rubocop 0.79.0 → 0.83.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/LICENSE.txt +1 -1
- data/README.md +5 -5
- data/config/default.yml +184 -50
- data/lib/rubocop.rb +15 -5
- data/lib/rubocop/ast/builder.rb +2 -0
- data/lib/rubocop/ast/node.rb +12 -19
- data/lib/rubocop/ast/node/array_node.rb +13 -0
- data/lib/rubocop/ast/node/block_node.rb +5 -1
- data/lib/rubocop/ast/node/case_match_node.rb +56 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +8 -0
- data/lib/rubocop/ast/node/regexp_node.rb +2 -4
- data/lib/rubocop/ast/node/send_node.rb +4 -0
- data/lib/rubocop/ast/traversal.rb +20 -9
- data/lib/rubocop/cli.rb +11 -5
- data/lib/rubocop/comment_config.rb +6 -1
- data/lib/rubocop/config.rb +40 -10
- data/lib/rubocop/config_loader.rb +43 -33
- data/lib/rubocop/config_loader_resolver.rb +28 -1
- data/lib/rubocop/config_obsoletion.rb +4 -1
- data/lib/rubocop/config_validator.rb +18 -1
- data/lib/rubocop/cop/badge.rb +5 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/corrector.rb +48 -24
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -2
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/string_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/generator.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -1
- data/lib/rubocop/cop/layout/array_alignment.rb +53 -10
- data/lib/rubocop/cop/layout/block_end_newline.rb +5 -3
- data/lib/rubocop/cop/layout/condition_position.rb +12 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +8 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -1
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +68 -0
- data/lib/rubocop/cop/layout/end_of_line.rb +2 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +16 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/{tab.rb → indentation_style.rb} +48 -6
- data/lib/rubocop/cop/layout/leading_comment_space.rb +34 -3
- data/lib/rubocop/cop/layout/line_length.rb +36 -4
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +0 -4
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +13 -4
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +133 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +37 -2
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +8 -0
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -9
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +2 -2
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +2 -2
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +38 -0
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +14 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +12 -0
- data/lib/rubocop/cop/lint/debugger.rb +2 -2
- data/lib/rubocop/cop/lint/duplicate_methods.rb +1 -5
- data/lib/rubocop/cop/lint/empty_when.rb +29 -6
- data/lib/rubocop/cop/lint/ensure_return.rb +18 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +10 -13
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/loop.rb +6 -4
- data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +21 -9
- data/lib/rubocop/cop/lint/percent_string_array.rb +2 -2
- data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +1 -6
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +12 -7
- 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/struct_new_override.rb +58 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +12 -28
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -2
- data/lib/rubocop/cop/lint/unused_method_argument.rb +32 -6
- data/lib/rubocop/cop/lint/uri_regexp.rb +4 -4
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +12 -0
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -2
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +5 -0
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -0
- data/lib/rubocop/cop/migration/department_name.rb +36 -10
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +4 -0
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +6 -1
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +16 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +2 -1
- data/lib/rubocop/cop/mixin/method_complexity.rb +5 -0
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -22
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +5 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -10
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +26 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/registry.rb +11 -4
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -6
- data/lib/rubocop/cop/style/alias.rb +4 -4
- data/lib/rubocop/cop/style/and_or.rb +5 -6
- data/lib/rubocop/cop/style/array_join.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +60 -1
- data/lib/rubocop/cop/style/case_equality.rb +24 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -8
- data/lib/rubocop/cop/style/copyright.rb +1 -1
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
- data/lib/rubocop/cop/style/documentation.rb +43 -5
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +1 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +3 -3
- data/lib/rubocop/cop/style/empty_method.rb +1 -5
- data/lib/rubocop/cop/style/end_block.rb +6 -0
- 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/exponential_notation.rb +119 -0
- data/lib/rubocop/cop/style/format_string.rb +2 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +89 -11
- data/lib/rubocop/cop/style/guard_clause.rb +25 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +3 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
- data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -0
- data/lib/rubocop/cop/style/inverse_methods.rb +9 -5
- data/lib/rubocop/cop/style/lambda.rb +3 -2
- data/lib/rubocop/cop/style/lambda_call.rb +1 -21
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +5 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -4
- data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +58 -12
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +16 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +4 -4
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +4 -4
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/one_line_conditional.rb +4 -3
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +4 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +18 -6
- data/lib/rubocop/cop/style/redundant_conditional.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +3 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_return.rb +5 -7
- data/lib/rubocop/cop/style/redundant_self.rb +1 -1
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- 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/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -4
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +3 -3
- data/lib/rubocop/cop/style/symbol_literal.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +2 -3
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +35 -22
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +41 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +44 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +0 -4
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +1 -1
- data/lib/rubocop/cop/util.rb +24 -0
- data/lib/rubocop/cop/variable_force.rb +4 -1
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -0
- data/lib/rubocop/cop/variable_force/scope.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +1 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +74 -0
- data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +1 -1
- data/lib/rubocop/name_similarity.rb +12 -9
- data/lib/rubocop/node_pattern.rb +96 -10
- data/lib/rubocop/options.rb +18 -5
- data/lib/rubocop/processed_source.rb +1 -4
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +1 -1
- data/lib/rubocop/rspec/shared_contexts.rb +0 -4
- data/lib/rubocop/runner.rb +7 -2
- data/lib/rubocop/target_finder.rb +6 -4
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +1 -1
- metadata +35 -25
- data/lib/rubocop/cop/lint/end_in_method.rb +0 -40
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +0 -209
- data/lib/rubocop/formatter/disabled_lines_formatter.rb +0 -57
- data/lib/rubocop/string_util.rb +0 -14
@@ -6,6 +6,10 @@ module RuboCop
|
|
6
6
|
# Checks that operators have space around them, except for ** which
|
7
7
|
# should or shouldn't have surrounding space depending on configuration.
|
8
8
|
#
|
9
|
+
# This cop has `AllowForAlignment` option. When `true`, allows most
|
10
|
+
# uses of extra spacing if the intent is to align with an operator on
|
11
|
+
# the previous or next line, not counting empty lines or comment lines.
|
12
|
+
#
|
9
13
|
# @example
|
10
14
|
# # bad
|
11
15
|
# total = 3*4
|
@@ -17,6 +21,20 @@ module RuboCop
|
|
17
21
|
# "apple" + "juice"
|
18
22
|
# my_number = 38 / 4
|
19
23
|
#
|
24
|
+
# @example AllowForAlignment: true (default)
|
25
|
+
# # good
|
26
|
+
# {
|
27
|
+
# 1 => 2,
|
28
|
+
# 11 => 3
|
29
|
+
# }
|
30
|
+
#
|
31
|
+
# @example AllowForAlignment: false
|
32
|
+
# # bad
|
33
|
+
# {
|
34
|
+
# 1 => 2,
|
35
|
+
# 11 => 3
|
36
|
+
# }
|
37
|
+
#
|
20
38
|
# @example EnforcedStyleForExponentOperator: no_space (default)
|
21
39
|
# # bad
|
22
40
|
# a ** b
|
@@ -121,7 +139,7 @@ module RuboCop
|
|
121
139
|
elsif range.source.end_with?("\n")
|
122
140
|
corrector.replace(range, " #{range.source.strip}\n")
|
123
141
|
else
|
124
|
-
corrector
|
142
|
+
enclose_operator_with_space(corrector, range)
|
125
143
|
end
|
126
144
|
end
|
127
145
|
end
|
@@ -152,12 +170,25 @@ module RuboCop
|
|
152
170
|
yield msg if msg
|
153
171
|
end
|
154
172
|
|
173
|
+
def enclose_operator_with_space(corrector, range)
|
174
|
+
operator = range.source
|
175
|
+
|
176
|
+
# If `ForceEqualSignAlignment` is true, `Layout/ExtraSpacing` cop
|
177
|
+
# inserts spaces before operator. If `Layout/SpaceAroundOperators` cop
|
178
|
+
# inserts a space, it collides and raises the infinite loop error.
|
179
|
+
if force_equal_sign_alignment?
|
180
|
+
corrector.insert_after(range, ' ') unless operator.end_with?(' ')
|
181
|
+
else
|
182
|
+
corrector.replace(range, " #{operator.strip} ")
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
155
186
|
def offense_message(type, operator, with_space, right_operand)
|
156
187
|
if should_not_have_surrounding_space?(operator)
|
157
188
|
return if with_space.is?(operator.source)
|
158
189
|
|
159
190
|
"Space around operator `#{operator.source}` detected."
|
160
|
-
elsif with_space.source
|
191
|
+
elsif !/^\s.*\s$/.match?(with_space.source)
|
161
192
|
"Surrounding space missing for operator `#{operator.source}`."
|
162
193
|
elsif excess_leading_space?(type, operator, with_space) ||
|
163
194
|
excess_trailing_space?(right_operand, with_space)
|
@@ -198,6 +229,10 @@ module RuboCop
|
|
198
229
|
cop_config['EnforcedStyleForExponentOperator'] == 'space'
|
199
230
|
end
|
200
231
|
|
232
|
+
def force_equal_sign_alignment?
|
233
|
+
config.for_cop('Layout/ExtraSpacing')['ForceEqualSignAlignment']
|
234
|
+
end
|
235
|
+
|
201
236
|
def should_not_have_surrounding_space?(operator)
|
202
237
|
operator.is?('**') ? !space_around_exponent_operator? : false
|
203
238
|
end
|
@@ -54,6 +54,7 @@ module RuboCop
|
|
54
54
|
|
55
55
|
def expect_params_after_method_name?(node)
|
56
56
|
return false if node.parenthesized?
|
57
|
+
return true if no_space_between_method_name_and_first_argument?(node)
|
57
58
|
|
58
59
|
first_arg = node.first_argument
|
59
60
|
|
@@ -61,6 +62,13 @@ module RuboCop
|
|
61
62
|
!(allow_for_alignment? &&
|
62
63
|
aligned_with_something?(first_arg.source_range))
|
63
64
|
end
|
65
|
+
|
66
|
+
def no_space_between_method_name_and_first_argument?(node)
|
67
|
+
end_pos_of_method_name = node.loc.selector.end_pos
|
68
|
+
begin_pos_of_argument = node.first_argument.source_range.begin_pos
|
69
|
+
|
70
|
+
end_pos_of_method_name == begin_pos_of_argument
|
71
|
+
end
|
64
72
|
end
|
65
73
|
end
|
66
74
|
end
|
@@ -46,7 +46,7 @@ module RuboCop
|
|
46
46
|
children = lambda_node.parent.children
|
47
47
|
lambda do |corrector|
|
48
48
|
if style == :require_space
|
49
|
-
corrector.insert_before(children[1]
|
49
|
+
corrector.insert_before(children[1], ' ')
|
50
50
|
else
|
51
51
|
corrector.remove(space_after_arrow(lambda_node))
|
52
52
|
end
|
@@ -117,7 +117,7 @@ module RuboCop
|
|
117
117
|
range = range_between(left_brace.end_pos, right_brace.begin_pos)
|
118
118
|
inner = range.source
|
119
119
|
|
120
|
-
if
|
120
|
+
if /\S/.match?(inner)
|
121
121
|
braces_with_contents_inside(node, inner)
|
122
122
|
elsif style_for_empty_braces == :no_space
|
123
123
|
offense(range.begin_pos, range.end_pos,
|
@@ -142,7 +142,7 @@ module RuboCop
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def check_left_brace(inner, left_brace, args_delimiter)
|
145
|
-
if
|
145
|
+
if /\A\S/.match?(inner)
|
146
146
|
no_space_inside_left_brace(left_brace, args_delimiter)
|
147
147
|
else
|
148
148
|
space_inside_left_brace(left_brace, args_delimiter)
|
@@ -83,17 +83,10 @@ module RuboCop
|
|
83
83
|
|
84
84
|
def autocorrect(range)
|
85
85
|
lambda do |corrector|
|
86
|
-
# It is possible that BracesAroundHashParameters will remove the
|
87
|
-
# braces while this cop inserts spaces. This can lead to unwanted
|
88
|
-
# changes to the inspected code. If we replace the brace with a
|
89
|
-
# brace plus space (rather than just inserting a space), then any
|
90
|
-
# removal of the same brace will give us a clobbering error. This
|
91
|
-
# in turn will make RuboCop fall back on cop-by-cop
|
92
|
-
# auto-correction. Problem solved.
|
93
86
|
case range.source
|
94
87
|
when /\s/ then corrector.remove(range)
|
95
|
-
when '{' then corrector.
|
96
|
-
else corrector.
|
88
|
+
when '{' then corrector.insert_after(range, ' ')
|
89
|
+
else corrector.insert_before(range, ' ')
|
97
90
|
end
|
98
91
|
end
|
99
92
|
end
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
|
36
36
|
lambda do |corrector|
|
37
37
|
corrector.replace(
|
38
|
-
node
|
38
|
+
node,
|
39
39
|
expression
|
40
40
|
.sub(/\s+#{operator_escaped}/, operator)
|
41
41
|
.sub(/#{operator_escaped}\s+/, operator)
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
53
53
|
# account for multiline range literals
|
54
54
|
expression.sub!(/#{escaped_op}\n\s*/, op)
|
55
55
|
|
56
|
-
return unless
|
56
|
+
return unless /(\s#{escaped_op})|(#{escaped_op}\s)/.match?(expression)
|
57
57
|
|
58
58
|
add_offense(node)
|
59
59
|
end
|
@@ -14,14 +14,14 @@ module RuboCop
|
|
14
14
|
# # good
|
15
15
|
# x = 0
|
16
16
|
#
|
17
|
-
# @example AllowInHeredoc: false
|
17
|
+
# @example AllowInHeredoc: false
|
18
18
|
# # The line in this example contains spaces after the 0.
|
19
19
|
# # bad
|
20
20
|
# code = <<~RUBY
|
21
21
|
# x = 0
|
22
22
|
# RUBY
|
23
23
|
#
|
24
|
-
# @example AllowInHeredoc: true
|
24
|
+
# @example AllowInHeredoc: true (default)
|
25
25
|
# # The line in this example contains spaces after the 0.
|
26
26
|
# # good
|
27
27
|
# code = <<~RUBY
|
@@ -38,17 +38,55 @@ module RuboCop
|
|
38
38
|
'a whitespace to the right of the `%<operator>s` if it ' \
|
39
39
|
'should be a %<possible>s.'
|
40
40
|
|
41
|
+
def autocorrect(node)
|
42
|
+
lambda do |corrector|
|
43
|
+
add_parentheses(node, corrector)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
41
47
|
private
|
42
48
|
|
43
49
|
def relevant_diagnostic?(diagnostic)
|
44
50
|
diagnostic.reason == :ambiguous_prefix
|
45
51
|
end
|
46
52
|
|
53
|
+
def find_offense_node_by(diagnostic)
|
54
|
+
ast = processed_source.ast
|
55
|
+
ast.each_node(:splat, :block_pass, :kwsplat) do |node|
|
56
|
+
next unless offense_position?(node, diagnostic)
|
57
|
+
|
58
|
+
offense_node = offense_node(node)
|
59
|
+
return offense_node if offense_node
|
60
|
+
end
|
61
|
+
|
62
|
+
ast.each_node(:send).find do |send_node|
|
63
|
+
offense_position?(send_node.first_argument, diagnostic) &&
|
64
|
+
unary_operator?(send_node.first_argument, diagnostic)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
47
68
|
def alternative_message(diagnostic)
|
48
69
|
operator = diagnostic.location.source
|
49
70
|
hash = AMBIGUITIES[operator]
|
50
71
|
format(MSG_FORMAT, hash)
|
51
72
|
end
|
73
|
+
|
74
|
+
def offense_position?(node, diagnostic)
|
75
|
+
node.source_range.begin_pos == diagnostic.location.begin_pos
|
76
|
+
end
|
77
|
+
|
78
|
+
def offense_node(node)
|
79
|
+
case node.type
|
80
|
+
when :splat, :block_pass
|
81
|
+
node.parent
|
82
|
+
when :kwsplat
|
83
|
+
node.parent.parent
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def unary_operator?(node, diagnostic)
|
88
|
+
node.source.start_with?(diagnostic.arguments[:prefix])
|
89
|
+
end
|
52
90
|
end
|
53
91
|
end
|
54
92
|
end
|
@@ -28,12 +28,26 @@ module RuboCop
|
|
28
28
|
"if it's surely a regexp literal, or add a whitespace to the " \
|
29
29
|
'right of the `/` if it should be a division.'
|
30
30
|
|
31
|
+
def autocorrect(node)
|
32
|
+
lambda do |corrector|
|
33
|
+
add_parentheses(node, corrector)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
31
37
|
private
|
32
38
|
|
33
39
|
def relevant_diagnostic?(diagnostic)
|
34
40
|
diagnostic.reason == :ambiguous_literal
|
35
41
|
end
|
36
42
|
|
43
|
+
def find_offense_node_by(diagnostic)
|
44
|
+
node = processed_source.ast.each_node(:regexp).find do |regexp_node|
|
45
|
+
regexp_node.source_range.begin_pos == diagnostic.location.begin_pos
|
46
|
+
end
|
47
|
+
|
48
|
+
node.parent
|
49
|
+
end
|
50
|
+
|
37
51
|
def alternative_message(_diagnostic)
|
38
52
|
MSG
|
39
53
|
end
|
@@ -32,6 +32,18 @@ module RuboCop
|
|
32
32
|
|
33
33
|
add_offense(node, message: format(MSG, boolean: node.value))
|
34
34
|
end
|
35
|
+
|
36
|
+
def autocorrect(node)
|
37
|
+
lambda do |corrector|
|
38
|
+
boolean_literal = node.source.delete(':')
|
39
|
+
parent = node.parent
|
40
|
+
if parent&.pair_type? && node.equal?(parent.children[0])
|
41
|
+
corrector.remove(parent.loc.operator)
|
42
|
+
boolean_literal = "#{node.source} =>"
|
43
|
+
end
|
44
|
+
corrector.replace(node, boolean_literal)
|
45
|
+
end
|
46
|
+
end
|
35
47
|
end
|
36
48
|
end
|
37
49
|
end
|
@@ -43,7 +43,7 @@ module RuboCop
|
|
43
43
|
PATTERN
|
44
44
|
|
45
45
|
def_node_matcher :debugger_call?, <<~PATTERN
|
46
|
-
{(send {nil? #kernel?} {:debugger :byebug :remote_byebug
|
46
|
+
{(send {nil? #kernel?} {:debugger :byebug :remote_byebug} ...)
|
47
47
|
(send (send {#kernel? nil?} :binding)
|
48
48
|
{:pry :remote_pry :pry_remote :console} ...)
|
49
49
|
(send (const {nil? (cbase)} :Pry) :rescue ...)
|
@@ -69,7 +69,7 @@ module RuboCop
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def binding_irb?(node)
|
72
|
-
|
72
|
+
binding_irb_call?(node)
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -95,10 +95,6 @@ module RuboCop
|
|
95
95
|
(send nil? :alias_method (sym $_name) _)
|
96
96
|
PATTERN
|
97
97
|
|
98
|
-
def_node_matcher :attr?, <<~PATTERN
|
99
|
-
(send nil? ${:attr_reader :attr_writer :attr_accessor :attr} $...)
|
100
|
-
PATTERN
|
101
|
-
|
102
98
|
def_node_matcher :sym_name, '(sym $_name)'
|
103
99
|
|
104
100
|
def on_send(node)
|
@@ -108,7 +104,7 @@ module RuboCop
|
|
108
104
|
return if possible_dsl?(node)
|
109
105
|
|
110
106
|
found_instance_method(node, name)
|
111
|
-
elsif (attr =
|
107
|
+
elsif (attr = node.attribute_accessor?)
|
112
108
|
on_attr(node, *attr)
|
113
109
|
end
|
114
110
|
end
|
@@ -8,26 +8,49 @@ module RuboCop
|
|
8
8
|
# @example
|
9
9
|
#
|
10
10
|
# # bad
|
11
|
-
#
|
12
11
|
# case foo
|
13
|
-
# when bar
|
14
|
-
#
|
12
|
+
# when bar
|
13
|
+
# do_something
|
14
|
+
# when baz
|
15
15
|
# end
|
16
16
|
#
|
17
17
|
# @example
|
18
18
|
#
|
19
19
|
# # good
|
20
|
+
# case condition
|
21
|
+
# when foo
|
22
|
+
# do_something
|
23
|
+
# when bar
|
24
|
+
# nil
|
25
|
+
# end
|
20
26
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
27
|
+
# @example AllowComments: true (default)
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# case condition
|
31
|
+
# when foo
|
32
|
+
# do_something
|
33
|
+
# when bar
|
34
|
+
# # noop
|
24
35
|
# end
|
36
|
+
#
|
37
|
+
# @example AllowComments: false
|
38
|
+
#
|
39
|
+
# # bad
|
40
|
+
# case condition
|
41
|
+
# when foo
|
42
|
+
# do_something
|
43
|
+
# when bar
|
44
|
+
# # do nothing
|
45
|
+
# end
|
46
|
+
#
|
25
47
|
class EmptyWhen < Cop
|
26
48
|
MSG = 'Avoid `when` branches without a body.'
|
27
49
|
|
28
50
|
def on_case(node)
|
29
51
|
node.each_when do |when_node|
|
30
52
|
next if when_node.body
|
53
|
+
next if cop_config['AllowComments'] && comment_lines?(node)
|
31
54
|
|
32
55
|
add_offense(when_node, location: when_node.source_range)
|
33
56
|
end
|
@@ -29,6 +29,8 @@ module RuboCop
|
|
29
29
|
# do_something_else
|
30
30
|
# end
|
31
31
|
class EnsureReturn < Cop
|
32
|
+
include RangeHelp
|
33
|
+
|
32
34
|
MSG = 'Do not return from an `ensure` block.'
|
33
35
|
|
34
36
|
def on_ensure(node)
|
@@ -37,7 +39,22 @@ module RuboCop
|
|
37
39
|
return unless ensure_body
|
38
40
|
|
39
41
|
ensure_body.each_node(:return) do |return_node|
|
40
|
-
|
42
|
+
next if return_node.arguments.size >= 2
|
43
|
+
|
44
|
+
add_offense(return_node, location: :keyword)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def autocorrect(node)
|
49
|
+
lambda do |corrector|
|
50
|
+
if node.arguments?
|
51
|
+
corrector.replace(node, node.source.gsub(/return\s*/, ''))
|
52
|
+
else
|
53
|
+
range = range_by_whole_lines(
|
54
|
+
node.loc.expression, include_final_newline: true
|
55
|
+
)
|
56
|
+
corrector.remove(range)
|
57
|
+
end
|
41
58
|
end
|
42
59
|
end
|
43
60
|
end
|
@@ -84,7 +84,7 @@ module RuboCop
|
|
84
84
|
|
85
85
|
def on_send(node)
|
86
86
|
erb_new_with_non_keyword_arguments(node) do |arguments|
|
87
|
-
return if correct_arguments?(arguments)
|
87
|
+
return if arguments.empty? || correct_arguments?(arguments)
|
88
88
|
|
89
89
|
arguments[1..3].each_with_index do |argument, i|
|
90
90
|
next if !argument || argument.hash_type?
|