Spec-Zone.ru › Ruby 3.4

class Prism::Node

Родитель:
Object

Это представляет узел в дереве. Это родительский класс всех различных типов узлов.

Атрибуты

flags [R]

Битовая настройка флагов для этого узла. Существуют определенные флаги, общие для всех узлов, а некоторые узлы имеют специфические флаги.

node_id [R]

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

source [R]

Указатель на исходный код, из которого был создан этот узел.

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

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

Возвращает список полей, которые существуют для этого класса узлов. Поля описывают структуру узла. Такая рефлексия полезна для таких задач, как рекурсивное посещение каждого узла и поля в дереве.

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

breadth_first_search () { |node| ... }
Исходный код
# 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 }
cached_end_code_units_column (cache)
Исходный код
# 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 связанного объекта местоположения.

cached_end_code_units_offset (cache)
Исходный код
# 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 связанного объекта местоположения.

cached_start_code_units_column (cache)
Исходный код
# 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 связанного объекта местоположения.

cached_start_code_units_offset (cache)
Исходный код
# 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 связанного объекта местоположения.

comments ()
Исходный код
# File lib/prism/node.rb, line 130
def comments
  location.comments
end

Делегирует комментарии связанного объекта местоположения.

end_character_column ()
Исходный код
# File lib/prism/node.rb, line 103
def end_character_column
  location.end_character_column
end

Делегирует end_character_column связанного объекта местоположения.

end_character_offset ()
Исходный код
# File lib/prism/node.rb, line 71
def end_character_offset
  location.end_character_offset
end

Делегирует end_character_offset связанного объекта местоположения.

end_column ()
Исходный код
# File lib/prism/node.rb, line 93
def end_column
  location.end_column
end

Делегирует end_column связанного объекта местоположения.

end_line ()
Исходный код
# File lib/prism/node.rb, line 47
def end_line
  location.end_line
end

Делегирует end_line связанного объекта местоположения.

end_offset ()
Исходный код
# File lib/prism/node.rb, line 60
def end_offset
  location = @location
  location.is_a?(Location) ? location.end_offset : ((location >> 32) + (location & 0xFFFFFFFF))
end

Конечный смещение узла в исходном коде. Этот метод фактически является делегирующим методом для объекта местоположения.

leading_comments ()
Исходный код
# File lib/prism/node.rb, line 120
def leading_comments
  location.leading_comments
end

Делегирует leading_comments связанного объекта местоположения.

location ()
Исходный код
# 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, представляющий местоположение этого узла в исходном коде.

newline? ()
Исходный код
# File lib/prism/node.rb, line 161
def newline?
  flags.anybits?(NodeFlags::NEWLINE)
end

Возвращает true, если для узла установлен флаг новой строки.

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

save (repository)
Исходный код
# File lib/prism/node.rb, line 24
def save(repository)
  repository.enter(node_id, :itself)
end

Сохраняет этот узел с использованием сохраненного источника, чтобы его можно было получить позже.

save_location (repository)
Исходный код
# File lib/prism/node.rb, line 37
def save_location(repository)
  repository.enter(node_id, :location)
end

Сохраняет местоположение с использованием сохраненного источника, чтобы его можно было получить позже.

script_lines ()

Псевдоним для source_lines, используемый для имитации API из RubyVM::AbstractSyntaxTree, чтобы упростить миграцию.

Псевдоним для: source_lines
slice ()
Исходный код
# File lib/prism/node.rb, line 144
def slice
  location.slice
end

Вырезает расположение узла из исходного кода.

slice_lines ()
Исходный код
# File lib/prism/node.rb, line 151
def slice_lines
  location.slice_lines
end

Вырезает расположение узла из исходного кода, начиная с начала строки, в которой расположение начинается, и заканчивая концом строки, в которой расположение заканчивается.

source_lines ()
Исходный код
# File lib/prism/node.rb, line 135
def source_lines
  location.source_lines
end

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

Также псевдоним для: script_lines
start_character_column ()
Исходный код
# File lib/prism/node.rb, line 98
def start_character_column
  location.start_character_column
end

Делегирует вызов к методу start_character_column связанного объекта расположения.

start_character_offset ()
Исходный код
# File lib/prism/node.rb, line 66
def start_character_offset
  location.start_character_offset
end

Делегирует вызов к методу start_character_offset связанного объекта расположения.

start_column ()
Исходный код
# File lib/prism/node.rb, line 88
def start_column
  location.start_column
end

Делегирует вызов к методу start_column связанного объекта расположения.

start_line ()
Исходный код
# File lib/prism/node.rb, line 42
def start_line
  location.start_line
end

Делегирует вызов к методу start_line связанного объекта расположения.

start_offset ()
Исходный код
# File lib/prism/node.rb, line 53
def start_offset
  location = @location
  location.is_a?(Location) ? location.start_offset : location >> 32
end

Начальное смещение узла в исходном коде. Этот метод фактически является делегированным методом к объекту расположения.

static_literal? ()
Исходный код
# File lib/prism/node.rb, line 166
def static_literal?
  flags.anybits?(NodeFlags::STATIC_LITERAL)
end

Возвращает true, если для узла установлен флаг статического литерала.

to_dot ()
Исходный код
# File lib/prism/node.rb, line 180
def to_dot
  # @type self: node
  DotVisitor.new.tap { |visitor| accept(visitor) }.to_dot
end

Преобразует этот узел в строку графа graphviz dot.

trailing_comments ()
Исходный код
# File lib/prism/node.rb, line 125
def trailing_comments
  location.trailing_comments
end

Делегирует вызов к методу trailing_comments связанного объекта расположения.

tunnel (line, column)
Исходный код
# 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

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

Важно отметить, что столбец, предоставленный этому методу, должен быть в байтах, а не в символах или кодовых единицах.

Интерфейс узла

↑ верх

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

type ()
Исходный код
# File lib/prism/node.rb, line 307
def self.type
  raise NoMethodError, "undefined method `type' for #{inspect}"
end

Аналогично type, этот метод возвращает символ, который можно использовать для разделения по типу узла, не прибегая к длинной цепочке ===. Обратите внимание, что, как и type, он по-прежнему будет медленнее, чем использование == для одного класса, но должен быть быстрее в операторе case или сравнении массивов.

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

accept (visitor)
Исходный код
# File lib/prism/node.rb, line 258
def accept(visitor)
  raise NoMethodError, "undefined method `accept' for #{inspect}"
end

Принимает посетителя и вызывает специализированную функцию посещения.

child_nodes ()
Исходный код
# File lib/prism/node.rb, line 264
def child_nodes
  raise NoMethodError, "undefined method `child_nodes' for #{inspect}"
end

Возвращает массив дочерних узлов, включая ‘nil` в качестве необязательных узлов, которых не было.

Также переименован как: deconstruct
comment_targets ()
Исходный код
# File lib/prism/node.rb, line 278
def comment_targets
  raise NoMethodError, "undefined method `comment_targets' for #{inspect}"
end

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

compact_child_nodes ()
Исходный код
# File lib/prism/node.rb, line 272
def compact_child_nodes
  raise NoMethodError, "undefined method `compact_child_nodes' for #{inspect}"
end

Возвращает массив дочерних узлов, исключая любые ‘nil` в качестве необязательных узлов, которых не было.

deconstruct ()
Псевдоним для: child_nodes
inspect ()
Исходный код
# File lib/prism/node.rb, line 283
def inspect
  raise NoMethodError, "undefined method `inspect' for #{inspect}"
end

Возвращает строковое представление узла.

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

Spec-Zone.ru

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