rubocop 1.71.0 → 1.71.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +1 -0
- data/lib/rubocop/cop/internal_affairs.rb +2 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -5
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/redundant_line_break.rb +6 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +2 -6
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- 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/numeric_operation_with_constant_result.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +1 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -5
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +4 -4
- data/lib/rubocop/cop/mixin/hash_subset.rb +19 -1
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +22 -8
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +18 -14
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +2 -4
- data/lib/rubocop/cop/style/arguments_forwarding.rb +38 -19
- data/lib/rubocop/cop/style/block_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +3 -3
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +2 -5
- data/lib/rubocop/cop/style/hash_except.rb +15 -0
- data/lib/rubocop/cop/style/hash_slice.rb +15 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +6 -6
- data/lib/rubocop/cop/style/it_assignment.rb +1 -1
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/map_into_array.rb +1 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +1 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +10 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +1 -1
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -2
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +6 -6
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +12 -27
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/redundant_string_escape.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/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +1 -1
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/super_arguments.rb +4 -4
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/util.rb +2 -2
- data/lib/rubocop/cop/variable_force/variable.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/rspec/support.rb +1 -2
- data/lib/rubocop/version.rb +1 -1
- metadata +9 -6
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -203,17 +203,36 @@ module RuboCop
|
|
203
203
|
corrector.remove(range)
|
204
204
|
next if inserted_expression
|
205
205
|
|
206
|
-
if
|
207
|
-
corrector
|
206
|
+
if node.parent&.assignment?
|
207
|
+
correct_assignment(corrector, node, expression, insert_position)
|
208
208
|
else
|
209
|
-
corrector
|
209
|
+
correct_no_assignment(corrector, node, expression, insert_position)
|
210
210
|
end
|
211
|
+
|
211
212
|
inserted_expression = true
|
212
213
|
end
|
213
214
|
end
|
214
215
|
end
|
215
216
|
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
216
217
|
|
218
|
+
def correct_assignment(corrector, node, expression, insert_position)
|
219
|
+
if insert_position == :after_condition
|
220
|
+
assignment = node.parent.source_range.with(end_pos: node.source_range.begin_pos)
|
221
|
+
corrector.remove(assignment)
|
222
|
+
corrector.insert_after(node, "\n#{assignment.source}#{expression.source}")
|
223
|
+
else
|
224
|
+
corrector.insert_before(node.parent, "#{expression.source}\n")
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def correct_no_assignment(corrector, node, expression, insert_position)
|
229
|
+
if insert_position == :after_condition
|
230
|
+
corrector.insert_after(node, "\n#{expression.source}")
|
231
|
+
else
|
232
|
+
corrector.insert_before(node, "#{expression.source}\n")
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
217
236
|
def last_child_of_parent?(node)
|
218
237
|
return true unless (parent = node.parent)
|
219
238
|
|
@@ -103,7 +103,7 @@ module RuboCop
|
|
103
103
|
|
104
104
|
def defined_argument_is_undefined?(if_node, defined_node)
|
105
105
|
defined_argument = defined_node.first_argument
|
106
|
-
return false unless defined_argument.
|
106
|
+
return false unless defined_argument.type?(:lvar, :send)
|
107
107
|
|
108
108
|
if_node.left_siblings.none? do |sibling|
|
109
109
|
sibling.respond_to?(:lvasgn_type?) && sibling.lvasgn_type? &&
|
@@ -112,11 +112,11 @@ module RuboCop
|
|
112
112
|
end
|
113
113
|
|
114
114
|
def pattern_matching_nodes(condition)
|
115
|
-
if condition.
|
115
|
+
if condition.type?(:match_pattern, :match_pattern_p)
|
116
116
|
[condition]
|
117
117
|
else
|
118
118
|
condition.each_descendant.select do |node|
|
119
|
-
node.
|
119
|
+
node.type?(:match_pattern, :match_pattern_p)
|
120
120
|
end
|
121
121
|
end
|
122
122
|
end
|
@@ -67,7 +67,7 @@ module RuboCop
|
|
67
67
|
|
68
68
|
# @!method if_with_boolean_literal_branches?(node)
|
69
69
|
def_node_matcher :if_with_boolean_literal_branches?, <<~PATTERN
|
70
|
-
(if #return_boolean_value?
|
70
|
+
(if #return_boolean_value? <true false>)
|
71
71
|
PATTERN
|
72
72
|
# @!method double_negative?(node)
|
73
73
|
def_node_matcher :double_negative?, '(send (send _ :!) :!)'
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
42
42
|
def message(node)
|
43
43
|
template = if require_newline?(node)
|
44
44
|
MSG_NEWLINE
|
45
|
-
elsif node.else_branch&.
|
45
|
+
elsif node.else_branch&.type?(:if, :begin) ||
|
46
46
|
use_masgn_or_block_in_branches?(node)
|
47
47
|
MSG_IF_ELSE
|
48
48
|
else
|
@@ -66,7 +66,7 @@ module RuboCop
|
|
66
66
|
|
67
67
|
def use_masgn_or_block_in_branches?(node)
|
68
68
|
node.branches.compact.any? do |branch|
|
69
|
-
branch.
|
69
|
+
branch.type?(:masgn, :any_block)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -68,7 +68,7 @@ module RuboCop
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def autocorrect(corrector, node)
|
71
|
-
if node.
|
71
|
+
if node.type?(:while_post, :until_post)
|
72
72
|
replace_begin_end_with_modifier(corrector, node)
|
73
73
|
elsif node.modifier_form?
|
74
74
|
replace_source(corrector, node.source_range, modifier_replacement(node))
|
@@ -60,18 +60,18 @@ module RuboCop
|
|
60
60
|
def_node_matcher :inverse_candidate?, <<~PATTERN
|
61
61
|
{
|
62
62
|
(send $(call $(...) $_ $...) :!)
|
63
|
-
(send (
|
63
|
+
(send (any_block $(call $(...) $_) $...) :!)
|
64
64
|
(send (begin $(call $(...) $_ $...)) :!)
|
65
65
|
}
|
66
66
|
PATTERN
|
67
67
|
|
68
68
|
# @!method inverse_block?(node)
|
69
69
|
def_node_matcher :inverse_block?, <<~PATTERN
|
70
|
-
(
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
70
|
+
(any_block $(call (...) $_) ... { $(call ... :!)
|
71
|
+
$(send (...) {:!= :!~} ...)
|
72
|
+
(begin ... $(call ... :!))
|
73
|
+
(begin ... $(send (...) {:!= :!~} ...))
|
74
|
+
})
|
75
75
|
PATTERN
|
76
76
|
|
77
77
|
def on_send(node)
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
|
58
58
|
def append_newline_to_last_kwoptarg(arguments, corrector)
|
59
59
|
last_argument = arguments.last
|
60
|
-
return if last_argument.
|
60
|
+
return if last_argument.type?(:kwrestarg, :blockarg)
|
61
61
|
|
62
62
|
last_kwoptarg = arguments.reverse.find(&:kwoptarg_type?)
|
63
63
|
corrector.insert_after(last_kwoptarg, "\n") unless arguments.parent.block_type?
|
@@ -72,7 +72,7 @@ module RuboCop
|
|
72
72
|
def_node_matcher :each_block_with_push?, <<-PATTERN
|
73
73
|
[
|
74
74
|
^({begin kwbegin block} ...)
|
75
|
-
(
|
75
|
+
(any_block (send !{nil? self} :each) _
|
76
76
|
(send (lvar _) {:<< :push :append} #suitable_argument_node?))
|
77
77
|
]
|
78
78
|
PATTERN
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
# @!method map_to_h(node)
|
41
41
|
def_node_matcher :map_to_h, <<~PATTERN
|
42
42
|
{
|
43
|
-
$(call (
|
43
|
+
$(call (any_block $(call _ {:map :collect}) ...) :to_h)
|
44
44
|
$(call $(call _ {:map :collect} (block_pass sym)) :to_h)
|
45
45
|
}
|
46
46
|
PATTERN
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
# @!method map_to_set?(node)
|
34
34
|
def_node_matcher :map_to_set?, <<~PATTERN
|
35
35
|
{
|
36
|
-
$(call (
|
36
|
+
$(call (any_block $(call _ {:map :collect}) ...) :to_set)
|
37
37
|
$(call $(call _ {:map :collect} (block_pass sym)) :to_set)
|
38
38
|
}
|
39
39
|
PATTERN
|
@@ -111,9 +111,7 @@ module RuboCop
|
|
111
111
|
parent = node.parent&.block_type? ? node.parent.parent : node.parent
|
112
112
|
return false unless parent
|
113
113
|
|
114
|
-
parent.
|
115
|
-
parent.array_type? ||
|
116
|
-
parent.range_type? ||
|
114
|
+
parent.type?(:pair, :array, :range) ||
|
117
115
|
splat?(parent) ||
|
118
116
|
ternary_if?(parent)
|
119
117
|
end
|
@@ -128,14 +126,14 @@ module RuboCop
|
|
128
126
|
end
|
129
127
|
|
130
128
|
def call_in_optional_arguments?(node)
|
131
|
-
node.parent
|
129
|
+
node.parent&.type?(:optarg, :kwoptarg)
|
132
130
|
end
|
133
131
|
|
134
132
|
def call_in_single_line_inheritance?(node)
|
135
133
|
node.parent&.class_type? && node.parent.single_line?
|
136
134
|
end
|
137
135
|
|
138
|
-
# rubocop:disable Metrics/
|
136
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
139
137
|
def call_with_ambiguous_arguments?(node)
|
140
138
|
call_with_braced_block?(node) ||
|
141
139
|
call_in_argument_with_block?(node) ||
|
@@ -144,33 +142,32 @@ module RuboCop
|
|
144
142
|
hash_literal_in_arguments?(node) ||
|
145
143
|
ambiguous_range_argument?(node) ||
|
146
144
|
node.descendants.any? do |n|
|
147
|
-
n.
|
145
|
+
n.type?(:forwarded_args, :any_block) ||
|
148
146
|
ambiguous_literal?(n) || logical_operator?(n)
|
149
147
|
end
|
150
148
|
end
|
151
|
-
# rubocop:enable Metrics/
|
149
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
152
150
|
|
153
151
|
def call_with_braced_block?(node)
|
154
|
-
|
152
|
+
node.type?(:call, :super) && node.block_node&.braces?
|
155
153
|
end
|
156
154
|
|
157
155
|
def call_in_argument_with_block?(node)
|
158
156
|
parent = node.parent&.block_type? && node.parent.parent
|
159
157
|
return false unless parent
|
160
158
|
|
161
|
-
parent.
|
159
|
+
parent.type?(:call, :super, :yield)
|
162
160
|
end
|
163
161
|
|
164
162
|
def call_as_argument_or_chain?(node)
|
165
|
-
node.parent &&
|
166
|
-
(node.parent.call_type? || node.parent.super_type? || node.parent.yield_type?) &&
|
163
|
+
node.parent&.type?(:call, :super, :yield) &&
|
167
164
|
!assigned_before?(node.parent, node)
|
168
165
|
end
|
169
166
|
|
170
167
|
def call_in_match_pattern?(node)
|
171
168
|
return false unless (parent = node.parent)
|
172
169
|
|
173
|
-
parent.
|
170
|
+
parent.type?(:match_pattern, :match_pattern_p)
|
174
171
|
end
|
175
172
|
|
176
173
|
def hash_literal_in_arguments?(node)
|
@@ -205,7 +202,7 @@ module RuboCop
|
|
205
202
|
end
|
206
203
|
|
207
204
|
def splat?(node)
|
208
|
-
node.
|
205
|
+
node.type?(:splat, :kwsplat, :block_pass)
|
209
206
|
end
|
210
207
|
|
211
208
|
def ternary_if?(node)
|
@@ -40,10 +40,8 @@ module RuboCop
|
|
40
40
|
def on_send(node)
|
41
41
|
return if ignored_node?(node)
|
42
42
|
|
43
|
-
receiver = node.receiver
|
44
|
-
|
45
|
-
return unless (receiver&.block_type? || receiver&.numblock_type?) &&
|
46
|
-
receiver.loc.end.is?('end')
|
43
|
+
return unless (receiver = node.receiver)
|
44
|
+
return unless receiver.any_block_type? && receiver.loc.end.is?('end')
|
47
45
|
|
48
46
|
range = range_between(receiver.loc.end.begin_pos, node.source_range.end_pos)
|
49
47
|
|
@@ -168,7 +168,7 @@ module RuboCop
|
|
168
168
|
|
169
169
|
def anonymous_arguments?(node)
|
170
170
|
return true if node.arguments.any? do |arg|
|
171
|
-
arg.
|
171
|
+
arg.type?(:forward_arg, :restarg, :kwrestarg)
|
172
172
|
end
|
173
173
|
return false unless (last_argument = node.last_argument)
|
174
174
|
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
node.send_node.each_node(:send, :csend) do |send_node|
|
32
32
|
receiver = send_node.receiver
|
33
33
|
|
34
|
-
next unless
|
34
|
+
next unless receiver&.any_block_type? && receiver.multiline?
|
35
35
|
|
36
36
|
range = range_between(receiver.loc.end.begin_pos, node.send_node.source_range.end_pos)
|
37
37
|
|
@@ -197,7 +197,7 @@ module RuboCop
|
|
197
197
|
end
|
198
198
|
|
199
199
|
def frozen_regexp_or_range_literals?(node)
|
200
|
-
target_ruby_version >= 3.0 &&
|
200
|
+
target_ruby_version >= 3.0 && node.type?(:regexp, :range)
|
201
201
|
end
|
202
202
|
|
203
203
|
def requires_parentheses?(node)
|
@@ -69,11 +69,7 @@ module RuboCop
|
|
69
69
|
elements = Array(node).compact
|
70
70
|
|
71
71
|
# Account for edge case of `Constant::CONSTANT`
|
72
|
-
!node.array_type? ||
|
73
|
-
end
|
74
|
-
|
75
|
-
def return_of_method_call?(node)
|
76
|
-
node.block_type? || node.send_type?
|
72
|
+
!node.array_type? || elements.any?(&:splat_type?)
|
77
73
|
end
|
78
74
|
|
79
75
|
def assignment_corrector(node, rhs, order)
|
@@ -94,8 +94,8 @@ module RuboCop
|
|
94
94
|
end
|
95
95
|
|
96
96
|
def require_parentheses?(node, condition_body)
|
97
|
-
return false
|
98
|
-
return false
|
97
|
+
return false unless node.type?(:while, :until)
|
98
|
+
return false unless condition_body.any_block_type?
|
99
99
|
|
100
100
|
condition_body.send_node.block_literal? && condition_body.keywords?
|
101
101
|
end
|
@@ -19,8 +19,7 @@ module RuboCop
|
|
19
19
|
MSG = 'Use `proc` instead of `Proc.new`.'
|
20
20
|
|
21
21
|
# @!method proc_new?(node)
|
22
|
-
def_node_matcher :proc_new?,
|
23
|
-
'({block numblock} $(send (const {nil? cbase} :Proc) :new) ...)'
|
22
|
+
def_node_matcher :proc_new?, '(any_block $(send (const {nil? cbase} :Proc) :new) ...)'
|
24
23
|
|
25
24
|
def on_block(node)
|
26
25
|
proc_new?(node) do |block_method|
|
@@ -157,7 +157,7 @@ module RuboCop
|
|
157
157
|
end
|
158
158
|
|
159
159
|
def asgn_type?(node)
|
160
|
-
node.
|
160
|
+
node.type?(:lvasgn, :ivasgn, :cvasgn, :gvasgn)
|
161
161
|
end
|
162
162
|
|
163
163
|
def branches_have_method?(node)
|
@@ -184,7 +184,7 @@ module RuboCop
|
|
184
184
|
return false unless argument.hash_type?
|
185
185
|
return false unless (node = argument.children.first)
|
186
186
|
|
187
|
-
node.
|
187
|
+
node.type?(:kwsplat, :forwarded_kwrestarg)
|
188
188
|
end
|
189
189
|
|
190
190
|
def if_source(if_branch, arithmetic_operation)
|
@@ -25,11 +25,11 @@ module RuboCop
|
|
25
25
|
MSG = 'Remove the redundant double splat and braces, use keyword arguments directly.'
|
26
26
|
MERGE_METHODS = %i[merge merge!].freeze
|
27
27
|
|
28
|
-
# rubocop:disable Metrics/
|
28
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
29
29
|
def on_hash(node)
|
30
30
|
return if node.pairs.empty? || node.pairs.any?(&:hash_rocket?)
|
31
31
|
return unless (parent = node.parent)
|
32
|
-
return unless parent.
|
32
|
+
return unless parent.type?(:call, :kwsplat)
|
33
33
|
return unless mergeable?(parent)
|
34
34
|
return unless (kwsplat = node.each_ancestor(:kwsplat).first)
|
35
35
|
return if !node.braces? || allowed_double_splat_receiver?(kwsplat)
|
@@ -38,13 +38,13 @@ module RuboCop
|
|
38
38
|
autocorrect(corrector, node, kwsplat)
|
39
39
|
end
|
40
40
|
end
|
41
|
-
# rubocop:enable Metrics/
|
41
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
42
42
|
|
43
43
|
private
|
44
44
|
|
45
45
|
def allowed_double_splat_receiver?(kwsplat)
|
46
46
|
first_child = kwsplat.children.first
|
47
|
-
return true if first_child.
|
47
|
+
return true if first_child.any_block_type?
|
48
48
|
return false unless first_child.call_type?
|
49
49
|
|
50
50
|
root_receiver = root_receiver(first_child)
|
@@ -73,7 +73,7 @@ module RuboCop
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def select_merge_method_nodes(kwsplat)
|
76
|
-
|
76
|
+
kwsplat.each_descendant(:call).select do |node|
|
77
77
|
mergeable?(node)
|
78
78
|
end
|
79
79
|
end
|
@@ -89,7 +89,7 @@ module RuboCop
|
|
89
89
|
def autocorrect_merge_methods(corrector, merge_methods, kwsplat)
|
90
90
|
range = range_of_merge_methods(merge_methods)
|
91
91
|
|
92
|
-
new_kwsplat_arguments =
|
92
|
+
new_kwsplat_arguments = kwsplat.each_descendant(:call).map do |descendant|
|
93
93
|
convert_to_new_arguments(descendant)
|
94
94
|
end
|
95
95
|
new_source = new_kwsplat_arguments.compact.reverse.unshift('').join(', ')
|
@@ -104,10 +104,6 @@ module RuboCop
|
|
104
104
|
begin_merge_method.loc.dot.begin.join(end_merge_method.source_range.end)
|
105
105
|
end
|
106
106
|
|
107
|
-
def extract_send_methods(kwsplat)
|
108
|
-
kwsplat.each_descendant(:send, :csend)
|
109
|
-
end
|
110
|
-
|
111
107
|
def convert_to_new_arguments(node)
|
112
108
|
return unless mergeable?(node)
|
113
109
|
|
@@ -65,7 +65,7 @@ module RuboCop
|
|
65
65
|
return if node.last_argument&.block_pass_type?
|
66
66
|
|
67
67
|
if node.method?(:each) && !node.parent&.block_type?
|
68
|
-
ancestor_node = node.each_ancestor(:
|
68
|
+
ancestor_node = node.each_ancestor(:call).detect do |ancestor|
|
69
69
|
ancestor.receiver == node &&
|
70
70
|
(RESTRICT_ON_SEND.include?(ancestor.method_name) || ancestor.method?(:reverse_each))
|
71
71
|
end
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
42
42
|
return true if node.immutable_literal?
|
43
43
|
return true if frozen_string_literal?(node)
|
44
44
|
|
45
|
-
target_ruby_version >= 3.0 &&
|
45
|
+
target_ruby_version >= 3.0 && node.type?(:regexp, :range)
|
46
46
|
end
|
47
47
|
|
48
48
|
def strip_parenthesis(node)
|
@@ -50,7 +50,7 @@ module RuboCop
|
|
50
50
|
def ignore_syntax?(node)
|
51
51
|
return false unless (parent = node.parent)
|
52
52
|
|
53
|
-
parent.
|
53
|
+
parent.type?(:while_post, :until_post, :match_with_lvasgn) ||
|
54
54
|
like_method_argument_parentheses?(parent) || multiline_control_flow_statements?(node)
|
55
55
|
end
|
56
56
|
|
@@ -72,7 +72,7 @@ module RuboCop
|
|
72
72
|
ancestor = node.ancestors.first
|
73
73
|
return false unless ancestor
|
74
74
|
|
75
|
-
!ancestor.
|
75
|
+
!ancestor.type?(:begin, :def, :any_block)
|
76
76
|
end
|
77
77
|
|
78
78
|
def allowed_ternary?(node)
|
@@ -89,7 +89,7 @@ module RuboCop
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def like_method_argument_parentheses?(node)
|
92
|
-
return false
|
92
|
+
return false unless node.type?(:send, :super, :yield)
|
93
93
|
|
94
94
|
node.arguments.one? && !node.parenthesized? &&
|
95
95
|
!node.arithmetic_operation? && node.first_argument.begin_type?
|
@@ -99,7 +99,7 @@ module RuboCop
|
|
99
99
|
return false unless (parent = node.parent)
|
100
100
|
return false if parent.single_line?
|
101
101
|
|
102
|
-
parent.
|
102
|
+
parent.type?(:return, :next, :break)
|
103
103
|
end
|
104
104
|
|
105
105
|
def empty_parentheses?(node)
|
@@ -279,9 +279,9 @@ module RuboCop
|
|
279
279
|
end
|
280
280
|
|
281
281
|
def do_end_block_in_method_chain?(begin_node, node)
|
282
|
-
return false unless (block = node.each_descendant(:
|
282
|
+
return false unless (block = node.each_descendant(:any_block).first)
|
283
283
|
|
284
|
-
block.keywords? && begin_node.each_ancestor(:
|
284
|
+
block.keywords? && begin_node.each_ancestor(:call).any?
|
285
285
|
end
|
286
286
|
end
|
287
287
|
end
|
@@ -21,12 +21,8 @@ module RuboCop
|
|
21
21
|
# args += foo
|
22
22
|
# hash.merge!(other)
|
23
23
|
#
|
24
|
-
# # bad
|
25
|
-
# self.foo = foo.concat(ary)
|
26
|
-
#
|
27
24
|
# # good
|
28
25
|
# foo.concat(ary)
|
29
|
-
# self.foo += ary
|
30
26
|
#
|
31
27
|
class RedundantSelfAssignment < Base
|
32
28
|
include RangeHelp
|
@@ -49,6 +45,16 @@ module RuboCop
|
|
49
45
|
gvasgn: :gvar
|
50
46
|
}.freeze
|
51
47
|
|
48
|
+
# @!method redundant_self_assignment?
|
49
|
+
def_node_matcher :redundant_self_assignment?, <<~PATTERN
|
50
|
+
(call
|
51
|
+
%1 _
|
52
|
+
(call
|
53
|
+
(call
|
54
|
+
%1 %2) #method_returning_self?
|
55
|
+
...))
|
56
|
+
PATTERN
|
57
|
+
|
52
58
|
# rubocop:disable Metrics/AbcSize
|
53
59
|
def on_lvasgn(node)
|
54
60
|
return unless (rhs = node.rhs)
|
@@ -85,31 +91,10 @@ module RuboCop
|
|
85
91
|
METHODS_RETURNING_SELF.include?(method_name)
|
86
92
|
end
|
87
93
|
|
88
|
-
# @!method redundant_self_assignment?(node, method_name)
|
89
|
-
def_node_matcher :redundant_self_assignment?, <<~PATTERN
|
90
|
-
(send
|
91
|
-
(self) _
|
92
|
-
(call
|
93
|
-
(send
|
94
|
-
{(self) nil?} %1) #method_returning_self?
|
95
|
-
...))
|
96
|
-
PATTERN
|
97
|
-
|
98
|
-
# @!method redundant_nonself_assignment?(node, receiver, method_name)
|
99
|
-
def_node_matcher :redundant_nonself_assignment?, <<~PATTERN
|
100
|
-
(call
|
101
|
-
%1 _
|
102
|
-
(call
|
103
|
-
(call
|
104
|
-
%1 %2) #method_returning_self?
|
105
|
-
...))
|
106
|
-
PATTERN
|
107
|
-
|
108
94
|
def redundant_assignment?(node)
|
109
|
-
receiver_name = node.method_name.to_s
|
95
|
+
receiver_name = node.method_name.to_s.delete_suffix('=').to_sym
|
110
96
|
|
111
|
-
redundant_self_assignment?(node, receiver_name)
|
112
|
-
redundant_nonself_assignment?(node, node.receiver, receiver_name)
|
97
|
+
redundant_self_assignment?(node, node.receiver, receiver_name)
|
113
98
|
end
|
114
99
|
|
115
100
|
def correction_range(node)
|
@@ -93,9 +93,9 @@ module RuboCop
|
|
93
93
|
(call $(call _ $:sort_by _) ${:last :first})
|
94
94
|
(send $(send _ $:sort_by _) ${:[] :at :slice} {(int 0) (int -1)})
|
95
95
|
|
96
|
-
(call (
|
96
|
+
(call (any_block $(call _ ${:sort_by :sort}) ...) ${:last :first})
|
97
97
|
(call
|
98
|
-
(
|
98
|
+
(any_block $(call _ ${:sort_by :sort}) ...)
|
99
99
|
${:[] :at :slice} {(int 0) (int -1)}
|
100
100
|
)
|
101
101
|
}
|
@@ -41,7 +41,7 @@ module RuboCop
|
|
41
41
|
MSG = 'Redundant escape of %<char>s inside string literal.'
|
42
42
|
|
43
43
|
def on_str(node)
|
44
|
-
return if node.parent&.
|
44
|
+
return if node.parent&.type?(:regexp, :xstr) || node.character_literal?
|
45
45
|
|
46
46
|
str_contents_range = str_contents_range(node)
|
47
47
|
|
@@ -147,7 +147,7 @@ module RuboCop
|
|
147
147
|
end
|
148
148
|
|
149
149
|
def heredoc?(node)
|
150
|
-
|
150
|
+
node.type?(:str, :dstr) && node.heredoc?
|
151
151
|
end
|
152
152
|
|
153
153
|
def delimiter?(node, char)
|