1

我写了一个自定义的 rubocop 警察,摘录是这样的:

def_node_matcher :is_foo_bar?, <<-PATTERN
  (send (const nil :Foo) :bar)
PATTERN

def on_send(node)
  puts "Match" if is_foo_bar?(node)
end

我正在尝试以下代码的警察:

Foo.bar

有趣的是,node.to_s以下内容与我的模式完全匹配:

"(send
  (const nil :Foo) :bar)"

但是节点不匹配。如果我将模式更改为以下,它可以工作:

(send (...) :bar)

为什么我的原始匹配不起作用?

我的版本:

  • 红宝石 2.6.2
  • AST 2.4.0
  • rubocop 0.77.0
  • 解析器 2.6.4.1
4

1 回答 1

1

前段时间,我们将匹配器更改为nilbe nil?。这有一个不幸的副作用,您不能再复制粘贴输出,ruby-parse或者node.to_s立即拥有一个工作匹配器。

只需添加额外的问号即可使您的模式再次起作用:

def_node_matcher :is_foo_bar?, <<-PATTERN
  (send (const nil? :Foo) :bar)
PATTERN
于 2020-03-26T02:57:42.477 回答