класс Prism::RipperCompat
Примечание: Эта интеграция не завершена и поэтому до сих пор имеет много несоответствий с Ripper. Если вы хотите помочь, pull запросы будут очень оценены!
Этот класс предназначен для обеспечения совместимости между prism и Ripper. Он работает, сначала проанализировав всё дерево, а затем пройдясь по нему и выполняя каждый из Ripper обратных вызовов по мере продвижения.
Этот класс неизбежно будет медленнее, чем родной Ripper API. Он предназначен как временное решение до тех пор, пока разработчики не перейдут на использование prism. Он также предназначен как тестовая среда для анализатора prism.
Для использования этого класса, вы эффективно используете «Prism::RipperCompat» так же, как и класс `Ripper`.
Атрибуты
Текущее число столбца анализатора.
Текущее число строки анализатора.
Источник, который анализируется.
Общедоступные методы класса
# File lib/prism/ripper_compat.rb, line 74 def initialize(source) @source = source @result = nil @lineno = nil @column = nil end
Создать новый объект RipperCompat с заданным источником.
# File lib/prism/ripper_compat.rb, line 171 def self.sexp(source) SexpBuilderPP.new(source).parse end
Это вспомогательный метод, который запускает парсер подкласса SexpBuilderPP.
# File lib/prism/ripper_compat.rb, line 166 def self.sexp_raw(source) SexpBuilder.new(source).parse end
Это вспомогательный метод, который запускает парсер подкласса SexpBuilder.
Общедоступные методы экземпляра
# File lib/prism/ripper_compat.rb, line 86 def error? result.failure? end
Истина, если во время парсинга парсер столкнулся с ошибкой.
# 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 Проанализировать исходный код и вернуть результат.
# 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.
# File lib/prism/ripper_compat.rb, line 123 def visit_float_node(node) bounds(node.location) on_float(node.slice) end
Посетить узел FloatNode.
# File lib/prism/ripper_compat.rb, line 129 def visit_imaginary_node(node) bounds(node.location) on_imaginary(node.slice) end
Посетить узел ImaginaryNode.
# File lib/prism/ripper_compat.rb, line 135 def visit_integer_node(node) bounds(node.location) on_int(node.slice) end
Посетить узел IntegerNode.
# 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.
# File lib/prism/ripper_compat.rb, line 141 def visit_rational_node(node) bounds(node.location) on_rational(node.slice) end
Посетить узел RationalNode.
# 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.
Закрытые методы экземпляра
# File lib/prism/ripper_compat.rb, line 182 def bounds(location) @lineno = location.start_line @column = location.start_column end
Этот метод отвечает за обновление информации о строке и столбце для отражения текущего узла.
Этот метод можно значительно улучшить, добавив кеширование в начале каждой строки, но пока он достаточно хороший.
# 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.