class Prism::Node
这代表树中的一个节点。它是各种节点类型的父类。
属性
此节点的标志位集合。有些标志对所有节点通用,而有些节点有特定标志。
此节点的唯一标识符。这在您想保留对节点的引用而不必将语法树保留在内存中时使用。这个唯一标识符在对同一源代码进行多次解析时会保持一致。
指向创建此节点的源的指针。
Public Class Methods
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
返回此节点类存在的字段列表。字段描述了节点的结构。这种反射对于递归访问树中的每个节点和字段等事情非常有用。
Public Instance Methods
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
在深度优先搜索中访问时,返回第一个符合给定块的节点。这对于查找满足特定条件的节点很有用。
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
委托给关联的 location 对象的 cached_end_code_units_column。
Source
# File lib/prism/node.rb, line 86 def cached_end_code_units_offset(cache) location.cached_end_code_units_offset(cache) end
委托给关联的 location 对象的 cached_end_code_units_offset。
Source
# File lib/prism/node.rb, line 112 def cached_start_code_units_column(cache) location.cached_start_code_units_column(cache) end
委托给关联的 location 对象的 cached_start_code_units_column。
Source
# File lib/prism/node.rb, line 80 def cached_start_code_units_offset(cache) location.cached_start_code_units_offset(cache) end
委托给关联的 location 对象的 cached_start_code_units_offset。
Source
# File lib/prism/node.rb, line 133 def comments location.comments end
委托给关联的 location 对象的注释。
Source
# File lib/prism/node.rb, line 106 def end_character_column location.end_character_column end
委托给关联的 location 对象的 end_character_column。
Source
# File lib/prism/node.rb, line 74 def end_character_offset location.end_character_offset end
委托给关联的 location 对象的 end_character_offset。
Source
# File lib/prism/node.rb, line 96 def end_column location.end_column end
委托给关联的 location 对象的 end_column。
Source
# File lib/prism/node.rb, line 50 def end_line location.end_line end
委托给关联的 location 对象的 end_line。
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
节点在源中的结束偏移量。此方法实际上是委托给 location 对象的方法。
Source
# File lib/prism/node.rb, line 123 def leading_comments location.leading_comments end
委托给关联的 location 对象的 leading_comments。
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
一个 Location 实例,表示节点在源中的位置。
Source
# File lib/prism/node.rb, line 164 def newline? flags.anybits?(NodeFlags::NEWLINE) end
如果节点设置了换行标志,则返回 true。
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
类似于 inspect,但会尊重 pretty print 对象给定的当前缩进级别。
Source
# File lib/prism/node.rb, line 27 def save(repository) repository.enter(node_id, :itself) end
使用已保存的源保存此节点,以便以后可以检索。
Source
# File lib/prism/node.rb, line 40 def save_location(repository) repository.enter(node_id, :location) end
使用已保存的源保存位置,以便以后可以检索。
Source
# File lib/prism/node.rb, line 154 def slice_lines location.slice_lines end
从源中切片节点的 location,从 location 开始的行开头开始,到 location 结束的行末尾结束。
Source
# File lib/prism/node.rb, line 138 def source_lines location.source_lines end
返回与此节点关联的源代码的所有行。
Source
# File lib/prism/node.rb, line 101 def start_character_column location.start_character_column end
委托给关联的 location 对象的 start_character_column。
Source
# File lib/prism/node.rb, line 69 def start_character_offset location.start_character_offset end
委托给关联的 location 对象的 start_character_offset。
Source
# File lib/prism/node.rb, line 91 def start_column location.start_column end
委托给关联的 location 对象的 start_column。
Source
# File lib/prism/node.rb, line 45 def start_line location.start_line end
委托给关联的 location 对象的 start_line。
Source
# File lib/prism/node.rb, line 56 def start_offset location = @location location.is_a?(Location) ? location.start_offset : location >> 32 end
节点在源中的开始偏移量。此方法实际上是委托给 location 对象的方法。
Source
# File lib/prism/node.rb, line 169 def static_literal? flags.anybits?(NodeFlags::STATIC_LITERAL) end
如果节点设置了静态字面量标志,则返回 true。
Source
# File lib/prism/node.rb, line 183 def to_dot # @type self: node DotVisitor.new.tap { |visitor| accept(visitor) }.to_dot end
将此节点转换为 graphviz dot 图形字符串。
Source
# File lib/prism/node.rb, line 128 def trailing_comments location.trailing_comments end
委托给关联的 location 对象的 trailing_comments。
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
返回此节点的所有后代节点列表,这些节点包含给定的行和列。这对于根据源代码的行和列定位所选节点很有用。
重要提示:传递给此方法的列应以字节为单位,而不是字符或代码单元。
Node 接口
Public Class Methods
Public Instance Methods
Source
# File lib/prism/node.rb, line 261 def accept(visitor) raise NoMethodError, "undefined method `accept' for #{inspect}" end
接受访问者并调用专门的 visit 函数。
Source
# File lib/prism/node.rb, line 267 def child_nodes raise NoMethodError, "undefined method `child_nodes' for #{inspect}" end
返回子节点数组,在可选节点未出现的地方用 nil 填充。
Source
# File lib/prism/node.rb, line 281 def comment_targets raise NoMethodError, "undefined method `comment_targets' for #{inspect}" end
返回可能附带注释的子节点和位置的数组。
Source
# File lib/prism/node.rb, line 275 def compact_child_nodes raise NoMethodError, "undefined method `compact_child_nodes' for #{inspect}" end
返回子节点数组,排除可选节点未出现地方的 nil。
Source
# File lib/prism/node.rb, line 286 def inspect raise NoMethodError, "undefined method `inspect' for #{inspect}" end
返回节点的字符串表示。
Source
# File lib/prism/node.rb, line 302 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 语句会使用跳转表的这一事实。