ソースコードを検索する

PHP で書かれたソースコードを解析している。ある関数、クラスがどこで定義され、どこで使われているのか調べたい。PHP 用の統合開発環境を使えばきっとそんなことは簡単にできるのだろうけれど。EmacsPHP 開発モードでも便利なものはアリそうだけれど。とりあえず今は次のようなシェルスクリプトを使っている。

#!/bin/bash                                                                     

target_dir=src

grep_opts="-r"
while getopts "fci" OPT; do
  case $OPT in
   "c" ) prefix='class' ;;
   "f" ) prefix='function' ;;
   "i" ) grep_opts="$grep_opts -i" ;;
     * ) ;;
  esac
done
shift `expr $OPTIND - 1`

needle="${1}"

if [ -n "$prefix" ] ; then
  echo grep $grep_opts "$prefix $needle" $target_dir '| grep -v \\.php~'
  grep $grep_opts "$prefix $needle" $target_dir | grep -v \\.php~
else
  echo grep $grep_opts "$needle" $target_dir '| grep -v \\.php~'
  grep $grep_opts "$needle" $target_dir | grep -v \\.php~
fi

# end of file 

たとえば、getRedStuff という関数が定義されているところを調べたいときには

$ grep.sh -f getRedStuff

とやる。GreenStuff というクラスが定義されているところを調べたいときには

$ grep.sh -c GreenStuff

とやる。
PHP は変数名は case sensitive だけど、関数は case insensitive らしく、定義時と大文字小文字が違う呼出し方をされているかもしれない。たとえば、truncate_fileName という関数がどこで定義されているか、

$ grep.sh -f truncate_fileName

で探しても見つからない場合、case を無視して探すと見つかる (と期待される)。

$ grep.sh -if truncate_fileName
src/path/to/file/func.php:function truncate_filename()