LoginSignup
1
2

More than 5 years have passed since last update.

Javaソースの解析ツールをJavaで書いてみた…い

Posted at

なぜ作るのか?

いろいろ考えてみましたがド初心者の僕には難しいのです。
考えをまとめるためにもアウトプットしときます。

とりま現在の流れを3行で。

  1. 現場で簡単な仕様のDiffツール作ってくれって言われる
  2. 仕様を踏まえた上で考えたらソース解析必要やなーって思う
  3. なんやこれ構文解析ってこんなむずいんか

まぁライブラリ使ったら余裕なのかもですけど、いろいろ制約があるもんで、とりあえず標準ライブラリで作ろうとしてます。

解析ツールの仕様

概要

  1. 比較元と比較先のJavaファイルのパス受け取る
  2. 比較する
  3. Diffの結果のステップ数を出力する

※ただし、2つのJavaファイルはメソッドやフィールドの順番は入れ替わってたりする

入力と出力

INPUT
・javaファイル2つ(絶対パス)

OUTPUT
・diffした結果のステップ数(コメントも含む)

今現在想定している実装メソッドの実行順序

  1. 受け取ったjavaファイルのパスからファイル内の文字列を取得
  2. 比較元、比較先のjavaファイルからメソッドとフィールドの文字列に分け、マップに格納(フィールド、メソッド用の両方のマップインスタンスを作成)
  3. 比較元、比較先のフィールドの並び替え
  4. 比較元、比較先のメソッドの並び替え
  5. 比較元、比較先を文字列インスタンスに代入
  6. 比較元と比較先の両文字列インスタンスを比較
  7. ステップ数を算出し、出力する

こんな感じだと思います。

で、何に悩んどんねん

悩んでいるのは上の赤文字の部分になります。

例えば以下のようなクラスがあるとします。

public class Main {

    public static final String hoge;
    public static final String fuga;

    public static void main(String[] args){
        if (compareStr(args[0], hoge)) {
            System.out.println(hoge);
        }
    }

    public static boolean compareStr(String arg1, String arg2) {
        if (arg2.equals(arg1)) {
            return true;
        } else {
            return false;
        }
    }
}

これをフィールドとメソッドに分けて以下のマップインスタンスに格納しようとしました。

Map<String, Map<String, String>> codeMap;

…。
ん?どうやってメソッドとフィールドに分けるんや??

っていうところで詰まりました…。

素のままの状態でやるには馬鹿な僕には少々無理があったようです😭

ライブラリ使えば余裕ですね。
git diffとか。

1
2
6

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
1
2