5

我目前的理解是,JDT 为我们提供了两种不同的接口和类层次结构来表示和操作 Java 代码:

  • Java 模型:提供一种表示 Java 项目的方法。快速创建但不包含与 AST 类层次结构一样多的信息,例如,没有关于源文件中每个元素的确切位置的信息(在可用的 AST 中)

  • AST:更详细的源代码表示,并提供了操作它的方法。

那是对的吗?

现在,还有一个名为 I*Binding 的接口层次结构(从IBinding开始),例如 IMethodBinding。例如,我们有 3 种不同的类型来处理方法:

从 doc IMethodBinding 看起来很像来自 AST 的 MethodInvocation,但我没有看到明显的区别,我什么时候应该使用它们。有人可以澄清一下吗?

4

1 回答 1

8

原始 AST 节点不包含它们之间的引用,例如从变量使用返回到其声明,或从方法调用返回到方法声明。可以检查 MethodInvocation 对象的方法名称,但您无法立即了解实际调用了哪个类的哪个方法。为此需要进行范围分析。

这种分析称为绑定解析。IBinding 对象附加到 AST 节点,您可以使用它们来查找给定 MethodInvocation AST 节点的 MethodDeclaration AST 节点,使用CompilationUnit.findDeclaringNode(methodInvocationNode.resolveMethodBidning().getKey())

或者您可以使用CompilationUnit.findDeclaringNode(method.getKey())来查找哪个 AST 节点包含对应于给定 IMethod 对象的声明。

MethodInvocation.resolveBinding().getKey() ==
MethodDeclaration.resolveBinding().getKey() ==
IMethod.getKey()
于 2013-01-30T10:34:45.657 回答