奇怪的JavaCore IType缓存问题

Dem*_*ián 5 eclipse-plugin eclipse-jdt

我正在开发一个插件,它接受实现特定接口(IDomain)的工作空间中的所有枚举解析代码(使用AST)对枚举进行一些修改并将其标记为使用注释(@IDomainInfo)处理.

例如,它需要像这样:

public
enum SomeEnum implements IDomain {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

并生成这样的东西:

public @IDomainInfo(domainId = 1)
enum SomeEnum implements IDomain {
  // Some changes here...
}
Run Code Online (Sandbox Code Playgroud)

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

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

一切正常,但如果我打开一个@IDomainInfo带注释的枚举(仅用于测试),然后删除@IDomainInfo,保存文件(我确定)然后调用执行我之前描述的所有工作的操作,当我到达从非注释的过滤带注释的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...
    }
Run Code Online (Sandbox Code Playgroud)

好吧,结果是对于我刚刚保存的文件,IType检测到我刚删除的注释,就像它仍然存在一样.如果我关闭并重新打开eclipse,所有工作都会正常进行.

现在,我刚检查并三重检查了我的代码,所以我确定我没有使用注释版本保留未编辑的旧IType的旧版本(我的所有IType都来自每次新的java搜索调用我执行动作).

所以问题是,我可能做错了什么?我的意思是,我刚刚多次阅读JavaCore API来检查我是否可能使用它错了或者我是否有一些概念上的缺陷但我真的没有线索,就像eclipse会缓存IType忽略变化我刚刚在编辑中做出: - /

如果有人有想法我会很感激:-)

Xav*_*lon 0

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