How to get environment method in Java source file for given line number

I have a line number of the Java source file and want the program code to be obtained for this line number.

+7
source share
2 answers

Use something like JavaParser . From what I see, the Node class has references to the start and end indices of columns and rows. MethodDeclaration is a subclass of Node, so parse the source file and look for MethodDeclaration that contains your line number.

Code example

, 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);
}
+7

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);
    }
0

All Articles