Spec-Zone.ru › Ruby 4.0
  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)
  index = offsets.bsearch_index { |offset| offset > byte_offset } || offsets.length
  index - 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