idea插件开发-自定义语言6-Declarations and References

        这个专题又是idea中非常重要的内容,在编程语言中一般都会定义变量然后再其它地方使用,定义的变量统称为声明,使用统称为引用。

一、声明

        每个符号可以在零个或多个位置声明,例如:1、C# 部分类是一个带有多个声明的符号;2、属性键是可能同时在多个文件中声明的符号;3、Java 局部变量是具有单个声明的符号;4、但文件是没有声明的符号,它只有参考。

  • PsiSymbolDeclaration:PSI 元素中的声明;
  • PsiSymbolDeclarationProvider:报告 PSI 元素中的声明,在实现时需要注册com.intellij.psi.declarationProvider。或者直接在PsiElement中实现PsiSymbolDeclaration;                

二、引用

        实现PsiSymbolReference接口,重写resolveReference()方法,如果无法解析引用,它返回引用指向的符号集合以及附加数据,例如,如果它指向未定义的类,则会返回一个空集合。该方法的对应项resolveReference()是PsiSymbolReference.resolvesTo(),它检查引用是否解析为指定的符号。仅当元素的文本等于引用的文本时,才可以实施此方法来遍历树。

        如果可以在没有附加数据的情况下将引用解析为单个符号,则可以将其扩展自SingleTargetReference.

1、自身引用

        在 PSI 元素中可以找到的引用,它们被语言视为引用。比如:x在Java 表达式中表示的 PSI 元素x * 2具有对本地 Java 变量的 Own 引用,例如,var x = 42因为从 Java 语言的角度来看这是一个引用,并且 Java 语言支持使用它来进行代码分析等。

        它是通过实现在PsiElement中实现PsiElement.getOwnReferences()来获取的,如果元素包含单个引用,则可以使用Collections.singletonList()。

2、外部引用

        外部引用是不被宿主语言视为引用的引用。语言支持不应依赖于它们的存在/不存在,因为它们可能由其他插件提供。比如:"users.txt"在Java 表达式中表示的 PSI 元素new File("users.txt")从 Java 语言的角度来看是一个字符串文字,但是有一个插件知道这个文字引用了一个文件名,并提供了这样的引用。

        外部引用可用PsiExternalReferenceHost实现。为了允许其他插件提供对的引用PsiElement,可在PsiElement中实现PsiExternalReferenceHost,并注册PsiSymbolReferenceProvider扩展;

3、隐式引用

        隐式引用是应该成为通过引用获取目标的机制的一部分的引用,没有通过目标搜索或重命名此类引用的反向能力。比如: var Java 声明中的关键字var x = new Person()具有隐式引用,因为目标类获取引用没有意义。

        提供隐式引用,需要注册ImplicitReferenceProvidercom.intellij.psi.implicitReferenceProvider扩展点。

你可能感兴趣的:(Idea插件开发,intellij-idea,java,ide)