Spec-Zone.ru › Ruby 3.3

класс Prism::RipperCompat

Родитель:
Visitor

Примечание: Эта интеграция не завершена и поэтому до сих пор имеет много несоответствий с Ripper. Если вы хотите помочь, pull запросы будут очень оценены!

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

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

Для использования этого класса, вы эффективно используете «Prism::RipperCompat» так же, как и класс `Ripper`.

Атрибуты

column[R]

Текущее число столбца анализатора.

lineno[R]

Текущее число строки анализатора.

source[R]

Источник, который анализируется.

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

new(source) Показать исходный код
# File lib/prism/ripper_compat.rb, line 74
def initialize(source)
  @source = source
  @result = nil
  @lineno = nil
  @column = nil
end

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

sexp(source) Показать исходный код
# File lib/prism/ripper_compat.rb, line 171
def self.sexp(source)
  SexpBuilderPP.new(source).parse
end

Это вспомогательный метод, который запускает парсер подкласса SexpBuilderPP.

sexp_raw(source) Показать исходный код
# File lib/prism/ripper_compat.rb, line 166
def self.sexp_raw(source)
  SexpBuilder.new(source).parse
end

Это вспомогательный метод, который запускает парсер подкласса SexpBuilder.

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

error?() Показать исходный код
# File lib/prism/ripper_compat.rb, line 86
def error?
  result.failure?
end

Истина, если во время парсинга парсер столкнулся с ошибкой.

parse() Показать исходный код
# File lib/prism/ripper_compat.rb, line 91
def parse
  result.magic_comments.each do |magic_comment|
    on_magic_comment(magic_comment.key, magic_comment.value)
  end

  if error?
    result.errors.each do |error|
      on_parse_error(error.message)
    end
  else
    result.value.accept(self)
  end
end

Проанализировать исходный код и вернуть результат.

visit_call_node(node) Показать исходный код
# File lib/prism/ripper_compat.rb, line 110
def visit_call_node(node)
  if !node.message.match?(/^[[:alpha:]_]/) && node.opening_loc.nil? && node.arguments&.arguments&.length == 1
    left = visit(node.receiver)
    right = visit(node.arguments.arguments.first)

    bounds(node.location)
    on_binary(left, node.name, right)
  else
    raise NotImplementedError
  end
end

Посетить узел CallNode.

visit_float_node(node) Показать исходный код
# File lib/prism/ripper_compat.rb, line 123
def visit_float_node(node)
  bounds(node.location)
  on_float(node.slice)
end

Посетить узел FloatNode.

visit_imaginary_node(node) Показать исходный код
# File lib/prism/ripper_compat.rb, line 129
def visit_imaginary_node(node)
  bounds(node.location)
  on_imaginary(node.slice)
end

Посетить узел ImaginaryNode.

visit_integer_node(node) Показать исходный код
# File lib/prism/ripper_compat.rb, line 135
def visit_integer_node(node)
  bounds(node.location)
  on_int(node.slice)
end

Посетить узел IntegerNode.

visit_program_node(node) Показать исходный код
# File lib/prism/ripper_compat.rb, line 155
def visit_program_node(node)
  statements = visit(node.statements)
  bounds(node.location)
  on_program(statements)
end

Посетить узел ProgramNode.

visit_rational_node(node) Показать исходный код
# File lib/prism/ripper_compat.rb, line 141
def visit_rational_node(node)
  bounds(node.location)
  on_rational(node.slice)
end

Посетить узел RationalNode.

visit_statements_node(node) Показать исходный код
# File lib/prism/ripper_compat.rb, line 147
def visit_statements_node(node)
  bounds(node.location)
  node.body.inject(on_stmts_new) do |stmts, stmt|
    on_stmts_add(stmts, visit(stmt))
  end
end

Посетить узел StatementsNode.

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

bounds(location) Показать исходный код
# File lib/prism/ripper_compat.rb, line 182
def bounds(location)
  @lineno = location.start_line
  @column = location.start_column
end

Этот метод отвечает за обновление информации о строке и столбце для отражения текущего узла.

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

result() Показать исходный код
# File lib/prism/ripper_compat.rb, line 188
def result
  @result ||= Prism.parse(source)
end

Ленивая инициализация результата парсинга.

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

Spec-Zone.ru

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