0

我正在为 Eclipse 编写一个插件,该插件会定期遍历 Eclipse JDT 提供的抽象语法树并将 IMarkers 放置在某些节点上 - 例如,突出显示 printStackTrace() 以供删除(Youtube Demo)。对于随后的每次步行,我想避免放置第二个(或第三个或第四个或......)标记。

这些节点的位置可以改变(如果在两次行走之间编辑了文档),但 IMarker 不会(在保存文档之前,IMarker 位置不会更新),所以我不能对这些对象使用 char_start 和 char_end 比较。

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

现在,我正在考虑扩展ASTMatcher并覆盖各种 match() 方法,但要调用每个 match(),我需要将其中一个节点从 ASTNode 转换为适当的子类。

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

4

1 回答 1

1

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

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

于 2012-10-17T14:41:37.637 回答