Затмить ASTNode в номер строки исходного кода
При наличии ASTNode в eclipse, есть ли способ получить соответствующий номер строки исходного кода?
3 ответа
Вы можете получить номер строки ASTNode
используя код ниже
int lineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
блок компиляции может быть получен из ASTParser
используя код ниже
ASTParser parser = ASTParser.newParser(AST.JLS3);
// Parse the class as a compilation unit.
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(source); // give your java source here as char array
parser.setResolveBindings(true);
// Return the compiled class as a compilation unit
CompilationUnit compilationUnit = parser.createAST(null);
Тогда вы можете использовать ASTVisitor
шаблон для посещения типа требуемого узла (скажем, узла MethodDeclaration) с использованием приведенного ниже кода:
compilationUnit.accept(new ASTVisitor() {
public boolean visit(MethodDeclaration node) {
int lineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
return true;
}
});
ASTNode имеет методы getStartPosition() и getLength(), которые работают со смещением символов. Чтобы преобразовать смещение символа в номер строки, вы должны использовать метод getLineNumber() CompilationUnit. CompilationUnit - это корень вашего дерева AST.
Помимо общего решения, которое уже было описано, есть еще одно, которое применяется, если вам нужен номер строки ASTNode, включая начальные пробелы или потенциальные комментарии, написанные перед ASTNode. Тогда вы можете использовать:
int lineNumber = compilationUnit.getLineNumber(compilationUnit.getExtendedStartPosition(astNode))
Смотрите API:
Возвращает расширенную начальную позицию данного узла. В отличие от ASTNode.getStartPosition() и ASTNode.getLength(), расширенный исходный диапазон может включать комментарии и пробелы непосредственно перед или после нормального исходного диапазона для узла.