Eclipse plugin Eclipse中节点的比较

Eclipse plugin Eclipse中节点的比较,eclipse-plugin,static-analysis,abstract-syntax-tree,eclipse-jdt,Eclipse Plugin,Static Analysis,Abstract Syntax Tree,Eclipse Jdt,我正在为Eclipse编写一个插件,它定期遍历EclipseJDT提供的抽象语法树,并将IMARKER放置在某些节点上——例如,高亮显示printStackTrace()以供删除。对于后续的每次行走,我希望避免放置第二个(或第三个或第四个或…)标记 这些节点的位置可以更改(如果在行走之间编辑文档),但IMarker不会更改(在保存文档之前,IMarker位置不会更新),因此我无法对这些对象使用char\u start和char\u end比较 我也不能使用ASTNode的.equals方法,因为

我正在为Eclipse编写一个插件,它定期遍历EclipseJDT提供的抽象语法树,并将IMARKER放置在某些节点上——例如,高亮显示printStackTrace()以供删除。对于后续的每次行走,我希望避免放置第二个(或第三个或第四个或…)标记

这些节点的位置可以更改(如果在行走之间编辑文档),但IMarker不会更改(在保存文档之前,IMarker位置不会更新),因此我无法对这些对象使用char\u start和char\u end比较

我也不能使用ASTNode的.equals方法,因为ASTNode的存储副本不会更新这些charstart和charend位置。我也尝试过比较getParent()节点,但这有其自身的问题(即在单独的catch块中的两个printstacktrace将有一个公共父节点)

现在我正在研究扩展和重写各种matches()方法,但要调用每个matches(),我需要将其中一个节点从ASTNode强制转换为相应的子类


在尝试用大量switch语句和大量转换来编写之前,有没有更优雅的解决方案来检查两个ASTNode是否相同,而不依赖于.equals()呢?

通常,验证程序和构建程序将删除文件上的所有标记,然后返回并为特定验证或构建添加自己的标记。我怀疑他们是这样做的,而不是采取你的方法,因为那样更容易。除非有严重的性能原因,否则我会采用这种方法


如果您确实需要比较新旧版本,则需要编写一个switch语句并进行大量的转换,尽管您至少可以通过某种工厂模式使其看起来优雅。

我从未想过删除现有标记-在进行转换之前,我可能会尝试一下。感谢您的提示。如果您使用“新建插件项目向导”并选择生成器模板,生成的示例代码将包括一个清除现有标记的调用。另一个技巧是使用多种标记。clear markers方法将要清除的标记类型作为参数,因此如果仔细规划,可以保留一些标记并删除其他标记。它们已定义为自定义标记类型,这非常有用。我刚刚用这种方法测试了我的插件,效果非常好。