rubocop 1.6.0 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +3 -2
- data/config/default.yml +142 -19
- data/lib/rubocop.rb +15 -1
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +5 -4
- data/lib/rubocop/comment_config.rb +6 -6
- data/lib/rubocop/config.rb +10 -7
- data/lib/rubocop/config_loader.rb +11 -14
- data/lib/rubocop/config_loader_resolver.rb +21 -4
- data/lib/rubocop/config_obsoletion.rb +5 -3
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -6
- data/lib/rubocop/config_store.rb +12 -1
- data/lib/rubocop/cop/base.rb +1 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +3 -2
- data/lib/rubocop/cop/generator.rb +1 -3
- data/lib/rubocop/cop/internal_affairs.rb +6 -1
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +68 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +89 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +61 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +64 -0
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +145 -0
- data/lib/rubocop/cop/layout/class_structure.rb +7 -2
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +19 -3
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +14 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -10
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +62 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +13 -10
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +59 -0
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +7 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +75 -0
- data/lib/rubocop/cop/lint/duplicate_branch.rb +64 -2
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +44 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +10 -6
- data/lib/rubocop/cop/lint/number_conversion.rb +41 -6
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +47 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +39 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +2 -1
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +50 -0
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +50 -17
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -11
- data/lib/rubocop/cop/lint/symbol_conversion.rb +102 -0
- data/lib/rubocop/cop/lint/triple_quotes.rb +71 -0
- data/lib/rubocop/cop/lint/unreachable_loop.rb +17 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/mixin/allowed_identifiers.rb +18 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -11
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +5 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +59 -5
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +38 -5
- data/lib/rubocop/cop/naming/variable_name.rb +2 -0
- data/lib/rubocop/cop/naming/variable_number.rb +2 -9
- data/lib/rubocop/cop/registry.rb +10 -0
- data/lib/rubocop/cop/severity.rb +3 -3
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +3 -1
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +14 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +22 -5
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -9
- data/lib/rubocop/cop/style/empty_literal.rb +6 -2
- data/lib/rubocop/cop/style/endless_method.rb +102 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +63 -34
- data/lib/rubocop/cop/style/explicit_block_argument.rb +10 -0
- data/lib/rubocop/cop/style/float_division.rb +3 -0
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/format_string_token.rb +18 -2
- data/lib/rubocop/cop/style/hash_except.rb +95 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +2 -1
- data/lib/rubocop/cop/style/if_inside_else.rb +22 -10
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +96 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +12 -2
- data/lib/rubocop/cop/style/lambda_call.rb +2 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +7 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -6
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -0
- data/lib/rubocop/cop/style/multiline_method_signature.rb +26 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +3 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +13 -3
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -0
- data/lib/rubocop/cop/style/non_nil_check.rb +23 -13
- data/lib/rubocop/cop/style/raise_args.rb +5 -2
- data/lib/rubocop/cop/style/redundant_argument.rb +7 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +8 -4
- data/lib/rubocop/cop/style/redundant_return.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +34 -2
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +29 -5
- data/lib/rubocop/cop/style/string_concatenation.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +5 -4
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +2 -4
- data/lib/rubocop/cop/util.rb +3 -1
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -0
- data/lib/rubocop/magic_comment.rb +30 -1
- data/lib/rubocop/options.rb +10 -10
- data/lib/rubocop/rspec/cop_helper.rb +0 -4
- data/lib/rubocop/rspec/expect_offense.rb +37 -22
- data/lib/rubocop/runner.rb +17 -1
- data/lib/rubocop/target_finder.rb +4 -2
- data/lib/rubocop/target_ruby.rb +47 -11
- data/lib/rubocop/util.rb +16 -0
- data/lib/rubocop/version.rb +8 -2
- metadata +26 -7
@@ -19,6 +19,9 @@ module RuboCop
|
|
19
19
|
# end
|
20
20
|
#
|
21
21
|
class MultilineMethodSignature < Base
|
22
|
+
include RangeHelp
|
23
|
+
extend AutoCorrector
|
24
|
+
|
22
25
|
MSG = 'Avoid multi-line method signatures.'
|
23
26
|
|
24
27
|
def on_def(node)
|
@@ -26,12 +29,34 @@ module RuboCop
|
|
26
29
|
return if opening_line(node) == closing_line(node)
|
27
30
|
return if correction_exceeds_max_line_length?(node)
|
28
31
|
|
29
|
-
add_offense(node)
|
32
|
+
add_offense(node) do |corrector|
|
33
|
+
autocorrect(corrector, node)
|
34
|
+
end
|
30
35
|
end
|
31
36
|
alias on_defs on_def
|
32
37
|
|
33
38
|
private
|
34
39
|
|
40
|
+
def autocorrect(corrector, node)
|
41
|
+
arguments = node.arguments
|
42
|
+
joined_arguments = arguments.map(&:source).join(', ')
|
43
|
+
last_line_source_of_arguments = processed_source[arguments.last_line - 1].strip
|
44
|
+
|
45
|
+
if last_line_source_of_arguments.start_with?(')')
|
46
|
+
joined_arguments = "#{joined_arguments}#{last_line_source_of_arguments}"
|
47
|
+
|
48
|
+
corrector.remove(range_by_whole_lines(arguments.loc.end, include_final_newline: true))
|
49
|
+
end
|
50
|
+
|
51
|
+
corrector.replace(arguments_range(node), joined_arguments)
|
52
|
+
end
|
53
|
+
|
54
|
+
def arguments_range(node)
|
55
|
+
range_between(
|
56
|
+
node.first_argument.source_range.begin_pos, node.last_argument.source_range.end_pos
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
35
60
|
def opening_line(node)
|
36
61
|
node.first_line
|
37
62
|
end
|
@@ -58,7 +58,9 @@ module RuboCop
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def require_then?(when_node)
|
61
|
-
|
61
|
+
unless when_node.conditions.first.first_line == when_node.conditions.last.last_line
|
62
|
+
return true
|
63
|
+
end
|
62
64
|
return false unless when_node.body
|
63
65
|
|
64
66
|
when_node.loc.line == when_node.body.loc.line
|
@@ -14,6 +14,8 @@ module RuboCop
|
|
14
14
|
# positives. Luckily, there is no harm in freezing an already
|
15
15
|
# frozen object.
|
16
16
|
#
|
17
|
+
# NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
|
18
|
+
#
|
17
19
|
# @example EnforcedStyle: literals (default)
|
18
20
|
# # bad
|
19
21
|
# CONST = [1, 2, 3]
|
@@ -94,7 +96,8 @@ module RuboCop
|
|
94
96
|
range_enclosed_in_parentheses = range_enclosed_in_parentheses?(value)
|
95
97
|
|
96
98
|
return unless mutable_literal?(value) ||
|
97
|
-
range_enclosed_in_parentheses
|
99
|
+
target_ruby_version <= 2.7 && range_enclosed_in_parentheses
|
100
|
+
|
98
101
|
return if FROZEN_STRING_LITERAL_TYPES.include?(value.type) &&
|
99
102
|
frozen_string_literals_enabled?
|
100
103
|
|
@@ -119,11 +122,14 @@ module RuboCop
|
|
119
122
|
end
|
120
123
|
|
121
124
|
def mutable_literal?(value)
|
122
|
-
value
|
125
|
+
return false if value.nil?
|
126
|
+
return false if frozen_regexp_or_range_literals?(value)
|
127
|
+
|
128
|
+
value.mutable_literal?
|
123
129
|
end
|
124
130
|
|
125
131
|
def immutable_literal?(node)
|
126
|
-
node.nil? || node.immutable_literal?
|
132
|
+
node.nil? || frozen_regexp_or_range_literals?(node) || node.immutable_literal?
|
127
133
|
end
|
128
134
|
|
129
135
|
def frozen_string_literal?(node)
|
@@ -131,6 +137,10 @@ module RuboCop
|
|
131
137
|
frozen_string_literals_enabled?
|
132
138
|
end
|
133
139
|
|
140
|
+
def frozen_regexp_or_range_literals?(node)
|
141
|
+
target_ruby_version >= 3.0 && (node.regexp_type? || node.range_type?)
|
142
|
+
end
|
143
|
+
|
134
144
|
def requires_parentheses?(node)
|
135
145
|
node.range_type? ||
|
136
146
|
(node.send_type? && node.loc.dot.nil?)
|
@@ -8,6 +8,9 @@ module RuboCop
|
|
8
8
|
# With `IncludeSemanticChanges` set to `false` by default, this cop
|
9
9
|
# does not report offenses for `!x.nil?` and does no changes that might
|
10
10
|
# change behavior.
|
11
|
+
# Also `IncludeSemanticChanges` set to `false` with `EnforcedStyle: comparison` of
|
12
|
+
# `Style/NilComparison` cop, this cop does not report offenses for `x != nil` and
|
13
|
+
# does no changes to `!x.nil?` style.
|
11
14
|
#
|
12
15
|
# With `IncludeSemanticChanges` set to `true`, this cop reports offenses
|
13
16
|
# for `!x.nil?` and autocorrects that and `x != nil` to solely `x`, which
|
@@ -41,6 +44,9 @@ module RuboCop
|
|
41
44
|
class NonNilCheck < Base
|
42
45
|
extend AutoCorrector
|
43
46
|
|
47
|
+
MSG_FOR_REPLACEMENT = 'Prefer `%<prefer>s` over `%<current>s`.'
|
48
|
+
MSG_FOR_REDUNDANCY = 'Explicit non-nil checks are usually redundant.'
|
49
|
+
|
44
50
|
RESTRICT_ON_SEND = %i[!= nil? !].freeze
|
45
51
|
|
46
52
|
def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'
|
@@ -49,11 +55,12 @@ module RuboCop
|
|
49
55
|
def_node_matcher :not_and_nil_check?, '(send (send _ :nil?) :!)'
|
50
56
|
|
51
57
|
def on_send(node)
|
52
|
-
return if ignored_node?(node)
|
53
|
-
|
58
|
+
return if ignored_node?(node) ||
|
59
|
+
!include_semantic_changes? && nil_comparison_style == 'comparison'
|
60
|
+
return unless register_offense?(node)
|
54
61
|
|
55
62
|
message = message(node)
|
56
|
-
add_offense(
|
63
|
+
add_offense(node, message: message) do |corrector|
|
57
64
|
autocorrect(corrector, node)
|
58
65
|
end
|
59
66
|
end
|
@@ -73,13 +80,9 @@ module RuboCop
|
|
73
80
|
|
74
81
|
private
|
75
82
|
|
76
|
-
def
|
77
|
-
|
78
|
-
node
|
79
|
-
elsif include_semantic_changes? &&
|
80
|
-
(not_and_nil_check?(node) || unless_and_nil_check?(node))
|
81
|
-
node
|
82
|
-
end
|
83
|
+
def register_offense?(node)
|
84
|
+
not_equal_to_nil?(node) ||
|
85
|
+
include_semantic_changes? && (not_and_nil_check?(node) || unless_and_nil_check?(node))
|
83
86
|
end
|
84
87
|
|
85
88
|
def autocorrect(corrector, node)
|
@@ -101,10 +104,11 @@ module RuboCop
|
|
101
104
|
end
|
102
105
|
|
103
106
|
def message(node)
|
104
|
-
if node.method?(:!=)
|
105
|
-
|
107
|
+
if node.method?(:!=) && !include_semantic_changes?
|
108
|
+
prefer = "!#{node.receiver.source}.nil?"
|
109
|
+
format(MSG_FOR_REPLACEMENT, prefer: prefer, current: node.source)
|
106
110
|
else
|
107
|
-
|
111
|
+
MSG_FOR_REDUNDANCY
|
108
112
|
end
|
109
113
|
end
|
110
114
|
|
@@ -138,6 +142,12 @@ module RuboCop
|
|
138
142
|
corrector.replace(node.parent.loc.keyword, 'if')
|
139
143
|
corrector.replace(node, receiver.source)
|
140
144
|
end
|
145
|
+
|
146
|
+
def nil_comparison_style
|
147
|
+
nil_comparison_conf = config.for_cop('Style/NilComparison')
|
148
|
+
|
149
|
+
nil_comparison_conf['Enabled'] && nil_comparison_conf['EnforcedStyle']
|
150
|
+
end
|
141
151
|
end
|
142
152
|
end
|
143
153
|
end
|
@@ -81,11 +81,12 @@ module RuboCop
|
|
81
81
|
return node.source if message_nodes.size > 1
|
82
82
|
|
83
83
|
argument = message_nodes.first.source
|
84
|
+
exception_class = exception_node.const_name || exception_node.receiver.source
|
84
85
|
|
85
86
|
if node.parent && requires_parens?(node.parent)
|
86
|
-
"#{node.method_name}(#{
|
87
|
+
"#{node.method_name}(#{exception_class}.new(#{argument}))"
|
87
88
|
else
|
88
|
-
"#{node.method_name} #{
|
89
|
+
"#{node.method_name} #{exception_class}.new(#{argument})"
|
89
90
|
end
|
90
91
|
end
|
91
92
|
|
@@ -95,6 +96,7 @@ module RuboCop
|
|
95
96
|
replacement = correction_exploded_to_compact(node)
|
96
97
|
|
97
98
|
corrector.replace(node, replacement)
|
99
|
+
opposite_style_detected
|
98
100
|
end
|
99
101
|
else
|
100
102
|
correct_style_detected
|
@@ -115,6 +117,7 @@ module RuboCop
|
|
115
117
|
replacement = correction_compact_to_exploded(node)
|
116
118
|
|
117
119
|
corrector.replace(node, replacement)
|
120
|
+
opposite_style_detected
|
118
121
|
end
|
119
122
|
end
|
120
123
|
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# 1. This cop matches for method names only and hence cannot tell apart
|
13
13
|
# methods with same name in different classes.
|
14
14
|
# 2. This cop is limited to methods with single parameter.
|
15
|
-
# 3. This cop is unsafe if certain special global variables (e.g.
|
15
|
+
# 3. This cop is unsafe if certain special global variables (e.g. `$;`, `$/`) are set.
|
16
16
|
# That depends on the nature of the target methods, of course.
|
17
17
|
#
|
18
18
|
# Method names and their redundant arguments can be configured like this:
|
@@ -20,6 +20,8 @@ module RuboCop
|
|
20
20
|
# Methods:
|
21
21
|
# join: ''
|
22
22
|
# split: ' '
|
23
|
+
# chomp: "\n"
|
24
|
+
# chomp!: "\n"
|
23
25
|
# foo: 2
|
24
26
|
#
|
25
27
|
# @example
|
@@ -28,6 +30,8 @@ module RuboCop
|
|
28
30
|
# [1, 2, 3].join("")
|
29
31
|
# string.split(" ")
|
30
32
|
# "first\nsecond".split(" ")
|
33
|
+
# string.chomp("\n")
|
34
|
+
# string.chomp!("\n")
|
31
35
|
# A.foo(2)
|
32
36
|
#
|
33
37
|
# # good
|
@@ -35,6 +39,8 @@ module RuboCop
|
|
35
39
|
# [1, 2, 3].join
|
36
40
|
# string.split
|
37
41
|
# "first second".split
|
42
|
+
# string.chomp
|
43
|
+
# string.chomp!
|
38
44
|
# A.foo
|
39
45
|
class RedundantArgument < Base
|
40
46
|
include RangeHelp
|
@@ -3,7 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Style
|
6
|
-
# This cop check for uses of Object#freeze on immutable objects.
|
6
|
+
# This cop check for uses of `Object#freeze` on immutable objects.
|
7
|
+
#
|
8
|
+
# NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
|
7
9
|
#
|
8
10
|
# @example
|
9
11
|
# # bad
|
@@ -37,8 +39,10 @@ module RuboCop
|
|
37
39
|
|
38
40
|
return true if node.immutable_literal?
|
39
41
|
|
40
|
-
FROZEN_STRING_LITERAL_TYPES.include?(node.type) &&
|
41
|
-
|
42
|
+
return true if FROZEN_STRING_LITERAL_TYPES.include?(node.type) &&
|
43
|
+
frozen_string_literals_enabled?
|
44
|
+
|
45
|
+
target_ruby_version >= 3.0 && (node.regexp_type? || node.range_type?)
|
42
46
|
end
|
43
47
|
|
44
48
|
def strip_parenthesis(node)
|
@@ -52,7 +56,7 @@ module RuboCop
|
|
52
56
|
def_node_matcher :operation_produces_immutable_object?, <<~PATTERN
|
53
57
|
{
|
54
58
|
(begin (send {float int} {:+ :- :* :** :/ :% :<<} _))
|
55
|
-
(begin (send !(str _) {:+ :- :* :** :/ :%} {float int}))
|
59
|
+
(begin (send !{(str _) array} {:+ :- :* :** :/ :%} {float int}))
|
56
60
|
(begin (send _ {:== :=== :!= :<= :>= :< :>} _))
|
57
61
|
(send (const {nil? cbase} :ENV) :[] _)
|
58
62
|
(send _ {:count :length :size} ...)
|
@@ -66,7 +66,7 @@ module RuboCop
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def correct_with_arguments(return_node, corrector)
|
69
|
-
if return_node.
|
69
|
+
if return_node.children.size > 1
|
70
70
|
add_brackets(corrector, return_node)
|
71
71
|
elsif hash_without_braces?(return_node.first_argument)
|
72
72
|
add_braces(corrector, return_node.first_argument)
|
@@ -6,6 +6,12 @@ module RuboCop
|
|
6
6
|
# This cop checks for single-line method definitions that contain a body.
|
7
7
|
# It will accept single-line methods with no body.
|
8
8
|
#
|
9
|
+
# Endless methods added in Ruby 3.0 are also accepted by this cop.
|
10
|
+
#
|
11
|
+
# If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line` or
|
12
|
+
# `allow_always`, single-line methods will be auto-corrected to endless
|
13
|
+
# methods if there is only one statement in the body.
|
14
|
+
#
|
9
15
|
# @example
|
10
16
|
# # bad
|
11
17
|
# def some_method; body end
|
@@ -15,6 +21,7 @@ module RuboCop
|
|
15
21
|
# # good
|
16
22
|
# def self.resource_class=(klass); end
|
17
23
|
# def @table.columns; end
|
24
|
+
# def some_method() = body
|
18
25
|
#
|
19
26
|
# @example AllowIfMethodIsEmpty: true (default)
|
20
27
|
# # good
|
@@ -32,6 +39,7 @@ module RuboCop
|
|
32
39
|
|
33
40
|
def on_def(node)
|
34
41
|
return unless node.single_line?
|
42
|
+
return if node.endless?
|
35
43
|
return if allow_empty? && !node.body
|
36
44
|
|
37
45
|
add_offense(node) do |corrector|
|
@@ -43,6 +51,28 @@ module RuboCop
|
|
43
51
|
private
|
44
52
|
|
45
53
|
def autocorrect(corrector, node)
|
54
|
+
if correct_to_endless?(node.body)
|
55
|
+
correct_to_endless(corrector, node)
|
56
|
+
else
|
57
|
+
correct_to_multiline(corrector, node)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def allow_empty?
|
62
|
+
cop_config['AllowIfMethodIsEmpty']
|
63
|
+
end
|
64
|
+
|
65
|
+
def correct_to_endless?(body_node)
|
66
|
+
endless_method_config = config.for_cop('Style/EndlessMethod')
|
67
|
+
|
68
|
+
return false unless endless_method_config['Enabled']
|
69
|
+
return false if endless_method_config['EnforcedStyle'] == 'disallow'
|
70
|
+
return false unless body_node
|
71
|
+
|
72
|
+
!(body_node.begin_type? || body_node.kwbegin_type?)
|
73
|
+
end
|
74
|
+
|
75
|
+
def correct_to_multiline(corrector, node)
|
46
76
|
each_part(node.body) do |part|
|
47
77
|
LineBreakCorrector.break_line_before(
|
48
78
|
range: part, node: node, corrector: corrector,
|
@@ -58,8 +88,10 @@ module RuboCop
|
|
58
88
|
move_comment(node, corrector)
|
59
89
|
end
|
60
90
|
|
61
|
-
def
|
62
|
-
|
91
|
+
def correct_to_endless(corrector, node)
|
92
|
+
arguments = node.arguments.any? ? node.arguments.source : '()'
|
93
|
+
replacement = "def #{node.method_name}#{arguments} = #{node.body.source}"
|
94
|
+
corrector.replace(node, replacement)
|
63
95
|
end
|
64
96
|
|
65
97
|
def each_part(body)
|
@@ -63,13 +63,13 @@ module RuboCop
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def autocorrect(corrector, node, if_branch)
|
66
|
+
corrector.wrap(node.condition, '(', ')') if node.condition.or_type?
|
67
|
+
|
66
68
|
if node.unless?
|
67
69
|
corrector.replace(node.loc.keyword, 'if')
|
68
70
|
corrector.insert_before(node.condition, '!')
|
69
71
|
end
|
70
72
|
|
71
|
-
corrector.wrap(node.condition, '(', ')') if node.condition.or_type?
|
72
|
-
|
73
73
|
and_operator = if_branch.unless? ? ' && !' : ' && '
|
74
74
|
if if_branch.modifier_form?
|
75
75
|
correct_for_guard_condition_style(corrector, node, if_branch, and_operator)
|
@@ -80,8 +80,11 @@ module RuboCop
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def correct_for_guard_condition_style(corrector, node, if_branch, and_operator)
|
83
|
+
outer_condition = node.condition
|
84
|
+
correct_outer_condition(corrector, outer_condition)
|
85
|
+
|
83
86
|
condition = if_branch.condition
|
84
|
-
corrector.insert_after(
|
87
|
+
corrector.insert_after(outer_condition, replacement_condition(and_operator, condition))
|
85
88
|
|
86
89
|
range = range_between(if_branch.loc.keyword.begin_pos, condition.source_range.end_pos)
|
87
90
|
corrector.remove(range_with_surrounding_space(range: range, newlines: false))
|
@@ -100,14 +103,35 @@ module RuboCop
|
|
100
103
|
def correct_for_comment(corrector, node, if_branch)
|
101
104
|
return if config.for_cop('Style/IfUnlessModifier')['Enabled']
|
102
105
|
|
103
|
-
comments = processed_source.
|
106
|
+
comments = processed_source.ast_with_comments[if_branch]
|
104
107
|
comment_text = comments.map(&:text).join("\n") << "\n"
|
105
108
|
|
106
109
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
107
110
|
end
|
108
111
|
|
112
|
+
def correct_outer_condition(corrector, condition)
|
113
|
+
return unless requrie_parentheses?(condition)
|
114
|
+
|
115
|
+
range = range_between(
|
116
|
+
condition.loc.selector.end_pos, condition.first_argument.source_range.begin_pos
|
117
|
+
)
|
118
|
+
|
119
|
+
corrector.replace(range, '(')
|
120
|
+
corrector.insert_after(condition.last_argument.source_range, ')')
|
121
|
+
end
|
122
|
+
|
123
|
+
def requrie_parentheses?(condition)
|
124
|
+
condition.send_type? && !condition.arguments.empty? && !condition.parenthesized?
|
125
|
+
end
|
126
|
+
|
127
|
+
def arguments_range(node)
|
128
|
+
range_between(
|
129
|
+
node.first_argument.source_range.begin_pos, node.last_argument.source_range.end_pos
|
130
|
+
)
|
131
|
+
end
|
132
|
+
|
109
133
|
def wrap_condition?(node)
|
110
|
-
node.or_type? ||
|
134
|
+
node.and_type? || node.or_type? ||
|
111
135
|
(node.send_type? && node.arguments.any? && !node.parenthesized?)
|
112
136
|
end
|
113
137
|
|