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
         
     |