class Prism::Node
Dies repräsentiert einen Knoten im Baum. Es ist die Oberklasse aller verschiedenen Knotentypen.
Attribute
Eine Bitmaske von Flags für diesen Knoten. Es gibt bestimmte Flags, die für alle Knoten üblich sind, und dann haben einige Knoten spezifische Flags.
Eine eindeutige Kennung für diesen Knoten. Diese wird in einem sehr spezifischen Anwendungsfall verwendet, bei dem Sie eine Referenz auf einen Knoten beibehalten möchten, ohne den Syntaxbaum im Speicher behalten zu müssen. Diese eindeutige Kennung ist über mehrere Analysen desselben Quellcodes hinweg konsistent.
Ein Zeiger auf die Quelle, aus der dieser Knoten erstellt wurde.
Öffentliche Klassenmethoden
Source
# File lib/prism/node.rb, line 245 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
Gibt eine Liste der Felder zurück, die für diese Knotenklasse existieren. Felder beschreiben die Struktur des Knotens. Diese Art von Reflexion ist nützlich für Dinge wie das rekursive Durchlaufen jedes Knotens *und* Feldes im Baum.
Öffentliche Instanzmethoden
Source
# File lib/prism/node.rb, line 231 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
Gibt den ersten Knoten zurück, der dem angegebenen Block entspricht, wenn er in einer Tiefensuche durchlaufen wird. Dies ist nützlich, um einen Knoten zu finden, der einer bestimmten Bedingung entspricht.
node.breadth_first_search { |node| node.node_id == node_id }
Source
# File lib/prism/node.rb, line 118 def cached_end_code_units_column(cache) location.cached_end_code_units_column(cache) end
Delegiert an die cached_end_code_units_column des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 86 def cached_end_code_units_offset(cache) location.cached_end_code_units_offset(cache) end
Delegiert an die cached_end_code_units_offset des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 112 def cached_start_code_units_column(cache) location.cached_start_code_units_column(cache) end
Delegiert an die cached_start_code_units_column des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 80 def cached_start_code_units_offset(cache) location.cached_start_code_units_offset(cache) end
Delegiert an die cached_start_code_units_offset des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 133 def comments location.comments end
Delegiert an die Kommentare des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 106 def end_character_column location.end_character_column end
Delegiert an die end_character_column des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 74 def end_character_offset location.end_character_offset end
Delegiert an die end_character_offset des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 96 def end_column location.end_column end
Delegiert an die end_column des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 50 def end_line location.end_line end
Delegiert an die end_line des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 63 def end_offset location = @location location.is_a?(Location) ? location.end_offset : ((location >> 32) + (location & 0xFFFFFFFF)) end
Der End-Offset des Knotens in der Quelle. Diese Methode ist effektiv eine Delegierungsmethode an das Standortobjekt.
Source
# File lib/prism/node.rb, line 123 def leading_comments location.leading_comments end
Delegiert an die leading_comments des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 33 def location location = @location return location if location.is_a?(Location) @location = Location.new(source, location >> 32, location & 0xFFFFFFFF) end
Eine Location-Instanz, die den Standort dieses Knotens in der Quelle repräsentiert.
Source
# File lib/prism/node.rb, line 164 def newline? flags.anybits?(NodeFlags::NEWLINE) end
Gibt true zurück, wenn das Newline-Flag für den Knoten gesetzt ist.
Source
# File lib/prism/node.rb, line 175 def pretty_print(q) q.seplist(inspect.chomp.each_line, -> { q.breakable }) do |line| q.text(line.chomp) end q.current_group.break end
Ähnlich wie inspect, respektiert aber die aktuelle Einrückungsebene, die vom pretty print-Objekt vorgegeben wird.
Source
# File lib/prism/node.rb, line 27 def save(repository) repository.enter(node_id, :itself) end
Speichert diesen Knoten mithilfe einer gespeicherten Quelle, damit er später abgerufen werden kann.
Source
# File lib/prism/node.rb, line 40 def save_location(repository) repository.enter(node_id, :location) end
Speichert den Standort mithilfe einer gespeicherten Quelle, damit er später abgerufen werden kann.
Ein Alias für source_lines, der verwendet wird, um die API von RubyVM::AbstractSyntaxTree zu imitieren und die Migration zu erleichtern.
Source
# File lib/prism/node.rb, line 147 def slice location.slice end
Schneidet den Standort des Knotens aus der Quelle aus.
Source
# File lib/prism/node.rb, line 154 def slice_lines location.slice_lines end
Schneidet den Standort des Knotens aus der Quelle aus, beginnend am Anfang der Zeile, in der der Standort beginnt, und endend am Ende der Zeile, in der der Standort endet.
Source
# File lib/prism/node.rb, line 138 def source_lines location.source_lines end
Gibt alle Zeilen des Quellcodes zurück, die diesem Knoten zugeordnet sind.
Source
# File lib/prism/node.rb, line 101 def start_character_column location.start_character_column end
Delegiert an die start_character_column des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 69 def start_character_offset location.start_character_offset end
Delegiert an die start_character_offset des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 91 def start_column location.start_column end
Delegiert an die start_column des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 45 def start_line location.start_line end
Delegiert an die start_line des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 56 def start_offset location = @location location.is_a?(Location) ? location.start_offset : location >> 32 end
Der Start-Offset des Knotens in der Quelle. Diese Methode ist effektiv eine Delegierungsmethode an das Standortobjekt.
Source
# File lib/prism/node.rb, line 169 def static_literal? flags.anybits?(NodeFlags::STATIC_LITERAL) end
Gibt true zurück, wenn das Static-Literal-Flag für den Knoten gesetzt ist.
Source
# File lib/prism/node.rb, line 183 def to_dot # @type self: node DotVisitor.new.tap { |visitor| accept(visitor) }.to_dot end
Konvertiert diesen Knoten in einen Graphviz Dot-Graph-String.
Source
# File lib/prism/node.rb, line 128 def trailing_comments location.trailing_comments end
Delegiert an die trailing_comments des zugehörigen Standortobjekts.
Source
# File lib/prism/node.rb, line 194 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
Gibt eine Liste von Knoten zurück, die Nachkommen dieses Knotens sind und die angegebene Zeile und Spalte enthalten. Dies ist nützlich, um einen Knoten zu lokalisieren, der basierend auf Zeile und Spalte des Quellcodes ausgewählt wurde.
Wichtig zu beachten ist, dass die an diese Methode übergebene Spalte in Bytes und nicht in Zeichen oder Code-Einheiten angegeben werden sollte.
Node-Schnittstelle
Öffentliche Klassenmethoden
Source
# File lib/prism/node.rb, line 310 def self.type raise NoMethodError, "undefined method `type' for #{inspect}" end
Ähnlich wie type gibt diese Methode ein Symbol zurück, das Sie zum Aufteilen nach dem Typ des Knotens verwenden können, ohne eine lange ===-Kette durchführen zu müssen. Beachten Sie, dass es wie type immer noch langsamer ist als die Verwendung von == für eine einzelne Klasse, aber in einem case-Statement oder einem Array-Vergleich schneller sein sollte.
Öffentliche Instanzmethoden
Source
# File lib/prism/node.rb, line 261 def accept(visitor) raise NoMethodError, "undefined method `accept' for #{inspect}" end
Akzeptiert einen Besucher und ruft die spezialisierte Besuchfunktion zurück.
Source
# File lib/prism/node.rb, line 267 def child_nodes raise NoMethodError, "undefined method `child_nodes' for #{inspect}" end
Gibt ein Array von Kindknoten zurück, einschließlich nils anstelle von optionalen Knoten, die nicht vorhanden waren.
Source
# File lib/prism/node.rb, line 281 def comment_targets raise NoMethodError, "undefined method `comment_targets' for #{inspect}" end
Gibt ein Array von Kindknoten und Standorten zurück, die potenziell Kommentare enthalten könnten.
Source
# File lib/prism/node.rb, line 275 def compact_child_nodes raise NoMethodError, "undefined method `compact_child_nodes' for #{inspect}" end
Gibt ein Array von Kindknoten zurück, ohne nils anstelle von optionalen Knoten, die nicht vorhanden waren.
Source
# File lib/prism/node.rb, line 286 def inspect raise NoMethodError, "undefined method `inspect' for #{inspect}" end
Gibt eine Zeichenfolgendarstellung des Knotens zurück.
Source
# File lib/prism/node.rb, line 302 def type raise NoMethodError, "undefined method `type' for #{inspect}" end
Manchmal möchten Sie eine Instanz eines Knotens gegen eine Liste von Klassen prüfen, um zu sehen, welche Art von Verhalten ausgeführt werden soll. Normalerweise geschieht dies durch Aufruf von [cls1, cls2].include?(node.class) oder durch Einfügen des Knotens in ein case-Statement und Ausführen von case node; when cls1; when cls2; end. Beide Ansätze sind aufgrund der ständigen Lookups, Methodenaufrufe und/oder Array-Allokationen relativ langsam.
Stattdessen können Sie type aufrufen, das Ihnen ein Symbol zurückgibt, das Sie für Vergleiche verwenden können. Dies ist schneller als die anderen Ansätze, da es einen einzelnen Integer-Vergleich verwendet, aber auch, weil Sie auf CRuby die Tatsache ausnutzen können, dass case-Statements mit allen Symbolschlüsseln eine Sprungtabelle verwenden.