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
@@ -8,10 +8,19 @@ module RuboCop
|
|
8
8
|
# when reading code.
|
9
9
|
#
|
10
10
|
# @example
|
11
|
-
#
|
11
|
+
# # bad
|
12
12
|
# a do
|
13
13
|
# b
|
14
14
|
# end.c
|
15
|
+
#
|
16
|
+
# # good
|
17
|
+
# a { b }.c
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# foo = a do
|
21
|
+
# b
|
22
|
+
# end
|
23
|
+
# foo.c
|
15
24
|
class MethodCalledOnDoEndBlock < Base
|
16
25
|
include RangeHelp
|
17
26
|
|
@@ -44,7 +44,7 @@ module RuboCop
|
|
44
44
|
# Requires `then` for write `when` and its body on the same line.
|
45
45
|
return if require_then?(node)
|
46
46
|
|
47
|
-
#
|
47
|
+
# For arrays and hashes there's no offense
|
48
48
|
return if accept_node_type?(node.body)
|
49
49
|
|
50
50
|
range = node.loc.begin
|
@@ -64,7 +64,7 @@ module RuboCop
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def accept_node_type?(node)
|
67
|
-
node&.
|
67
|
+
node&.array_type? || node&.hash_type?
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
@@ -68,19 +68,19 @@ module RuboCop
|
|
68
68
|
# if !foo
|
69
69
|
# bar
|
70
70
|
# end
|
71
|
-
class NegatedIf <
|
71
|
+
class NegatedIf < Base
|
72
72
|
include ConfigurableEnforcedStyle
|
73
73
|
include NegativeConditional
|
74
|
+
extend AutoCorrector
|
74
75
|
|
75
76
|
def on_if(node)
|
76
77
|
return if node.unless? || node.elsif? || node.ternary?
|
77
78
|
return if correct_style?(node)
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
ConditionCorrector.correct_negative_condition(node)
|
80
|
+
message = message(node)
|
81
|
+
check_negative_conditional(node, message: message) do |corrector|
|
82
|
+
ConditionCorrector.correct_negative_condition(corrector, node)
|
83
|
+
end
|
84
84
|
end
|
85
85
|
|
86
86
|
private
|
@@ -58,19 +58,19 @@ module RuboCop
|
|
58
58
|
# unless !foo
|
59
59
|
# bar
|
60
60
|
# end
|
61
|
-
class NegatedUnless <
|
61
|
+
class NegatedUnless < Base
|
62
62
|
include ConfigurableEnforcedStyle
|
63
63
|
include NegativeConditional
|
64
|
+
extend AutoCorrector
|
64
65
|
|
65
66
|
def on_if(node)
|
66
67
|
return if node.if? || node.elsif? || node.ternary?
|
67
68
|
return if correct_style?(node)
|
68
69
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
ConditionCorrector.correct_negative_condition(node)
|
70
|
+
message = message(node)
|
71
|
+
check_negative_conditional(node, message: message) do |corrector|
|
72
|
+
ConditionCorrector.correct_negative_condition(corrector, node)
|
73
|
+
end
|
74
74
|
end
|
75
75
|
|
76
76
|
private
|
@@ -22,26 +22,18 @@ module RuboCop
|
|
22
22
|
# # good
|
23
23
|
# bar while foo
|
24
24
|
# bar while !foo && baz
|
25
|
-
class NegatedWhile <
|
25
|
+
class NegatedWhile < Base
|
26
26
|
include NegativeConditional
|
27
|
+
extend AutoCorrector
|
27
28
|
|
28
29
|
def on_while(node)
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
def on_until(node)
|
33
|
-
check_negative_conditional(node)
|
34
|
-
end
|
35
|
-
|
36
|
-
def autocorrect(node)
|
37
|
-
ConditionCorrector.correct_negative_condition(node)
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
30
|
+
message = format(MSG, inverse: node.inverse_keyword, current: node.keyword)
|
41
31
|
|
42
|
-
|
43
|
-
|
32
|
+
check_negative_conditional(node, message: message) do |corrector|
|
33
|
+
ConditionCorrector.correct_negative_condition(corrector, node)
|
34
|
+
end
|
44
35
|
end
|
36
|
+
alias on_until on_while
|
45
37
|
end
|
46
38
|
end
|
47
39
|
end
|
@@ -13,28 +13,27 @@ module RuboCop
|
|
13
13
|
#
|
14
14
|
# # good
|
15
15
|
# something if b && a
|
16
|
-
class NestedModifier <
|
16
|
+
class NestedModifier < Base
|
17
17
|
include RangeHelp
|
18
|
+
extend AutoCorrector
|
18
19
|
|
19
20
|
MSG = 'Avoid using nested modifiers.'
|
20
21
|
|
21
22
|
def on_while(node)
|
22
23
|
check(node)
|
23
24
|
end
|
25
|
+
alias on_until on_while
|
26
|
+
alias on_if on_while
|
24
27
|
|
25
|
-
|
26
|
-
check(node)
|
27
|
-
end
|
28
|
-
|
29
|
-
def on_if(node)
|
30
|
-
check(node)
|
31
|
-
end
|
28
|
+
private
|
32
29
|
|
33
30
|
def check(node)
|
34
31
|
return if part_of_ignored_node?(node)
|
35
32
|
return unless modifier?(node) && modifier?(node.parent)
|
36
33
|
|
37
|
-
add_offense(node
|
34
|
+
add_offense(node.loc.keyword) do |corrector|
|
35
|
+
autocorrect(corrector, node)
|
36
|
+
end
|
38
37
|
ignore_node(node)
|
39
38
|
end
|
40
39
|
|
@@ -42,15 +41,13 @@ module RuboCop
|
|
42
41
|
node&.basic_conditional? && node&.modifier_form?
|
43
42
|
end
|
44
43
|
|
45
|
-
def autocorrect(node)
|
44
|
+
def autocorrect(corrector, node)
|
46
45
|
return unless node.if_type? && node.parent.if_type?
|
47
46
|
|
48
47
|
range = range_between(node.loc.keyword.begin_pos,
|
49
48
|
node.parent.condition.source_range.end_pos)
|
50
49
|
|
51
|
-
|
52
|
-
corrector.replace(range, new_expression(node))
|
53
|
-
end
|
50
|
+
corrector.replace(range, new_expression(node))
|
54
51
|
end
|
55
52
|
|
56
53
|
def new_expression(inner_node)
|
@@ -12,9 +12,10 @@ module RuboCop
|
|
12
12
|
#
|
13
13
|
# # bad
|
14
14
|
# method1(method2 arg)
|
15
|
-
class NestedParenthesizedCalls <
|
15
|
+
class NestedParenthesizedCalls < Base
|
16
16
|
include RangeHelp
|
17
17
|
include AllowedMethods
|
18
|
+
extend AutoCorrector
|
18
19
|
|
19
20
|
MSG = 'Add parentheses to nested method call `%<source>s`.'
|
20
21
|
|
@@ -24,14 +25,17 @@ module RuboCop
|
|
24
25
|
node.each_child_node(:send, :csend) do |nested|
|
25
26
|
next if allowed_omission?(nested)
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
message = format(MSG, source: nested.source)
|
29
|
+
add_offense(nested.source_range, message: message) do |corrector|
|
30
|
+
autocorrect(corrector, nested)
|
31
|
+
end
|
30
32
|
end
|
31
33
|
end
|
32
34
|
alias on_csend on_send
|
33
35
|
|
34
|
-
|
36
|
+
private
|
37
|
+
|
38
|
+
def autocorrect(corrector, nested)
|
35
39
|
first_arg = nested.first_argument.source_range
|
36
40
|
last_arg = nested.last_argument.source_range
|
37
41
|
|
@@ -41,14 +45,10 @@ module RuboCop
|
|
41
45
|
whitespace: true,
|
42
46
|
continuations: true)
|
43
47
|
|
44
|
-
|
45
|
-
|
46
|
-
corrector.insert_after(last_arg, ')')
|
47
|
-
end
|
48
|
+
corrector.replace(leading_space, '(')
|
49
|
+
corrector.insert_after(last_arg, ')')
|
48
50
|
end
|
49
51
|
|
50
|
-
private
|
51
|
-
|
52
52
|
def allowed_omission?(send_node)
|
53
53
|
!send_node.arguments? || send_node.parenthesized? ||
|
54
54
|
send_node.setter_method? || send_node.operator_method? ||
|
@@ -15,7 +15,9 @@ module RuboCop
|
|
15
15
|
# else
|
16
16
|
# a2
|
17
17
|
# end
|
18
|
-
class NestedTernaryOperator <
|
18
|
+
class NestedTernaryOperator < Base
|
19
|
+
extend AutoCorrector
|
20
|
+
|
19
21
|
MSG = 'Ternary operators must not be nested. Prefer `if` or `else` ' \
|
20
22
|
'constructs instead.'
|
21
23
|
|
@@ -23,21 +25,17 @@ module RuboCop
|
|
23
25
|
return unless node.ternary?
|
24
26
|
|
25
27
|
node.each_descendant(:if).select(&:ternary?).each do |nested_ternary|
|
26
|
-
add_offense(nested_ternary)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
else
|
38
|
-
#{if_node.else_branch.source}
|
39
|
-
end
|
40
|
-
RUBY
|
28
|
+
add_offense(nested_ternary) do |corrector|
|
29
|
+
if_node = if_node(nested_ternary)
|
30
|
+
|
31
|
+
corrector.replace(if_node, <<~RUBY.chop)
|
32
|
+
if #{if_node.condition.source}
|
33
|
+
#{remove_parentheses(if_node.if_branch.source)}
|
34
|
+
else
|
35
|
+
#{if_node.else_branch.source}
|
36
|
+
end
|
37
|
+
RUBY
|
38
|
+
end
|
41
39
|
end
|
42
40
|
end
|
43
41
|
|
@@ -46,10 +46,11 @@ module RuboCop
|
|
46
46
|
# next unless a == 1
|
47
47
|
# puts a
|
48
48
|
# end
|
49
|
-
class Next <
|
49
|
+
class Next < Base
|
50
50
|
include ConfigurableEnforcedStyle
|
51
51
|
include MinBodyLength
|
52
52
|
include RangeHelp
|
53
|
+
extend AutoCorrector
|
53
54
|
|
54
55
|
MSG = 'Use `next` to skip iteration.'
|
55
56
|
EXIT_TYPES = %i[break return].freeze
|
@@ -58,7 +59,7 @@ module RuboCop
|
|
58
59
|
[Style::SafeNavigation]
|
59
60
|
end
|
60
61
|
|
61
|
-
def
|
62
|
+
def on_new_investigation
|
62
63
|
# When correcting nested offenses, we need to keep track of how much
|
63
64
|
# we have adjusted the indentation of each line
|
64
65
|
@reindented_lines = Hash.new(0)
|
@@ -77,16 +78,6 @@ module RuboCop
|
|
77
78
|
alias on_until on_while
|
78
79
|
alias on_for on_while
|
79
80
|
|
80
|
-
def autocorrect(node)
|
81
|
-
lambda do |corrector|
|
82
|
-
if node.modifier_form?
|
83
|
-
autocorrect_modifier(corrector, node)
|
84
|
-
else
|
85
|
-
autocorrect_block(corrector, node)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
81
|
private
|
91
82
|
|
92
83
|
def check(node)
|
@@ -94,8 +85,13 @@ module RuboCop
|
|
94
85
|
|
95
86
|
offending_node = offense_node(node.body)
|
96
87
|
|
97
|
-
add_offense(offending_node
|
98
|
-
|
88
|
+
add_offense(offense_location(offending_node)) do |corrector|
|
89
|
+
if offending_node.modifier_form?
|
90
|
+
autocorrect_modifier(corrector, offending_node)
|
91
|
+
else
|
92
|
+
autocorrect_block(corrector, offending_node)
|
93
|
+
end
|
94
|
+
end
|
99
95
|
end
|
100
96
|
|
101
97
|
def ends_with_condition?(body)
|
@@ -28,8 +28,9 @@ module RuboCop
|
|
28
28
|
# if x == nil
|
29
29
|
# end
|
30
30
|
#
|
31
|
-
class NilComparison <
|
31
|
+
class NilComparison < Base
|
32
32
|
include ConfigurableEnforcedStyle
|
33
|
+
extend AutoCorrector
|
33
34
|
|
34
35
|
PREDICATE_MSG = 'Prefer the use of the `nil?` predicate.'
|
35
36
|
EXPLICIT_MSG = 'Prefer the use of the `==` comparison.'
|
@@ -39,17 +40,16 @@ module RuboCop
|
|
39
40
|
|
40
41
|
def on_send(node)
|
41
42
|
style_check?(node) do
|
42
|
-
add_offense(node
|
43
|
-
|
44
|
-
|
43
|
+
add_offense(node.loc.selector) do |corrector|
|
44
|
+
new_code = if prefer_comparison?
|
45
|
+
node.source.sub('.nil?', ' == nil')
|
46
|
+
else
|
47
|
+
node.source.sub(/\s*={2,3}\s*nil/, '.nil?')
|
48
|
+
end
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
else
|
50
|
-
node.source.sub(/\s*={2,3}\s*nil/, '.nil?')
|
51
|
-
end
|
52
|
-
->(corrector) { corrector.replace(node, new_code) }
|
50
|
+
corrector.replace(node, new_code)
|
51
|
+
end
|
52
|
+
end
|
53
53
|
end
|
54
54
|
|
55
55
|
private
|
@@ -38,7 +38,9 @@ module RuboCop
|
|
38
38
|
# if !x.nil?
|
39
39
|
# end
|
40
40
|
#
|
41
|
-
class NonNilCheck <
|
41
|
+
class NonNilCheck < Base
|
42
|
+
extend AutoCorrector
|
43
|
+
|
42
44
|
def_node_matcher :not_equal_to_nil?, '(send _ :!= nil)'
|
43
45
|
def_node_matcher :unless_check?, '(if (send _ :nil?) ...)'
|
44
46
|
def_node_matcher :nil_check?, '(send _ :nil?)'
|
@@ -46,12 +48,11 @@ module RuboCop
|
|
46
48
|
|
47
49
|
def on_send(node)
|
48
50
|
return if ignored_node?(node)
|
51
|
+
return unless (offense_node = find_offense_node(node))
|
49
52
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
(not_and_nil_check?(node) || unless_and_nil_check?(node))
|
54
|
-
add_offense(node)
|
53
|
+
message = message(node)
|
54
|
+
add_offense(offense_node, message: message) do |corrector|
|
55
|
+
autocorrect(corrector, node)
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
@@ -68,19 +69,28 @@ module RuboCop
|
|
68
69
|
end
|
69
70
|
alias on_defs on_def
|
70
71
|
|
71
|
-
|
72
|
+
private
|
73
|
+
|
74
|
+
def find_offense_node(node)
|
75
|
+
if not_equal_to_nil?(node)
|
76
|
+
node.loc.selector
|
77
|
+
elsif include_semantic_changes? &&
|
78
|
+
(not_and_nil_check?(node) || unless_and_nil_check?(node))
|
79
|
+
node
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def autocorrect(corrector, node)
|
72
84
|
case node.method_name
|
73
85
|
when :!=
|
74
|
-
autocorrect_comparison(node)
|
86
|
+
autocorrect_comparison(corrector, node)
|
75
87
|
when :!
|
76
|
-
autocorrect_non_nil(node, node.receiver)
|
88
|
+
autocorrect_non_nil(corrector, node, node.receiver)
|
77
89
|
when :nil?
|
78
|
-
autocorrect_unless_nil(node, node.receiver)
|
90
|
+
autocorrect_unless_nil(corrector, node, node.receiver)
|
79
91
|
end
|
80
92
|
end
|
81
93
|
|
82
|
-
private
|
83
|
-
|
84
94
|
def unless_and_nil_check?(send_node)
|
85
95
|
parent = send_node.parent
|
86
96
|
|
@@ -100,7 +110,7 @@ module RuboCop
|
|
100
110
|
cop_config['IncludeSemanticChanges']
|
101
111
|
end
|
102
112
|
|
103
|
-
def autocorrect_comparison(node)
|
113
|
+
def autocorrect_comparison(corrector, node)
|
104
114
|
expr = node.source
|
105
115
|
|
106
116
|
new_code = if include_semantic_changes?
|
@@ -111,24 +121,20 @@ module RuboCop
|
|
111
121
|
|
112
122
|
return if expr == new_code
|
113
123
|
|
114
|
-
|
124
|
+
corrector.replace(node, new_code)
|
115
125
|
end
|
116
126
|
|
117
|
-
def autocorrect_non_nil(node, inner_node)
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
corrector.replace(node, 'self')
|
123
|
-
end
|
127
|
+
def autocorrect_non_nil(corrector, node, inner_node)
|
128
|
+
if inner_node.receiver
|
129
|
+
corrector.replace(node, inner_node.receiver.source)
|
130
|
+
else
|
131
|
+
corrector.replace(node, 'self')
|
124
132
|
end
|
125
133
|
end
|
126
134
|
|
127
|
-
def autocorrect_unless_nil(node, receiver)
|
128
|
-
|
129
|
-
|
130
|
-
corrector.replace(node, receiver.source)
|
131
|
-
end
|
135
|
+
def autocorrect_unless_nil(corrector, node, receiver)
|
136
|
+
corrector.replace(node.parent.loc.keyword, 'if')
|
137
|
+
corrector.replace(node, receiver.source)
|
132
138
|
end
|
133
139
|
end
|
134
140
|
end
|