класс Prism::Source
Это представляет собой источник кода Ruby, который был проанализирован. Он используется совместно с местоположениями, чтобы разрешить номера строк и диапазоны исходного кода.
Атрибуты
Список смещений байтов символов новой строки в исходном коде.
Исходный код, который представляет этот объект источника.
Номер строки, с которой начинается этот источник.
Открытые методы класса
Исходный код
# File lib/prism/parse_result.rb, line 12
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 Создайте новый объект источника с заданным исходным кодом. Этот метод должен использоваться вместо «new», и он вернет либо `Source`, либо специализированный и более производительный `ASCIISource`, если в исходном коде отсутствуют многобайтовые символы.
Исходный код
# File lib/prism/parse_result.rb, line 45 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
Создайте новый объект источника с заданным исходным кодом.
Открытые методы экземпляра
Исходный код
# File lib/prism/parse_result.rb, line 97 def character_column(byte_offset) character_offset(byte_offset) - character_offset(line_start(byte_offset)) end
Возвращает номер столбца в символах для заданного смещения байта.
Исходный код
# File lib/prism/parse_result.rb, line 92 def character_offset(byte_offset) (source.byteslice(0, byte_offset) or raise).length end
Возвращает смещение символа для заданного смещения байта.
Исходный код
# File lib/prism/parse_result.rb, line 125 def code_units_cache(encoding) CodeUnitsCache.new(source, encoding) end
Генерирует кэш, ориентированный на определенную кодировку для вычисления смещений кодовых единиц.
Исходный код
# File lib/prism/parse_result.rb, line 131 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 113
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 87 def column(byte_offset) byte_offset - line_start(byte_offset) end
Возвращает номер столбца для заданного смещения байта.
Исходный код
# File lib/prism/parse_result.rb, line 53 def encoding source.encoding end
Возвращает кодировку исходного кода, которая устанавливается параметрами анализатора или комментарием кодировки magic.
Исходный код
# File lib/prism/parse_result.rb, line 70 def line(byte_offset) start_line + find_line(byte_offset) end
Бинарный поиск в смещениях для нахождения номера строки для заданного смещения байта.
Исходный код
# File lib/prism/parse_result.rb, line 82 def line_end(byte_offset) offsets[find_line(byte_offset) + 1] || source.bytesize end
Возвращает смещение байта конца строки, соответствующей заданному смещению байта.
Исходный код
# File lib/prism/parse_result.rb, line 76 def line_start(byte_offset) offsets[find_line(byte_offset)] end
Возвращает смещение байта начала строки, соответствующей заданному смещению байта.
Исходный код
# File lib/prism/parse_result.rb, line 58 def lines source.lines end
Возвращает строки исходного кода в виде массива строк.
Исходный код
# File lib/prism/parse_result.rb, line 64 def slice(byte_offset, length) source.byteslice(byte_offset, length) or raise end
Выполняет срез байтов в исходном коде с использованием заданного смещения байта и длины байта.
Приватные методы экземпляра
Исходный код
# File lib/prism/parse_result.rb, line 139
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–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.