我正在为 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()?