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

后端 未结 2 716
醉话见心
醉话见心 2021-01-05 09:15

I have a line number of a Java source file and want to get the surrounding method for that line number programmatically.

相关标签:
2条回答
  • 2021-01-05 09:53

    Use something like JavaParser. From what I can see, the Node class has references to begin and end column and row indexes. MethodDeclaration is a subclass of Node, so parse the source file and search for the MethodDeclaration that 'contains' your line number.

    Sample code

    You would make sure the src file points to your own source. Here, I just use the source of the sample itself.

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

    Sample output

    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 讨论(0)
  • 2021-01-05 10:06

    For the new version of 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 讨论(0)
提交回复
热议问题