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
委托给关联的 location 对象的 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
委托给关联的 location 对象的 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
委托给关联的 location 对象的 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
委托给关联的 location 对象的 cached_start_code_units_offset
。
来源
# File lib/prism/node.rb, line 130 def comments location.comments end
委托给关联的 location 对象的注释。
来源
# File lib/prism/node.rb, line 103 def end_character_column location.end_character_column end
委托给关联的 location 对象的 end_character_column
。
来源
# File lib/prism/node.rb, line 71 def end_character_offset location.end_character_offset end
委托给关联的 location 对象的 end_character_offset
。
来源
# File lib/prism/node.rb, line 93 def end_column location.end_column end
委托给关联的 location 对象的 end_column
。
来源
# File lib/prism/node.rb, line 47 def end_line location.end_line end
委托给关联的 location 对象的 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
节点在源中的结束偏移量。此方法实际上是 location 对象的委托方法。
来源
# File lib/prism/node.rb, line 120 def leading_comments location.leading_comments end
委托给关联的 location 对象的 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,但尊重漂亮的打印对象给出的当前缩进级别。
来源
# 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
使用保存的源保存位置,以便稍后可以检索它。
来源
# 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
委托给关联的 location 对象的 start_character_column
。
来源
# File lib/prism/node.rb, line 66 def start_character_offset location.start_character_offset end
委托给关联的 location 对象的 start_character_offset
。
来源
# File lib/prism/node.rb, line 88 def start_column location.start_column end
委托给关联的 location 对象的 start_column
。
来源
# File lib/prism/node.rb, line 42 def start_line location.start_line end
委托给关联的 location 对象的 start_line
。
来源
# File lib/prism/node.rb, line 53 def start_offset location = @location location.is_a?(Location) ? location.start_offset : location >> 32 end
节点在源中的起始偏移量。此方法实际上是 location 对象的委托方法。
来源
# 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
委托给关联的 location 对象的 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 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 语句将使用跳转表的事实。