パーサー (Ruby 実装自体で実行されているもの以外) または正規表現またはそれを行う外部ライブラリを使用してソース コードを解析せずに、メソッド定義の最後の行の場所を知る方法はありますか?
set_trace_func
またはによって提供される情報を使用してメソッド定義の最初の行を取得するのは簡単です。method_added
これらはメソッド定義の時点でトリガーされるためです。また、提供された情報を (から直接set_trace_func
またはからのcaller
情報を解析してmethod_added
) 分析できます。
しかし、メソッド定義の最後の行については、次のメソッド定義の最初の行またはcall
によって検出された他の sを探すことが最善の方法set_trace_func
です。元のメソッド定義がこの行で終了したことはわかりますが、それより前の行で終了したかどうかはわかりません。たとえば、 method の定義の最後の行を取得しようとしているとしますfoo
。ソースコードが以下のような場合:
| def foo
| ...
n | end; def bar
| ...
bar
定義の最初の行が であるとするとn
、(偶然にも)foo
定義の最後の行は であることがわかりますn
。しかし、ソースコードがたまたま以下のようなものだった場合:
| def foo
| ...
n-1 | end
n | def bar
n-1
次に、 の最後の行として取得したいのですが、この場合であり、foo
ではないことを伝える方法がわかりません。ソースコードには、次のような空の行またはコメント行がさらに含まれる場合があります。n-1
n
| def foo
| ...
n-9 | end
|
| # comment
|
| =begin
| ...
| =end
|
n-1 |
n | def bar
n-1
正しい の代わりに取得することは大きな問題ではありませんが、代わりにn-9
取得n
することは大きな問題です。