class Prism::Dispatcher

Dispatcher 类会在遍历 AST 以查找节点时,将事件触发给所有注册的监听器。它可用于在仅遍历一次树的情况下,对 AST 执行不同类型的分析。

要使用 Dispatcher,首先需要实例化它,并注册您感兴趣的事件的监听器。

class OctalListener
  def on_integer_node_enter(node)
    if node.octal? && !node.slice.start_with?("0o")
      warn("Octal integers should be written with the 0o prefix")
    end
  end
end

listener = OctalListener.new
dispatcher = Prism::Dispatcher.new
dispatcher.register(listener, :on_integer_node_enter)

然后,您可以遍历任意数量的树,并将事件分派给监听器。

result = Prism.parse("001 + 002 + 003")
dispatcher.dispatch(result.value)

可选地,您还可以使用 dispatch_once 来为单个节点分派进入(enter)和离开(leave)事件,而无需进一步向下递归。当您想重用已注册的监听器但又想在特定点停止遍历树时,这会非常有用。

integer = result.value.statements.body.first.receiver.receiver
dispatcher.dispatch_once(integer)