Почему этот шаблон отправки не совпадает?
Я написал кастомного рубокопа, отрывки такие:
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