节点模式以匹配开始中的一些但不是所有节点

Node pattern to match some, but not all nodes within a begin

我正在努力编写一个单节点匹配来检测这种情况:

chef_gem 'deep_merge' do
  action :nothing
  compile_time true
end.run_action(:install)

这个模式是我最初写的

def_node_matcher :compile_time_and_run_action?, <<-PATTERN
(send
  $(block
    (send nil? ... )
    (args)
    (begin
      (send nil? :action (sym $_) )
      (send nil? :compile_time (true) )
    )
  ) :run_action (sym $_) )
PATTERN

问题是操作方法,compile_time 方法可以按任何顺序排列,开头可能还有其他方法:

chef_gem 'deep_merge' do
  compile_time true
  action :nothing
  foo bar
end.run_action(:install)

过去我在数组和散列中使用过 <>,但这似乎在开始时不起作用,所以像这样的东西不会削减它:

def_node_matcher :compile_time_and_run_action?, <<-PATTERN
(send
  $(block
    (send nil? ... )
    (args)
    <(begin
      ...
      (send nil? :action (sym $_) )
      (send nil? :compile_time (true) )
    )>
  ) :run_action (sym $_) )
PATTERN

在我缺少的单个匹配器中是否有一种很好的方法来做到这一点?

-蒂姆

使用 <> 是正确的方法,但将此用于 begin 的 children。我相信这应该有效:

def_node_matcher :compile_time_and_run_action?, <<-PATTERN
(send
  $(block
    (send nil? ... )
    (args)
    (begin <
      (send nil? :action (sym $_) )
      (send nil? :compile_time (true) )
      ...
    >)
  ) :run_action (sym $_) )
PATTERN