7

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

4
  • Do you want to parse the source file manually? Commented Sep 9, 2011 at 10:32
  • 2
    Good luck! Feel free to share your results with us! Commented Sep 9, 2011 at 10:32
  • After the fact, or would you like a solution for future runs? Commented Sep 9, 2011 at 10:36
  • This will get difficult. What would you do for example in the case of anonymous inner classes (i.e., methods defined in classes, which are defined inside a method of another class)? Which of the methods would you want as the output? Commented Sep 9, 2011 at 10:46

2 Answers 2

7

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);
}
Sign up to request clarification or add additional context in comments.

6 Comments

I did not understand exactly how to do what you just told me
@Paul Btw is a java new line a CRLF or a LF ?
@Pacerier - I believe it varies according to the O/S. stackoverflow.com/questions/207947/…
@PaulGrime no I was talking about the Java source code.. I've found it here: java.sun.com/docs/books/jls/second_edition/html/…
Is it also possible to get Line number of instructions running inside each method with a small touch? @Paul Grime
|
0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.