Ruby 4.0 リファレンスマニュアル

class Prism::Source

[edit]

要約

解析対象のソースコード全体と各行の開始オフセットの表を保持し、バイトオフセットから行番号・桁位置への変換などを提供するクラスです。 Prism::ParseResult#source で得られます。

実際に得られるインスタンスは、ASCII のみのソース向けに最適化されたサブクラス Prism::ASCIISource の場合があります。クラスの判定をする場合は instance_of? ではなく is_a?(Prism::Source) を使ってください。

例
require "prism"

source = Prism.parse("foo = 1\nbar = 2\nbaz = foo + bar\n").source
p source.source[0, 7] # => "foo = 1"
p source.line(9)      # => 2 (バイトオフセット 9 は 2 行目)
p source.column(9)    # => 1
p source.offsets      # => [0, 8, 16, 32]

目次

特異メソッド
インスタンスメソッド

特異メソッド

for(source, start_line, offsets) -> Prism::SourceRuby 3.4 から[permalink][rdoc][edit]

指定したソースコード文字列から Prism::Source のインスタンスを作成します。

new の代わりにこのメソッドを使うことが推奨されます。ソースコードにマルチバイト文字が含まれない場合は、より高速に動作する特化版のサブクラス Prism::ASCIISource のインスタンスを返します。

[PARAM] source:
ソースコードの文字列を指定します。
[PARAM] start_line:
ソースコードが開始する行番号を指定します。通常は 1 ですが、このソースコードがより大きなソースコードの一部である場合や、eval の場合はそれ以外の値になることがあります。
[PARAM] offsets:
ソースコード中の各行の開始バイトオフセットの配列を指定します。先頭の要素は必ず 0 です。
例
require "prism"

source = Prism::Source.for("foo = 1\nbar = 2\n", 1, [0, 8, 16])
p source.class   # => Prism::ASCIISource
p source.line(9) # => 2

[SEE_ALSO] Prism::ParseResult#source

インスタンスメソッド

character_column(byte_offset) -> IntegerRuby 3.3 から[permalink][rdoc][edit]

byte_offset の位置の、行頭からの文字単位の桁位置(0 origin)を返します。

[PARAM] byte_offset:
バイトオフセット
character_offset(byte_offset) -> IntegerRuby 3.3 から[permalink][rdoc][edit]

byte_offset に対応する、ソースコード先頭からの文字単位のオフセットを返します。

[PARAM] byte_offset:
バイトオフセット
code_units_cache(encoding) -> Prism::CodeUnitsCacheRuby 3.4 から[permalink][rdoc][edit]

指定したエンコーディングでのコード単位のオフセットを高速に計算するためのキャッシュを生成します。

Prism::Location の cached_start_code_units_offset などのメソッドに、多数の位置に対して繰り返し使うためのキャッシュとして渡します。

[PARAM] encoding:
コード単位の基準となるエンコーディングを指定します。
例
require "prism"

result = Prism.parse("x = \"あい\" + 1\n")
cache = result.source.code_units_cache(Encoding::UTF_16LE)
p cache.class # => Prism::CodeUnitsCache
p cache[9]    # => 7

[SEE_ALSO] Prism::Location#cached_start_code_units_offset, Prism::Result#code_units_cache

code_units_column(byte_offset, encoding) -> IntegerRuby 3.4 から[permalink][rdoc][edit]

byte_offset の位置の、行頭からの指定エンコーディングのコード単位での桁位置を返します。

[PARAM] byte_offset:
バイトオフセット
[PARAM] encoding:
コード単位の基準となるエンコーディング
code_units_offset(byte_offset, encoding) -> IntegerRuby 3.4 から[permalink][rdoc][edit]

byte_offset に対応する、指定エンコーディングのコード単位でのオフセットを返します。UTF-16 のコード単位で位置をやりとりする LSP(Language Server Protocol)などとの連携向けです。

[PARAM] byte_offset:
バイトオフセット
[PARAM] encoding:
コード単位の基準となるエンコーディング
column(byte_offset) -> IntegerRuby 3.3 から[permalink][rdoc][edit]

byte_offset の位置の、行頭からのバイト単位の桁位置(0 origin)を返します。

[PARAM] byte_offset:
バイトオフセット
deep_freeze -> ()Ruby 4.0 から[permalink][rdoc][edit]

self とソースコード文字列を frozen にします。

例
require "prism"

source = Prism.parse("1 + 2").source
source.deep_freeze
p source.frozen?        # => true
p source.source.frozen? # => true

[SEE_ALSO] Prism::Token#deep_freeze

encoding -> EncodingRuby 3.4 から[permalink][rdoc][edit]

ソースコードのエンコーディングを返します。

line(byte_offset) -> IntegerRuby 3.3 から[permalink][rdoc][edit]

byte_offset の位置がある行の行番号を返します。行番号は 1 から始まります。

[PARAM] byte_offset:
バイトオフセット
line_end(byte_offset) -> IntegerRuby 3.4 から[permalink][rdoc][edit]

byte_offset の位置がある行の終端のバイトオフセット(次の行の行頭と同じ位置)を返します。

[PARAM] byte_offset:
バイトオフセット
line_start(byte_offset) -> IntegerRuby 3.3 から[permalink][rdoc][edit]

byte_offset の位置がある行の、行頭のバイトオフセットを返します。

[PARAM] byte_offset:
バイトオフセット
lines -> ArrayRuby 3.4 から[permalink][rdoc][edit]

ソースコードを行ごと(改行を含む)に分割した配列を返します。

offsets -> ArrayRuby 3.3 から[permalink][rdoc][edit]

各行の開始バイトオフセットの配列を返します。末尾にはソースコード全体のバイト数が入ります。

replace_offsets(offsets) -> ()Ruby 4.0 から[permalink][rdoc][edit]

内部で保持している、各行の開始バイトオフセットの配列を offsets に置き換えます。

[PARAM] offsets:
新しい開始バイトオフセットの配列を指定します。
例
require "prism"

source = Prism.parse("1 + 2").source
source.replace_offsets([0, 6])
p source.offsets
# => [0, 6]

[SEE_ALSO] Prism::Source#offsets

replace_start_line(start_line) -> ()Ruby 4.0 から[permalink][rdoc][edit]

開始行の行番号を start_line に置き換えます。

[PARAM] start_line:
新しい開始行の行番号を指定します。
例
require "prism"

source = Prism.parse("1 + 2").source
source.replace_start_line(10)
p source.start_line
# => 10

[SEE_ALSO] Prism::Source#start_line

slice(byte_offset, length) -> StringRuby 3.3 から[permalink][rdoc][edit]

byte_offset から length バイト分のソースコードを返します。

[PARAM] byte_offset:
開始バイトオフセット
[PARAM] length:
バイト数
source -> StringRuby 3.3 から[permalink][rdoc][edit]

ソースコード全体を文字列で返します。

start_line -> IntegerRuby 3.3 から[permalink][rdoc][edit]

先頭行の行番号を返します。通常は 1 です。