Затмить 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(), расширенный исходный диапазон может включать комментарии и пробелы непосредственно перед или после нормального исходного диапазона для узла.

Другие вопросы по тегам