Как получить окружающий метод в исходном файле Java для данного номера строки - PullRequest
7 голосов
/ 09 сентября 2011

У меня есть номер строки исходного файла Java, и я хочу получить метод окружения для этого номера строки программно.

Ответы [ 2 ]

7 голосов
/ 09 сентября 2011

Используйте что-то вроде JavaParser . Из того, что я вижу, класс Node имеет ссылки на индексы начала и конца столбцов и строк. MethodDeclaration является подклассом Node, поэтому проанализируйте исходный файл и найдите MethodDeclaration, который «содержит» номер вашей строки.

Пример кода

Вы должны убедиться, что файл src указывает на ваш собственный источник. Здесь я просто использую источник самого образца.

package grimbo.test;

import japa.parser.JavaParser;
import japa.parser.ParseException;
import japa.parser.ast.CompilationUnit;
import japa.parser.ast.body.MethodDeclaration;
import japa.parser.ast.visitor.VoidVisitorAdapter;

import java.io.File;
import java.io.IOException;

public class TestMethodLineNumber {
    public static void method1() {
        int i = 1;
        System.out.println(i);
    }

    public static void method2() {
        String s = "hello";
        System.out.println(s);
    }

    public static void main(String[] args) throws ParseException, IOException {
        File f = new File(".").getAbsoluteFile();
        File srcRoot = new File(f, "src/main/java");
        String srcFilename = TestMethodLineNumber.class.getName().replaceAll("\\.", "/") + ".java";
        File src = new File(srcRoot, srcFilename);
        System.out.println(f);
        System.out.println(srcRoot);
        System.out.println(src);
        getMethodLineNumbers(src);
    }

    private static void getMethodLineNumbers(File src) throws ParseException, IOException {
        CompilationUnit cu = JavaParser.parse(src);
        new MethodVisitor().visit(cu, null);
    }

    /**
     * Simple visitor implementation for visiting MethodDeclaration nodes.
     */
    private static class MethodVisitor extends VoidVisitorAdapter {
        @Override
        public void visit(MethodDeclaration m, Object arg) {
            System.out.println("From [" + m.getBeginLine() + "," + m.getBeginColumn() + "] to [" + m.getEndLine() + ","
                    + m.getEndColumn() + "] is method:");
            System.out.println(m);
        }
    }
}

Пример вывода

From [13,5] to [16,5] is method:
public static void method1() {
    int i = 1;
    System.out.println(i);
}
From [18,5] to [21,5] is method:
public static void method2() {
    String s = "hello";
    System.out.println(s);
}
From [23,5] to [32,5] is method:
public static void main(String[] args) throws ParseException, IOException {
    File f = new File(".").getAbsoluteFile();
    File srcRoot = new File(f, "src/main/java");
    String srcFilename = TestMethodLineNumber.class.getName().replaceAll("\\.", "/") + ".java";
    File src = new File(srcRoot, srcFilename);
    System.out.println(f);
    System.out.println(srcRoot);
    System.out.println(src);
    getMethodLineNumbers(src);
}
From [34,5] to [37,5] is method:
private static void getMethodLineNumbers(File src) throws ParseException, IOException {
    CompilationUnit cu = JavaParser.parse(src);
    new MethodVisitor().visit(cu, null);
}
From [43,9] to [48,9] is method:
@Override
public void visit(MethodDeclaration m, Object arg) {
    System.out.println("From [" + m.getBeginLine() + "," + m.getBeginColumn() + "] to [" + m.getEndLine() + "," + m.getEndColumn() + "] is method:");
    System.out.println(m);
}
0 голосов
/ 02 февраля 2019

Для новой версии JavaParser:

    @Override
    public void visit(MethodDeclaration m, Object arg) {
        System.out.println("From [" + m.getRange().get().begin.line + "," + m.getRange().get().begin.column
            + "] to [" + m.getRange().get().end.line + "," + m.getRange().get().end.column + "] is method:");
        System.out.println(m);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...