From 9d62f6c32d8eb617c09c143aee01ab1e8efa954e Mon Sep 17 00:00:00 2001 From: Marc-Andre Lafortune Date: Mon, 8 Mar 2021 14:56:31 -0500 Subject: [PATCH] Have `SendNode#def_modifier?` return the `def` node it modifies, or `nil` instead of boolean Stricter check (used to check any child, including the receiver of the `send`) --- ...nge_have_sendnodedef_modifier_return_the_def.md | 1 + lib/rubocop/ast/node/mixin/method_dispatch_node.rb | 14 ++++++++++---- spec/rubocop/ast/send_node_spec.rb | 6 +++--- 3 files changed, 14 insertions(+), 7 deletions(-) create mode 100644 changelog/change_have_sendnodedef_modifier_return_the_def.md diff --git a/changelog/change_have_sendnodedef_modifier_return_the_def.md b/changelog/change_have_sendnodedef_modifier_return_the_def.md new file mode 100644 index 000000000..dc095bde4 --- /dev/null +++ b/changelog/change_have_sendnodedef_modifier_return_the_def.md @@ -0,0 +1 @@ +* [#x](https://github.com/rubocop-hq/rubocop-ast/pull/x): Have `SendNode#def_modifier?` return the `def` node it modifies, or `nil` instead of boolean. ([@marcandre][]) diff --git a/lib/rubocop/ast/node/mixin/method_dispatch_node.rb b/lib/rubocop/ast/node/mixin/method_dispatch_node.rb index f1e4de717..0fcb3c574 100644 --- a/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +++ b/lib/rubocop/ast/node/mixin/method_dispatch_node.rb @@ -165,15 +165,21 @@ def arithmetic_operation? ARITHMETIC_OPERATORS.include?(method_name) end - # Checks if this node is part of a chain of `def` modifiers. + # @!method def_modifier?(node = self) + # Checks if this node is part of a chain of `def` or `defs` modifiers. # # @example # # private def foo; end # - # @return [Boolean] whether the dispatched method is a `def` modifier - def def_modifier? - adjacent_def_modifier? || each_child_node(:send).any?(&:def_modifier?) + # @return [Node | nil] returns the `def|defs` node this is a modifier for, + # or `nil` if it isn't a def modifier + def def_modifier?(node=self) + if node.send_type? && node.receiver.nil? + arg = node.children[2] + return arg if arg.def_type? || arg.defs_type? + def_modifier?(arg) + end end # Checks whether this is a lambda. Some versions of parser parses diff --git a/spec/rubocop/ast/send_node_spec.rb b/spec/rubocop/ast/send_node_spec.rb index c8076e066..893fb1769 100644 --- a/spec/rubocop/ast/send_node_spec.rb +++ b/spec/rubocop/ast/send_node_spec.rb @@ -1106,19 +1106,19 @@ def bar context 'with a prefixed def modifier' do let(:source) { 'foo def bar; end' } - it { expect(send_node).to be_def_modifier } + it { expect(send_node.def_modifier?.method_name).to eq(:bar) } end context 'with several prefixed def modifiers' do let(:source) { 'foo bar baz def qux; end' } - it { expect(send_node).to be_def_modifier } + it { expect(send_node.def_modifier?.method_name).to eq(:qux) } end context 'with a block containing a method definition' do let(:source) { 'foo bar { baz def qux; end }' } - it { expect(send_node).not_to be_def_modifier } + it { expect(send_node.def_modifier?).to be_nil } end end