class Prism::Source
Этот класс представляет источник кода Ruby, который был разобран. Он используется вместе с позициями, чтобы определять номера строк и диапазоны исходного кода.
Атрибуты
Список смещений байтов символов новой строки в исходном коде.
Исходный код, представленный этим объектом source.
Номер строки, с которой начинается этот источник.
Публичные методы класса
# 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, если исходный код не содержит многобайтовых символов.
# 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 с указанным исходным кодом.
Публичные методы экземпляра
# File lib/prism/parse_result.rb, line 108 def character_column(byte_offset) character_offset(byte_offset) - character_offset(line_start(byte_offset)) end
Возвращает номер столбца в символах для указанного смещения в байтах.
# File lib/prism/parse_result.rb, line 103 def character_offset(byte_offset) (source.byteslice(0, byte_offset) or raise).length end
Возвращает смещение в символах для указанного смещения в байтах.
# File lib/prism/parse_result.rb, line 136 def code_units_cache(encoding) CodeUnitsCache.new(source, encoding) end
Создаёт кэш для конкретной кодировки, используемый при вычислении смещений в кодовых единицах.
# 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
Возвращает номер столбца в кодовых единицах для указанной кодировки и смещения в байтах.
# 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. Если в других кодировках существует понятие кодовых единиц, отличающееся от количества символов, здесь оно не учитывается.
При преобразовании мы намеренно заменяем недопустимые и неопределённые символы символами замены. Это происходит по двум причинам. Во-первых, указанное смещение в байтах может не совпадать с границей символа. Во-вторых, исходный код может содержать символ, которому нет соответствия в указанной кодировке.
# File lib/prism/parse_result.rb, line 98 def column(byte_offset) byte_offset - line_start(byte_offset) end
Возвращает номер столбца для указанного смещения в байтах.
# File lib/prism/parse_result.rb, line 147 def deep_freeze source.freeze offsets.freeze freeze end
Замораживает этот объект и содержащиеся в нём объекты.
# File lib/prism/parse_result.rb, line 64 def encoding source.encoding end
Возвращает кодировку исходного кода, заданную параметрами парсера или магическим комментарием кодировки.
# File lib/prism/parse_result.rb, line 81 def line(byte_offset) start_line + find_line(byte_offset) end
Выполняет двоичный поиск по смещениям, чтобы найти номер строки для указанного смещения в байтах.
# File lib/prism/parse_result.rb, line 93 def line_end(byte_offset) offsets[find_line(byte_offset) + 1] || source.bytesize end
Возвращает смещение в байтах конца строки, соответствующей указанному смещению в байтах.
# File lib/prism/parse_result.rb, line 87 def line_start(byte_offset) offsets[find_line(byte_offset)] end
Возвращает смещение в байтах начала строки, соответствующей указанному смещению в байтах.
# File lib/prism/parse_result.rb, line 69 def lines source.lines end
Возвращает строки исходного кода в виде массива строк.
# File lib/prism/parse_result.rb, line 58 def replace_offsets(offsets) @offsets.replace(offsets) end
Заменяет значение offsets указанным значением.
# File lib/prism/parse_result.rb, line 53 def replace_start_line(start_line) @start_line = start_line end
Заменяет значение start_line указанным значением.
# File lib/prism/parse_result.rb, line 75 def slice(byte_offset, length) source.byteslice(byte_offset, length) or raise end
Выполняет срез исходного кода по байтам, используя указанное смещение в байтах и длину в байтах.
Приватные методы экземпляра
# 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.