我正在开发一个插件,它接受工作区中实现某些接口(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 搜索调用我运行该动作)。
所以问题是,我可能做错了什么?我的意思是,我刚刚多次阅读了 JavaCore API,以检查我是否可能使用错误,或者我是否存在一些概念缺陷,但实际上我不知道,就像如果 Eclipse 会缓存 IType 并忽略我刚刚在编辑器中所做的更改 :-/
如果有人有想法,我将非常感激:-)