Spec-Zone.ru › Ruby 3.4

класс Prism::Source

Родитель:
Объект

Это представляет собой источник кода Ruby, который был проанализирован. Он используется совместно с местоположениями, чтобы разрешить номера строк и диапазоны исходного кода.

Атрибуты

offsets [R]

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

source [R]

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

start_line [R]

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

Открытые методы класса

for (source, start_line = 1, offsets = [])
Исходный код
# 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`, если в исходном коде отсутствуют многобайтовые символы.

new (source, start_line = 1, offsets = [])
Исходный код
# 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

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

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

character_column (byte_offset)
Исходный код
# File lib/prism/parse_result.rb, line 97
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 92
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 125
def code_units_cache(encoding)
  CodeUnitsCache.new(source, encoding)
end

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

code_units_column (byte_offset, encoding)
Исходный код
# 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

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

code_units_offset (byte_offset, encoding)
Исходный код
# 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. Если в других кодировках существует понятие кодовых единиц, отличающееся от количества символов, оно здесь не учитывается.

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

column (byte_offset)
Исходный код
# File lib/prism/parse_result.rb, line 87
def column(byte_offset)
  byte_offset - line_start(byte_offset)
end

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

encoding ()
Исходный код
# File lib/prism/parse_result.rb, line 53
def encoding
  source.encoding
end

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

line (byte_offset)
Исходный код
# File lib/prism/parse_result.rb, line 70
def line(byte_offset)
  start_line + find_line(byte_offset)
end

Бинарный поиск в смещениях для нахождения номера строки для заданного смещения байта.

line_end (byte_offset)
Исходный код
# File lib/prism/parse_result.rb, line 82
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 76
def line_start(byte_offset)
  offsets[find_line(byte_offset)]
end

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

lines ()
Исходный код
# File lib/prism/parse_result.rb, line 58
def lines
  source.lines
end

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

slice (byte_offset, length)
Исходный код
# File lib/prism/parse_result.rb, line 64
def slice(byte_offset, length)
  source.byteslice(byte_offset, length) or raise
end

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

Приватные методы экземпляра

find_line (byte_offset)
Исходный код
# 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.

Spec-Zone.ru

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