0
0

JavaParserを利用して、javaファイルをパースした際に、メソッド宣言された行の行番号を取得する

Posted at

結論

JavaParserを利用して、javaファイルをパースした際に、メソッド宣言された行の行番号を取得するには、MethodDeclarationクラスのgetBeginメソッドを利用します。

ここで注意すべきは、getBeginで取得できる行番号はメソッドアノテーションを含むということです。たとえば、以下のようなメソッド宣言がある場合、getBeginで取得できる行番号はmethodXが記載されている行ではなく、@Overrideが記載されている行になります。

@Override 
public void methodX(){...}

以下のようなファイルがあるとします。

XXX.java
package path.to.example;

public class XXX {
    public void methodA() {
        // ...
    }
    
    @Override
    public boolean equals(Object obj) {
        return super.equals(obj);
    }
    
    @Override
    @SuppressWarnings("all")
    public String toString() {
        return super.toString();
    }
}

このファイルをJavaParserを使ってパースし、XXXクラスのメソッド名とメソッド宣言されている行の行番号をコンソール表示します。

Solution.java
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Paths;

import com.github.javaparser.Position;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;

public class Solution {
    public static void main(String[] args) {
        try {
            CompilationUnit compilationUnit = StaticJavaParser.parse(Paths.get("XXX.java"));
            MethodDeclarationVisitor methodDeclarationVisitor = new MethodDeclarationVisitor();
            compilationUnit.accept(methodDeclarationVisitor, null);
        } catch (IOException e) {
           throw new UncheckedIOException(e);
        }
    }

    private static class MethodDeclarationVisitor extends VoidVisitorAdapter<Void> {
        @Override
        public void visit(MethodDeclaration n, Void arg) {
            Position position = n.getBegin().get();
            String text = "name=%s, line=%d".formatted(n.getName(), position.line);
            System.out.println(text);
            super.visit(n, arg);
        }
    }
}

実行結果は以下の通りになります。

name=methodA, line=4
name=equals, line=8
name=toString, line=13

環境情報 (pom.xmlの抜粋)

pom.xml
<properties>
  <maven.compiler.target>17</maven.compiler.target>
  <maven.compiler.source>17</maven.compiler.source>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
  <dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-core</artifactId>
    <version>3.25.6</version>
  </dependency>
</dependencies>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0