ctagsで引数付きメソッド一覧

ctagsってエディタの補完用ファイルを生成するだけじゃないんだね!っていうメモです。


引数付きのメソッド一覧が必要になったことがあって、ctagsの生成するtagsファイルが使えるかも、と思って見てみたら引数が書いてなかったのです。(/ /で囲われているところはエディタが検索に使う部分なので、引数の途中で改行されていると途中までしか書いてない)
「ええー、Javaのパーサーなんて書けないよ?」と思って、一応ctagsのオプションを調べたら引数も書いてくれるオプションがあるではないですか。便利ですねえ。
エディタの補完用途にしか使えないのだとばかり思っていたら割と高機能・多機能で…… これからもお世話になります。

$ ctags -R --fields=+KS

-Rはカレントディレクトリ以下を再帰的に検索、--fieldsの+がONにする、という意味で、-にするとOFFに。
Kがmとか表示されるところがmethodと長く記述されるようにするオプションで、Sが引数のリストを記述するオプション。(オプション?)


試しに以下のソースでtagsファイルを生成してみると……

{ aaa.pas }
unit aaa;

function bbb: Boolean;
procedure ccc;
procedure ddd(const Value: String); overload;
procedure ddd(Value: Integer); overload;

implementation

function bbb: Boolean;
begin

end;

procedure ccc;
begin

end;

procedure ddd(const Value: String); overload;
begin

end;

procedure ddd(Value: Integer); overload;
begin

end;

end.
// aaa.java
class aaa {
  public static void main() { }
  public void bbb() { }
  public void bbb(String str) { }
  public void bbb(int l,
    String str,
    int n) {}
  public void ccc(int i) { }
}
aaa	aaa.java	/^class aaa {$/;"	class
bbb	aaa.java	/^  public void bbb() { }$/;"	method	class:aaa	signature:()
bbb	aaa.java	/^  public void bbb(String str) { }$/;"	method	class:aaa	signature:(String str)
bbb	aaa.java	/^  public void bbb(int l,$/;"	method	class:aaa	signature:(int l, String str, int n)
bbb	aaa.pas	/^function bbb: Boolean;$/;"	function
ccc	aaa.java	/^  public void ccc(int i) { }$/;"	method	class:aaa	signature:(int i)
ccc	aaa.pas	/^procedure ccc;$/;"	procedure
ddd	aaa.pas	/^procedure ddd(Value: Integer); overload;$/;"	procedure
ddd	aaa.pas	/^procedure ddd(const Value: String); overload;$/;"	procedure
main	aaa.java	/^  public static void main() { }$/;"	method	class:aaa	signature:()

こんな感じ。Pascalのソースは引数を解析してくれない……
Javaのaaa#bbb()メソッドは/ /で囲まれてるところは途中で改行されてるから引数が全部表示されてないけど、後ろのsignatureのところに全部列挙されてます。


これでパーサを書く必要もなくなり、grepsed/awkでごにょごにょして事なきを得たのでした。