Spec-Zone.ru › Ruby 3.4
  1. Prism::
  2. Исходный код

class Prism::Source

Родительский класс:
Object

Представляет исходный код на Ruby, который был разобран. Используется вместе с позициями, чтобы определять номера строк и диапазоны исходного кода.

Атрибуты

offsets [R]

Список байтовых смещений символов новой строки в исходном коде.

source [R]

Исходный код, представленный этим объектом source.

start_line [R]

Номер строки, с которой начинается этот исходный код.

Общедоступные методы класса

for (source, start_line = 1, offsets = []) Показать исходный код
# File lib/prism/parse_result.rb, line 13
def self.for(source, start_line = 1, offsets = [])
  if source.ascii_only?
    ASCIISource.new(source, start_line, offsets)
  elsif source.encoding == Encoding::BINARY
    source.force_encoding(Encoding::UTF_8)

    if source.valid_encoding?
      new(source, start_line, offsets)
    else
      # This is an extremely niche use case where the file is marked as
      # binary, contains multi-byte characters, and those characters are not
      # valid UTF-8. In this case we'll mark it as binary and fall back to
      # treating everything as a single-byte character. This _may_ cause
      # problems when asking for code units, but it appears to be the
      # cleanest solution at the moment.
      source.force_encoding(Encoding::BINARY)
      ASCIISource.new(source, start_line, offsets)
    end
  else
    new(source, start_line, offsets)
  end
end

Создаёт новый объект source с указанным исходным кодом. Этот метод следует использовать вместо new; он вернёт либо Source, либо специализированный и более производительный объект ASCIISource, если исходный код не содержит многобайтовых символов.

new (source, start_line = 1, offsets = []) Показать исходный код
# File lib/prism/parse_result.rb, line 46
def initialize(source, start_line = 1, offsets = [])
  @source = source
  @start_line = start_line # set after parsing is done
  @offsets = offsets # set after parsing is done
end

Создаёт новый объект source с указанным исходным кодом.

Общедоступные методы экземпляра

character_column (byte_offset) Показать исходный код
# File lib/prism/parse_result.rb, line 108
def character_column(byte_offset)
  character_offset(byte_offset) - character_offset(line_start(byte_offset))
end

Возвращает номер столбца в символах для указанного байтового смещения.

character_offset (byte_offset) Показать исходный код
# File lib/prism/parse_result.rb, line 103
def character_offset(byte_offset)
  (source.byteslice(0, byte_offset) or raise).length
end

Возвращает смещение в символах для указанного байтового смещения.

code_units_cache (encoding) Показать исходный код
# File lib/prism/parse_result.rb, line 136
def code_units_cache(encoding)
  CodeUnitsCache.new(source, encoding)
end

Создаёт кэш для заданной кодировки, используемый при вычислении смещений в кодовых единицах.

code_units_column (byte_offset, encoding) Показать исходный код
# File lib/prism/parse_result.rb, line 142
def code_units_column(byte_offset, encoding)
  code_units_offset(byte_offset, encoding) - code_units_offset(line_start(byte_offset), encoding)
end

Возвращает номер столбца в кодовых единицах для указанной кодировки и заданного байтового смещения.

code_units_offset (byte_offset, encoding) Показать исходный код
# File lib/prism/parse_result.rb, line 124
def code_units_offset(byte_offset, encoding)
  byteslice = (source.byteslice(0, byte_offset) or raise).encode(encoding, invalid: :replace, undef: :replace)

  if encoding == Encoding::UTF_16LE || encoding == Encoding::UTF_16BE
    byteslice.bytesize / 2
  else
    byteslice.length
  end
end

Возвращает смещение от начала файла для заданного байтового смещения, подсчитанное в кодовых единицах указанной кодировки.

Этот метод протестирован с UTF-8, UTF-16 и UTF-32. Понятия кодовых единиц, отличающегося от числа символов в других кодировках, здесь не учитываются.

При таком преобразовании недопустимые и неопределённые символы намеренно заменяются символами замены. Это происходит по двум причинам. Во-первых, заданное байтовое смещение может не совпадать с границей символа. Во-вторых, исходный код может содержать символ, которому нет эквивалента в указанной кодировке.

column (byte_offset) Показать исходный код
# File lib/prism/parse_result.rb, line 98
def column(byte_offset)
  byte_offset - line_start(byte_offset)
end

Возвращает номер столбца для указанного байтового смещения.

deep_freeze () Показать исходный код
# File lib/prism/parse_result.rb, line 147
def deep_freeze
  source.freeze
  offsets.freeze
  freeze
end

Замораживает этот объект и содержащиеся в нём объекты.

encoding () Показать исходный код
# File lib/prism/parse_result.rb, line 64
def encoding
  source.encoding
end

Возвращает кодировку исходного кода, заданную параметрами парсера или магическим комментарием кодировки.

line (byte_offset) Показать исходный код
# File lib/prism/parse_result.rb, line 81
def line(byte_offset)
  start_line + find_line(byte_offset)
end

Выполняет двоичный поиск по смещениям, чтобы найти номер строки для указанного байтового смещения.

line_end (byte_offset) Показать исходный код
# File lib/prism/parse_result.rb, line 93
def line_end(byte_offset)
  offsets[find_line(byte_offset) + 1] || source.bytesize
end

Возвращает байтовое смещение конца строки, соответствующей указанному байтовому смещению.

line_start (byte_offset) Показать исходный код
# File lib/prism/parse_result.rb, line 87
def line_start(byte_offset)
  offsets[find_line(byte_offset)]
end

Возвращает байтовое смещение начала строки, соответствующей указанному байтовому смещению.

lines () Показать исходный код
# File lib/prism/parse_result.rb, line 69
def lines
  source.lines
end

Возвращает строки исходного кода в виде массива строк.

replace_offsets (offsets) Показать исходный код
# File lib/prism/parse_result.rb, line 58
def replace_offsets(offsets)
  @offsets.replace(offsets)
end

Заменяет значение offsets указанным значением.

replace_start_line (start_line) Показать исходный код
# File lib/prism/parse_result.rb, line 53
def replace_start_line(start_line)
  @start_line = start_line
end

Заменяет значение start_line указанным значением.

slice (byte_offset, length) Показать исходный код
# File lib/prism/parse_result.rb, line 75
def slice(byte_offset, length)
  source.byteslice(byte_offset, length) or raise
end

Извлекает фрагмент исходного кода по байтам, используя заданные байтовое смещение и длину в байтах.

Закрытые методы экземпляра

find_line (byte_offset) Показать исходный код
# File lib/prism/parse_result.rb, line 157
def find_line(byte_offset)
  left = 0
  right = offsets.length - 1

  while left <= right
    mid = left + (right - left) / 2
    return mid if (offset = offsets[mid]) == byte_offset

    if offset < byte_offset
      left = mid + 1
    else
      right = mid - 1
    end
  end

  left - 1
end

Выполняет двоичный поиск по смещениям, чтобы найти номер строки для указанного байтового смещения.

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API