Почему этот шаблон отправки не совпадает?

Я написал кастомного рубокопа, отрывки такие:

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
  • аст 2.4.0
  • рубокоп 0,77,0
  • парсер 2.6.4.1

1 ответ

Некоторое время назад мы заменили сопоставитель на nil быть nil?. Это имеет неприятный побочный эффект: вы больше не можете копировать и вставлять вывод изruby-parse или node.to_s и сразу получите рабочий сопоставитель.

Простое добавление дополнительного вопросительного знака должно заставить ваш шаблон снова заработать:

def_node_matcher :is_foo_bar?, <<-PATTERN
  (send (const nil? :Foo) :bar)
PATTERN
Другие вопросы по тегам