rubocop 0.57.2 → 0.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +12 -9
- data/bin/setup +7 -0
- data/config/default.yml +18 -2
- data/config/disabled.yml +4 -0
- data/lib/rubocop.rb +1 -0
- data/lib/rubocop/ast/node.rb +5 -0
- data/lib/rubocop/ast/node/str_node.rb +2 -0
- data/lib/rubocop/cli.rb +4 -7
- data/lib/rubocop/config.rb +4 -4
- data/lib/rubocop/config_loader.rb +4 -8
- data/lib/rubocop/cop/corrector.rb +25 -0
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +3 -7
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +9 -1
- data/lib/rubocop/cop/layout/leading_blank_lines.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +28 -51
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -3
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +17 -4
- data/lib/rubocop/cop/metrics/line_length.rb +28 -6
- data/lib/rubocop/cop/mixin/check_assignment.rb +0 -2
- data/lib/rubocop/cop/mixin/statement_modifier.rb +6 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +79 -4
- data/lib/rubocop/cop/performance/inefficient_hash_search.rb +9 -5
- data/lib/rubocop/cop/performance/range_include.rb +9 -3
- data/lib/rubocop/cop/performance/sample.rb +6 -4
- data/lib/rubocop/cop/rails/bulk_change_table.rb +11 -7
- data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +3 -1
- data/lib/rubocop/cop/registry.rb +11 -2
- data/lib/rubocop/cop/style/encoding.rb +5 -0
- data/lib/rubocop/cop/style/end_block.rb +8 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +16 -2
- data/lib/rubocop/cop/style/symbol_proc.rb +4 -2
- data/lib/rubocop/cop/style/unneeded_condition.rb +19 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -3
- data/lib/rubocop/options.rb +20 -12
- data/lib/rubocop/processed_source.rb +2 -5
- data/lib/rubocop/rspec/cop_helper.rb +0 -4
- data/lib/rubocop/rspec/shared_contexts.rb +0 -4
- data/lib/rubocop/rspec/shared_examples.rb +0 -23
- data/lib/rubocop/version.rb +1 -1
- metadata +7 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3841f2f7a2e69362f57238be2722eb4f06bccf8
|
4
|
+
data.tar.gz: '0193123e23f57b0cea3701b8f59c90c2ea6b0658'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59d32b347c6000e8b1b23981d00cde8017bee3870e941fd72482d415de3966c3928c11b566489ba55e22545d8243e82008df7c5ba4c69e788a75c878df2d13dd
|
7
|
+
data.tar.gz: 85337f25210448131a7bc0be46a654fd71db0590c5269a328208fbb874e82b79647150b09d64a2a1178bd7d322c013642bd1ecb59ba17516c276a1e31461916d
|
data/README.md
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
[](http://badge.fury.io/rb/rubocop)
|
2
2
|
[](https://travis-ci.org/rubocop-hq/rubocop)
|
3
|
+
[](https://circleci.com/gh/rubocop-hq/rubocop/tree/master)
|
3
4
|
[](https://ci.appveyor.com/project/bbatsov/rubocop)
|
4
5
|
[](https://codeclimate.com/github/bbatsov/rubocop)
|
5
6
|
[](https://codeclimate.com/github/bbatsov/rubocop)
|
6
7
|
[](http://inch-ci.org/github/bbatsov/rubocop)
|
8
|
+
[](https://dependabot.com/compatibility-score.html?dependency-name=rubocop&package-manager=bundler&version-scheme=semver)
|
7
9
|
|
8
10
|
[](https://www.patreon.com/bbatsov)
|
9
11
|
[](https://liberapay.com/bbatsov/donate)
|
@@ -11,7 +13,7 @@
|
|
11
13
|
[](#open-collective-sponsors)
|
12
14
|
|
13
15
|
<p align="center">
|
14
|
-
<img src="https://raw.githubusercontent.com/
|
16
|
+
<img src="https://raw.githubusercontent.com/rubocop-hq/rubocop/master/logo/rubo-logo-horizontal.png" alt="RuboCop Logo"/>
|
15
17
|
</p>
|
16
18
|
|
17
19
|
> Role models are important. <br/>
|
@@ -19,10 +21,10 @@
|
|
19
21
|
|
20
22
|
**RuboCop** is a Ruby static code analyzer. Out of the box it will
|
21
23
|
enforce many of the guidelines outlined in the community
|
22
|
-
[Ruby Style Guide](https://github.com/
|
24
|
+
[Ruby Style Guide](https://github.com/rubocop-hq/ruby-style-guide).
|
23
25
|
|
24
26
|
Most aspects of its behavior can be tweaked via various
|
25
|
-
[configuration options](https://github.com/
|
27
|
+
[configuration options](https://github.com/rubocop-hq/rubocop/blob/master/config/default.yml).
|
26
28
|
|
27
29
|
Apart from reporting problems in your code, RuboCop can also
|
28
30
|
automatically fix some of the problems for you.
|
@@ -51,7 +53,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
|
|
51
53
|
might want to use a conservative version locking in your `Gemfile`:
|
52
54
|
|
53
55
|
```rb
|
54
|
-
gem 'rubocop', '~> 0.
|
56
|
+
gem 'rubocop', '~> 0.58.0', require: false
|
55
57
|
```
|
56
58
|
|
57
59
|
## Quickstart
|
@@ -65,13 +67,13 @@ $ rubocop
|
|
65
67
|
|
66
68
|
## Official manual
|
67
69
|
|
68
|
-
You can read a ton more about RuboCop in its [official manual](http://rubocop.
|
70
|
+
You can read a ton more about RuboCop in its [official manual](http://docs.rubocop.org).
|
69
71
|
|
70
72
|
## Compatibility
|
71
73
|
|
72
74
|
RuboCop supports the following Ruby implementations:
|
73
75
|
|
74
|
-
* MRI 2.
|
76
|
+
* MRI 2.2+
|
75
77
|
* JRuby 9.0+
|
76
78
|
|
77
79
|
The Rails cops support the following versions:
|
@@ -82,24 +84,25 @@ The Rails cops support the following versions:
|
|
82
84
|
|
83
85
|
Here's a list of RuboCop's core developers:
|
84
86
|
|
85
|
-
* [Bozhidar Batsov](https://github.com/bbatsov)
|
87
|
+
* [Bozhidar Batsov](https://github.com/bbatsov) (author & head maintainer)
|
86
88
|
* [Jonas Arvidsson](https://github.com/jonas054)
|
87
89
|
* [Yuji Nakayama](https://github.com/yujinakayama)
|
88
90
|
* [Evgeni Dzhelyov](https://github.com/edzhelyov) (retired)
|
89
91
|
* [Ted Johansson](https://github.com/drenmi)
|
90
92
|
* [Masataka Kuwabara](https://github.com/pocke)
|
93
|
+
* [Koichi Ito](https://github.com/koic)
|
91
94
|
|
92
95
|
## Logo
|
93
96
|
|
94
97
|
RuboCop's logo was created by [Dimiter Petrov](https://www.chadomoto.com/). You can find the logo in various
|
95
|
-
formats [here](https://github.com/
|
98
|
+
formats [here](https://github.com/rubocop-hq/rubocop/tree/master/logo).
|
96
99
|
|
97
100
|
The logo is licensed under a
|
98
101
|
[Creative Commons Attribution-NonCommercial 4.0 International License](http://creativecommons.org/licenses/by-nc/4.0/deed.en_GB).
|
99
102
|
|
100
103
|
## Contributors
|
101
104
|
|
102
|
-
Here's a [list](https://github.com/
|
105
|
+
Here's a [list](https://github.com/rubocop-hq/rubocop/graphs/contributors) of
|
103
106
|
all the people who have contributed to the development of RuboCop.
|
104
107
|
|
105
108
|
I'm extremely grateful to each and every one of them!
|
data/bin/setup
ADDED
data/config/default.yml
CHANGED
@@ -130,7 +130,7 @@ AllCops:
|
|
130
130
|
# followed by the Gemfile.lock or gems.locked file. (Although the Ruby version
|
131
131
|
# is specified in the Gemfile or gems.rb file, RuboCop reads the final value
|
132
132
|
# from the lock file.) If the Ruby version is still unresolved, RuboCop will
|
133
|
-
# use the oldest officially supported Ruby version (currently Ruby 2.
|
133
|
+
# use the oldest officially supported Ruby version (currently Ruby 2.2).
|
134
134
|
TargetRubyVersion: ~
|
135
135
|
# What version of Rails is the inspected code using? If a value is specified
|
136
136
|
# for TargetRailsVersion then it is used. Acceptable values are specificed
|
@@ -739,6 +739,13 @@ Naming/HeredocDelimiterCase:
|
|
739
739
|
- lowercase
|
740
740
|
- uppercase
|
741
741
|
|
742
|
+
Naming/MemoizedInstanceVariableName:
|
743
|
+
EnforcedStyleForLeadingUnderscores: disallowed
|
744
|
+
SupportedStylesForLeadingUnderscores:
|
745
|
+
- disallowed
|
746
|
+
- required
|
747
|
+
- optional
|
748
|
+
|
742
749
|
Naming/MethodName:
|
743
750
|
EnforcedStyle: snake_case
|
744
751
|
SupportedStyles:
|
@@ -1132,6 +1139,12 @@ Style/InverseMethods:
|
|
1132
1139
|
:select: :reject
|
1133
1140
|
:select!: :reject!
|
1134
1141
|
|
1142
|
+
Style/IpAddresses:
|
1143
|
+
# Allow strings to be whitelisted
|
1144
|
+
Whitelist:
|
1145
|
+
- "::"
|
1146
|
+
# :: is a valid IPv6 address, but could potentially be legitimately in code
|
1147
|
+
|
1135
1148
|
Style/Lambda:
|
1136
1149
|
EnforcedStyle: line_count_dependent
|
1137
1150
|
SupportedStyles:
|
@@ -1539,7 +1552,10 @@ Metrics/AbcSize:
|
|
1539
1552
|
Metrics/BlockLength:
|
1540
1553
|
CountComments: false # count full line comments?
|
1541
1554
|
Max: 25
|
1542
|
-
ExcludedMethods:
|
1555
|
+
ExcludedMethods:
|
1556
|
+
# By default, exclude the `#refine` method, as it tends to have larger
|
1557
|
+
# associated blocks.
|
1558
|
+
- refine
|
1543
1559
|
|
1544
1560
|
Metrics/BlockNesting:
|
1545
1561
|
CountBlocks: false
|
data/config/disabled.yml
CHANGED
@@ -82,6 +82,10 @@ Style/InlineComment:
|
|
82
82
|
Description: 'Avoid trailing inline comments.'
|
83
83
|
Enabled: false
|
84
84
|
|
85
|
+
Style/IpAddresses:
|
86
|
+
Description: "Don't include literal IP addresses in code."
|
87
|
+
Enabled: false
|
88
|
+
|
85
89
|
Style/MethodCallWithArgsParentheses:
|
86
90
|
Description: 'Use parentheses for method calls with arguments.'
|
87
91
|
StyleGuide: '#method-invocation-parens'
|
data/lib/rubocop.rb
CHANGED
@@ -441,6 +441,7 @@ require_relative 'rubocop/cop/style/implicit_runtime_error'
|
|
441
441
|
require_relative 'rubocop/cop/style/infinite_loop'
|
442
442
|
require_relative 'rubocop/cop/style/inverse_methods'
|
443
443
|
require_relative 'rubocop/cop/style/inline_comment'
|
444
|
+
require_relative 'rubocop/cop/style/ip_addresses'
|
444
445
|
require_relative 'rubocop/cop/style/lambda'
|
445
446
|
require_relative 'rubocop/cop/style/lambda_call'
|
446
447
|
require_relative 'rubocop/cop/style/line_end_concatenation'
|
data/lib/rubocop/ast/node.rb
CHANGED
@@ -379,6 +379,11 @@ module RuboCop
|
|
379
379
|
{equals_asgn? shorthand_asgn? asgn_method_call?}
|
380
380
|
PATTERN
|
381
381
|
|
382
|
+
# Some cops treat the shovel operator as a kind of assignment.
|
383
|
+
def_node_matcher :assignment_or_similar?, <<-PATTERN
|
384
|
+
{assignment? (send _recv :<< ...)}
|
385
|
+
PATTERN
|
386
|
+
|
382
387
|
def literal?
|
383
388
|
LITERALS.include?(type)
|
384
389
|
end
|
@@ -6,6 +6,8 @@ module RuboCop
|
|
6
6
|
# in place of a plain node when the builder constructs the AST, making
|
7
7
|
# its methods available to all `str` nodes within RuboCop.
|
8
8
|
class StrNode < Node
|
9
|
+
include BasicLiteralNode
|
10
|
+
|
9
11
|
def heredoc?
|
10
12
|
loc.is_a?(Parser::Source::Map::Heredoc)
|
11
13
|
end
|
data/lib/rubocop/cli.rb
CHANGED
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
act_on_options
|
40
40
|
apply_default_formatter
|
41
41
|
execute_runners(paths)
|
42
|
-
rescue
|
42
|
+
rescue ConfigNotFoundError, IncorrectCopNameError, OptionArgumentError => e
|
43
43
|
warn e.message
|
44
44
|
STATUS_ERROR
|
45
45
|
rescue RuboCop::Error => e
|
@@ -47,9 +47,6 @@ module RuboCop
|
|
47
47
|
STATUS_ERROR
|
48
48
|
rescue Finished
|
49
49
|
STATUS_SUCCESS
|
50
|
-
rescue IncorrectCopNameError => e
|
51
|
-
warn e.message
|
52
|
-
STATUS_ERROR
|
53
50
|
rescue OptionParser::InvalidOption => e
|
54
51
|
warn e.message
|
55
52
|
warn 'For usage information, use --help'
|
@@ -128,9 +125,9 @@ module RuboCop
|
|
128
125
|
def validate_options_vs_config
|
129
126
|
if @options[:parallel] &&
|
130
127
|
!@config_store.for(Dir.pwd).for_all_cops['UseCache']
|
131
|
-
raise
|
132
|
-
|
133
|
-
|
128
|
+
raise OptionArgumentError, '-P/--parallel uses caching to speed up ' \
|
129
|
+
'execution, so combining with AllCops: ' \
|
130
|
+
'UseCache: false is not allowed.'
|
134
131
|
end
|
135
132
|
end
|
136
133
|
|
data/lib/rubocop/config.rb
CHANGED
@@ -16,10 +16,10 @@ module RuboCop
|
|
16
16
|
|
17
17
|
COMMON_PARAMS = %w[Exclude Include Severity
|
18
18
|
AutoCorrect StyleGuide Details].freeze
|
19
|
-
# 2.
|
20
|
-
DEFAULT_RUBY_VERSION = 2.
|
21
|
-
KNOWN_RUBIES = [2.
|
22
|
-
OBSOLETE_RUBIES = { 1.9 => '0.50', 2.0 => '0.50' }.freeze
|
19
|
+
# 2.2 is the oldest officially supported Ruby version.
|
20
|
+
DEFAULT_RUBY_VERSION = 2.2
|
21
|
+
KNOWN_RUBIES = [2.2, 2.3, 2.4, 2.5].freeze
|
22
|
+
OBSOLETE_RUBIES = { 1.9 => '0.50', 2.0 => '0.50', 2.1 => '0.58' }.freeze
|
23
23
|
RUBY_VERSION_FILENAME = '.ruby-version'.freeze
|
24
24
|
DEFAULT_RAILS_VERSION = 5.0
|
25
25
|
OBSOLETE_COPS = {
|
@@ -176,15 +176,11 @@ module RuboCop
|
|
176
176
|
end
|
177
177
|
|
178
178
|
def yaml_safe_load(yaml_code, filename)
|
179
|
-
if
|
180
|
-
|
181
|
-
|
182
|
-
whitelisted_tags: %w[!ruby/regexp])
|
183
|
-
else
|
184
|
-
YAML.safe_load(yaml_code, [Regexp, Symbol], [], false, filename)
|
185
|
-
end
|
179
|
+
if defined?(SafeYAML) && SafeYAML.respond_to?(:load)
|
180
|
+
SafeYAML.load(yaml_code, filename,
|
181
|
+
whitelisted_tags: %w[!ruby/regexp])
|
186
182
|
else
|
187
|
-
YAML.
|
183
|
+
YAML.safe_load(yaml_code, [Regexp, Symbol], [], false, filename)
|
188
184
|
end
|
189
185
|
end
|
190
186
|
end
|
@@ -32,6 +32,8 @@ module RuboCop
|
|
32
32
|
# corrector = Corrector.new(source_buffer, corrections)
|
33
33
|
def initialize(source_buffer, corrections = [])
|
34
34
|
@source_buffer = source_buffer
|
35
|
+
raise 'source_buffer should be a Parser::Source::Buffer' unless \
|
36
|
+
source_buffer.is_a? Parser::Source::Buffer
|
35
37
|
@corrections = corrections
|
36
38
|
@source_rewriter = Parser::Source::TreeRewriter.new(
|
37
39
|
source_buffer,
|
@@ -72,6 +74,7 @@ module RuboCop
|
|
72
74
|
#
|
73
75
|
# @param [Parser::Source::Range] range
|
74
76
|
def remove(range)
|
77
|
+
validate_range range
|
75
78
|
@source_rewriter.remove(range)
|
76
79
|
end
|
77
80
|
|
@@ -80,6 +83,7 @@ module RuboCop
|
|
80
83
|
# @param [Parser::Source::Range] range
|
81
84
|
# @param [String] content
|
82
85
|
def insert_before(range, content)
|
86
|
+
validate_range range
|
83
87
|
# TODO: Fix Cops using bad ranges instead
|
84
88
|
if range.end_pos > @source_buffer.source.size
|
85
89
|
range = range.with(end_pos: @source_buffer.source.size)
|
@@ -93,6 +97,7 @@ module RuboCop
|
|
93
97
|
# @param [Parser::Source::Range] range
|
94
98
|
# @param [String] content
|
95
99
|
def insert_after(range, content)
|
100
|
+
validate_range range
|
96
101
|
@source_rewriter.insert_after(range, content)
|
97
102
|
end
|
98
103
|
|
@@ -101,6 +106,7 @@ module RuboCop
|
|
101
106
|
# @param [Parser::Source::Range] range
|
102
107
|
# @param [String] content
|
103
108
|
def replace(range, content)
|
109
|
+
validate_range range
|
104
110
|
@source_rewriter.replace(range, content)
|
105
111
|
end
|
106
112
|
|
@@ -109,6 +115,7 @@ module RuboCop
|
|
109
115
|
# @param [Parser::Source::Range] range
|
110
116
|
# @param [Integer] size
|
111
117
|
def remove_preceding(range, size)
|
118
|
+
validate_range range
|
112
119
|
to_remove = Parser::Source::Range.new(range.source_buffer,
|
113
120
|
range.begin_pos - size,
|
114
121
|
range.begin_pos)
|
@@ -122,6 +129,7 @@ module RuboCop
|
|
122
129
|
# @param [Parser::Source::Range] range
|
123
130
|
# @param [Integer] size
|
124
131
|
def remove_leading(range, size)
|
132
|
+
validate_range range
|
125
133
|
to_remove = Parser::Source::Range.new(range.source_buffer,
|
126
134
|
range.begin_pos,
|
127
135
|
range.begin_pos + size)
|
@@ -135,11 +143,28 @@ module RuboCop
|
|
135
143
|
# @param [Parser::Source::Range] range
|
136
144
|
# @param [Integer] size
|
137
145
|
def remove_trailing(range, size)
|
146
|
+
validate_range range
|
138
147
|
to_remove = Parser::Source::Range.new(range.source_buffer,
|
139
148
|
range.end_pos - size,
|
140
149
|
range.end_pos)
|
141
150
|
@source_rewriter.remove(to_remove)
|
142
151
|
end
|
152
|
+
|
153
|
+
private
|
154
|
+
|
155
|
+
# :nodoc:
|
156
|
+
def validate_range(range)
|
157
|
+
return if range.source_buffer == @source_buffer
|
158
|
+
unless range.source_buffer.is_a?(Parser::Source::Buffer)
|
159
|
+
# actually this should be enforced by parser gem
|
160
|
+
raise 'Corrector expected range source buffer to be a '\
|
161
|
+
"Parser::Source::Buffer, but got #{range.source_buffer.class}"
|
162
|
+
end
|
163
|
+
raise "Correction target buffer #{range.source_buffer.object_id} "\
|
164
|
+
"name:#{range.source_buffer.name.inspect}"\
|
165
|
+
" is not current #{@source_buffer.object_id} "\
|
166
|
+
"name:#{@source_buffer.name.inspect} under investigation"
|
167
|
+
end
|
143
168
|
end
|
144
169
|
end
|
145
170
|
end
|
@@ -55,13 +55,9 @@ module RuboCop
|
|
55
55
|
'beginning of method definition.'.freeze
|
56
56
|
|
57
57
|
def on_heredoc(node)
|
58
|
-
return if heredoc_type(node) == SIMPLE_HEREDOC
|
59
|
-
|
60
|
-
|
61
|
-
contents_indentation(node) >= closing_indentation(node)
|
62
|
-
return if opening_indentation(node) == closing_indentation(node)
|
63
|
-
return if argument_indentation_correct?(node)
|
64
|
-
end
|
58
|
+
return if heredoc_type(node) == SIMPLE_HEREDOC ||
|
59
|
+
opening_indentation(node) == closing_indentation(node) ||
|
60
|
+
argument_indentation_correct?(node)
|
65
61
|
|
66
62
|
add_offense(node, location: :heredoc_end)
|
67
63
|
end
|
@@ -162,7 +162,7 @@ module RuboCop
|
|
162
162
|
def alignment_node_for_variable_style(node)
|
163
163
|
return node.parent if node.case_type? && node.argument?
|
164
164
|
|
165
|
-
assignment = node.ancestors.find(&:
|
165
|
+
assignment = node.ancestors.find(&:assignment_or_similar?)
|
166
166
|
if assignment && !line_break_before_keyword?(assignment.source_range,
|
167
167
|
node)
|
168
168
|
assignment
|
@@ -103,7 +103,11 @@ module RuboCop
|
|
103
103
|
|
104
104
|
def_end_config = config.for_cop('Layout/DefEndAlignment')
|
105
105
|
style = def_end_config['EnforcedStyleAlignWith'] || 'start_of_line'
|
106
|
-
base = style == 'def'
|
106
|
+
base = if style == 'def'
|
107
|
+
node.first_argument
|
108
|
+
else
|
109
|
+
leftmost_modifier_of(node) || node
|
110
|
+
end
|
107
111
|
|
108
112
|
check_indentation(base.source_range, body)
|
109
113
|
ignore_node(node.first_argument)
|
@@ -319,6 +323,10 @@ module RuboCop
|
|
319
323
|
def configured_indentation_width
|
320
324
|
cop_config['Width']
|
321
325
|
end
|
326
|
+
|
327
|
+
def leftmost_modifier_of(node)
|
328
|
+
node.each_ancestor(:send).to_a.last
|
329
|
+
end
|
322
330
|
end
|
323
331
|
end
|
324
332
|
end
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
53
53
|
ALTERNATIVE_PROTECTED = '`protected` inside a `class << self` ' \
|
54
54
|
'block'.freeze
|
55
55
|
|
56
|
-
|
56
|
+
def_node_search :private_class_methods, <<-PATTERN
|
57
57
|
(send nil? :private_class_method $...)
|
58
58
|
PATTERN
|
59
59
|
|
@@ -67,25 +67,26 @@ module RuboCop
|
|
67
67
|
|
68
68
|
private
|
69
69
|
|
70
|
-
def clear
|
71
|
-
@useless = {}
|
72
|
-
@last_access_modifier = nil
|
73
|
-
end
|
74
|
-
|
75
70
|
def check_node(node)
|
76
71
|
return unless node && node.begin_type?
|
77
72
|
|
78
|
-
|
79
|
-
check_scope(node)
|
73
|
+
ignored_methods = private_class_method_names(node)
|
80
74
|
|
81
|
-
|
75
|
+
ineffective_modifier(node, ignored_methods) do |defs_node, modifier|
|
82
76
|
add_offense(defs_node,
|
83
77
|
location: :keyword,
|
84
|
-
message: format_message(
|
78
|
+
message: format_message(modifier))
|
85
79
|
end
|
86
80
|
end
|
87
81
|
|
88
|
-
def
|
82
|
+
def private_class_method_names(node)
|
83
|
+
private_class_methods(node).to_a.flatten
|
84
|
+
.select(&:basic_literal?)
|
85
|
+
.map(&:value)
|
86
|
+
end
|
87
|
+
|
88
|
+
def format_message(modifier)
|
89
|
+
visibility = modifier.method_name
|
89
90
|
alternative = if visibility == :private
|
90
91
|
ALTERNATIVE_PRIVATE
|
91
92
|
else
|
@@ -96,52 +97,28 @@ module RuboCop
|
|
96
97
|
alternative: alternative)
|
97
98
|
end
|
98
99
|
|
99
|
-
def
|
100
|
-
node.each_child_node
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
check_defs(node, cur_vis)
|
111
|
-
when :kwbegin
|
112
|
-
check_scope(node, cur_vis)
|
100
|
+
def ineffective_modifier(node, ignored_methods, modifier = nil, &block)
|
101
|
+
node.each_child_node do |child|
|
102
|
+
case child.type
|
103
|
+
when :send
|
104
|
+
modifier = child if access_modifier?(child)
|
105
|
+
when :defs
|
106
|
+
next if correct_visibility?(child, modifier, ignored_methods)
|
107
|
+
yield child, modifier
|
108
|
+
when :kwbegin
|
109
|
+
ineffective_modifier(child, ignored_methods, modifier, &block)
|
110
|
+
end
|
113
111
|
end
|
114
|
-
|
115
|
-
cur_vis
|
116
112
|
end
|
117
113
|
|
118
|
-
def
|
119
|
-
|
120
|
-
@last_access_modifier = node
|
121
|
-
return node.method_name
|
122
|
-
elsif (methods = private_class_method(node))
|
123
|
-
# don't warn about defs nodes which are followed by a call to
|
124
|
-
# `private_class_method :name`
|
125
|
-
# obviously the programmer knows what they are doing
|
126
|
-
revert_method_uselessness(methods)
|
127
|
-
end
|
128
|
-
|
129
|
-
cur_vis
|
114
|
+
def access_modifier?(node)
|
115
|
+
node.bare_access_modifier? && !node.method?(:module_function)
|
130
116
|
end
|
131
117
|
|
132
|
-
def
|
133
|
-
|
134
|
-
end
|
118
|
+
def correct_visibility?(node, modifier, ignored_methods)
|
119
|
+
return true if modifier.nil? || modifier.method_name == :public
|
135
120
|
|
136
|
-
|
137
|
-
@useless[node.method_name] = [node, cur_vis, @last_access_modifier]
|
138
|
-
end
|
139
|
-
|
140
|
-
def revert_method_uselessness(methods)
|
141
|
-
methods.each do |sym|
|
142
|
-
next unless sym.sym_type?
|
143
|
-
@useless.delete(sym.value)
|
144
|
-
end
|
121
|
+
ignored_methods.include?(node.method_name)
|
145
122
|
end
|
146
123
|
end
|
147
124
|
end
|