【发布时间】:2015-02-03 02:58:00
【问题描述】:
我有一个 IntelliJ 插件,它正在将 PsiReference 分辨率传送到“远程”类,并且遇到问题,因为 resolve() 方法返回 null 当且仅当我没有在当前编辑器中导航到远程文件时IntelliJ 会话。我怀疑需要促使 IntelliJ 在某种意义上解析文件(当您导航到文件时,您可以看到 IntelliJ 启动了某种解析运行,因为许多代码从最小突出显示到完全突出显示)但我不知道该怎么做。我查看了PsiManager 和PsiFile,在那里我找到了一些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;
}
我对@987654332@ 执行操作,然后逻辑找到包含文件(文件1)顶部的@AnnotationReferringToAnotherType 和resolve()s 到File2 的定义。然后它在File2 中寻找一个用@File3 注释的方法。由于mustBeLookedUpToHandleAction 上的@File3 注释没有指定它的值,插件现在必须查找@File3 的定义以确定默认值是什么。在新加载 IntelliJ 后,所有这些工作都非常顺利。失败的部分是resolve() 从PsiReferenceExpression SomeEnum.DEFAULT 到SomeEnum 中DEFAULT 的实际定义。它始终返回null,直到我在编辑器中导航到文件 3,然后它每次都在会话的其余部分工作。似乎很明显,引用的解析正在被懒惰地解析,如果我能找到一些方法来开始解析一切应该没问题?
您可能会想“到底为什么这个逻辑如此复杂?”。大多数逻辑实际上都在我正在使用的库中 - 它是内部的,所以我可能能够进行一些更改,但我怀疑我是否能够针对这个问题做出根本性的改变,除非这个问题被证明是完全无法控制。
【问题讨论】:
-
看起来答案可能在confluence.jetbrains.com/display/IDEADEV/PSI+Cookbook -
FileContentUtil.reparseFiles- 我会试试看是否可行
标签: intellij-13 intellij-plugin psi