rubocop 0.72.0 → 0.73.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|