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

Написал кастомный кс рубокоп, выдержки такие:

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

person Remo    schedule 18.12.2019    source источник


Ответы (1)


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

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

def_node_matcher :is_foo_bar?, <<-PATTERN
  (send (const nil? :Foo) :bar)
PATTERN
person Drenmi    schedule 26.03.2020