【问题标题】:How to force IntelliJ plugin to parse a file's PsiReference resolutions?如何强制 IntelliJ 插件解析文件的 PsiReference 分辨率?
【发布时间】:2015-02-03 02:58:00
【问题描述】:

我有一个 IntelliJ 插件,它正在将 PsiReference 分辨率传送到“远程”类,并且遇到问题,因为 resolve() 方法返回 null 当且仅当我没有在当前编辑器中导航到远程文件时IntelliJ 会话。我怀疑需要促使 IntelliJ 在某种意义上解析文件(当您导航到文件时,您可以看到 IntelliJ 启动了某种解析运行,因为许多代码从最小突出显示到完全突出显示)但我不知道该怎么做。我查看了PsiManagerPsiFile,在那里我找到了一些refresh()reloadFromDisk() 方法,但我猜这些有很多我不想要的副作用,并且可能不会启动解析运行反正。详情/说明如下。

代码如下所示:

文件 1,我在其中调用 foo 的插件操作:

@AnnotationReferringToAnotherType(File2.class)
class File1 {
  String foo;
}

文件 2,插件必须查找该文件才能对 foo 执行操作:

class File2 {
  @File3
  void mustBeLookedUpToHandleAction() {}
}

还必须查找文件 3:

@interface File3 {
  public enum SomeEnum {
    DEFAULT,
    SOMETHING_ELSE
  }

  SomeEnum value() default SomeEnum.DEFAULT;
}

我对@9​​87654332@ 执行操作,然后逻辑找到包含文件(文件1)顶部的@AnnotationReferringToAnotherTyperesolve()s 到File2 的定义。然后它在File2 中寻找一个用@File3 注释的方法。由于mustBeLookedUpToHandleAction 上的@File3 注释没有指定它的值,插件现在必须查找@File3 的定义以确定默认值是什么。在新加载 IntelliJ 后,所有这些工作都非常顺利。失败的部分是resolve()PsiReferenceExpression SomeEnum.DEFAULTSomeEnumDEFAULT 的实际定义。它始终返回null,直到我在编辑器中导航到文件 3,然后它每次都在会话的其余部分工作。似乎很明显,引用的解析正在被懒惰地解析,如果我能找到一些方法来开始解析一切应该没问题?

您可能会想“到底为什么这个逻辑如此复杂?”。大多数逻辑实际上都在我正在使用的库中 - 它是内部的,所以我可能能够进行一些更改,但我怀疑我是否能够针对这个问题做出根本性的改变,除非这个问题被证明是完全无法控制。

【问题讨论】:

标签: intellij-13 intellij-plugin psi


【解决方案1】:

原来这是 IntelliJ 中的一个错误:https://youtrack.jetbrains.com/issue/IDEA-133994

解决方法是在调用resolve() 之前在注释定义的PsiElements 之一上调用getText() - 例如一旦你有PsiAnnotationMethod for File3.value,在调用getDefaultValue().resolve()之前调用getText()就可以了

deets:

File3 的定义是“存根的”,因此实际上只有其 psi 树的核心组件可用。每当从存根请求存根没有的信息时(例如,通过调用getText),包含存根的 psi 树的文件将被完全解析,并用完整的 psi 树替换存根(参见https://confluence.jetbrains.com/display/IDEADEV/Indexing+and+PSI+Stubs+in+IntelliJ+IDEA)。如果注释被存根,PsiAnnotationMethod.getDefaultValue 的特定实现将返回一个虚拟 PsiAnnotationMemberValue,并且该虚拟元素显然不知道尊重 resolve()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多