eclipse-plugin - 奇怪的 JavaCore IType 缓存问题

标签 eclipse-plugin eclipse-jdt

我正在开发一个插件,该插件采用工作区中实现某些接口(interface)(IDomain)的所有枚举解析代码(使用 AST)对枚举进行一些修改并将其标记为使用注释(@IDomainInfo)处理。

例如,它需要这样的东西:

public
enum SomeEnum implements IDomain {
  // ...
}

并生成如下内容:
public @IDomainInfo(domainId = 1)
enum SomeEnum implements IDomain {
  // Some changes here...
}

@IDomainInfo 背后的想法是插件不再需要处理带注释的枚举。

基本上,我完成这项任务的方法是使用 JavaSearch API 进行搜索,以找到所有实现 IDomain 的枚举(简单任务),结果我得到一个 IJavaElements 列表(实际上是 IType 的实例)。然后我调用一个方法,该方法遍历结果列表并创建所有未使用 @IDomainInfo 注释的 IType 实例的新列表,然后处理结果列表: 对于每个未注释的 IType 做一些工作,使用 @ 注释 IType IDomainInfo 注释(使用 AST),然后将结果保存回文件(使用 IFile,因此我可以在不刷新的情况下看到更改,事实上,如果我在编辑器中打开枚举,我会立即看到它刷新 :-)

一切正常,但如果我打开一个@IDomainInfo 带注释的枚举(仅用于测试)然后删除@IDomainInfo,保存文件(我确定)然后调用完成我之前描述的所有工作的操作,当我到达从未注释的 IType 中过滤带注释的 IType 的部分时,代码是这样的:
    for (IType type : typeList) {
      IAnnotation annotation = type.getAnnotation(“IDomainInfo”);

      if (!annotation.exists()) {
        // The annotation does not exist, so add the type to the
        // list of elements to update and go on...
        ret.add(type);
        continue;
      }
 // Something else here...
    }

好吧,结果是对于我刚刚保存的文件,IType 检测到我刚刚删除的注释,就好像它仍然存在一样。如果我关闭并重新打开 Eclipse 一切正常。

现在,我刚刚检查并三重检查了我的代码,所以我确定我不会保留未编辑的旧 IType 的陈旧副本仍然带有注释版本(我所有的 IType 每次都来自新的 java 搜索调用我运行 Action )。

所以问题是,我可能做错了什么?我的意思是,我刚刚多次阅读 JavaCore API 以检查我是否可能使用错了,或者我是否有一些概念上的缺陷,但我真的不知道,就像 如果 eclipse 将缓存 IType 忽略我刚刚在编辑器中所做的更改 :-/

如果有人有想法,我将不胜感激:-)

最佳答案

您的插件何时或如何被调用?您注册了资源监听器还是项目构建器或其他?如果它由资源监听器调用,则您的插件可能正在读取您的 IType 的“主副本”,该副本尚未保存。因此,您的更改仍在工作副本中。

关于eclipse-plugin - 奇怪的 JavaCore IType 缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2011348/

相关文章:

java - Eclipse RCP : File association (--launcher. 打开文件)

linux - 设置 Window tester pro linux。 SWT错误

java - Eclipse 插件,用于自动创建 Java 代码以重现对象的状态,以便在调试时进行快速测试

eclipse - 组织插件测试的夹具首选项

eclipse - 使用 Eclipse 的 JDT,如何从类名中获取 IType?

java - 使用 Eclipse JDT AST Rewrite 作为独立应用程序以编程方式修改现有 Java 源代码

java - 如何克隆 JDT ICompilationUnit

java - 恢复视野的秘诀

java - Eclipse + Java 8 支持?

java - org.osgi.framework.BundleException : Could not resolve module