rubocop 1.48.1 → 1.50.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 +1 -1
- data/config/default.yml +19 -7
- data/lib/rubocop/cli/command/execute_runner.rb +7 -2
- data/lib/rubocop/cli.rb +6 -6
- data/lib/rubocop/config.rb +1 -1
- data/lib/rubocop/config_loader.rb +8 -8
- data/lib/rubocop/cop/autocorrect_logic.rb +28 -12
- data/lib/rubocop/cop/cop.rb +2 -2
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +29 -2
- data/lib/rubocop/cop/layout/class_structure.rb +1 -0
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +6 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +6 -7
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +3 -3
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +102 -0
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +7 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -3
- data/lib/rubocop/cop/lint/useless_method_definition.rb +10 -2
- data/lib/rubocop/cop/lint/void.rb +7 -3
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -1
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +23 -4
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/class_equality_comparison.rb +42 -9
- data/lib/rubocop/cop/style/copyright.rb +1 -1
- data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +2 -2
- data/lib/rubocop/cop/style/file_empty.rb +3 -3
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/hash_except.rb +4 -4
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +38 -12
- data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
- data/lib/rubocop/cop/style/map_to_set.rb +4 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +3 -7
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +43 -36
- data/lib/rubocop/cop/style/multiline_method_signature.rb +6 -3
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +167 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -3
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -2
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- data/lib/rubocop/cops_documentation_generator.rb +10 -3
- data/lib/rubocop/ext/regexp_node.rb +1 -1
- data/lib/rubocop/ext/regexp_parser.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/options.rb +4 -1
- data/lib/rubocop/result_cache.rb +1 -1
- data/lib/rubocop/server/cache.rb +1 -1
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -1
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +3 -0
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b29d7b756beef5910c678a948e4c5e6a852978e39b6d4436eadaf9087731a742
|
4
|
+
data.tar.gz: 139e8da95a5f9f5d84c6286bfccad4f41aa93790c7387b5e9737f5e8a3b0dd6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c642f1f939b5fd5c91669422f4cc901bc889b1999d0f44ab6e576a4b9aa84c5a0f77540a8b9ad613dd42d71c560699b7218fa5f5d9320721bb8f2ccf9b97aee
|
7
|
+
data.tar.gz: 7980c7461a8e5d7d7cb1e19bdcba86696490b3c016adaca99011c100373e1db5944fb20642d270db11f68aa5604dc9b26fcd25733f4285e777f5ab8a504b025f
|
data/README.md
CHANGED
@@ -53,7 +53,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
|
|
53
53
|
in your `Gemfile`:
|
54
54
|
|
55
55
|
```rb
|
56
|
-
gem 'rubocop', '~> 1.
|
56
|
+
gem 'rubocop', '~> 1.50', require: false
|
57
57
|
```
|
58
58
|
|
59
59
|
See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
|
data/config/default.yml
CHANGED
@@ -1016,8 +1016,6 @@ Layout/LineContinuationLeadingSpace:
|
|
1016
1016
|
Layout/LineContinuationSpacing:
|
1017
1017
|
Description: 'Checks the spacing in front of backslash in line continuations.'
|
1018
1018
|
Enabled: pending
|
1019
|
-
AutoCorrect: true
|
1020
|
-
SafeAutoCorrect: true
|
1021
1019
|
VersionAdded: '1.31'
|
1022
1020
|
EnforcedStyle: space
|
1023
1021
|
SupportedStyles:
|
@@ -1752,6 +1750,11 @@ Lint/DuplicateMagicComment:
|
|
1752
1750
|
Enabled: pending
|
1753
1751
|
VersionAdded: '1.37'
|
1754
1752
|
|
1753
|
+
Lint/DuplicateMatchPattern:
|
1754
|
+
Description: 'Do not repeat patterns in `in` keywords.'
|
1755
|
+
Enabled: pending
|
1756
|
+
VersionAdded: '1.50'
|
1757
|
+
|
1755
1758
|
Lint/DuplicateMethods:
|
1756
1759
|
Description: 'Check for duplicate method definitions.'
|
1757
1760
|
Enabled: true
|
@@ -2779,7 +2782,7 @@ Naming/InclusiveLanguage:
|
|
2779
2782
|
Description: 'Recommend the use of inclusive language instead of problematic terms.'
|
2780
2783
|
Enabled: false
|
2781
2784
|
VersionAdded: '1.18'
|
2782
|
-
VersionChanged: '1.
|
2785
|
+
VersionChanged: '1.49'
|
2783
2786
|
CheckIdentifiers: true
|
2784
2787
|
CheckConstants: true
|
2785
2788
|
CheckVariables: true
|
@@ -3277,7 +3280,7 @@ Style/ClassAndModuleChildren:
|
|
3277
3280
|
StyleGuide: '#namespace-definition'
|
3278
3281
|
# Moving from compact to nested children requires knowledge of whether the
|
3279
3282
|
# outer parent is a module or a class. Moving from nested to compact requires
|
3280
|
-
# verification that the outer parent is defined elsewhere.
|
3283
|
+
# verification that the outer parent is defined elsewhere. RuboCop does not
|
3281
3284
|
# have the knowledge to perform either operation safely and thus requires
|
3282
3285
|
# manual oversight.
|
3283
3286
|
SafeAutoCorrect: false
|
@@ -3508,6 +3511,12 @@ Style/Copyright:
|
|
3508
3511
|
Notice: '^Copyright (\(c\) )?2[0-9]{3} .+'
|
3509
3512
|
AutocorrectNotice: ''
|
3510
3513
|
|
3514
|
+
Style/DataInheritance:
|
3515
|
+
Description: 'Checks for inheritance from Data.define.'
|
3516
|
+
StyleGuide: '#no-extend-data-define'
|
3517
|
+
Enabled: pending
|
3518
|
+
VersionAdded: '1.49'
|
3519
|
+
|
3511
3520
|
Style/DateTime:
|
3512
3521
|
Description: 'Use Time over DateTime.'
|
3513
3522
|
StyleGuide: '#date-time'
|
@@ -3737,7 +3746,6 @@ Style/FileEmpty:
|
|
3737
3746
|
Prefer to use `File.empty?('path/to/file')` when checking if a file is empty.
|
3738
3747
|
Enabled: pending
|
3739
3748
|
Safe: false
|
3740
|
-
SafeAutoCorrect: false
|
3741
3749
|
VersionAdded: '1.48'
|
3742
3750
|
|
3743
3751
|
Style/FileRead:
|
@@ -4565,11 +4573,10 @@ Style/NumericPredicate:
|
|
4565
4573
|
Checks for the use of predicate- or comparison methods for
|
4566
4574
|
numeric comparisons.
|
4567
4575
|
StyleGuide: '#predicate-methods'
|
4568
|
-
Safe: false
|
4569
4576
|
# This will change to a new method call which isn't guaranteed to be on the
|
4570
4577
|
# object. Switching these methods has to be done with knowledge of the types
|
4571
4578
|
# of the variables which rubocop doesn't have.
|
4572
|
-
|
4579
|
+
Safe: false
|
4573
4580
|
Enabled: true
|
4574
4581
|
VersionAdded: '0.42'
|
4575
4582
|
VersionChanged: '0.59'
|
@@ -4878,6 +4885,11 @@ Style/RedundantInterpolation:
|
|
4878
4885
|
VersionAdded: '0.76'
|
4879
4886
|
VersionChanged: '1.30'
|
4880
4887
|
|
4888
|
+
Style/RedundantLineContinuation:
|
4889
|
+
Description: 'Check for redundant line continuation.'
|
4890
|
+
Enabled: pending
|
4891
|
+
VersionAdded: '1.49'
|
4892
|
+
|
4881
4893
|
Style/RedundantParentheses:
|
4882
4894
|
Description: "Checks for parentheses that seem not to serve any purpose."
|
4883
4895
|
Enabled: true
|
@@ -76,13 +76,18 @@ module RuboCop
|
|
76
76
|
warn <<~WARNING
|
77
77
|
Errors are usually caused by RuboCop bugs.
|
78
78
|
Please, report your problems to RuboCop's issue tracker.
|
79
|
-
#{
|
80
|
-
|
79
|
+
#{bug_tracker_uri}
|
81
80
|
Mention the following information in the issue report:
|
82
81
|
#{RuboCop::Version.version(debug: true)}
|
83
82
|
WARNING
|
84
83
|
end
|
85
84
|
|
85
|
+
def bug_tracker_uri
|
86
|
+
return unless Gem.loaded_specs.key?('rubocop')
|
87
|
+
|
88
|
+
"#{Gem.loaded_specs['rubocop'].metadata['bug_tracker_uri']}\n"
|
89
|
+
end
|
90
|
+
|
86
91
|
def maybe_print_corrected_source
|
87
92
|
# Integration tools (like RubyMine) expect to have only the JSON result
|
88
93
|
# when specifying JSON format. Similar HTML and JUnit are targeted as well.
|
data/lib/rubocop/cli.rb
CHANGED
@@ -87,20 +87,20 @@ module RuboCop
|
|
87
87
|
|
88
88
|
tmp_dir = File.join(ConfigFinder.project_root, 'tmp')
|
89
89
|
FileUtils.mkdir_p(tmp_dir)
|
90
|
+
cpu_profile_file = File.join(tmp_dir, 'rubocop-stackprof.dump')
|
90
91
|
status = nil
|
91
92
|
|
92
|
-
StackProf.run(out:
|
93
|
+
StackProf.run(out: cpu_profile_file) do
|
93
94
|
status = yield
|
94
95
|
end
|
95
|
-
puts
|
96
|
+
puts "Profile report generated at #{cpu_profile_file}"
|
96
97
|
|
97
98
|
if with_memory
|
98
99
|
puts 'Building memory report...'
|
99
100
|
report = MemoryProfiler.stop
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
)
|
101
|
+
memory_profile_file = File.join(tmp_dir, 'rubocop-memory_profiler.txt')
|
102
|
+
report.pretty_print(to_file: memory_profile_file, scale_bytes: true)
|
103
|
+
puts "Memory report generated at #{memory_profile_file}"
|
104
104
|
end
|
105
105
|
status
|
106
106
|
end
|
data/lib/rubocop/config.rb
CHANGED
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
end
|
30
30
|
|
31
31
|
# rubocop:disable Metrics/AbcSize
|
32
|
-
def initialize(hash =
|
32
|
+
def initialize(hash = RuboCop::ConfigLoader.default_configuration, loaded_path = nil)
|
33
33
|
@loaded_path = loaded_path
|
34
34
|
@for_cop = Hash.new do |h, cop|
|
35
35
|
cop_name = cop.respond_to?(:cop_name) ? cop.cop_name : cop
|
@@ -23,6 +23,14 @@ module RuboCop
|
|
23
23
|
class << self
|
24
24
|
include FileFinder
|
25
25
|
|
26
|
+
PENDING_BANNER = <<~BANNER
|
27
|
+
The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
|
28
|
+
|
29
|
+
Please also note that you can opt-in to new cops by default by adding this to your config:
|
30
|
+
AllCops:
|
31
|
+
NewCops: enable
|
32
|
+
BANNER
|
33
|
+
|
26
34
|
attr_accessor :debug, :ignore_parent_exclusion, :disable_pending_cops, :enable_pending_cops,
|
27
35
|
:ignore_unrecognized_cops
|
28
36
|
attr_writer :default_configuration
|
@@ -165,14 +173,6 @@ module RuboCop
|
|
165
173
|
ConfigFinder.project_root
|
166
174
|
end
|
167
175
|
|
168
|
-
PENDING_BANNER = <<~BANNER
|
169
|
-
The following cops were added to RuboCop, but are not configured. Please set Enabled to either `true` or `false` in your `.rubocop.yml` file.
|
170
|
-
|
171
|
-
Please also note that you can opt-in to new cops by default by adding this to your config:
|
172
|
-
AllCops:
|
173
|
-
NewCops: enable
|
174
|
-
BANNER
|
175
|
-
|
176
176
|
def warn_on_pending_cops(pending_cops)
|
177
177
|
warn Rainbow(PENDING_BANNER).yellow
|
178
178
|
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
return false if cop_config['AutoCorrect'] == false
|
36
36
|
|
37
37
|
# :safe_autocorrect is a derived option based on several command-line
|
38
|
-
# arguments - see
|
38
|
+
# arguments - see RuboCop::Options#add_autocorrection_options
|
39
39
|
return safe_autocorrect? if @options.fetch(:safe_autocorrect, false)
|
40
40
|
|
41
41
|
true
|
@@ -43,18 +43,24 @@ module RuboCop
|
|
43
43
|
|
44
44
|
private
|
45
45
|
|
46
|
-
def disable_offense(
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
def disable_offense(offense_range)
|
47
|
+
range = surrounding_heredoc(offense_range) || surrounding_percent_array(offense_range)
|
48
|
+
|
49
|
+
if range
|
50
|
+
disable_offense_before_and_after(range_by_lines(range))
|
51
|
+
else
|
52
|
+
disable_offense_with_eol_or_surround_comment(offense_range)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def disable_offense_with_eol_or_surround_comment(range)
|
57
|
+
eol_comment = " # rubocop:todo #{cop_name}"
|
58
|
+
needed_line_length = (range.source_line + eol_comment).length
|
59
|
+
|
60
|
+
if needed_line_length <= max_line_length
|
61
|
+
disable_offense_at_end_of_line(range_of_first_line(range), eol_comment)
|
50
62
|
else
|
51
|
-
|
52
|
-
needed_line_length = (range.source_line + eol_comment).length
|
53
|
-
if needed_line_length <= max_line_length
|
54
|
-
disable_offense_at_end_of_line(range_of_first_line(range), eol_comment)
|
55
|
-
else
|
56
|
-
disable_offense_before_and_after(range_by_lines(range))
|
57
|
-
end
|
63
|
+
disable_offense_before_and_after(range_by_lines(range))
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
@@ -69,6 +75,16 @@ module RuboCop
|
|
69
75
|
.find { |range| range.contains?(offense_range) }
|
70
76
|
end
|
71
77
|
|
78
|
+
def surrounding_percent_array(offense_range)
|
79
|
+
return nil if offense_range.empty?
|
80
|
+
|
81
|
+
percent_array = processed_source.ast.each_descendant.select do |node|
|
82
|
+
node.array_type? && node.percent_literal?
|
83
|
+
end
|
84
|
+
|
85
|
+
percent_array.map(&:source_range).find { |range| range.overlaps?(offense_range) }
|
86
|
+
end
|
87
|
+
|
72
88
|
def range_of_first_line(range)
|
73
89
|
begin_of_first_line = range.begin_pos - range.column
|
74
90
|
end_of_first_line = begin_of_first_line + range.source_line.length
|
data/lib/rubocop/cop/cop.rb
CHANGED
@@ -138,10 +138,10 @@ module RuboCop
|
|
138
138
|
def correction_lambda
|
139
139
|
return unless support_autocorrect?
|
140
140
|
|
141
|
-
|
141
|
+
dedupe_on_node(@v0_argument) { autocorrect(@v0_argument) }
|
142
142
|
end
|
143
143
|
|
144
|
-
def
|
144
|
+
def dedupe_on_node(node)
|
145
145
|
@corrected_nodes ||= {}.compare_by_identity
|
146
146
|
yield unless @corrected_nodes.key?(node)
|
147
147
|
ensure
|
@@ -66,10 +66,10 @@ module RuboCop
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
def line_breaks(node, source, previous_line_num, base_line_num,
|
69
|
+
def line_breaks(node, source, previous_line_num, base_line_num, node_index)
|
70
70
|
source_in_lines = source.split("\n")
|
71
71
|
if first_line?(node, previous_line_num)
|
72
|
-
|
72
|
+
node_index.zero? && node.first_line == base_line_num ? '' : ' '
|
73
73
|
else
|
74
74
|
process_lines(node, previous_line_num, base_line_num, source_in_lines)
|
75
75
|
end
|
@@ -24,7 +24,7 @@ module RuboCop
|
|
24
24
|
MSG = 'Description should be started with %<suggestion>s instead of `This cop ...`.'
|
25
25
|
|
26
26
|
SPECIAL_WORDS = %w[is can could should will would must may].freeze
|
27
|
-
COP_DESC_OFFENSE_REGEX =
|
27
|
+
COP_DESC_OFFENSE_REGEX =
|
28
28
|
/^\s+# This cop (?<special>#{SPECIAL_WORDS.join('|')})?\s*(?<word>.+?) .*/.freeze
|
29
29
|
REPLACEMENT_REGEX = /^\s+# This cop (#{SPECIAL_WORDS.join('|')})?\s*(.+?) /.freeze
|
30
30
|
|
@@ -52,7 +52,7 @@ module RuboCop
|
|
52
52
|
# @return [void]
|
53
53
|
def autocorrect(corrector, node)
|
54
54
|
[
|
55
|
-
|
55
|
+
heredoc_opening_delimiter_range_from(node),
|
56
56
|
heredoc_closing_delimiter_range_from(node)
|
57
57
|
].each do |range|
|
58
58
|
corrector.replace(range, EXPECTED_HEREDOC_DELIMITER)
|
@@ -90,7 +90,7 @@ module RuboCop
|
|
90
90
|
|
91
91
|
# @param node [RuboCop::AST::StrNode]
|
92
92
|
# @return [Parser::Source::Range]
|
93
|
-
def
|
93
|
+
def heredoc_opening_delimiter_range_from(node)
|
94
94
|
match_data = node.source.match(Heredoc::OPENING_DELIMITER)
|
95
95
|
node.source_range.begin.adjust(
|
96
96
|
begin_pos: match_data.begin(2),
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module InternalAffairs
|
6
|
-
# `RuboCop::Cop::Cop` is deprecated and will be removed in
|
6
|
+
# `RuboCop::Cop::Cop` is deprecated and will be removed in RuboCop 2.0.
|
7
7
|
# Your custom cop class should inherit from `RuboCop::Cop::Base` instead of
|
8
8
|
# `RuboCop::Cop::Cop`.
|
9
9
|
#
|
@@ -13,19 +13,46 @@ module RuboCop
|
|
13
13
|
# # good
|
14
14
|
# node.source
|
15
15
|
#
|
16
|
+
# # bad
|
17
|
+
# add_offense(node) { |corrector| corrector.replace(node.source_range, prefer) }
|
18
|
+
# add_offense(node) { |corrector| corrector.insert_before(node.source_range, prefer) }
|
19
|
+
# add_offense(node) { |corrector| corrector.insert_before_multi(node.source_range, prefer) }
|
20
|
+
# add_offense(node) { |corrector| corrector.insert_after(node.source_range, prefer) }
|
21
|
+
# add_offense(node) { |corrector| corrector.insert_after_multi(node.source_range, prefer) }
|
22
|
+
# add_offense(node) { |corrector| corrector.swap(node.source_range, before, after) }
|
23
|
+
#
|
24
|
+
# # good
|
25
|
+
# add_offense(node) { |corrector| corrector.replace(node, prefer) }
|
26
|
+
# add_offense(node) { |corrector| corrector.insert_before(node, prefer) }
|
27
|
+
# add_offense(node) { |corrector| corrector.insert_before_multi(node, prefer) }
|
28
|
+
# add_offense(node) { |corrector| corrector.insert_after(node, prefer) }
|
29
|
+
# add_offense(node) { |corrector| corrector.insert_after_multi(node, prefer) }
|
30
|
+
# add_offense(node) { |corrector| corrector.swap(node, before, after) }
|
31
|
+
#
|
16
32
|
class RedundantSourceRange < Base
|
17
33
|
extend AutoCorrector
|
18
34
|
|
19
35
|
MSG = 'Remove the redundant `source_range`.'
|
20
|
-
RESTRICT_ON_SEND = %i[
|
36
|
+
RESTRICT_ON_SEND = %i[
|
37
|
+
source
|
38
|
+
replace remove insert_before insert_before_multi insert_after insert_after_multi swap
|
39
|
+
].freeze
|
21
40
|
|
22
41
|
# @!method redundant_source_range(node)
|
23
42
|
def_node_matcher :redundant_source_range, <<~PATTERN
|
24
|
-
|
43
|
+
{
|
44
|
+
(send $(send _ :source_range) :source)
|
45
|
+
(send _ {
|
46
|
+
:replace :insert_before :insert_before_multi :insert_after :insert_after_multi
|
47
|
+
} $(send _ :source_range) _)
|
48
|
+
(send _ :remove $(send _ :source_range))
|
49
|
+
(send _ :swap $(send _ :source_range) _ _)
|
50
|
+
}
|
25
51
|
PATTERN
|
26
52
|
|
27
53
|
def on_send(node)
|
28
54
|
return unless (source_range = redundant_source_range(node))
|
55
|
+
return if source_range.receiver.send_type? && source_range.receiver.method?(:buffer)
|
29
56
|
|
30
57
|
selector = source_range.loc.selector
|
31
58
|
|
@@ -137,7 +137,7 @@ module RuboCop
|
|
137
137
|
end
|
138
138
|
|
139
139
|
def current_token(comment)
|
140
|
-
processed_source.
|
140
|
+
processed_source.tokens.find { |token| token.pos == comment.source_range }
|
141
141
|
end
|
142
142
|
|
143
143
|
def previous_token(node)
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
return unless processed_source.raw_source.include?("\n\n\n")
|
32
32
|
|
33
33
|
lines = Set.new
|
34
|
-
processed_source.
|
34
|
+
processed_source.tokens.each { |token| lines << token.line }
|
35
35
|
|
36
36
|
each_extra_empty_line(lines.sort) do |range|
|
37
37
|
add_offense(range) do |corrector|
|
@@ -51,6 +51,8 @@ module RuboCop
|
|
51
51
|
MSG_BEFORE_FOR_ONLY_BEFORE = 'Keep a blank line before `%<modifier>s`.'
|
52
52
|
MSG_AFTER_FOR_ONLY_BEFORE = 'Remove a blank line after `%<modifier>s`.'
|
53
53
|
|
54
|
+
RESTRICT_ON_SEND = %i[public protected private module_function].freeze
|
55
|
+
|
54
56
|
def initialize(config = nil, options = nil)
|
55
57
|
super
|
56
58
|
|
@@ -109,6 +109,7 @@ module RuboCop
|
|
109
109
|
check_other_alignment(node)
|
110
110
|
end
|
111
111
|
end
|
112
|
+
alias on_case_match on_case
|
112
113
|
|
113
114
|
private
|
114
115
|
|
@@ -169,7 +170,10 @@ module RuboCop
|
|
169
170
|
end
|
170
171
|
|
171
172
|
def alignment_node_for_variable_style(node)
|
172
|
-
|
173
|
+
if (node.case_type? || node.case_match_type?) && node.argument? &&
|
174
|
+
same_line?(node, node.parent)
|
175
|
+
return node.parent
|
176
|
+
end
|
173
177
|
|
174
178
|
assignment = assignment_or_operator_method(node)
|
175
179
|
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
-
def aligned_locations(locs)
|
52
|
+
def aligned_locations(locs) # rubocop:disable Metrics/AbcSize
|
53
53
|
return [] if locs.empty?
|
54
54
|
|
55
55
|
aligned = Set[locs.first.line, locs.last.line]
|
@@ -57,6 +57,11 @@ module RuboCop
|
|
57
57
|
col = loc.column
|
58
58
|
aligned << loc.line if col == before.column || col == after.column
|
59
59
|
end
|
60
|
+
|
61
|
+
# if locs.size > 2 and the size of variable `aligned`
|
62
|
+
# has not increased from its initial value, there are not aligned lines.
|
63
|
+
return [] if locs.size > 2 && aligned.size == 2
|
64
|
+
|
60
65
|
aligned
|
61
66
|
end
|
62
67
|
|
@@ -153,9 +153,10 @@ module RuboCop
|
|
153
153
|
MSG = 'Indent the first argument one step more than %<base>s.'
|
154
154
|
|
155
155
|
def on_send(node)
|
156
|
+
return unless should_check?(node)
|
157
|
+
return if same_line?(node, node.first_argument)
|
156
158
|
return if style != :consistent && enforce_first_argument_with_fixed_indentation? &&
|
157
159
|
!enable_layout_first_method_argument_line_break?
|
158
|
-
return if !node.arguments? || bare_operator?(node) || node.setter_method?
|
159
160
|
|
160
161
|
indent = base_indentation(node) + configured_indentation_width
|
161
162
|
|
@@ -166,6 +167,10 @@ module RuboCop
|
|
166
167
|
|
167
168
|
private
|
168
169
|
|
170
|
+
def should_check?(node)
|
171
|
+
node.arguments? && !bare_operator?(node) && !node.setter_method?
|
172
|
+
end
|
173
|
+
|
169
174
|
def autocorrect(corrector, node)
|
170
175
|
AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
|
171
176
|
end
|
@@ -67,7 +67,7 @@ module RuboCop
|
|
67
67
|
|
68
68
|
outermost_send = outermost_send_on_same_line(heredoc_arg)
|
69
69
|
return unless outermost_send
|
70
|
-
return if
|
70
|
+
return if end_keyword_before_closing_parenthesis?(node)
|
71
71
|
return if subsequent_closing_parentheses_in_same_line?(outermost_send)
|
72
72
|
return if exist_argument_between_heredoc_end_and_closing_parentheses?(node)
|
73
73
|
|
@@ -159,7 +159,7 @@ module RuboCop
|
|
159
159
|
|
160
160
|
# Closing parenthesis helpers.
|
161
161
|
|
162
|
-
def
|
162
|
+
def end_keyword_before_closing_parenthesis?(parenthesized_send_node)
|
163
163
|
parenthesized_send_node.ancestors.any? do |ancestor|
|
164
164
|
ancestor.loc.respond_to?(:end) && ancestor.loc.end&.source == 'end'
|
165
165
|
end
|
@@ -50,9 +50,9 @@ module RuboCop
|
|
50
50
|
|
51
51
|
def on_send(node)
|
52
52
|
# Include "the whole expression".
|
53
|
-
node = node.parent while
|
54
|
-
|
55
|
-
node.parent
|
53
|
+
node = node.parent while node.parent&.send_type? ||
|
54
|
+
convertible_block?(node) ||
|
55
|
+
node.parent.is_a?(RuboCop::AST::BinaryOperatorNode)
|
56
56
|
|
57
57
|
return unless offense?(node) && !part_of_ignored_node?(node)
|
58
58
|
|
@@ -69,15 +69,14 @@ module RuboCop
|
|
69
69
|
|
70
70
|
def register_offense(node)
|
71
71
|
add_offense(node) do |corrector|
|
72
|
-
corrector.replace(node
|
72
|
+
corrector.replace(node, to_single_line(node.source).strip)
|
73
73
|
end
|
74
74
|
ignore_node(node)
|
75
75
|
end
|
76
76
|
|
77
77
|
def offense?(node)
|
78
|
-
|
79
|
-
|
80
|
-
node.multiline? && !too_long?(node) && suitable_as_single_line?(node)
|
78
|
+
node.multiline? && !too_long?(node) && suitable_as_single_line?(node) &&
|
79
|
+
!configured_to_not_be_inspected?(node)
|
81
80
|
end
|
82
81
|
|
83
82
|
def configured_to_not_be_inspected?(node)
|
@@ -34,6 +34,7 @@ module RuboCop
|
|
34
34
|
|
35
35
|
def on_send(node)
|
36
36
|
return unless regular_method_call_with_arguments?(node)
|
37
|
+
return if node.parenthesized?
|
37
38
|
|
38
39
|
first_arg = node.first_argument.source_range
|
39
40
|
first_arg_with_space = range_with_surrounding_space(first_arg, side: :left)
|
@@ -52,7 +53,6 @@ module RuboCop
|
|
52
53
|
end
|
53
54
|
|
54
55
|
def expect_params_after_method_name?(node)
|
55
|
-
return false if node.parenthesized?
|
56
56
|
return true if no_space_between_method_name_and_first_argument?(node)
|
57
57
|
|
58
58
|
first_arg = node.first_argument
|
@@ -91,7 +91,7 @@ module RuboCop
|
|
91
91
|
if !left_parens?(token1, token2) && !right_parens?(token1, token2)
|
92
92
|
correct_missing_space(token1, token2)
|
93
93
|
else
|
94
|
-
|
94
|
+
correct_extraneous_space_between_consecutive_parens(token1, token2)
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
@@ -112,7 +112,7 @@ module RuboCop
|
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
|
-
def
|
115
|
+
def correct_extraneous_space_between_consecutive_parens(token1, token2)
|
116
116
|
return if range_between(token1.end_pos, token2.begin_pos).source != ' '
|
117
117
|
|
118
118
|
range = range_between(token1.end_pos, token2.begin_pos)
|
@@ -38,7 +38,7 @@ module RuboCop
|
|
38
38
|
attr clone dup exists? freeze gethostbyaddr gethostbyname iterator?
|
39
39
|
].freeze
|
40
40
|
|
41
|
-
|
41
|
+
PREFERRED_METHODS = {
|
42
42
|
clone: 'to_h',
|
43
43
|
dup: 'to_h',
|
44
44
|
exists?: 'exist?',
|
@@ -97,11 +97,11 @@ module RuboCop
|
|
97
97
|
|
98
98
|
"#{preferred_attr_method} #{node.first_argument.source}"
|
99
99
|
elsif dir_env_file_const?(node.receiver)
|
100
|
-
prefer =
|
100
|
+
prefer = PREFERRED_METHODS[node.method_name]
|
101
101
|
|
102
102
|
prefer ? "#{node.receiver.source}.#{prefer}" : 'ENV'
|
103
103
|
else
|
104
|
-
|
104
|
+
PREFERRED_METHODS[node.method_name]
|
105
105
|
end
|
106
106
|
end
|
107
107
|
|