Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d2da4a4

Browse files
committed
Fix an error for Style/Documentation
This PR fixes an error for `Style/Documentation` when namespace is a variable. ```ruby m = Module.new module n::N def method end end ``` ```console % rubocop documentation.rb --only Style/Documentation -d (snip) undefined method `namespace' for s(:lvar, :m):RuboCop::AST::Node /Users/koic/src/github.com/rubocop/rubocop/lib/rubocop/cop/style/documentation.rb:187:in `qualify_const' /Users/koic/src/github.com/rubocop/rubocop/lib/rubocop/cop/style/documentation.rb:187:in `qualify_const' /Users/koic/src/github.com/rubocop/rubocop/lib/rubocop/cop/style/documentation.rb:181:in `block in identifier' ``` It also complements missing cbase and namespaces in offense messages. e.g.: ```diff class ::MyClass -^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class MyClass`. +^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class ::MyClass`. ``` ```diff class self::MyClass -^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class MyClass`. +^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class self::MyClass`. ``` ```diff class my_method::MyClass -^^^^^^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class MyClass`. +^^^^^^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class my_method::MyClass`. ```
1 parent 7f96a01 commit d2da4a4

File tree

3 files changed

+76
-6
lines changed

3 files changed

+76
-6
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* [#11661](https://github.com/rubocop/rubocop/pull/11661): Fix an error for `Style/Documentation` when namespace is a variable. ([@koic][])

lib/rubocop/cop/style/documentation.rb

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,19 @@ def allowed_constants
178178
def identifier(node)
179179
# Get the fully qualified identifier for a class/module
180180
nodes = [node, *node.each_ancestor(:class, :module)]
181-
nodes.reverse_each.flat_map { |n| qualify_const(n.identifier) }.join('::')
181+
identifier = nodes.reverse_each.flat_map { |n| qualify_const(n.identifier) }.join('::')
182+
183+
identifier.sub('::::', '::')
182184
end
183185

184186
def qualify_const(node)
185-
return if node.nil? || node.cbase_type? || node.self_type? || node.send_type?
187+
return if node.nil?
186188

187-
[qualify_const(node.namespace), node.short_name].compact
189+
if node.cbase_type? || node.self_type? || node.call_type? || node.variable?
190+
node.source
191+
else
192+
[qualify_const(node.namespace), node.short_name].compact
193+
end
188194
end
189195
end
190196
end

spec/rubocop/cop/style/documentation_spec.rb

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def method
2020
it 'registers an offense for non-empty cbase class' do
2121
expect_offense(<<~RUBY)
2222
class ::MyClass
23-
^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class MyClass`.
23+
^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class ::MyClass`.
2424
def method
2525
end
2626
end
@@ -30,7 +30,7 @@ def method
3030
it 'registers an offense for non-empty class nested under self' do
3131
expect_offense(<<~RUBY)
3232
class self::MyClass
33-
^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class MyClass`.
33+
^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class self::MyClass`.
3434
def method
3535
end
3636
end
@@ -40,7 +40,70 @@ def method
4040
it 'registers an offense for non-empty class nested under method call' do
4141
expect_offense(<<~RUBY)
4242
class my_method::MyClass
43-
^^^^^^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class MyClass`.
43+
^^^^^^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class my_method::MyClass`.
44+
def method
45+
end
46+
end
47+
RUBY
48+
end
49+
50+
it 'registers an offense for non-empty class nested under safe navigation method call' do
51+
expect_offense(<<~RUBY)
52+
class obj&.my_method::MyClass
53+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Missing top-level documentation comment for `class obj&.my_method::MyClass`.
54+
def method
55+
end
56+
end
57+
RUBY
58+
end
59+
60+
it 'registers an offense for non-empty class nested under local variable' do
61+
expect_offense(<<~RUBY)
62+
m = Module.new
63+
module m::N
64+
^^^^^^^^^^^ Missing top-level documentation comment for `module m::N`.
65+
def method
66+
end
67+
end
68+
RUBY
69+
end
70+
71+
it 'registers an offense for non-empty class nested under instance variable' do
72+
expect_offense(<<~RUBY)
73+
module @m::N
74+
^^^^^^^^^^^^ Missing top-level documentation comment for `module @m::N`.
75+
def method
76+
end
77+
end
78+
RUBY
79+
end
80+
81+
it 'registers an offense for non-empty class nested under class variable' do
82+
expect_offense(<<~RUBY)
83+
module @@m::N
84+
^^^^^^^^^^^^^ Missing top-level documentation comment for `module @@m::N`.
85+
def method
86+
end
87+
end
88+
RUBY
89+
end
90+
91+
it 'registers an offense for non-empty class nested under global variable' do
92+
expect_offense(<<~RUBY)
93+
module $m::N
94+
^^^^^^^^^^^^ Missing top-level documentation comment for `module $m::N`.
95+
def method
96+
end
97+
end
98+
RUBY
99+
end
100+
101+
it 'registers an offense for non-empty class nested under local variables' do
102+
expect_offense(<<~RUBY)
103+
m = Module.new
104+
n = Module.new
105+
module m::n::M
106+
^^^^^^^^^^^^^^ Missing top-level documentation comment for `module m::n::M`.
44107
def method
45108
end
46109
end

0 commit comments

Comments
 (0)