class Prism::Node

这表示树中的一个节点。它是所有各种节点类型的父类。

属性

flags[R]

此节点的标志位集合。有一些标志是所有节点共有的,还有一些节点有特定的标志。

node_id[R]

此节点的唯一标识符。这用于一个非常特殊的用例,在该用例中,您希望保留对节点的引用,而不必将语法树保留在内存中。此唯一标识符在对同一源代码进行多次解析时将保持一致。

source[R]

指向创建此节点的源的指针。

公共类方法

fields() 点击以切换源代码

返回此节点类存在的字段列表。字段描述节点的结构。这种反射对于递归访问树中的每个节点字段等操作非常有用。

# 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

公共实例方法

cached_end_code_units_column(cache) 点击以切换源代码

委托给关联的位置对象的 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(cache) 点击以切换源代码

委托给关联的位置对象的 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(cache) 点击以切换源代码

委托给关联的位置对象的 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(cache) 点击以切换源代码

委托给关联的位置对象的 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
comments() 点击以切换源代码

委托给关联的位置对象的注释。

# File prism/node.rb, line 130
def comments
  location.comments
end
end_character_column() 点击以切换源代码

委托给关联的位置对象的 end_character_column

# File prism/node.rb, line 103
def end_character_column
  location.end_character_column
end
end_character_offset() 点击以切换源代码

委托给关联的位置对象的 end_character_offset

# File prism/node.rb, line 71
def end_character_offset
  location.end_character_offset
end
end_column() 点击以切换源代码

委托给关联的位置对象的 end_column

# File prism/node.rb, line 93
def end_column
  location.end_column
end
end_line() 点击以切换源代码

委托给关联的位置对象的 end_line

# File prism/node.rb, line 47
def end_line
  location.end_line
end
end_offset() 点击以切换源代码

节点在源中的结束偏移量。此方法实际上是位置对象的委托方法。

# 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() 点击以切换源代码

委托给关联的位置对象的 leading_comments

# File prism/node.rb, line 120
def leading_comments
  location.leading_comments
end
location() 点击以切换源代码

一个 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
newline?() 点击以切换源代码

如果节点设置了换行符标志,则返回 true。

# File prism/node.rb, line 161
def newline?
  flags.anybits?(NodeFlags::NEWLINE)
end
pretty_print(q) 点击以切换源代码

类似于 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
save(repository) 点击以切换源代码

使用已保存的源保存此节点,以便以后可以检索它。

# File prism/node.rb, line 24
def save(repository)
  repository.enter(node_id, :itself)
end
save_location(repository) 点击以切换源代码

使用已保存的源保存位置,以便以后可以检索它。

# File prism/node.rb, line 37
def save_location(repository)
  repository.enter(node_id, :location)
end
script_lines()

source_lines 的别名,用于模仿 RubyVM::AbstractSyntaxTree 中的 API,以方便迁移。

别名:source_lines
slice() 点击以切换源代码

从源中切出节点的位置。

# File prism/node.rb, line 144
def slice
  location.slice
end
slice_lines() 点击以切换源代码

从源中切出节点的位置,从位置开始的行开头开始,到位置结束的行结尾结束。

# File prism/node.rb, line 151
def slice_lines
  location.slice_lines
end
source_lines() 点击以切换源代码

返回与此节点关联的源代码的所有行。

# File prism/node.rb, line 135
def source_lines
  location.source_lines
end
也别名为:script_lines
start_character_column() 点击以切换源代码

委托给关联的位置对象的 start_character_column

# File prism/node.rb, line 98
def start_character_column
  location.start_character_column
end
start_character_offset() 点击以切换源代码

委托给关联的位置对象的 start_character_offset

# File prism/node.rb, line 66
def start_character_offset
  location.start_character_offset
end
start_column() 点击以切换源代码

委托给关联的位置对象的 start_column

# File prism/node.rb, line 88
def start_column
  location.start_column
end
start_line() 点击以切换源代码

委托给关联的位置对象的 start_line

# File prism/node.rb, line 42
def start_line
  location.start_line
end
start_offset() 点击以切换源代码

节点在源中的起始偏移量。此方法实际上是位置对象的委托方法。

# File prism/node.rb, line 53
def start_offset
  location = @location
  location.is_a?(Location) ? location.start_offset : location >> 32
end
static_literal?() 点击以切换源代码

如果节点设置了静态字面量标志,则返回 true。

# File prism/node.rb, line 166
def static_literal?
  flags.anybits?(NodeFlags::STATIC_LITERAL)
end
to_dot() 点击以切换源代码

将此节点转换为 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() 点击以切换源代码

委托给关联的位置对象的 trailing_comments

# File prism/node.rb, line 125
def trailing_comments
  location.trailing_comments
end
tunnel(line, column) 点击以切换源代码

返回此节点的后代中包含给定行和列的节点列表。这对于定位基于源代码的行和列选择的节点非常有用。

需要注意的是,传递给此方法的列应该以字节为单位,而不是字符或代码单元。

# 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

节点接口

↑ 返回顶部

公共类方法

type() 点击以切换源代码

类似于 type,此方法返回一个符号,您可以使用该符号拆分节点类型,而不必进行长的 === 链。请注意,与 type 类似,它仍然比使用 == 进行单个类比较慢,但在 case 语句或数组比较中应该更快。

# File prism/node.rb, line 307
def self.type
  raise NoMethodError, "undefined method `type' for #{inspect}"
end

公共实例方法

accept(visitor) 点击以切换源代码

接受一个访问器并回调到专门的访问函数。

# File prism/node.rb, line 258
def accept(visitor)
  raise NoMethodError, "undefined method `accept' for #{inspect}"
end
child_nodes() 点击以切换源代码

返回子节点数组,包括未出现的选项节点位置处的“nil”。

# File prism/node.rb, line 264
def child_nodes
  raise NoMethodError, "undefined method `child_nodes' for #{inspect}"
end
也别名为:deconstruct
comment_targets() 点击以切换源代码

返回可能附加注释的子节点和位置数组。

# File prism/node.rb, line 278
def comment_targets
  raise NoMethodError, "undefined method `comment_targets' for #{inspect}"
end
compact_child_nodes() 点击以切换源代码

返回子节点数组,排除未出现的选项节点位置处的任何“nil”。

# File prism/node.rb, line 272
def compact_child_nodes
  raise NoMethodError, "undefined method `compact_child_nodes' for #{inspect}"
end
deconstruct()
别名:child_nodes
inspect() 点击以切换源代码

返回节点的字符串表示形式。

# File prism/node.rb, line 283
def inspect
  raise NoMethodError, "undefined method `inspect' for #{inspect}"
end
type() 点击以切换源代码

有时,您希望将节点的实例与类列表进行比较,以查看要执行哪种行为。通常,这是通过调用 `[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