0

我已经使用 AST 玩了很长一段时间,并试图从 eclipse 中获取与在此插件上解析的给定节点相关联的行和列信息。根据此处记录的api,我发现该方法getStartPosition()可以为我提供已解析文件字符的位置,但这不是我想要的。

我继续阅读CompilationUnit 类 api 文档以找出方法getLineNumber(int position)getColumnNumber(int position)并且根据我的理解可以做到这一点。position参数就是getStartPosition()方法返回的内容,通过做node.getStartPosition().

现在,问题是在源文件上获取行和列的两种方法似乎不适用于所有节点。例如,方法声明节点没有它们!

我怎样才能获得所有树的这些信息?我知道这不是不可能的,因为我能够使用其他语言的解析器,每个ast 节点都有与之关联的行和列。事实上,我相信javaparser是其中之一,因为该类包含硬编码的行和列的属性。看到 Eclipse JDT 对我来说似乎更加健壮并且在那里呆了很长一段时间,我会惊讶于无法获得这样的信息。

编辑:同样,问题是从仅出现在根目录上的编译单元的不同内容中获取行号:

<type 'org.eclipse.jdt.core.dom.CompilationUnit'>
1
<type 'org.eclipse.jdt.core.dom.TypeDeclaration'>
<type 'org.eclipse.jdt.core.dom.Javadoc'>
<type 'org.eclipse.jdt.core.dom.TagElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>
<type 'org.eclipse.jdt.core.dom.TextElement'>

谢谢你。

4

2 回答 2

2

为了后代,我将重新发布我在 jdt-core-dev 邮件列表上发布的答案。(我的回答与上面 Ryan 的建议差别不大)

嗨,卡洛斯,

您对 CompilationUnit.getLineNumber(int) 方法是正确的。您可以按如下方式使用它:

int lineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;

但是,我不明白你在哪里卡住。为什么需要为 MethodDeclaration 定义的 getLineNumber(..)?你只需要找到方法声明节点,然后使用下面的代码找到它对应的CompilationUnit,然后使用上面的代码行找到行号。我在这里错过了什么吗?

ASTParser parser = ASTParser.newParser(AST.JLS3); // or JLS_4 for java 7 and above

parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(source); // give your java source here as char array
parser.setResolveBindings(true);

CompilationUnit compilationUnit = parser.createAST(null);

干杯! 阿尤什

于 2012-08-17T16:23:35.240 回答
1

我面前没有正在运行的程序,但是根据您上面链接到的文档和 Eclipse 的源代码,您似乎可以通过调用并将其转换CompilationUnit为. 或者,它出现在javadoc和ibm的一个示例中,它几乎总是返回 a ,它代表您正在解析的源代码。ASTNodegetRoot()CompilationUnitASTParser ASTParser.createAST(IProgressMonitor)CompilationUnit

在你有了一个CompilationUnitnamed之后root,你应该就可以使用root.getLineNumber(node.getStartPosition())androot.getColumnNumber(node.getStartPosition())方法了。

final ASTParser p = ASTParser.newParser(AST.JLS3);
p.setSource(source);
final CompilationUnit root = (CompilationUnit) p.createAST(null);
// stuff happens
final ASTNode node = //get a node

final int line = root.getLineNumber(node.getStartPosition());
final int column = root.getColumnNumber(node.getStartPosition());
System.out.println("Node started at (" + line + ", " + column + ")";
于 2012-08-17T02:29:29.850 回答