要約
Ruby のソースコード上のある範囲を表すクラスです。
インスタンスは Proc#source_range・Method#source_range・UnboundMethod#source_range・Thread::Backtrace::Location#source_range から得られます。Ruby::SourceRange.new は未定義で、これらのメソッド以外から生成することはできません。ソースパス、(可能なら)絶対パス、開始行、開始のバイト単位の桁、終了行、終了のバイト単位の桁を保持します。
このクラスの主な目的は、node_id のような実装の詳細に依存しない形で、Prism.find をすべての Ruby 実装で正確に実装できるようにすることです。そのために必要な開始・終了の行と桁、および絶対パスをこのクラスが提供します。
Prism.find の利用者は、必要に応じて結果を調整できます。例えば Ruby::SourceRange#end_line で触れているようにヒアドキュメントの分だけ範囲を広げたり、Proc#source_range の結果に対してブロックが渡されたメソッド呼び出しまで範囲を広げたりといった調整です。
なお、返されるソース範囲は、それだけで評価可能なコード片であるとは限りません。ヒアドキュメントがメソッドの end を越えて続くことがあるほか、ブロックの場合は範囲が { や do から始まるためです。
目次
- インスタンスメソッド
インスタンスメソッド
absolute_path -> String | nilRuby 4.1 から[permalink][rdoc][edit]-
selfに対応する呼び出し可能オブジェクトの絶対パスを返します。eval したコードなど、ソースが絶対パスを持たない場合は nil を返します。
例range = eval("proc {}", binding, "/tmp/sample.rb", 10).source_range p range.absolute_path # => nil[SEE_ALSO] Ruby::SourceRange#path
end_column -> IntegerRuby 4.1 から[permalink][rdoc][edit]-
この範囲が終了するバイト単位の桁を返します。
0 から数えます。
呼び出し可能オブジェクトの
例endを越えて続くヒアドキュメントは範囲に含まれないことに注意してください。最後のヒアドキュメントまでの範囲を得たい場合は、Prism.findにProc・Method・UnboundMethodを渡した結果から、子ノードの終了行・終了桁の最大値を計算してください。pr = proc { <<~HEREDOC } heredoc contents HEREDOC p pr.source_range.end_column # => 24[SEE_ALSO] Ruby::SourceRange#end_line
end_line -> IntegerRuby 4.1 から[permalink][rdoc][edit]-
この範囲が終了する行番号を返します。
1 から数えます。
呼び出し可能オブジェクトの
例endを越えて続くヒアドキュメントは範囲に含まれないことに注意してください。最後のヒアドキュメントまでの範囲を得たい場合は、Prism.findにProc・Method・UnboundMethodを渡した結果から、子ノードの終了行・終了桁の最大値を計算してください。pr = proc { <<~HEREDOC } heredoc contents HEREDOC p pr.source_range.end_line # => 1[SEE_ALSO] Ruby::SourceRange#end_column
inspect -> StringRuby 4.1 から[permalink][rdoc][edit]-
Ruby::SourceRange#absolute_path が利用できればそれを、そうでなければ Ruby::SourceRange#path を使い、開始・終了の座標とあわせて人間が読みやすい形式の文字列にして返します。
例range = eval("proc {}", binding, "/tmp/sample.rb", 10).source_range p range.inspect # => "#<Ruby::SourceRange /tmp/sample.rb:(10,5)-(10,7)>" path -> StringRuby 4.1 から[permalink][rdoc][edit]-
selfに対応する呼び出し可能オブジェクトのソースパスを返します。Proc#source_location や Method#source_location が返す配列の最初の要素と同じものです。
例range = eval("proc {}", binding, "/tmp/sample.rb", 10).source_range p range.path # => "/tmp/sample.rb"[SEE_ALSO] Ruby::SourceRange#absolute_path
start_column -> IntegerRuby 4.1 から[permalink][rdoc][edit]-
この範囲が開始するバイト単位の桁を返します。
0 から数えます。
lambda の範囲は
例->から、ブロックの範囲は{またはdoから、メソッドの範囲はdefから始まります。l = -> {} p l.source_range.start_column # => 4 pr = proc {} p pr.source_range.start_column # => 10 meth = method(def m = 42) p meth.source_range.start_column # => 14[SEE_ALSO] Ruby::SourceRange#end_column
start_line -> IntegerRuby 4.1 から[permalink][rdoc][edit]-
この範囲が開始する行番号を返します。
1 から数えます。
例range = eval("proc {}", binding, "/tmp/sample.rb", 10).source_range p range.start_line # => 10[SEE_ALSO] Ruby::SourceRange#end_line