class Prism::Node
Это представляет узел в дереве. Это родительский класс всех различных типов узлов.
Атрибуты
Битовая настройка флагов для этого узла. Существуют определенные флаги, общие для всех узлов, а некоторые узлы имеют специфические флаги.
Уникальный идентификатор этого узла. Он используется в очень специфическом случае, когда вы хотите сохранить ссылку на узел, не сохраняя синтаксическое дерево в памяти. Этот уникальный идентификатор будет согласован при нескольких разборах одного и того же исходного кода.
Указатель на исходный код, из которого был создан этот узел.
Открытые методы класса
Исходный код
# File lib/prism/node.rb, line 242
def self.fields
# This method should only be called on subclasses of Node, not Node
# itself.
raise NoMethodError, "undefined method `fields' for #{inspect}" if self == Node
Reflection.fields_for(self)
end Возвращает список полей, которые существуют для этого класса узлов. Поля описывают структуру узла. Такая рефлексия полезна для таких задач, как рекурсивное посещение каждого узла и поля в дереве.
Публичные методы экземпляра
Исходный код
# File lib/prism/node.rb, line 228
def breadth_first_search(&block)
queue = [self] #: Array[Prism::node]
while (node = queue.shift)
return node if yield node
queue.concat(node.compact_child_nodes)
end
nil
end Возвращает первый узел, который соответствует данному блоку при посещении в поиске в ширину. Это полезно для поиска узла, который соответствует определенному условию.
node.breadth_first_search { |node| node.node_id == node_id }
Исходный код
# File lib/prism/node.rb, line 115 def cached_end_code_units_column(cache) location.cached_end_code_units_column(cache) end
Делегирует cached_end_code_units_column связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 83 def cached_end_code_units_offset(cache) location.cached_end_code_units_offset(cache) end
Делегирует cached_end_code_units_offset связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 109 def cached_start_code_units_column(cache) location.cached_start_code_units_column(cache) end
Делегирует cached_start_code_units_column связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 77 def cached_start_code_units_offset(cache) location.cached_start_code_units_offset(cache) end
Делегирует cached_start_code_units_offset связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 130 def comments location.comments end
Делегирует комментарии связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 103 def end_character_column location.end_character_column end
Делегирует end_character_column связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 71 def end_character_offset location.end_character_offset end
Делегирует end_character_offset связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 93 def end_column location.end_column end
Делегирует end_column связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 47 def end_line location.end_line end
Делегирует end_line связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 60 def end_offset location = @location location.is_a?(Location) ? location.end_offset : ((location >> 32) + (location & 0xFFFFFFFF)) end
Конечный смещение узла в исходном коде. Этот метод фактически является делегирующим методом для объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 120 def leading_comments location.leading_comments end
Делегирует leading_comments связанного объекта местоположения.
Исходный код
# File lib/prism/node.rb, line 30 def location location = @location return location if location.is_a?(Location) @location = Location.new(source, location >> 32, location & 0xFFFFFFFF) end
Экземпляр Location, представляющий местоположение этого узла в исходном коде.
Исходный код
# File lib/prism/node.rb, line 161 def newline? flags.anybits?(NodeFlags::NEWLINE) end
Возвращает true, если для узла установлен флаг новой строки.
Исходный код
# File lib/prism/node.rb, line 172
def pretty_print(q)
q.seplist(inspect.chomp.each_line, -> { q.breakable }) do |line|
q.text(line.chomp)
end
q.current_group.break
end Аналогично inspect, но учитывает текущий уровень отступа, заданный объектом pretty print.
Исходный код
# File lib/prism/node.rb, line 24 def save(repository) repository.enter(node_id, :itself) end
Сохраняет этот узел с использованием сохраненного источника, чтобы его можно было получить позже.
Исходный код
# File lib/prism/node.rb, line 37 def save_location(repository) repository.enter(node_id, :location) end
Сохраняет местоположение с использованием сохраненного источника, чтобы его можно было получить позже.
Псевдоним для source_lines, используемый для имитации API из RubyVM::AbstractSyntaxTree, чтобы упростить миграцию.
Исходный код
# File lib/prism/node.rb, line 144 def slice location.slice end
Вырезает расположение узла из исходного кода.
Исходный код
# File lib/prism/node.rb, line 151 def slice_lines location.slice_lines end
Вырезает расположение узла из исходного кода, начиная с начала строки, в которой расположение начинается, и заканчивая концом строки, в которой расположение заканчивается.
Исходный код
# File lib/prism/node.rb, line 135 def source_lines location.source_lines end
Возвращает все строки исходного кода, связанные с этим узлом.
Исходный код
# File lib/prism/node.rb, line 98 def start_character_column location.start_character_column end
Делегирует вызов к методу start_character_column связанного объекта расположения.
Исходный код
# File lib/prism/node.rb, line 66 def start_character_offset location.start_character_offset end
Делегирует вызов к методу start_character_offset связанного объекта расположения.
Исходный код
# File lib/prism/node.rb, line 88 def start_column location.start_column end
Делегирует вызов к методу start_column связанного объекта расположения.
Исходный код
# File lib/prism/node.rb, line 42 def start_line location.start_line end
Делегирует вызов к методу start_line связанного объекта расположения.
Исходный код
# File lib/prism/node.rb, line 53 def start_offset location = @location location.is_a?(Location) ? location.start_offset : location >> 32 end
Начальное смещение узла в исходном коде. Этот метод фактически является делегированным методом к объекту расположения.
Исходный код
# File lib/prism/node.rb, line 166 def static_literal? flags.anybits?(NodeFlags::STATIC_LITERAL) end
Возвращает true, если для узла установлен флаг статического литерала.
Исходный код
# File lib/prism/node.rb, line 180
def to_dot
# @type self: node
DotVisitor.new.tap { |visitor| accept(visitor) }.to_dot
end Преобразует этот узел в строку графа graphviz dot.
Исходный код
# File lib/prism/node.rb, line 125 def trailing_comments location.trailing_comments end
Делегирует вызов к методу trailing_comments связанного объекта расположения.
Исходный код
# File lib/prism/node.rb, line 191
def tunnel(line, column)
queue = [self] #: Array[Prism::node]
result = [] #: Array[Prism::node]
while (node = queue.shift)
result << node
node.compact_child_nodes.each do |child_node|
child_location = child_node.location
start_line = child_location.start_line
end_line = child_location.end_line
if start_line == end_line
if line == start_line && column >= child_location.start_column && column < child_location.end_column
queue << child_node
break
end
elsif (line == start_line && column >= child_location.start_column) || (line == end_line && column < child_location.end_column)
queue << child_node
break
elsif line > start_line && line < end_line
queue << child_node
break
end
end
end
result
end Возвращает список узлов, которые являются потомками этого узла и содержат заданную строку и столбец. Это полезно для поиска узла, выбранного на основе строки и столбца исходного кода.
Важно отметить, что столбец, предоставленный этому методу, должен быть в байтах, а не в символах или кодовых единицах.
Интерфейс узла
↑ верхОбщедоступные методы класса
Исходный код
# File lib/prism/node.rb, line 307
def self.type
raise NoMethodError, "undefined method `type' for #{inspect}"
end Аналогично type, этот метод возвращает символ, который можно использовать для разделения по типу узла, не прибегая к длинной цепочке ===. Обратите внимание, что, как и type, он по-прежнему будет медленнее, чем использование == для одного класса, но должен быть быстрее в операторе case или сравнении массивов.
Общедоступные методы экземпляра
Исходный код
# File lib/prism/node.rb, line 258
def accept(visitor)
raise NoMethodError, "undefined method `accept' for #{inspect}"
end Принимает посетителя и вызывает специализированную функцию посещения.
Исходный код
# File lib/prism/node.rb, line 264
def child_nodes
raise NoMethodError, "undefined method `child_nodes' for #{inspect}"
end Возвращает массив дочерних узлов, включая ‘nil` в качестве необязательных узлов, которых не было.
Исходный код
# File lib/prism/node.rb, line 278
def comment_targets
raise NoMethodError, "undefined method `comment_targets' for #{inspect}"
end Возвращает массив дочерних узлов и расположений, к которым могут быть прикреплены комментарии.
Исходный код
# File lib/prism/node.rb, line 272
def compact_child_nodes
raise NoMethodError, "undefined method `compact_child_nodes' for #{inspect}"
end Возвращает массив дочерних узлов, исключая любые ‘nil` в качестве необязательных узлов, которых не было.
Исходный код
# File lib/prism/node.rb, line 283
def inspect
raise NoMethodError, "undefined method `inspect' for #{inspect}"
end Возвращает строковое представление узла.
Исходный код
# File lib/prism/node.rb, line 299
def type
raise NoMethodError, "undefined method `type' for #{inspect}"
end Иногда нужно проверить экземпляр узла на соответствие списку классов, чтобы определить, какое поведение выполнить. Обычно это делается, вызывая `[cls1, cls2].include?(node.class)` или помещая узел в оператор case и выполняя `case node; when cls1; when cls2; end`. Оба этих подхода относительно медленные из-за постоянных поисков, вызовов методов и/или выделений массивов.
Вместо этого можно вызвать type, который вернет символ для сравнения. Это быстрее, чем другие подходы, потому что использует одно целочисленное сравнение, а также потому, что в CRuby можно воспользоваться тем, что операторы case со всеми символьными ключами используют таблицу переходов.
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.