hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

Perlのソースコードから文単位でトークンをgit grepするやつ

Perlのソースコードから,文単位でトークンをgit grepするのを作った.
普通のgrepは行単位の検索なので,これまでgit grepするとき, メソッドの呼び出しが複数行に渡ることが予想されるとき,勘で-A 5 とかやって,後ろ5行も表示,とかやってたけど,勘に頼っていて,不便だった.ソースコードはトークン単位とか文単位なので,行単位で扱ってもあまり意味がない.


GitHubに,git-grep-perl-statementというのを置いてある.

git-grep-perl-statementのソースコードから,coloredというトークンを探してみる.

% git grep-perl-statement colored
git-grep-perl-statement:61
colored($self->highlight_style, $_);
git-grep-perl-statement:85
say colored(
                ['bold'],
                "@{[ $file ]}:@{[ $_->line_number ]}"
            );

85行目のところ,coloredのあと改行してても,その命令が終わるまでは表示してくれてる.


flushというトークンを探してみる.

% git grep-perl-statement flush
git-grep-perl-statement:47
sub flush {
        my ($self) = @_;
        $self->{docs} = [];
    }
git-grep-perl-statement:95
$finder->flush;

メソッドの定義も見れる.

トークンの完全一致を見てるので,flus とかでは出ない.

仕組み

git grep --name-onlyで検索したあと,対象のソースコードをPPIでパースして,検索対象のトークンが含まれる文だけを表示している.
PPIを使えばstatement単位とかtoken単位での操作ができる.

便利

  • メソッドの呼び出しが複数行に渡るときに,何も気にしなくても命令の最後まで見れる
  • トークン単位で検索できるので,1文字の変数なども探せる
  • メソッド名で検索すると,メソッドの定義も見れる
  • 内部的に与えられた引数でgit grepしてるので,git grep-per-statement foo lib とかすると,lib/以下のみから検索とかできる


依存モジュールを管理とかインストールとかできるようにしたかったけどよくわからなかった.なんか足りなかったらcpanmで入れてください.