class Prism::Node
这表示树中的一个节点。它是所有各种节点类型的父类。
属性
此节点的标志位集合。有一些标志是所有节点共有的,还有一些节点有特定的标志。
此节点的唯一标识符。这用于一个非常特殊的用例,在该用例中,您希望保留对节点的引用,而不必将语法树保留在内存中。此唯一标识符在对同一源代码进行多次解析时将保持一致。
指向创建此节点的源的指针。
公共类方法
返回此节点类存在的字段列表。字段描述节点的结构。这种反射对于递归访问树中的每个节点和字段等操作非常有用。
# File 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
公共实例方法
返回在深度优先搜索中访问时与给定块匹配的第一个节点。这对于查找与特定条件匹配的节点非常有用。
node.breadth_first_search { |node| node.node_id == node_id }
# File 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
委托给关联的位置对象的 cached_end_code_units_column
。
# File prism/node.rb, line 115 def cached_end_code_units_column(cache) location.cached_end_code_units_column(cache) end
委托给关联的位置对象的 cached_end_code_units_offset
。
# File prism/node.rb, line 83 def cached_end_code_units_offset(cache) location.cached_end_code_units_offset(cache) end
委托给关联的位置对象的 cached_start_code_units_column
。
# File prism/node.rb, line 109 def cached_start_code_units_column(cache) location.cached_start_code_units_column(cache) end
委托给关联的位置对象的 cached_start_code_units_offset
。
# File prism/node.rb, line 77 def cached_start_code_units_offset(cache) location.cached_start_code_units_offset(cache) end
委托给关联的位置对象的注释。
# File prism/node.rb, line 130 def comments location.comments end
委托给关联的位置对象的 end_character_column
。
# File prism/node.rb, line 103 def end_character_column location.end_character_column end
委托给关联的位置对象的 end_character_offset
。
# File prism/node.rb, line 71 def end_character_offset location.end_character_offset end
委托给关联的位置对象的 end_column
。
# File prism/node.rb, line 93 def end_column location.end_column end
委托给关联的位置对象的 end_line
。
# File prism/node.rb, line 47 def end_line location.end_line end
节点在源中的结束偏移量。此方法实际上是位置对象的委托方法。
# File 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 prism/node.rb, line 120 def leading_comments location.leading_comments end
一个 Location
实例,表示此节点在源中的位置。
# File 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
如果节点设置了换行符标志,则返回 true。
# File prism/node.rb, line 161 def newline? flags.anybits?(NodeFlags::NEWLINE) end
类似于 inspect,但会考虑漂亮打印对象给出的当前缩进级别。
# File 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
使用已保存的源保存此节点,以便以后可以检索它。
# File prism/node.rb, line 24 def save(repository) repository.enter(node_id, :itself) end
使用已保存的源保存位置,以便以后可以检索它。
# File prism/node.rb, line 37 def save_location(repository) repository.enter(node_id, :location) end
从源中切出节点的位置。
# File prism/node.rb, line 144 def slice location.slice end
从源中切出节点的位置,从位置开始的行开头开始,到位置结束的行结尾结束。
# File prism/node.rb, line 151 def slice_lines location.slice_lines end
返回与此节点关联的源代码的所有行。
# File prism/node.rb, line 135 def source_lines location.source_lines end
委托给关联的位置对象的 start_character_column
。
# File prism/node.rb, line 98 def start_character_column location.start_character_column end
委托给关联的位置对象的 start_character_offset
。
# File prism/node.rb, line 66 def start_character_offset location.start_character_offset end
委托给关联的位置对象的 start_column
。
# File prism/node.rb, line 88 def start_column location.start_column end
委托给关联的位置对象的 start_line
。
# File prism/node.rb, line 42 def start_line location.start_line end
节点在源中的起始偏移量。此方法实际上是位置对象的委托方法。
# File prism/node.rb, line 53 def start_offset location = @location location.is_a?(Location) ? location.start_offset : location >> 32 end
如果节点设置了静态字面量标志,则返回 true。
# File prism/node.rb, line 166 def static_literal? flags.anybits?(NodeFlags::STATIC_LITERAL) end
将此节点转换为 graphviz dot 图字符串。
# File prism/node.rb, line 180 def to_dot # @type self: node DotVisitor.new.tap { |visitor| accept(visitor) }.to_dot end
委托给关联的位置对象的 trailing_comments
。
# File prism/node.rb, line 125 def trailing_comments location.trailing_comments end
返回此节点的后代中包含给定行和列的节点列表。这对于定位基于源代码的行和列选择的节点非常有用。
需要注意的是,传递给此方法的列应该以字节为单位,而不是字符或代码单元。
# File 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 prism/node.rb, line 258 def accept(visitor) raise NoMethodError, "undefined method `accept' for #{inspect}" end
返回子节点数组,包括未出现的选项节点位置处的“nil”。
# File prism/node.rb, line 264 def child_nodes raise NoMethodError, "undefined method `child_nodes' for #{inspect}" end
返回可能附加注释的子节点和位置数组。
# File prism/node.rb, line 278 def comment_targets raise NoMethodError, "undefined method `comment_targets' for #{inspect}" end
返回子节点数组,排除未出现的选项节点位置处的任何“nil”。
# File prism/node.rb, line 272 def compact_child_nodes raise NoMethodError, "undefined method `compact_child_nodes' for #{inspect}" end
返回节点的字符串表示形式。
# File prism/node.rb, line 283 def inspect raise NoMethodError, "undefined method `inspect' for #{inspect}" end
有时,您希望将节点的实例与类列表进行比较,以查看要执行哪种行为。通常,这是通过调用 `[cls1, cls2].include?(node.class)` 或将节点放入 case 语句并执行 `case node; when cls1; when cls2; end` 来完成的。这两种方法都比较慢,因为需要进行常量查找、方法调用和/或数组分配。
相反,您可以调用 type
,它将向您返回一个可以用于比较的符号。这比其他方法更快,因为它使用单个整数比较,而且如果您在 CRuby 上,您可以利用所有符号键的 case 语句将使用跳转表的事实。
# File prism/node.rb, line 299 def type raise NoMethodError, "undefined method `type' for #{inspect}" end