rubocop 0.89.1 → 0.90.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 +1 -1
- data/config/default.yml +79 -11
- data/lib/rubocop.rb +13 -0
- data/lib/rubocop/cached_data.rb +1 -0
- data/lib/rubocop/cli/command.rb +1 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
- data/lib/rubocop/cli/command/show_cops.rb +1 -0
- data/lib/rubocop/cli/command/version.rb +1 -0
- data/lib/rubocop/cli/environment.rb +1 -0
- data/lib/rubocop/comment_config.rb +5 -0
- data/lib/rubocop/config_loader.rb +17 -6
- data/lib/rubocop/config_loader_resolver.rb +1 -0
- data/lib/rubocop/config_obsoletion.rb +1 -0
- data/lib/rubocop/config_validator.rb +3 -0
- data/lib/rubocop/cop/base.rb +23 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
- data/lib/rubocop/cop/commissioner.rb +47 -7
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
- data/lib/rubocop/cop/documentation.rb +22 -0
- data/lib/rubocop/cop/generator.rb +1 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
- data/lib/rubocop/cop/layout/class_structure.rb +10 -9
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
- data/lib/rubocop/cop/layout/condition_position.rb +13 -15
- data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
- data/lib/rubocop/cop/layout/dot_position.rb +21 -17
- data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
- data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +4 -6
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
- data/lib/rubocop/cop/layout/end_alignment.rb +6 -7
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
- data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -21
- data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
- data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
- data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
- data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
- data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
- data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
- data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
- data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +0 -11
- data/lib/rubocop/cop/lint/empty_file.rb +53 -0
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -19
- data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
- data/lib/rubocop/cop/mixin/alignment.rb +3 -0
- data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
- data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
- data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +17 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
- data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
- data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
- data/lib/rubocop/cop/offense.rb +1 -0
- data/lib/rubocop/cop/severity.rb +0 -8
- data/lib/rubocop/cop/style/case_equality.rb +8 -3
- data/lib/rubocop/cop/style/case_like_if.rb +20 -4
- data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
- data/lib/rubocop/cop/style/guard_clause.rb +1 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +14 -1
- data/lib/rubocop/cop/style/hash_transform_values.rb +14 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +2 -2
- data/lib/rubocop/cop/style/negated_if.rb +6 -6
- data/lib/rubocop/cop/style/negated_unless.rb +6 -6
- data/lib/rubocop/cop/style/negated_while.rb +7 -15
- data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
- data/lib/rubocop/cop/style/next.rb +10 -14
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
- data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
- data/lib/rubocop/cop/style/not.rb +19 -26
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
- data/lib/rubocop/cop/style/numeric_predicate.rb +4 -11
- data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +13 -10
- data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
- data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
- data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
- data/lib/rubocop/cop/style/proc.rb +6 -6
- data/lib/rubocop/cop/style/raise_args.rb +13 -24
- data/lib/rubocop/cop/style/random_with_offset.rb +15 -16
- data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
- data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
- data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +8 -8
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
- data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
- data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
- data/lib/rubocop/cop/style/return_nil.rb +5 -5
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -12
- data/lib/rubocop/cop/style/sample.rb +10 -13
- data/lib/rubocop/cop/style/self_assignment.rb +26 -22
- data/lib/rubocop/cop/style/semicolon.rb +6 -9
- data/lib/rubocop/cop/style/send.rb +2 -2
- data/lib/rubocop/cop/style/signal_exception.rb +21 -19
- data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
- data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
- data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
- data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
- data/lib/rubocop/cop/style/string_methods.rb +7 -17
- data/lib/rubocop/cop/style/strip.rb +8 -14
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
- data/lib/rubocop/cop/style/symbol_array.rb +5 -16
- data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
- data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
- data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
- data/lib/rubocop/cop/style/unless_else.rb +5 -8
- data/lib/rubocop/cop/style/unpack_first.rb +4 -8
- data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
- data/lib/rubocop/cop/style/when_then.rb +4 -6
- data/lib/rubocop/cop/style/while_until_do.rb +6 -16
- data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
- data/lib/rubocop/cop/style/word_array.rb +5 -23
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
- data/lib/rubocop/cop/style/zero_length_predicate.rb +11 -13
- data/lib/rubocop/cop/team.rb +1 -0
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +3 -5
- data/lib/rubocop/cop/variable_force.rb +2 -0
- data/lib/rubocop/cops_documentation_generator.rb +4 -2
- data/lib/rubocop/core_ext/string.rb +1 -1
- data/lib/rubocop/ext/regexp_node.rb +46 -0
- data/lib/rubocop/file_finder.rb +1 -0
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/html_formatter.rb +2 -0
- data/lib/rubocop/formatter/progress_formatter.rb +2 -1
- data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
- data/lib/rubocop/name_similarity.rb +1 -0
- data/lib/rubocop/options.rb +3 -0
- data/lib/rubocop/remote_config.rb +1 -0
- data/lib/rubocop/result_cache.rb +1 -0
- data/lib/rubocop/rspec/cop_helper.rb +4 -1
- data/lib/rubocop/rspec/expect_offense.rb +10 -5
- data/lib/rubocop/rspec/shared_contexts.rb +12 -0
- data/lib/rubocop/runner.rb +1 -0
- data/lib/rubocop/string_interpreter.rb +3 -0
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +6 -0
- data/lib/rubocop/version.rb +2 -1
- data/lib/rubocop/yaml_duplication_checker.rb +1 -0
- metadata +15 -2
@@ -24,7 +24,9 @@ module RuboCop
|
|
24
24
|
# require_relative '../foo'
|
25
25
|
# require_relative '../foo.so'
|
26
26
|
#
|
27
|
-
class RedundantFileExtensionInRequire <
|
27
|
+
class RedundantFileExtensionInRequire < Base
|
28
|
+
extend AutoCorrector
|
29
|
+
|
28
30
|
MSG = 'Redundant `.rb` file extension detected.'
|
29
31
|
|
30
32
|
def_node_matcher :require_call?, <<~PATTERN
|
@@ -33,15 +35,13 @@ module RuboCop
|
|
33
35
|
|
34
36
|
def on_send(node)
|
35
37
|
require_call?(node) do |name_node|
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
38
|
+
return unless name_node.value.end_with?('.rb')
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
add_offense(name_node) do |corrector|
|
41
|
+
correction = name_node.value.sub(/\.rb\z/, '')
|
42
42
|
|
43
|
-
|
44
|
-
|
43
|
+
corrector.replace(name_node, "'#{correction}'")
|
44
|
+
end
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -11,7 +11,8 @@ module RuboCop
|
|
11
11
|
#
|
12
12
|
# # good
|
13
13
|
# CONST = 1
|
14
|
-
class RedundantFreeze <
|
14
|
+
class RedundantFreeze < Base
|
15
|
+
extend AutoCorrector
|
15
16
|
include FrozenStringLiteral
|
16
17
|
|
17
18
|
MSG = 'Do not freeze immutable objects, as freezing them has no ' \
|
@@ -22,11 +23,7 @@ module RuboCop
|
|
22
23
|
(immutable_literal?(node.receiver) ||
|
23
24
|
operation_produces_immutable_object?(node.receiver))
|
24
25
|
|
25
|
-
add_offense(node)
|
26
|
-
end
|
27
|
-
|
28
|
-
def autocorrect(node)
|
29
|
-
lambda do |corrector|
|
26
|
+
add_offense(node) do |corrector|
|
30
27
|
corrector.remove(node.loc.dot)
|
31
28
|
corrector.remove(node.loc.selector)
|
32
29
|
end
|
@@ -15,8 +15,9 @@ module RuboCop
|
|
15
15
|
#
|
16
16
|
# # good if @var is already a String
|
17
17
|
# @var
|
18
|
-
class RedundantInterpolation <
|
18
|
+
class RedundantInterpolation < Base
|
19
19
|
include PercentLiteral
|
20
|
+
extend AutoCorrector
|
20
21
|
|
21
22
|
MSG = 'Prefer `to_s` over string interpolation.'
|
22
23
|
|
@@ -25,18 +26,18 @@ module RuboCop
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def on_dstr(node)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
29
|
+
return unless single_interpolation?(node)
|
30
|
+
|
31
|
+
add_offense(node) do |corrector|
|
32
|
+
embedded_node = node.children.first
|
33
|
+
|
34
|
+
if variable_interpolation?(embedded_node)
|
35
|
+
autocorrect_variable_interpolation(corrector, embedded_node, node)
|
36
|
+
elsif single_variable_interpolation?(embedded_node)
|
37
|
+
autocorrect_single_variable_interpolation(corrector, embedded_node, node)
|
38
|
+
else
|
39
|
+
autocorrect_other(corrector, embedded_node, node)
|
40
|
+
end
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
@@ -70,27 +71,27 @@ module RuboCop
|
|
70
71
|
percent_literal?(node.parent)
|
71
72
|
end
|
72
73
|
|
73
|
-
def autocorrect_variable_interpolation(embedded_node, node)
|
74
|
+
def autocorrect_variable_interpolation(corrector, embedded_node, node)
|
74
75
|
replacement = "#{embedded_node.loc.expression.source}.to_s"
|
75
|
-
|
76
|
+
|
77
|
+
corrector.replace(node, replacement)
|
76
78
|
end
|
77
79
|
|
78
|
-
def autocorrect_single_variable_interpolation(embedded_node, node)
|
80
|
+
def autocorrect_single_variable_interpolation(corrector, embedded_node, node)
|
79
81
|
variable_loc = embedded_node.children.first.loc
|
80
82
|
replacement = "#{variable_loc.expression.source}.to_s"
|
81
|
-
|
83
|
+
|
84
|
+
corrector.replace(node, replacement)
|
82
85
|
end
|
83
86
|
|
84
|
-
def autocorrect_other(embedded_node, node)
|
87
|
+
def autocorrect_other(corrector, embedded_node, node)
|
85
88
|
loc = node.loc
|
86
89
|
embedded_loc = embedded_node.loc
|
87
90
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
corrector.replace(embedded_loc.end, ').to_s')
|
93
|
-
end
|
91
|
+
corrector.replace(loc.begin, '')
|
92
|
+
corrector.replace(loc.end, '')
|
93
|
+
corrector.replace(embedded_loc.begin, '(')
|
94
|
+
corrector.replace(embedded_loc.end, ').to_s')
|
94
95
|
end
|
95
96
|
end
|
96
97
|
end
|
@@ -13,8 +13,9 @@ module RuboCop
|
|
13
13
|
# # good
|
14
14
|
# x if y.z.nil?
|
15
15
|
#
|
16
|
-
class RedundantParentheses <
|
16
|
+
class RedundantParentheses < Base
|
17
17
|
include Parentheses
|
18
|
+
extend AutoCorrector
|
18
19
|
|
19
20
|
def_node_matcher :square_brackets?,
|
20
21
|
'(send {(send _recv _msg) str array hash} :[] ...)'
|
@@ -32,10 +33,6 @@ module RuboCop
|
|
32
33
|
check(node)
|
33
34
|
end
|
34
35
|
|
35
|
-
def autocorrect(node)
|
36
|
-
ParenthesesCorrector.correct(node)
|
37
|
-
end
|
38
|
-
|
39
36
|
private
|
40
37
|
|
41
38
|
def parens_allowed?(node)
|
@@ -115,15 +112,16 @@ module RuboCop
|
|
115
112
|
|
116
113
|
node = node.children.first while suspect_unary?(node)
|
117
114
|
|
118
|
-
if node.send_type?
|
119
|
-
|
120
|
-
end
|
115
|
+
return if node.send_type? &&
|
116
|
+
!method_call_with_redundant_parentheses?(node)
|
121
117
|
|
122
118
|
offense(begin_node, 'an unary operation')
|
123
119
|
end
|
124
120
|
|
125
121
|
def offense(node, msg)
|
126
|
-
add_offense(node, message: "Don't use parentheses around #{msg}.")
|
122
|
+
add_offense(node, message: "Don't use parentheses around #{msg}.") do |corrector|
|
123
|
+
ParenthesesCorrector.correct(corrector, node)
|
124
|
+
end
|
127
125
|
end
|
128
126
|
|
129
127
|
def suspect_unary?(node)
|
@@ -21,9 +21,10 @@ module RuboCop
|
|
21
21
|
#
|
22
22
|
# # good
|
23
23
|
# r = /[ab]/
|
24
|
-
class RedundantRegexpCharacterClass <
|
24
|
+
class RedundantRegexpCharacterClass < Base
|
25
25
|
include MatchRange
|
26
26
|
include RegexpLiteralHelp
|
27
|
+
extend AutoCorrector
|
27
28
|
|
28
29
|
MSG_REDUNDANT_CHARACTER_CLASS = 'Redundant single-element character class, ' \
|
29
30
|
'`%<char_class>s` can be replaced with `%<element>s`.'
|
@@ -48,33 +49,25 @@ module RuboCop
|
|
48
49
|
next if whitespace_in_free_space_mode?(node, loc)
|
49
50
|
|
50
51
|
add_offense(
|
51
|
-
|
52
|
-
location: loc,
|
53
|
-
message: format(
|
52
|
+
loc, message: format(
|
54
53
|
MSG_REDUNDANT_CHARACTER_CLASS,
|
55
54
|
char_class: loc.source,
|
56
55
|
element: without_character_class(loc)
|
57
56
|
)
|
58
|
-
)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def autocorrect(node)
|
63
|
-
lambda do |corrector|
|
64
|
-
each_redundant_character_class(node) do |loc|
|
57
|
+
) do |corrector|
|
65
58
|
corrector.replace(loc, without_character_class(loc))
|
66
59
|
end
|
67
60
|
end
|
68
61
|
end
|
69
62
|
|
63
|
+
private
|
64
|
+
|
70
65
|
def each_redundant_character_class(node)
|
71
66
|
pattern_source(node).scan(PATTERN) do
|
72
67
|
yield match_range(node.loc.begin.end, Regexp.last_match)
|
73
68
|
end
|
74
69
|
end
|
75
70
|
|
76
|
-
private
|
77
|
-
|
78
71
|
def without_character_class(loc)
|
79
72
|
loc.source[1..-2]
|
80
73
|
end
|
@@ -32,13 +32,14 @@ module RuboCop
|
|
32
32
|
#
|
33
33
|
# # good
|
34
34
|
# /[+\-]\d/
|
35
|
-
class RedundantRegexpEscape <
|
35
|
+
class RedundantRegexpEscape < Base
|
36
36
|
include RangeHelp
|
37
37
|
include RegexpLiteralHelp
|
38
|
+
extend AutoCorrector
|
38
39
|
|
39
40
|
MSG_REDUNDANT_ESCAPE = 'Redundant escape inside regexp literal'
|
40
41
|
|
41
|
-
ALLOWED_ALWAYS_ESCAPES =
|
42
|
+
ALLOWED_ALWAYS_ESCAPES = " \n[]^\\#".chars.freeze
|
42
43
|
ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES = '-'.chars.freeze
|
43
44
|
ALLOWED_OUTSIDE_CHAR_CLASS_METACHAR_ESCAPES = '.*+?{}()|$'.chars.freeze
|
44
45
|
|
@@ -46,19 +47,9 @@ module RuboCop
|
|
46
47
|
each_escape(node) do |char, index, within_character_class|
|
47
48
|
next if allowed_escape?(node, char, within_character_class)
|
48
49
|
|
49
|
-
|
50
|
-
node,
|
51
|
-
location: escape_range_at_index(node, index),
|
52
|
-
message: MSG_REDUNDANT_ESCAPE
|
53
|
-
)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def autocorrect(node)
|
58
|
-
lambda do |corrector|
|
59
|
-
each_escape(node) do |char, index, within_character_class|
|
60
|
-
next if allowed_escape?(node, char, within_character_class)
|
50
|
+
location = escape_range_at_index(node, index)
|
61
51
|
|
52
|
+
add_offense(location, message: MSG_REDUNDANT_ESCAPE) do |corrector|
|
62
53
|
corrector.remove_leading(escape_range_at_index(node, index), 1)
|
63
54
|
end
|
64
55
|
end
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
def initialize(config = nil, options = nil)
|
58
58
|
super
|
59
59
|
@allowed_send_nodes = []
|
60
|
-
@local_variables_scopes = Hash.new { |hash, key| hash[key] = [] }
|
60
|
+
@local_variables_scopes = Hash.new { |hash, key| hash[key] = [] }.compare_by_identity
|
61
61
|
end
|
62
62
|
|
63
63
|
# Assignment of self.x
|
@@ -123,7 +123,7 @@ module RuboCop
|
|
123
123
|
private
|
124
124
|
|
125
125
|
def add_scope(node, local_variables = [])
|
126
|
-
node.
|
126
|
+
node.each_descendant do |child_node|
|
127
127
|
@local_variables_scopes[child_node] = local_variables
|
128
128
|
end
|
129
129
|
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for places where redundant assignments are made for in place
|
7
|
+
# modification methods.
|
8
|
+
#
|
9
|
+
# This cop is marked as unsafe, because it can produce false positives for
|
10
|
+
# user defined methods having one of the expected names, but not modifying
|
11
|
+
# its receiver in place.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# # bad
|
15
|
+
# args = args.concat(ary)
|
16
|
+
# hash = hash.merge!(other)
|
17
|
+
#
|
18
|
+
# # good
|
19
|
+
# args.concat(foo)
|
20
|
+
# args += foo
|
21
|
+
# hash.merge!(other)
|
22
|
+
#
|
23
|
+
# # bad
|
24
|
+
# self.foo = foo.concat(ary)
|
25
|
+
#
|
26
|
+
# # good
|
27
|
+
# foo.concat(ary)
|
28
|
+
# self.foo += ary
|
29
|
+
#
|
30
|
+
class RedundantSelfAssignment < Base
|
31
|
+
include RangeHelp
|
32
|
+
extend AutoCorrector
|
33
|
+
|
34
|
+
MSG = 'Redundant self assignment detected. '\
|
35
|
+
'Method `%<method_name>s` modifies its receiver in place.'
|
36
|
+
|
37
|
+
METHODS_RETURNING_SELF = %i[
|
38
|
+
append clear collect! compare_by_identity concat delete_if
|
39
|
+
fill initialize_copy insert keep_if map! merge! prepend push
|
40
|
+
rehash replace reverse! rotate! shuffle! sort! sort_by! to_ary
|
41
|
+
to_hash transform_keys! transform_values! unshift update
|
42
|
+
].to_set.freeze
|
43
|
+
|
44
|
+
ASSIGNMENT_TYPE_TO_RECEIVER_TYPE = {
|
45
|
+
lvasgn: :lvar,
|
46
|
+
ivasgn: :ivar,
|
47
|
+
cvasgn: :cvar,
|
48
|
+
gvasgn: :gvar
|
49
|
+
}.freeze
|
50
|
+
|
51
|
+
def on_lvasgn(node)
|
52
|
+
lhs, rhs = *node
|
53
|
+
receiver, method_name, = *rhs
|
54
|
+
return unless receiver && method_returning_self?(method_name)
|
55
|
+
|
56
|
+
receiver_type = ASSIGNMENT_TYPE_TO_RECEIVER_TYPE[node.type]
|
57
|
+
return unless receiver.type == receiver_type && receiver.children.first == lhs
|
58
|
+
|
59
|
+
message = format(MSG, method_name: method_name)
|
60
|
+
add_offense(node.loc.operator, message: message) do |corrector|
|
61
|
+
corrector.replace(node, rhs.source)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
alias on_ivasgn on_lvasgn
|
65
|
+
alias on_cvasgn on_lvasgn
|
66
|
+
alias on_gvasgn on_lvasgn
|
67
|
+
|
68
|
+
def on_send(node)
|
69
|
+
# TODO: replace with #end_with? after supporting only ruby >= 2.7
|
70
|
+
return unless node.method_name.match?(/=$/)
|
71
|
+
return unless redundant_assignment?(node)
|
72
|
+
|
73
|
+
message = format(MSG, method_name: node.first_argument.method_name)
|
74
|
+
add_offense(node.loc.operator, message: message) do |corrector|
|
75
|
+
corrector.remove(correction_range(node))
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def method_returning_self?(method_name)
|
82
|
+
METHODS_RETURNING_SELF.include?(method_name)
|
83
|
+
end
|
84
|
+
|
85
|
+
def_node_matcher :redundant_self_assignment?, <<~PATTERN
|
86
|
+
(send
|
87
|
+
(self) _
|
88
|
+
(send
|
89
|
+
(send
|
90
|
+
{(self) nil?} %1) #method_returning_self?
|
91
|
+
...))
|
92
|
+
PATTERN
|
93
|
+
|
94
|
+
def_node_matcher :redundant_nonself_assignment?, <<~PATTERN
|
95
|
+
(send
|
96
|
+
%1 _
|
97
|
+
(send
|
98
|
+
(send
|
99
|
+
%1 %2) #method_returning_self?
|
100
|
+
...))
|
101
|
+
PATTERN
|
102
|
+
|
103
|
+
def redundant_assignment?(node)
|
104
|
+
receiver_name = node.method_name.to_s[0...-1].to_sym
|
105
|
+
|
106
|
+
redundant_self_assignment?(node, receiver_name) ||
|
107
|
+
redundant_nonself_assignment?(node, node.receiver, receiver_name)
|
108
|
+
end
|
109
|
+
|
110
|
+
def correction_range(node)
|
111
|
+
range_between(node.source_range.begin_pos, node.first_argument.source_range.begin_pos)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -81,23 +81,24 @@ module RuboCop
|
|
81
81
|
# @example AllowInnerSlashes: true
|
82
82
|
# # good
|
83
83
|
# x =~ /home\//
|
84
|
-
class RegexpLiteral <
|
84
|
+
class RegexpLiteral < Base
|
85
85
|
include ConfigurableEnforcedStyle
|
86
86
|
include RangeHelp
|
87
|
+
extend AutoCorrector
|
87
88
|
|
88
89
|
MSG_USE_SLASHES = 'Use `//` around regular expression.'
|
89
90
|
MSG_USE_PERCENT_R = 'Use `%r` around regular expression.'
|
90
91
|
|
91
92
|
def on_regexp(node)
|
92
|
-
if slash_literal?(node)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
93
|
+
message = if slash_literal?(node)
|
94
|
+
MSG_USE_PERCENT_R unless allowed_slash_literal?(node)
|
95
|
+
else
|
96
|
+
MSG_USE_SLASHES unless allowed_percent_r_literal?(node)
|
97
|
+
end
|
98
|
+
|
99
|
+
return unless message
|
98
100
|
|
99
|
-
|
100
|
-
lambda do |corrector|
|
101
|
+
add_offense(node, message: message) do |corrector|
|
101
102
|
correct_delimiters(node, corrector)
|
102
103
|
correct_inner_slashes(node, corrector)
|
103
104
|
end
|
@@ -105,18 +106,6 @@ module RuboCop
|
|
105
106
|
|
106
107
|
private
|
107
108
|
|
108
|
-
def check_slash_literal(node)
|
109
|
-
return if allowed_slash_literal?(node)
|
110
|
-
|
111
|
-
add_offense(node, message: MSG_USE_PERCENT_R)
|
112
|
-
end
|
113
|
-
|
114
|
-
def check_percent_r_literal(node)
|
115
|
-
return if allowed_percent_r_literal?(node)
|
116
|
-
|
117
|
-
add_offense(node, message: MSG_USE_SLASHES)
|
118
|
-
end
|
119
|
-
|
120
109
|
def allowed_slash_literal?(node)
|
121
110
|
style == :slashes && !contains_disallowed_slash?(node) ||
|
122
111
|
allowed_mixed_slash?(node)
|