IDEA插件开发时,可以有两种途径提供代码补全:
- 实现
Reference
的getVariants()
方法,返回一个数组,类型为String
或者PsiElement
或者LookupElement
。这种方式只支持基本(basic)补全操作。 - 继承
CompletionContributor
,支持basic、smart和class name三种补全方式。
本文主要介绍继承CompletionContributor
的方式。
先说目标。
还是以之前的mapper文件为例:
我想为sql语句和if条件中的#{userName}
添加自动补全。
首先创建一个CompletionContributor
的基本实现类,其中包含公共方法,为元素添加自动补全:
该方法的逻辑比较清楚,先查出元素所在方法的参数列表,然后将参数构造成LookupElement
返回。
构造LookupElement
时,需要设置参数名称,参数类型和图标。
实现方式与上一篇IDEA插件开发(八)mybatis插件之参数引用 类似,不多解释。
主要看两个具体的实现类。
重写fillCompletionVariants方法
第一个,为sql语句中的#{userName}
添加自动补全。
为了方便解释,我们先把注册到plugin.xml
的代码贴出来:
第一种方式重写fillCompletionVariants
方法,首先也是过滤参数。
在注册时,我们指定了language为SQL,那么该补全器只会传入SQL语句中参数。
然后我们在方法内过滤mybatis的mapper文件中的SQL语句参数。
然后判断是否是#{
开头,如果是,才补全。
使用extend方法
|
|
常用的实现方式是在构造函数中调用extend()
方法。
第一个参数是补全类型,支持basic,smart和class name。一般选basic就好了。
第二个参数是参数匹配模式。本例子中是找到name
为test
的XmlAttribute
内部的元素:XmlPatterns.psiElement().inside(XmlPatterns.xmlAttribute().withName("test"))
。
第三个参数是CompletionProvider
实例,重写addCompletions
方法即可。
最后注册到plugin.xml
中: