rubocop 1.11.0 → 1.12.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 +2 -2
- data/config/default.yml +16 -1
- data/lib/rubocop.rb +1 -0
- data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
- data/lib/rubocop/comment_config.rb +43 -94
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -6
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/argument_alignment.rb +6 -5
- data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
- data/lib/rubocop/cop/layout/assignment_indentation.rb +6 -3
- data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +14 -15
- data/lib/rubocop/cop/layout/comment_indentation.rb +16 -16
- data/lib/rubocop/cop/layout/else_alignment.rb +9 -6
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +9 -6
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +22 -15
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
- data/lib/rubocop/cop/layout/indentation_style.rb +27 -30
- data/lib/rubocop/cop/layout/indentation_width.rb +19 -9
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
- data/lib/rubocop/cop/lint/number_conversion.rb +7 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +89 -2
- data/lib/rubocop/cop/mixin/alignment.rb +10 -3
- data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/line_length_help.rb +11 -6
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +4 -3
- data/lib/rubocop/cop/mixin/preferred_delimiters.rb +1 -1
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +4 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +4 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
- data/lib/rubocop/cop/registry.rb +9 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
- data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +62 -0
- data/lib/rubocop/cop/style/case_like_if.rb +15 -4
- data/lib/rubocop/cop/style/class_equality_comparison.rb +2 -0
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +25 -3
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/hash_syntax.rb +16 -15
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +40 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +20 -2
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +15 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +26 -3
- data/lib/rubocop/cop/style/redundant_return.rb +4 -0
- data/lib/rubocop/cop/style/redundant_self.rb +7 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +17 -14
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +16 -0
- data/lib/rubocop/cop/style/string_chars.rb +38 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +2 -0
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +5 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +8 -2
- data/lib/rubocop/directive_comment.rb +64 -9
- data/lib/rubocop/ext/regexp_parser.rb +3 -6
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +5 -3
@@ -70,8 +70,8 @@ module RuboCop
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def directive_cops(comment)
|
73
|
-
|
74
|
-
|
73
|
+
match_captures = DirectiveComment.new(comment).match_captures
|
74
|
+
match_captures && match_captures[1] ? match_captures[1].split(',').map(&:strip) : []
|
75
75
|
end
|
76
76
|
|
77
77
|
def allowed_cops
|
@@ -60,6 +60,15 @@ module RuboCop
|
|
60
60
|
# extend Foo
|
61
61
|
# end
|
62
62
|
#
|
63
|
+
# @example AllowedConstants: ['ClassMethods']
|
64
|
+
#
|
65
|
+
# # good
|
66
|
+
# module A
|
67
|
+
# module ClassMethods
|
68
|
+
# # ...
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
#
|
63
72
|
class Documentation < Base
|
64
73
|
include DocumentationComment
|
65
74
|
|
@@ -90,14 +99,19 @@ module RuboCop
|
|
90
99
|
|
91
100
|
def check(node, body, type)
|
92
101
|
return if namespace?(body)
|
93
|
-
return if documentation_comment?(node)
|
94
|
-
return if
|
95
|
-
|
102
|
+
return if documentation_comment?(node)
|
103
|
+
return if constant_allowed?(node)
|
104
|
+
return if nodoc_self_or_outer_module?(node)
|
96
105
|
return if macro_only?(body)
|
97
106
|
|
98
107
|
add_offense(node.loc.keyword, message: format(MSG, type: type))
|
99
108
|
end
|
100
109
|
|
110
|
+
def nodoc_self_or_outer_module?(node)
|
111
|
+
nodoc_comment?(node) ||
|
112
|
+
compact_namespace?(node) && nodoc_comment?(outer_module(node).first)
|
113
|
+
end
|
114
|
+
|
101
115
|
def macro_only?(body)
|
102
116
|
body.respond_to?(:macro?) && body.macro? ||
|
103
117
|
body.respond_to?(:children) && body.children&.all? { |child| macro_only?(child) }
|
@@ -117,6 +131,10 @@ module RuboCop
|
|
117
131
|
constant_definition?(node) || constant_visibility_declaration?(node)
|
118
132
|
end
|
119
133
|
|
134
|
+
def constant_allowed?(node)
|
135
|
+
allowed_constants.include?(node.identifier.short_name)
|
136
|
+
end
|
137
|
+
|
120
138
|
def compact_namespace?(node)
|
121
139
|
/::/.match?(node.loc.name.source)
|
122
140
|
end
|
@@ -143,6 +161,10 @@ module RuboCop
|
|
143
161
|
def nodoc(node)
|
144
162
|
processed_source.ast_with_comments[node.children.first].first
|
145
163
|
end
|
164
|
+
|
165
|
+
def allowed_constants
|
166
|
+
@allowed_constants ||= cop_config.fetch('AllowedConstants', []).map(&:intern)
|
167
|
+
end
|
146
168
|
end
|
147
169
|
end
|
148
170
|
end
|
@@ -224,7 +224,7 @@ module RuboCop
|
|
224
224
|
|
225
225
|
register_offense(node) do |corrector|
|
226
226
|
line_str = missing_line(node, code)
|
227
|
-
corrector.insert_after(node.
|
227
|
+
corrector.insert_after(node.last_argument.source_range.end, ", __FILE__, #{line_str}")
|
228
228
|
end
|
229
229
|
end
|
230
230
|
|
@@ -54,9 +54,10 @@ module RuboCop
|
|
54
54
|
# # good
|
55
55
|
# {a: 1, b: 2}
|
56
56
|
# {:c => 3, 'd' => 4}
|
57
|
-
class HashSyntax <
|
57
|
+
class HashSyntax < Base
|
58
58
|
include ConfigurableEnforcedStyle
|
59
59
|
include RangeHelp
|
60
|
+
extend AutoCorrector
|
60
61
|
|
61
62
|
MSG_19 = 'Use the new Ruby 1.9 hash syntax.'
|
62
63
|
MSG_NO_MIXED_KEYS = "Don't mix styles in the same hash."
|
@@ -104,18 +105,6 @@ module RuboCop
|
|
104
105
|
end
|
105
106
|
end
|
106
107
|
|
107
|
-
def autocorrect(node)
|
108
|
-
lambda do |corrector|
|
109
|
-
if style == :hash_rockets || force_hash_rockets?(node.parent.pairs)
|
110
|
-
autocorrect_hash_rockets(corrector, node)
|
111
|
-
elsif style == :ruby19_no_mixed_keys || style == :no_mixed_keys
|
112
|
-
autocorrect_no_mixed_keys(corrector, node)
|
113
|
-
else
|
114
|
-
autocorrect_ruby19(corrector, node)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
108
|
def alternative_style
|
120
109
|
case style
|
121
110
|
when :hash_rockets
|
@@ -127,6 +116,16 @@ module RuboCop
|
|
127
116
|
|
128
117
|
private
|
129
118
|
|
119
|
+
def autocorrect(corrector, node)
|
120
|
+
if style == :hash_rockets || force_hash_rockets?(node.parent.pairs)
|
121
|
+
autocorrect_hash_rockets(corrector, node)
|
122
|
+
elsif style == :ruby19_no_mixed_keys || style == :no_mixed_keys
|
123
|
+
autocorrect_no_mixed_keys(corrector, node)
|
124
|
+
else
|
125
|
+
autocorrect_ruby19(corrector, node)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
130
129
|
def sym_indices?(pairs)
|
131
130
|
pairs.all? { |p| word_symbol_pair?(p) }
|
132
131
|
end
|
@@ -152,14 +151,16 @@ module RuboCop
|
|
152
151
|
return true if /\A[_a-z]\w*[?!]?\z/i.match?(sym_name)
|
153
152
|
|
154
153
|
# For more complicated hash keys, let the parser validate the syntax.
|
155
|
-
|
154
|
+
ProcessedSource.new("{ #{sym_name}: :foo }", target_ruby_version).valid_syntax?
|
156
155
|
end
|
157
156
|
|
158
157
|
def check(pairs, delim, msg)
|
159
158
|
pairs.each do |pair|
|
160
159
|
if pair.delimiter == delim
|
161
160
|
location = pair.source_range.begin.join(pair.loc.operator)
|
162
|
-
add_offense(
|
161
|
+
add_offense(location, message: msg) do |corrector|
|
162
|
+
autocorrect(corrector, pair)
|
163
|
+
|
163
164
|
opposite_style_detected
|
164
165
|
end
|
165
166
|
else
|
@@ -79,6 +79,30 @@ module RuboCop
|
|
79
79
|
# # good
|
80
80
|
# foo.enforce strict: true
|
81
81
|
#
|
82
|
+
# # good
|
83
|
+
# # Allows parens for calls that won't produce valid Ruby or be ambiguous.
|
84
|
+
# model.validate strict(true)
|
85
|
+
#
|
86
|
+
# # good
|
87
|
+
# # Allows parens for calls that won't produce valid Ruby or be ambiguous.
|
88
|
+
# yield path, File.basename(path)
|
89
|
+
#
|
90
|
+
# # good
|
91
|
+
# # Operators methods calls with parens
|
92
|
+
# array&.[](index)
|
93
|
+
#
|
94
|
+
# # good
|
95
|
+
# # Operators methods without parens, if you prefer
|
96
|
+
# array.[] index
|
97
|
+
#
|
98
|
+
# # good
|
99
|
+
# # Operators methods calls with parens
|
100
|
+
# array&.[](index)
|
101
|
+
#
|
102
|
+
# # good
|
103
|
+
# # Operators methods without parens, if you prefer
|
104
|
+
# array.[] index
|
105
|
+
#
|
82
106
|
# @example IgnoreMacros: true (default)
|
83
107
|
#
|
84
108
|
# # good
|
@@ -146,6 +170,22 @@ module RuboCop
|
|
146
170
|
#
|
147
171
|
# # good
|
148
172
|
# Array 1
|
173
|
+
#
|
174
|
+
# @example AllowParenthesesInStringInterpolation: false (default)
|
175
|
+
#
|
176
|
+
# # bad
|
177
|
+
# "#{t('this.is.bad')}"
|
178
|
+
#
|
179
|
+
# # good
|
180
|
+
# "#{t 'this.is.better'}"
|
181
|
+
#
|
182
|
+
# @example AllowParenthesesInStringInterpolation: true
|
183
|
+
#
|
184
|
+
# # good
|
185
|
+
# "#{t('this.is.good')}"
|
186
|
+
#
|
187
|
+
# # good
|
188
|
+
# "#{t 'this.is.also.good'}"
|
149
189
|
class MethodCallWithArgsParentheses < Base
|
150
190
|
require_relative 'method_call_with_args_parentheses/omit_parentheses'
|
151
191
|
require_relative 'method_call_with_args_parentheses/require_parentheses'
|
@@ -5,6 +5,7 @@ module RuboCop
|
|
5
5
|
module Style
|
6
6
|
class MethodCallWithArgsParentheses
|
7
7
|
# Style omit_parentheses
|
8
|
+
# rubocop:disable Metrics/ModuleLength
|
8
9
|
module OmitParentheses
|
9
10
|
TRAILING_WHITESPACE_REGEX = /\s+\Z/.freeze
|
10
11
|
OMIT_MSG = 'Omit parentheses for method calls with arguments.'
|
@@ -12,18 +13,21 @@ module RuboCop
|
|
12
13
|
|
13
14
|
private
|
14
15
|
|
16
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
15
17
|
def omit_parentheses(node)
|
16
18
|
return unless node.parenthesized?
|
17
19
|
return if inside_endless_method_def?(node)
|
18
|
-
return if node
|
20
|
+
return if syntax_like_method_call?(node)
|
19
21
|
return if super_call_without_arguments?(node)
|
20
22
|
return if allowed_camel_case_method_call?(node)
|
21
23
|
return if legitimate_call_with_parentheses?(node)
|
24
|
+
return if allowed_string_interpolation_method_call?(node)
|
22
25
|
|
23
26
|
add_offense(offense_range(node), message: OMIT_MSG) do |corrector|
|
24
27
|
auto_correct(corrector, node)
|
25
28
|
end
|
26
29
|
end
|
30
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
27
31
|
|
28
32
|
def auto_correct(corrector, node)
|
29
33
|
if parentheses_at_the_end_of_multiline_call?(node)
|
@@ -43,6 +47,10 @@ module RuboCop
|
|
43
47
|
node.each_ancestor(:def).any?(&:endless?) && node.arguments.any?
|
44
48
|
end
|
45
49
|
|
50
|
+
def syntax_like_method_call?(node)
|
51
|
+
node.implicit_call? || node.operator_method?
|
52
|
+
end
|
53
|
+
|
46
54
|
def super_call_without_arguments?(node)
|
47
55
|
node.super_type? && node.arguments.none?
|
48
56
|
end
|
@@ -53,6 +61,11 @@ module RuboCop
|
|
53
61
|
cop_config['AllowParenthesesInCamelCaseMethod'])
|
54
62
|
end
|
55
63
|
|
64
|
+
def allowed_string_interpolation_method_call?(node)
|
65
|
+
cop_config['AllowParenthesesInStringInterpolation'] &&
|
66
|
+
inside_string_interpolation?(node)
|
67
|
+
end
|
68
|
+
|
56
69
|
def parentheses_at_the_end_of_multiline_call?(node)
|
57
70
|
node.multiline? &&
|
58
71
|
node.loc.begin.source_line
|
@@ -114,7 +127,7 @@ module RuboCop
|
|
114
127
|
def call_as_argument_or_chain?(node)
|
115
128
|
node.parent &&
|
116
129
|
(node.parent.send_type? && !assigned_before?(node.parent, node) ||
|
117
|
-
node.parent.csend_type? || node.parent.super_type?)
|
130
|
+
node.parent.csend_type? || node.parent.super_type? || node.parent.yield_type?)
|
118
131
|
end
|
119
132
|
|
120
133
|
def hash_literal_in_arguments?(node)
|
@@ -172,7 +185,12 @@ module RuboCop
|
|
172
185
|
node.assignment? &&
|
173
186
|
node.loc.operator.begin < target.loc.begin
|
174
187
|
end
|
188
|
+
|
189
|
+
def inside_string_interpolation?(node)
|
190
|
+
node.ancestors.drop_while { |a| !a.begin_type? }.any?(&:dstr_type?)
|
191
|
+
end
|
175
192
|
end
|
193
|
+
# rubocop:enable Metrics/ModuleLength
|
176
194
|
end
|
177
195
|
end
|
178
196
|
end
|
@@ -29,6 +29,7 @@ module RuboCop
|
|
29
29
|
#
|
30
30
|
class NegatedIfElseCondition < Base
|
31
31
|
include RangeHelp
|
32
|
+
include CommentsHelp
|
32
33
|
extend AutoCorrector
|
33
34
|
|
34
35
|
MSG = 'Invert the negated condition and swap the %<type>s branches.'
|
@@ -97,10 +98,22 @@ module RuboCop
|
|
97
98
|
if node.if_branch.nil?
|
98
99
|
corrector.remove(range_by_whole_lines(node.loc.else, include_final_newline: true))
|
99
100
|
else
|
100
|
-
|
101
|
-
|
101
|
+
if_range = node_with_comments(node.if_branch)
|
102
|
+
else_range = node_with_comments(node.else_branch)
|
103
|
+
|
104
|
+
corrector.replace(if_range, else_range.source)
|
105
|
+
corrector.replace(else_range, if_range.source)
|
102
106
|
end
|
103
107
|
end
|
108
|
+
|
109
|
+
def node_with_comments(node)
|
110
|
+
first_statement = node.begin_type? ? node.children[0] : node
|
111
|
+
return node if processed_source.ast_with_comments[first_statement].empty?
|
112
|
+
|
113
|
+
begin_pos = source_range_with_comment(first_statement).begin_pos
|
114
|
+
end_pos = node.source_range.end_pos
|
115
|
+
Parser::Source::Range.new(buffer, begin_pos, end_pos)
|
116
|
+
end
|
104
117
|
end
|
105
118
|
end
|
106
119
|
end
|
@@ -63,6 +63,7 @@ module RuboCop
|
|
63
63
|
# end
|
64
64
|
# end
|
65
65
|
class RedundantBegin < Base
|
66
|
+
include RangeHelp
|
66
67
|
extend AutoCorrector
|
67
68
|
|
68
69
|
MSG = 'Redundant `begin` block detected.'
|
@@ -95,12 +96,26 @@ module RuboCop
|
|
95
96
|
private
|
96
97
|
|
97
98
|
def register_offense(node)
|
98
|
-
|
99
|
-
|
99
|
+
offense_range = node.loc.begin
|
100
|
+
|
101
|
+
add_offense(offense_range) do |corrector|
|
102
|
+
if any_ancestor_assignment_node?(node)
|
103
|
+
replace_begin_with_statement(corrector, offense_range, node)
|
104
|
+
else
|
105
|
+
corrector.remove(offense_range)
|
106
|
+
end
|
107
|
+
|
100
108
|
corrector.remove(node.loc.end)
|
101
109
|
end
|
102
110
|
end
|
103
111
|
|
112
|
+
def replace_begin_with_statement(corrector, offense_range, node)
|
113
|
+
first_child = node.children.first
|
114
|
+
|
115
|
+
corrector.replace(offense_range, first_child.source)
|
116
|
+
corrector.remove(range_between(offense_range.end_pos, first_child.source_range.end_pos))
|
117
|
+
end
|
118
|
+
|
104
119
|
def empty_begin?(node)
|
105
120
|
node.children.empty?
|
106
121
|
end
|
@@ -114,9 +129,17 @@ module RuboCop
|
|
114
129
|
def valid_context_using_only_begin?(node)
|
115
130
|
parent = node.parent
|
116
131
|
|
117
|
-
|
132
|
+
valid_begin_assignment?(node) || parent&.post_condition_loop? ||
|
118
133
|
parent&.send_type? || parent&.operator_keyword?
|
119
134
|
end
|
135
|
+
|
136
|
+
def valid_begin_assignment?(node)
|
137
|
+
any_ancestor_assignment_node?(node) && !node.children.one?
|
138
|
+
end
|
139
|
+
|
140
|
+
def any_ancestor_assignment_node?(node)
|
141
|
+
node.each_ancestor.any?(&:assignment?)
|
142
|
+
end
|
120
143
|
end
|
121
144
|
end
|
122
145
|
end
|
@@ -71,6 +71,10 @@ module RuboCop
|
|
71
71
|
elsif hash_without_braces?(return_node.first_argument)
|
72
72
|
add_braces(corrector, return_node.first_argument)
|
73
73
|
end
|
74
|
+
if return_node.splat_argument?
|
75
|
+
first_argument = return_node.first_argument
|
76
|
+
corrector.replace(first_argument, first_argument.source.gsub(/\A\*/, ''))
|
77
|
+
end
|
74
78
|
|
75
79
|
keyword = range_with_surrounding_space(range: return_node.loc.keyword,
|
76
80
|
side: :right)
|
@@ -11,7 +11,7 @@ module RuboCop
|
|
11
11
|
# presence of a method name clash with an argument or a local
|
12
12
|
# variable.
|
13
13
|
#
|
14
|
-
# * Calling an attribute writer to prevent
|
14
|
+
# * Calling an attribute writer to prevent a local variable assignment.
|
15
15
|
#
|
16
16
|
# Note, with using explicit self you can only send messages with public or
|
17
17
|
# protected scope, you cannot send private messages this way.
|
@@ -144,8 +144,12 @@ module RuboCop
|
|
144
144
|
end
|
145
145
|
|
146
146
|
def on_argument(node)
|
147
|
-
|
148
|
-
|
147
|
+
if node.mlhs_type?
|
148
|
+
on_args(node)
|
149
|
+
else
|
150
|
+
name, = *node
|
151
|
+
@local_variables_scopes[node] << name
|
152
|
+
end
|
149
153
|
end
|
150
154
|
|
151
155
|
def allow_self(node)
|
@@ -39,23 +39,23 @@ module RuboCop
|
|
39
39
|
# rescue SomeException
|
40
40
|
# handle_error
|
41
41
|
# end
|
42
|
-
class RescueModifier <
|
42
|
+
class RescueModifier < Base
|
43
43
|
include Alignment
|
44
|
+
include RangeHelp
|
44
45
|
include RescueNode
|
46
|
+
extend AutoCorrector
|
45
47
|
|
46
48
|
MSG = 'Avoid using `rescue` in its modifier form.'
|
47
49
|
|
48
50
|
def on_resbody(node)
|
49
51
|
return unless rescue_modifier?(node)
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
+
rescue_node = node.parent
|
54
|
+
add_offense(rescue_node) do |corrector|
|
55
|
+
parenthesized = parenthesized?(rescue_node)
|
53
56
|
|
54
|
-
|
55
|
-
|
56
|
-
lambda do |corrector|
|
57
|
-
corrector.replace(node, corrected_block(node, parenthesized))
|
58
|
-
ParenthesesCorrector.correct(corrector, node.parent) if parenthesized
|
57
|
+
correct_rescue_block(corrector, rescue_node, parenthesized)
|
58
|
+
ParenthesesCorrector.correct(corrector, rescue_node.parent) if parenthesized
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -65,17 +65,20 @@ module RuboCop
|
|
65
65
|
node.parent && parentheses?(node.parent)
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
68
|
+
def correct_rescue_block(corrector, node, parenthesized)
|
69
69
|
operation, rescue_modifier, = *node
|
70
70
|
*_, rescue_args = *rescue_modifier
|
71
71
|
|
72
72
|
node_indentation, node_offset = indentation_and_offset(node, parenthesized)
|
73
73
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
74
|
+
corrector.remove(range_between(operation.source_range.end_pos, node.source_range.end_pos))
|
75
|
+
corrector.insert_before(operation, "begin\n#{node_indentation}")
|
76
|
+
corrector.insert_after(operation, <<~RESCUE_CLAUSE.chop)
|
77
|
+
|
78
|
+
#{node_offset}rescue
|
79
|
+
#{node_indentation}#{rescue_args.source}
|
80
|
+
#{node_offset}end
|
81
|
+
RESCUE_CLAUSE
|
79
82
|
end
|
80
83
|
|
81
84
|
def indentation_and_offset(node, parenthesized)
|