rubocop 0.72.0 → 0.73.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 +13 -0
- data/lib/rubocop.rb +2 -0
- data/lib/rubocop/ast/node.rb +8 -8
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +16 -5
- data/lib/rubocop/ast/traversal.rb +3 -3
- data/lib/rubocop/cop/autocorrect_logic.rb +71 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/commissioner.rb +3 -9
- data/lib/rubocop/cop/cop.rb +36 -6
- data/lib/rubocop/cop/corrector.rb +2 -3
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +1 -1
- data/lib/rubocop/cop/layout/indent_first_argument.rb +1 -1
- data/lib/rubocop/cop/layout/indent_heredoc.rb +3 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -4
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +14 -2
- data/lib/rubocop/cop/layout/tab.rb +10 -22
- data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +2 -2
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -5
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
- data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
- data/lib/rubocop/cop/security/eval.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +1 -1
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -1
- data/lib/rubocop/cop/security/yaml_load.rb +1 -1
- data/lib/rubocop/cop/style/alias.rb +1 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
- data/lib/rubocop/cop/style/constant_visibility.rb +1 -1
- data/lib/rubocop/cop/style/date_time.rb +3 -3
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +49 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
- data/lib/rubocop/cop/style/float_division.rb +4 -4
- data/lib/rubocop/cop/style/format_string.rb +7 -7
- data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +2 -2
- data/lib/rubocop/cop/style/min_max.rb +1 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +1 -1
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
- data/lib/rubocop/cop/style/strip.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_sort.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +5 -5
- data/lib/rubocop/cop/team.rb +15 -14
- data/lib/rubocop/error.rb +23 -0
- data/lib/rubocop/node_pattern.rb +2 -2
- data/lib/rubocop/options.rb +17 -0
- data/lib/rubocop/rspec/shared_contexts.rb +12 -0
- data/lib/rubocop/target_finder.rb +6 -4
- data/lib/rubocop/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65d141c7453c4d515c8e6a54e88cbc82305193f9fdd078148939550973c06eef
|
4
|
+
data.tar.gz: 78246e2ffa87ef9a0206e73227f323bfd9d1fdf97f565660c12f52854d2e75f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48f6c20451589a69ebf28b1dacb70193d9baa0b6a5c6a5f2c065c00df2a7df284575705ac65027f4884b0673d1b62babf862ad2c9bdb461f909c4b38cb15a138
|
7
|
+
data.tar.gz: ea5877d8c872db2adf5f45e6613d01881227b7a22394c8e661fb41e78b5a9d75fb2662471a1876f287718092120ef2953105f27392c2a741273f9dd131544b29
|
data/README.md
CHANGED
@@ -52,7 +52,7 @@ haven't reached version 1.0 yet). To prevent an unwanted RuboCop update you
|
|
52
52
|
might want to use a conservative version lock in your `Gemfile`:
|
53
53
|
|
54
54
|
```rb
|
55
|
-
gem 'rubocop', '~> 0.
|
55
|
+
gem 'rubocop', '~> 0.73.0', require: false
|
56
56
|
```
|
57
57
|
|
58
58
|
## Quickstart
|
data/config/default.yml
CHANGED
@@ -816,6 +816,8 @@ Layout/LeadingCommentSpace:
|
|
816
816
|
StyleGuide: '#hash-space'
|
817
817
|
Enabled: true
|
818
818
|
VersionAdded: '0.49'
|
819
|
+
VersionChanged: '0.73'
|
820
|
+
AllowDoxygenCommentStyle: false
|
819
821
|
|
820
822
|
Layout/MultilineArrayBraceLayout:
|
821
823
|
Description: >-
|
@@ -2555,6 +2557,11 @@ Style/DocumentationMethod:
|
|
2555
2557
|
- 'test/**/*'
|
2556
2558
|
RequireForNonPublicMethods: false
|
2557
2559
|
|
2560
|
+
Style/DoubleCopDisableDirective:
|
2561
|
+
Description: 'Checks for double rubocop:disable comments on a single line.'
|
2562
|
+
Enabled: true
|
2563
|
+
VersionAdded: '0.73'
|
2564
|
+
|
2558
2565
|
Style/DoubleNegation:
|
2559
2566
|
Description: 'Checks for uses of double negation (!!).'
|
2560
2567
|
StyleGuide: '#no-bang-bang'
|
@@ -3041,6 +3048,12 @@ Style/MultilineTernaryOperator:
|
|
3041
3048
|
Enabled: true
|
3042
3049
|
VersionAdded: '0.9'
|
3043
3050
|
|
3051
|
+
Style/MultilineWhenThen:
|
3052
|
+
Description: 'Do not use then for multi-line when statement.'
|
3053
|
+
StyleGuide: '#no-then'
|
3054
|
+
Enabled: true
|
3055
|
+
VersionAdded: '0.72'
|
3056
|
+
|
3044
3057
|
Style/MultipleComparison:
|
3045
3058
|
Description: >-
|
3046
3059
|
Avoid comparing a variable with multiple items in a conditional,
|
data/lib/rubocop.rb
CHANGED
@@ -414,6 +414,7 @@ require_relative 'rubocop/cop/style/def_with_parentheses'
|
|
414
414
|
require_relative 'rubocop/cop/style/dir'
|
415
415
|
require_relative 'rubocop/cop/style/documentation_method'
|
416
416
|
require_relative 'rubocop/cop/style/documentation'
|
417
|
+
require_relative 'rubocop/cop/style/double_cop_disable_directive'
|
417
418
|
require_relative 'rubocop/cop/style/double_negation'
|
418
419
|
require_relative 'rubocop/cop/style/each_for_simple_loop'
|
419
420
|
require_relative 'rubocop/cop/style/each_with_object'
|
@@ -466,6 +467,7 @@ require_relative 'rubocop/cop/style/multiline_if_modifier'
|
|
466
467
|
require_relative 'rubocop/cop/style/multiline_method_signature'
|
467
468
|
require_relative 'rubocop/cop/style/multiline_memoization'
|
468
469
|
require_relative 'rubocop/cop/style/multiline_ternary_operator'
|
470
|
+
require_relative 'rubocop/cop/style/multiline_when_then'
|
469
471
|
require_relative 'rubocop/cop/style/multiple_comparison'
|
470
472
|
require_relative 'rubocop/cop/style/mutable_constant'
|
471
473
|
require_relative 'rubocop/cop/style/negated_if'
|
data/lib/rubocop/ast/node.rb
CHANGED
@@ -302,7 +302,7 @@ module RuboCop
|
|
302
302
|
|
303
303
|
## Destructuring
|
304
304
|
|
305
|
-
def_node_matcher :receiver,
|
305
|
+
def_node_matcher :receiver, <<~PATTERN
|
306
306
|
{(send $_ ...) (block (send $_ ...) ...)}
|
307
307
|
PATTERN
|
308
308
|
|
@@ -321,7 +321,7 @@ module RuboCop
|
|
321
321
|
end
|
322
322
|
end
|
323
323
|
|
324
|
-
def_node_matcher :defined_module0,
|
324
|
+
def_node_matcher :defined_module0, <<~PATTERN
|
325
325
|
{(class (const $_ $_) ...)
|
326
326
|
(module (const $_ $_) ...)
|
327
327
|
(casgn $_ $_ (send (const nil? {:Class :Module}) :new ...))
|
@@ -367,7 +367,7 @@ module RuboCop
|
|
367
367
|
end
|
368
368
|
|
369
369
|
# Some cops treat the shovel operator as a kind of assignment.
|
370
|
-
def_node_matcher :assignment_or_similar?,
|
370
|
+
def_node_matcher :assignment_or_similar?, <<~PATTERN
|
371
371
|
{assignment? (send _recv :<< ...)}
|
372
372
|
PATTERN
|
373
373
|
|
@@ -479,11 +479,11 @@ module RuboCop
|
|
479
479
|
irange_type? || erange_type?
|
480
480
|
end
|
481
481
|
|
482
|
-
def_node_matcher :guard_clause?,
|
482
|
+
def_node_matcher :guard_clause?, <<~PATTERN
|
483
483
|
[{(send nil? {:raise :fail} ...) return break next} single_line?]
|
484
484
|
PATTERN
|
485
485
|
|
486
|
-
def_node_matcher :proc?,
|
486
|
+
def_node_matcher :proc?, <<~PATTERN
|
487
487
|
{(block (send nil? :proc) ...)
|
488
488
|
(block (send (const nil? :Proc) :new) ...)
|
489
489
|
(send (const nil? :Proc) :new)}
|
@@ -492,12 +492,12 @@ module RuboCop
|
|
492
492
|
def_node_matcher :lambda?, '(block (send nil? :lambda) ...)'
|
493
493
|
def_node_matcher :lambda_or_proc?, '{lambda? proc?}'
|
494
494
|
|
495
|
-
def_node_matcher :class_constructor?,
|
495
|
+
def_node_matcher :class_constructor?, <<~PATTERN
|
496
496
|
{ (send (const nil? {:Class :Module}) :new ...)
|
497
497
|
(block (send (const nil? {:Class :Module}) :new ...) ...)}
|
498
498
|
PATTERN
|
499
499
|
|
500
|
-
def_node_matcher :module_definition?,
|
500
|
+
def_node_matcher :module_definition?, <<~PATTERN
|
501
501
|
{class module (casgn _ _ class_constructor?)}
|
502
502
|
PATTERN
|
503
503
|
|
@@ -638,7 +638,7 @@ module RuboCop
|
|
638
638
|
end
|
639
639
|
end
|
640
640
|
|
641
|
-
def_node_matcher :new_class_or_module_block?,
|
641
|
+
def_node_matcher :new_class_or_module_block?, <<~PATTERN
|
642
642
|
^(casgn _ _ (block (send (const _ {:Class :Module}) :new) ...))
|
643
643
|
PATTERN
|
644
644
|
end
|
@@ -220,13 +220,24 @@ module RuboCop
|
|
220
220
|
|
221
221
|
private
|
222
222
|
|
223
|
-
def_node_matcher :macro_scope?,
|
223
|
+
def_node_matcher :macro_scope?, <<~PATTERN
|
224
224
|
{^{({sclass class module block} ...) class_constructor?}
|
225
|
-
|
225
|
+
^^#ascend_macro_scope?
|
226
226
|
^#macro_kwbegin_wrapper?
|
227
227
|
#root_node?}
|
228
228
|
PATTERN
|
229
229
|
|
230
|
+
def_node_matcher :wrapped_macro_scope?, <<~PATTERN
|
231
|
+
{({sclass class module block} ... ({begin if} ...)) class_constructor?}
|
232
|
+
PATTERN
|
233
|
+
|
234
|
+
def ascend_macro_scope?(ancestor)
|
235
|
+
return true if wrapped_macro_scope?(ancestor)
|
236
|
+
return false if root_node?(ancestor)
|
237
|
+
|
238
|
+
ascend_macro_scope?(ancestor.parent)
|
239
|
+
end
|
240
|
+
|
230
241
|
# Check if a node's parent is a kwbegin wrapper within a macro scope
|
231
242
|
#
|
232
243
|
# @param parent [Node] parent of the node being checked
|
@@ -245,15 +256,15 @@ module RuboCop
|
|
245
256
|
node.parent.nil?
|
246
257
|
end
|
247
258
|
|
248
|
-
def_node_matcher :adjacent_def_modifier?,
|
259
|
+
def_node_matcher :adjacent_def_modifier?, <<~PATTERN
|
249
260
|
(send nil? _ ({def defs} ...))
|
250
261
|
PATTERN
|
251
262
|
|
252
|
-
def_node_matcher :bare_access_modifier_declaration?,
|
263
|
+
def_node_matcher :bare_access_modifier_declaration?, <<~PATTERN
|
253
264
|
(send nil? {:public :protected :private :module_function})
|
254
265
|
PATTERN
|
255
266
|
|
256
|
-
def_node_matcher :non_bare_access_modifier_declaration?,
|
267
|
+
def_node_matcher :non_bare_access_modifier_declaration?, <<~PATTERN
|
257
268
|
(send nil? {:public :protected :private :module_function} _)
|
258
269
|
PATTERN
|
259
270
|
end
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
end
|
36
36
|
|
37
37
|
ONE_CHILD_NODE.each do |type|
|
38
|
-
module_eval(
|
38
|
+
module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
39
39
|
def on_#{type}(node)
|
40
40
|
if (child = node.children[0])
|
41
41
|
send(:"on_\#{child.type}", child)
|
@@ -45,7 +45,7 @@ module RuboCop
|
|
45
45
|
end
|
46
46
|
|
47
47
|
MANY_CHILD_NODES.each do |type|
|
48
|
-
module_eval(
|
48
|
+
module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
49
49
|
def on_#{type}(node)
|
50
50
|
node.children.each { |child| send(:"on_\#{child.type}", child) }
|
51
51
|
nil
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
55
55
|
|
56
56
|
SECOND_CHILD_ONLY.each do |type|
|
57
57
|
# Guard clause is for nodes nested within mlhs
|
58
|
-
module_eval(
|
58
|
+
module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
59
59
|
def on_#{type}(node)
|
60
60
|
if (child = node.children[1])
|
61
61
|
send(:"on_\#{child.type}", child)
|
@@ -5,17 +5,25 @@ module RuboCop
|
|
5
5
|
# This module encapsulates the logic for autocorrect behavior for a cop.
|
6
6
|
module AutocorrectLogic
|
7
7
|
def autocorrect?
|
8
|
-
autocorrect_requested? &&
|
8
|
+
autocorrect_requested? && correctable? && autocorrect_enabled?
|
9
9
|
end
|
10
10
|
|
11
11
|
def autocorrect_requested?
|
12
12
|
@options.fetch(:auto_correct, false)
|
13
13
|
end
|
14
14
|
|
15
|
+
def correctable?
|
16
|
+
support_autocorrect? || disable_uncorrectable?
|
17
|
+
end
|
18
|
+
|
15
19
|
def support_autocorrect?
|
16
20
|
respond_to?(:autocorrect)
|
17
21
|
end
|
18
22
|
|
23
|
+
def disable_uncorrectable?
|
24
|
+
@options[:disable_uncorrectable] == true
|
25
|
+
end
|
26
|
+
|
19
27
|
def autocorrect_enabled?
|
20
28
|
# allow turning off autocorrect on a cop by cop basis
|
21
29
|
return true unless cop_config
|
@@ -28,6 +36,68 @@ module RuboCop
|
|
28
36
|
|
29
37
|
true
|
30
38
|
end
|
39
|
+
|
40
|
+
def disable_offense(node)
|
41
|
+
range = node.location.expression
|
42
|
+
eol_comment = " # rubocop:disable #{cop_name}"
|
43
|
+
needed_line_length = range.column +
|
44
|
+
(range.source_line + eol_comment).length
|
45
|
+
if needed_line_length <= max_line_length
|
46
|
+
disable_offense_at_end_of_line(range_of_first_line(range),
|
47
|
+
eol_comment)
|
48
|
+
else
|
49
|
+
disable_offense_before_and_after(range_by_lines(range))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def range_of_first_line(range)
|
56
|
+
begin_of_first_line = range.begin_pos - range.column
|
57
|
+
end_of_first_line = begin_of_first_line + range.source_line.length
|
58
|
+
|
59
|
+
Parser::Source::Range.new(range.source_buffer,
|
60
|
+
begin_of_first_line,
|
61
|
+
end_of_first_line)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Expand the given range to include all of any lines it covers. Does not
|
65
|
+
# include newline at end of the last line.
|
66
|
+
def range_by_lines(range)
|
67
|
+
begin_of_first_line = range.begin_pos - range.column
|
68
|
+
|
69
|
+
last_line = range.source_buffer.source_line(range.last_line)
|
70
|
+
last_line_offset = last_line.length - range.last_column
|
71
|
+
end_of_last_line = range.end_pos + last_line_offset
|
72
|
+
|
73
|
+
Parser::Source::Range.new(range.source_buffer,
|
74
|
+
begin_of_first_line,
|
75
|
+
end_of_last_line)
|
76
|
+
end
|
77
|
+
|
78
|
+
def max_line_length
|
79
|
+
config.for_cop('Metrics/LineLength')['Max'] || 80
|
80
|
+
end
|
81
|
+
|
82
|
+
def disable_offense_at_end_of_line(range, eol_comment)
|
83
|
+
->(corrector) { corrector.insert_after(range, eol_comment) }
|
84
|
+
end
|
85
|
+
|
86
|
+
def disable_offense_before_and_after(range_by_lines)
|
87
|
+
lambda do |corrector|
|
88
|
+
range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
|
89
|
+
leading_whitespace = range_by_lines.source_line[/^\s*/]
|
90
|
+
|
91
|
+
corrector.insert_before(
|
92
|
+
range_with_newline,
|
93
|
+
"#{leading_whitespace}# rubocop:disable #{cop_name}\n"
|
94
|
+
)
|
95
|
+
corrector.insert_after(
|
96
|
+
range_with_newline,
|
97
|
+
"#{leading_whitespace}# rubocop:enable #{cop_name}\n"
|
98
|
+
)
|
99
|
+
end
|
100
|
+
end
|
31
101
|
end
|
32
102
|
end
|
33
103
|
end
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
"Please change your source to 'https://rubygems.org' " \
|
34
34
|
"if possible, or 'http://rubygems.org' if not."
|
35
35
|
|
36
|
-
def_node_matcher :insecure_protocol_source?,
|
36
|
+
def_node_matcher :insecure_protocol_source?, <<~PATTERN
|
37
37
|
(send nil? :source
|
38
38
|
(sym ${:gemcutter :rubygems :rubyforge}))
|
39
39
|
PATTERN
|
@@ -7,8 +7,6 @@ module RuboCop
|
|
7
7
|
class Commissioner
|
8
8
|
include RuboCop::AST::Traversal
|
9
9
|
|
10
|
-
CopError = Struct.new(:error, :line, :column)
|
11
|
-
|
12
10
|
attr_reader :errors
|
13
11
|
|
14
12
|
def initialize(cops, forces = [], options = {})
|
@@ -62,7 +60,7 @@ module RuboCop
|
|
62
60
|
end
|
63
61
|
|
64
62
|
def reset_errors
|
65
|
-
@errors =
|
63
|
+
@errors = []
|
66
64
|
end
|
67
65
|
|
68
66
|
def remove_irrelevant_cops(filename)
|
@@ -131,12 +129,8 @@ module RuboCop
|
|
131
129
|
rescue StandardError => e
|
132
130
|
raise e if @options[:raise_error]
|
133
131
|
|
134
|
-
|
135
|
-
|
136
|
-
column = node.loc.column
|
137
|
-
end
|
138
|
-
error = CopError.new(e, line, column)
|
139
|
-
@errors[cop] << error
|
132
|
+
err = ErrorWithAnalyzedFileLocation.new(cause: e, node: node, cop: cop)
|
133
|
+
@errors << err
|
140
134
|
end
|
141
135
|
end
|
142
136
|
end
|
data/lib/rubocop/cop/cop.rb
CHANGED
@@ -31,6 +31,16 @@ module RuboCop
|
|
31
31
|
include IgnoredNode
|
32
32
|
include AutocorrectLogic
|
33
33
|
|
34
|
+
Correction = Struct.new(:lambda, :node, :cop) do
|
35
|
+
def call(corrector)
|
36
|
+
lambda.call(corrector)
|
37
|
+
rescue StandardError => e
|
38
|
+
raise ErrorWithAnalyzedFileLocation.new(
|
39
|
+
cause: e, node: node, cop: cop
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
34
44
|
attr_reader :config, :offenses, :corrections
|
35
45
|
attr_accessor :processed_source # TODO: Bad design.
|
36
46
|
|
@@ -141,18 +151,38 @@ module RuboCop
|
|
141
151
|
end
|
142
152
|
|
143
153
|
def correct(node)
|
144
|
-
|
145
|
-
return
|
146
|
-
return :already_corrected if @corrected_nodes.key?(node)
|
154
|
+
reason = reason_to_not_correct(node)
|
155
|
+
return reason if reason
|
147
156
|
|
148
157
|
@corrected_nodes[node] = true
|
149
|
-
|
150
|
-
|
158
|
+
if support_autocorrect?
|
159
|
+
correction = autocorrect(node)
|
160
|
+
return :uncorrected unless correction
|
151
161
|
|
152
|
-
|
162
|
+
@corrections << Correction.new(correction, node, self)
|
163
|
+
elsif disable_uncorrectable?
|
164
|
+
disable_uncorrectable(node)
|
165
|
+
end
|
153
166
|
:corrected
|
154
167
|
end
|
155
168
|
|
169
|
+
def reason_to_not_correct(node)
|
170
|
+
return :unsupported unless correctable?
|
171
|
+
return :uncorrected unless autocorrect?
|
172
|
+
return :already_corrected if @corrected_nodes.key?(node)
|
173
|
+
|
174
|
+
nil
|
175
|
+
end
|
176
|
+
|
177
|
+
def disable_uncorrectable(node)
|
178
|
+
@disabled_lines ||= {}
|
179
|
+
line = node.location.line
|
180
|
+
return if @disabled_lines.key?(line)
|
181
|
+
|
182
|
+
@disabled_lines[line] = true
|
183
|
+
@corrections << Correction.new(disable_offense(node), node, self)
|
184
|
+
end
|
185
|
+
|
156
186
|
def config_to_allow_offenses
|
157
187
|
Formatter::DisabledConfigFormatter
|
158
188
|
.config_to_allow_offenses[cop_name] ||= {}
|
@@ -57,16 +57,15 @@ module RuboCop
|
|
57
57
|
#
|
58
58
|
# @return [String]
|
59
59
|
def rewrite
|
60
|
-
# rubocop:disable Lint/HandleExceptions
|
61
60
|
@corrections.each do |correction|
|
62
61
|
begin
|
63
62
|
@source_rewriter.transaction do
|
64
63
|
correction.call(self)
|
65
64
|
end
|
66
|
-
rescue
|
65
|
+
rescue ErrorWithAnalyzedFileLocation => e
|
66
|
+
raise e unless e.cause.is_a?(::Parser::ClobberingError)
|
67
67
|
end
|
68
68
|
end
|
69
|
-
# rubocop:enable Lint/HandleExceptions
|
70
69
|
|
71
70
|
@source_rewriter.process
|
72
71
|
end
|
@@ -9,9 +9,9 @@ module RuboCop
|
|
9
9
|
offense_style, range = node
|
10
10
|
lambda do |corrector|
|
11
11
|
case offense_style
|
12
|
-
when :no_empty_lines
|
12
|
+
when :no_empty_lines
|
13
13
|
corrector.remove(range)
|
14
|
-
when :empty_lines
|
14
|
+
when :empty_lines
|
15
15
|
corrector.insert_before(range, "\n")
|
16
16
|
end
|
17
17
|
end
|