Skip to content

Commit

Permalink
[Fix #9819] Fix a false negative for Style/TopLevelMethodDefinition
Browse files Browse the repository at this point in the history
Fixes #9819.

This PR fixes a false negative for `Style/TopLevelMethodDefinition`
when defining a top-level method after a class definition.
  • Loading branch information
koic authored and bbatsov committed May 25, 2021
1 parent 4216c38 commit b7928e7
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 2 deletions.
@@ -0,0 +1 @@
* [#9819](https://github.com/rubocop/rubocop/issues/9819): Fix a false negative for `Style/TopLevelMethodDefinition` when defining a top-level method after a class definition. ([@koic][])
12 changes: 10 additions & 2 deletions lib/rubocop/cop/style/top_level_method_definition.rb
Expand Up @@ -50,21 +50,29 @@ class TopLevelMethodDefinition < Base
RESTRICT_ON_SEND = %i[define_method].freeze

def on_def(node)
return unless node.root?
return unless top_level_method_definition?(node)

add_offense(node)
end
alias on_defs on_def
alias on_send on_def

def on_block(node)
return unless define_method_block?(node) && node.root?
return unless define_method_block?(node) && top_level_method_definition?(node)

add_offense(node)
end

private

def top_level_method_definition?(node)
if node.parent&.begin_type?
node.parent.root?
else
node.root?
end
end

# @!method define_method_block?(node)
def_node_matcher :define_method_block?, <<~PATTERN
(block (send _ {:define_method} _) ...)
Expand Down
10 changes: 10 additions & 0 deletions spec/rubocop/cop/style/top_level_method_definition_spec.rb
Expand Up @@ -40,6 +40,16 @@ def self.foo; end
end
end

it 'registers an offense when defining a top-level method after a class definition' do
expect_offense(<<~RUBY)
class Foo
end
def foo; end
^^^^^^^^^^^^ Do not define methods at the top-level.
RUBY
end

it 'does not register an offense when using module' do
expect_no_offenses(<<~RUBY)
module Foo
Expand Down

0 comments on commit b7928e7

Please sign in to comment.