自定义语言插件可以提供两种主要类型的代码完成:reference completion 和Contributor-based completion的完成。前者更容易实现,但只支持基本的补全动作。后者会复杂一些,但功能更强大支持所有三种完成类型(基本、智能和类名),并且可用于实现关键字完成等。
为了填充完成列表,IDE 调用PsiReference.getVariants()插入符号位置的引用或将放置在插入符号处的虚拟引用,这个方法需要返回包含字符串、实例或类实例的对象数组,PsiElement或LookupElement。如果PsiElement在数组中返回一个实例,完成列表将显示该元素的图标。
最常见的实现getVariants()
方式是使用与PsiReference.resolve()中相同的函数向上遍历树。收集PsiScopeProcessor给execute()
方法的所有声明并将它们作为数组返回以填充完成列表。
实现时可参考PsiSymbolReference提供的PsiCompletableReference接口。
需要实现CompletionContributor接口,并且注册com.intellij.completion.contributor
扩展点并指定language
属性。模式是针对叶 PSI 元素进行检查的。如果要匹配复合元素,请使用withParent()
或withSuperParent()
方法。一个参考示例:CompletionContributor 。
完成列表中显示的项目由LookupElement接口的实例表示,由LookupElementBuilder类创建。对于每个查找元素,您可以指定以下属性: