rubocop 1.80.1 → 1.81.7
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 +14 -2
 - data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
 - data/lib/rubocop/cli.rb +1 -2
 - data/lib/rubocop/config_loader.rb +3 -1
 - data/lib/rubocop/config_loader_resolver.rb +5 -4
 - data/lib/rubocop/config_store.rb +5 -0
 - data/lib/rubocop/cop/autocorrect_logic.rb +4 -4
 - data/lib/rubocop/cop/correctors/alignment_corrector.rb +1 -1
 - data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3 -1
 - data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
 - data/lib/rubocop/cop/layout/class_structure.rb +1 -1
 - data/lib/rubocop/cop/layout/dot_position.rb +1 -1
 - data/lib/rubocop/cop/layout/empty_line_between_defs.rb +30 -12
 - data/lib/rubocop/cop/layout/hash_alignment.rb +2 -5
 - data/lib/rubocop/cop/layout/line_length.rb +9 -1
 - data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -4
 - data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +8 -0
 - data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
 - data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
 - data/lib/rubocop/cop/lint/cop_directive_syntax.rb +13 -7
 - data/lib/rubocop/cop/lint/debugger.rb +0 -2
 - data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -1
 - data/lib/rubocop/cop/lint/empty_interpolation.rb +11 -0
 - data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +16 -6
 - data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
 - data/lib/rubocop/cop/lint/self_assignment.rb +1 -1
 - data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
 - data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
 - data/lib/rubocop/cop/lint/void.rb +7 -0
 - data/lib/rubocop/cop/message_annotator.rb +1 -1
 - data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
 - data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
 - data/lib/rubocop/cop/naming/method_name.rb +3 -1
 - data/lib/rubocop/cop/naming/predicate_method.rb +19 -6
 - data/lib/rubocop/cop/security/json_load.rb +33 -11
 - data/lib/rubocop/cop/style/array_intersect.rb +2 -2
 - data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
 - data/lib/rubocop/cop/style/conditional_assignment.rb +7 -3
 - data/lib/rubocop/cop/style/constant_visibility.rb +14 -9
 - data/lib/rubocop/cop/style/double_negation.rb +1 -1
 - data/lib/rubocop/cop/style/endless_method.rb +15 -2
 - data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
 - data/lib/rubocop/cop/style/float_division.rb +15 -1
 - data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
 - data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
 - data/lib/rubocop/cop/style/one_line_conditional.rb +17 -9
 - data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
 - data/lib/rubocop/cop/style/redundant_format.rb +26 -5
 - data/lib/rubocop/cop/style/redundant_interpolation.rb +11 -2
 - data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -10
 - data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
 - data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -0
 - data/lib/rubocop/cop/style/safe_navigation.rb +6 -0
 - data/lib/rubocop/cop/style/semicolon.rb +23 -7
 - data/lib/rubocop/cop/style/sole_nested_conditional.rb +8 -1
 - data/lib/rubocop/cop/style/string_concatenation.rb +16 -12
 - data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
 - data/lib/rubocop/cop/style/unless_else.rb +10 -9
 - data/lib/rubocop/cop/utils/format_string.rb +10 -0
 - data/lib/rubocop/cops_documentation_generator.rb +4 -4
 - data/lib/rubocop/lsp/diagnostic.rb +21 -20
 - data/lib/rubocop/lsp/routes.rb +36 -9
 - data/lib/rubocop/lsp/runtime.rb +2 -2
 - data/lib/rubocop/lsp/server.rb +2 -2
 - data/lib/rubocop/lsp/stdin_runner.rb +0 -16
 - data/lib/rubocop/target_ruby.rb +10 -1
 - data/lib/rubocop/version.rb +1 -1
 - data/lib/rubocop.rb +1 -0
 - data/lib/ruby_lsp/rubocop/addon.rb +23 -8
 - data/lib/ruby_lsp/rubocop/runtime_adapter.rb +49 -15
 - metadata +7 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 8acfafa4ed4b94c367e6ef95c84d2d02f01222a1e8a813790948977476f34456
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 0d2ad56c4a81da58046a098351606bfb8314f09f9e5f946ad1dd825aa70fe0f7
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: ae4edea22ca7511df39ec99591df3d537bfd3fa8974d5bb461d2b1c674b48f15296f22c81b1cd9329719a68b0d3f8d36442eaa5742cbf8e0974c6e3e2e56e29c
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: ffce467cec50d2ed0ef7b312a15dd17e9b7fd1622b70528d12f0cfe16056ae3b5111f2d360b4e855ea5811befd092a306ff56ad091b89a6050f3354f3db205a4
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -51,7 +51,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi 
     | 
|
| 
       51 
51 
     | 
    
         
             
            in your `Gemfile`:
         
     | 
| 
       52 
52 
     | 
    
         | 
| 
       53 
53 
     | 
    
         
             
            ```rb
         
     | 
| 
       54 
     | 
    
         
            -
            gem 'rubocop', '~> 1. 
     | 
| 
      
 54 
     | 
    
         
            +
            gem 'rubocop', '~> 1.81', require: false
         
     | 
| 
       55 
55 
     | 
    
         
             
            ```
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
57 
     | 
    
         
             
            See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
         
     | 
    
        data/config/default.yml
    CHANGED
    
    | 
         @@ -275,7 +275,7 @@ Gemspec/AddRuntimeDependency: 
     | 
|
| 
       275 
275 
     | 
    
         
             
              Description: 'Prefer `add_dependency` over `add_runtime_dependency`.'
         
     | 
| 
       276 
276 
     | 
    
         
             
              StyleGuide: '#add_dependency_vs_add_runtime_dependency'
         
     | 
| 
       277 
277 
     | 
    
         
             
              References:
         
     | 
| 
       278 
     | 
    
         
            -
                - https://github.com/ 
     | 
| 
      
 278 
     | 
    
         
            +
                - https://github.com/ruby/rubygems/issues/7799#issuecomment-2192720316
         
     | 
| 
       279 
279 
     | 
    
         
             
              Enabled: pending
         
     | 
| 
       280 
280 
     | 
    
         
             
              VersionAdded: '1.65'
         
     | 
| 
       281 
281 
     | 
    
         
             
              Include:
         
     | 
| 
         @@ -3207,6 +3207,7 @@ Security/JSONLoad: 
     | 
|
| 
       3207 
3207 
     | 
    
         
             
                             security issues. See reference for more information.
         
     | 
| 
       3208 
3208 
     | 
    
         
             
              References:
         
     | 
| 
       3209 
3209 
     | 
    
         
             
                - 'https://ruby-doc.org/stdlib-2.7.0/libdoc/json/rdoc/JSON.html#method-i-load'
         
     | 
| 
      
 3210 
     | 
    
         
            +
                - 'https://bugs.ruby-lang.org/issues/19528'
         
     | 
| 
       3210 
3211 
     | 
    
         
             
              Enabled: true
         
     | 
| 
       3211 
3212 
     | 
    
         
             
              VersionAdded: '0.43'
         
     | 
| 
       3212 
3213 
     | 
    
         
             
              VersionChanged: '1.22'
         
     | 
| 
         @@ -3341,6 +3342,12 @@ Style/ArrayIntersect: 
     | 
|
| 
       3341 
3342 
     | 
    
         
             
              Safe: false
         
     | 
| 
       3342 
3343 
     | 
    
         
             
              VersionAdded: '1.40'
         
     | 
| 
       3343 
3344 
     | 
    
         | 
| 
      
 3345 
     | 
    
         
            +
            Style/ArrayIntersectWithSingleElement:
         
     | 
| 
      
 3346 
     | 
    
         
            +
              Description: 'Use `include?(element)` instead of `intersect?([element])`.'
         
     | 
| 
      
 3347 
     | 
    
         
            +
              Enabled: 'pending'
         
     | 
| 
      
 3348 
     | 
    
         
            +
              Safe: false
         
     | 
| 
      
 3349 
     | 
    
         
            +
              VersionAdded: '1.81'
         
     | 
| 
      
 3350 
     | 
    
         
            +
             
     | 
| 
       3344 
3351 
     | 
    
         
             
            Style/ArrayJoin:
         
     | 
| 
       3345 
3352 
     | 
    
         
             
              Description: 'Use Array#join instead of Array#*.'
         
     | 
| 
       3346 
3353 
     | 
    
         
             
              StyleGuide: '#array-join'
         
     | 
| 
         @@ -4546,8 +4553,9 @@ Style/LambdaCall: 
     | 
|
| 
       4546 
4553 
     | 
    
         
             
              Description: 'Use lambda.call(...) instead of lambda.(...).'
         
     | 
| 
       4547 
4554 
     | 
    
         
             
              StyleGuide: '#proc-call'
         
     | 
| 
       4548 
4555 
     | 
    
         
             
              Enabled: true
         
     | 
| 
      
 4556 
     | 
    
         
            +
              AutoCorrect: contextual
         
     | 
| 
       4549 
4557 
     | 
    
         
             
              VersionAdded: '0.13'
         
     | 
| 
       4550 
     | 
    
         
            -
              VersionChanged: ' 
     | 
| 
      
 4558 
     | 
    
         
            +
              VersionChanged: '1.81'
         
     | 
| 
       4551 
4559 
     | 
    
         
             
              EnforcedStyle: call
         
     | 
| 
       4552 
4560 
     | 
    
         
             
              SupportedStyles:
         
     | 
| 
       4553 
4561 
     | 
    
         
             
                - call
         
     | 
| 
         @@ -5844,10 +5852,14 @@ Style/TrailingCommaInArguments: 
     | 
|
| 
       5844 
5852 
     | 
    
         
             
              # parenthesized method calls where each argument is on its own line.
         
     | 
| 
       5845 
5853 
     | 
    
         
             
              # If `consistent_comma`, the cop requires a comma after the last argument,
         
     | 
| 
       5846 
5854 
     | 
    
         
             
              # for all parenthesized method calls with arguments.
         
     | 
| 
      
 5855 
     | 
    
         
            +
              # If `diff_comma`, the cop requires a comma after the last argument, but only
         
     | 
| 
      
 5856 
     | 
    
         
            +
              # when that argument is followed by an immediate newline, even if
         
     | 
| 
      
 5857 
     | 
    
         
            +
              # there is an inline comment.
         
     | 
| 
       5847 
5858 
     | 
    
         
             
              EnforcedStyleForMultiline: no_comma
         
     | 
| 
       5848 
5859 
     | 
    
         
             
              SupportedStylesForMultiline:
         
     | 
| 
       5849 
5860 
     | 
    
         
             
                - comma
         
     | 
| 
       5850 
5861 
     | 
    
         
             
                - consistent_comma
         
     | 
| 
      
 5862 
     | 
    
         
            +
                - diff_comma
         
     | 
| 
       5851 
5863 
     | 
    
         
             
                - no_comma
         
     | 
| 
       5852 
5864 
     | 
    
         | 
| 
       5853 
5865 
     | 
    
         
             
            Style/TrailingCommaInArrayLiteral:
         
     | 
| 
         @@ -83,7 +83,7 @@ module RuboCop 
     | 
|
| 
       83 
83 
     | 
    
         
             
                      execute_runner
         
     | 
| 
       84 
84 
     | 
    
         
             
                      @options.delete(:only)
         
     | 
| 
       85 
85 
     | 
    
         
             
                      @config_store = ConfigStore.new
         
     | 
| 
       86 
     | 
    
         
            -
                      @config_store. 
     | 
| 
      
 86 
     | 
    
         
            +
                      @config_store.apply_options!(@options)
         
     | 
| 
       87 
87 
     | 
    
         
             
                      # Save the todo configuration of the LineLength cop.
         
     | 
| 
       88 
88 
     | 
    
         
             
                      File.read(AUTO_GENERATED_FILE).lines.drop_while { |line| line.start_with?('#') }.join
         
     | 
| 
       89 
89 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -99,7 +99,7 @@ module RuboCop 
     | 
|
| 
       99 
99 
     | 
    
         | 
| 
       100 
100 
     | 
    
         
             
                    def reset_config_and_auto_gen_file
         
     | 
| 
       101 
101 
     | 
    
         
             
                      @config_store = ConfigStore.new
         
     | 
| 
       102 
     | 
    
         
            -
                      @config_store. 
     | 
| 
      
 102 
     | 
    
         
            +
                      @config_store.apply_options!(@options)
         
     | 
| 
       103 
103 
     | 
    
         
             
                      File.open(AUTO_GENERATED_FILE, 'w') {} # create or truncate if exists
         
     | 
| 
       104 
104 
     | 
    
         
             
                      add_inheritance_from_auto_generated_file(@options[:config])
         
     | 
| 
       105 
105 
     | 
    
         
             
                    end
         
     | 
    
        data/lib/rubocop/cli.rb
    CHANGED
    
    | 
         @@ -164,8 +164,7 @@ module RuboCop 
     | 
|
| 
       164 
164 
     | 
    
         
             
                  set_options_to_pending_cops_reporter
         
     | 
| 
       165 
165 
     | 
    
         
             
                  handle_editor_mode
         
     | 
| 
       166 
166 
     | 
    
         | 
| 
       167 
     | 
    
         
            -
                  @config_store. 
     | 
| 
       168 
     | 
    
         
            -
                  @config_store.force_default_config! if @options[:force_default_config]
         
     | 
| 
      
 167 
     | 
    
         
            +
                  @config_store.apply_options!(@options)
         
     | 
| 
       169 
168 
     | 
    
         | 
| 
       170 
169 
     | 
    
         
             
                  handle_exiting_options
         
     | 
| 
       171 
170 
     | 
    
         | 
| 
         @@ -75,7 +75,9 @@ module RuboCop 
     | 
|
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
                    puts "configuration from #{absolute_path}" if debug?
         
     | 
| 
       77 
77 
     | 
    
         | 
| 
       78 
     | 
    
         
            -
                     
     | 
| 
      
 78 
     | 
    
         
            +
                    unless hash.is_a?(Hash)
         
     | 
| 
      
 79 
     | 
    
         
            +
                      raise(ValidationError, "Malformed configuration in #{absolute_path}")
         
     | 
| 
      
 80 
     | 
    
         
            +
                    end
         
     | 
| 
       79 
81 
     | 
    
         | 
| 
       80 
82 
     | 
    
         
             
                    hash
         
     | 
| 
       81 
83 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -295,10 +295,11 @@ module RuboCop 
     | 
|
| 
       295 
295 
     | 
    
         
             
                    begin
         
     | 
| 
       296 
296 
     | 
    
         
             
                      gem = Bundler.load.specs[gem_name].first
         
     | 
| 
       297 
297 
     | 
    
         
             
                      gem_path = gem.full_gem_path if gem
         
     | 
| 
       298 
     | 
    
         
            -
                    rescue  
     | 
| 
       299 
     | 
    
         
            -
                      #  
     | 
| 
       300 
     | 
    
         
            -
             
     | 
| 
       301 
     | 
    
         
            -
                      # The Gemfile exists but contains an uninstalled git source
         
     | 
| 
      
 298 
     | 
    
         
            +
                    rescue StandardError
         
     | 
| 
      
 299 
     | 
    
         
            +
                      # The Gemfile has a problem, which could be one of:
         
     | 
| 
      
 300 
     | 
    
         
            +
                      # - No Gemfile found. Bundler may be loaded manually
         
     | 
| 
      
 301 
     | 
    
         
            +
                      # - The Gemfile exists but contains an uninstalled git source
         
     | 
| 
      
 302 
     | 
    
         
            +
                      # - The Gemfile exists but cannot be loaded for some other reason
         
     | 
| 
       302 
303 
     | 
    
         
             
                    end
         
     | 
| 
       303 
304 
     | 
    
         
             
                  end
         
     | 
| 
       304 
305 
     | 
    
         | 
    
        data/lib/rubocop/config_store.rb
    CHANGED
    
    | 
         @@ -25,6 +25,11 @@ module RuboCop 
     | 
|
| 
       25 
25 
     | 
    
         
             
                  @validated = true
         
     | 
| 
       26 
26 
     | 
    
         
             
                end
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
      
 28 
     | 
    
         
            +
                def apply_options!(options)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  self.options_config = options[:config] if options[:config]
         
     | 
| 
      
 30 
     | 
    
         
            +
                  force_default_config! if options[:force_default_config]
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
       28 
33 
     | 
    
         
             
                def options_config=(options_config)
         
     | 
| 
       29 
34 
     | 
    
         
             
                  loaded_config = ConfigLoader.load_file(options_config)
         
     | 
| 
       30 
35 
     | 
    
         
             
                  @options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
         
     | 
| 
         @@ -35,8 +35,8 @@ module RuboCop 
     | 
|
| 
       35 
35 
     | 
    
         
             
                    # `false` is the same as `disabled` for backward compatibility.
         
     | 
| 
       36 
36 
     | 
    
         
             
                    return false if ['disabled', false].include?(cop_config['AutoCorrect'])
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                    # When LSP is enabled, it is considered as editing 
     | 
| 
       39 
     | 
    
         
            -
                    # and autocorrection with `AutoCorrect: contextual` will not be performed.
         
     | 
| 
      
 38 
     | 
    
         
            +
                    # When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
         
     | 
| 
      
 39 
     | 
    
         
            +
                    # source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
         
     | 
| 
       40 
40 
     | 
    
         
             
                    return false if contextual_autocorrect? && LSP.enabled?
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
42 
     | 
    
         
             
                    # :safe_autocorrect is a derived option based on several command-line
         
     | 
| 
         @@ -94,7 +94,7 @@ module RuboCop 
     | 
|
| 
       94 
94 
     | 
    
         
             
                  end
         
     | 
| 
       95 
95 
     | 
    
         | 
| 
       96 
96 
     | 
    
         
             
                  def surrounding_heredoc?(node)
         
     | 
| 
       97 
     | 
    
         
            -
                    node. 
     | 
| 
      
 97 
     | 
    
         
            +
                    node.any_str_type? && node.heredoc?
         
     | 
| 
       98 
98 
     | 
    
         
             
                  end
         
     | 
| 
       99 
99 
     | 
    
         | 
| 
       100 
100 
     | 
    
         
             
                  def heredoc_range(node)
         
     | 
| 
         @@ -106,7 +106,7 @@ module RuboCop 
     | 
|
| 
       106 
106 
     | 
    
         
             
                  end
         
     | 
| 
       107 
107 
     | 
    
         | 
| 
       108 
108 
     | 
    
         
             
                  def string_continuation?(node)
         
     | 
| 
       109 
     | 
    
         
            -
                    node. 
     | 
| 
      
 109 
     | 
    
         
            +
                    node.any_str_type? && node.source.match?(/\\\s*$/)
         
     | 
| 
       110 
110 
     | 
    
         
             
                  end
         
     | 
| 
       111 
111 
     | 
    
         | 
| 
       112 
112 
     | 
    
         
             
                  def multiline_string?(node)
         
     | 
| 
         @@ -57,7 +57,7 @@ module RuboCop 
     | 
|
| 
       57 
57 
     | 
    
         
             
                    def inside_string_ranges(node)
         
     | 
| 
       58 
58 
     | 
    
         
             
                      return [] unless node.is_a?(Parser::AST::Node)
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
                      node.each_node(: 
     | 
| 
      
 60 
     | 
    
         
            +
                      node.each_node(:any_str).filter_map { |n| inside_string_range(n) }
         
     | 
| 
       61 
61 
     | 
    
         
             
                    end
         
     | 
| 
       62 
62 
     | 
    
         | 
| 
       63 
63 
     | 
    
         
             
                    def inside_string_range(node)
         
     | 
| 
         @@ -30,6 +30,8 @@ module RuboCop 
     | 
|
| 
       30 
30 
     | 
    
         
             
                      any_block: %i[block numblock itblock],
         
     | 
| 
       31 
31 
     | 
    
         
             
                      any_def: %i[def defs],
         
     | 
| 
       32 
32 
     | 
    
         
             
                      any_match_pattern: %i[match_pattern match_pattern_p],
         
     | 
| 
      
 33 
     | 
    
         
            +
                      any_str: %i[str dstr xstr],
         
     | 
| 
      
 34 
     | 
    
         
            +
                      any_sym: %i[sym dsym],
         
     | 
| 
       33 
35 
     | 
    
         
             
                      argument: %i[arg optarg restarg kwarg kwoptarg kwrestarg blockarg forward_arg shadowarg],
         
     | 
| 
       34 
36 
     | 
    
         
             
                      boolean: %i[true false],
         
     | 
| 
       35 
37 
     | 
    
         
             
                      call: %i[send csend],
         
     | 
| 
         @@ -210,7 +212,7 @@ module RuboCop 
     | 
|
| 
       210 
212 
     | 
    
         
             
                    # A heredoc can be a `dstr` without interpolation, but if there is interpolation
         
     | 
| 
       211 
213 
     | 
    
         
             
                    # there'll be a `begin` node, in which case, we cannot evaluate the pattern.
         
     | 
| 
       212 
214 
     | 
    
         
             
                    def acceptable_heredoc?(node)
         
     | 
| 
       213 
     | 
    
         
            -
                      node. 
     | 
| 
      
 215 
     | 
    
         
            +
                      node.any_str_type? && node.heredoc? && node.each_child_node(:begin).none?
         
     | 
| 
       214 
216 
     | 
    
         
             
                    end
         
     | 
| 
       215 
217 
     | 
    
         | 
| 
       216 
218 
     | 
    
         
             
                    def process_pattern(pattern_node)
         
     | 
| 
         @@ -76,7 +76,7 @@ module RuboCop 
     | 
|
| 
       76 
76 
     | 
    
         
             
                    end
         
     | 
| 
       77 
77 
     | 
    
         | 
| 
       78 
78 
     | 
    
         
             
                    def on_send(node) # rubocop:disable InternalAffairs/OnSendWithoutOnCSend
         
     | 
| 
       79 
     | 
    
         
            -
                      new_identifier = node.first_argument
         
     | 
| 
      
 79 
     | 
    
         
            +
                      return unless (new_identifier = node.first_argument)
         
     | 
| 
       80 
80 
     | 
    
         
             
                      return unless new_identifier.basic_literal?
         
     | 
| 
       81 
81 
     | 
    
         | 
| 
       82 
82 
     | 
    
         
             
                      new_identifier = new_identifier.value
         
     | 
| 
         @@ -76,28 +76,40 @@ module RuboCop 
     | 
|
| 
       76 
76 
     | 
    
         
             
                  #   # good
         
     | 
| 
       77 
77 
     | 
    
         
             
                  #   class ErrorA < BaseError; end
         
     | 
| 
       78 
78 
     | 
    
         
             
                  #   class ErrorB < BaseError; end
         
     | 
| 
       79 
     | 
    
         
            -
                  #   class ErrorC < BaseError; end
         
     | 
| 
       80 
79 
     | 
    
         
             
                  #
         
     | 
| 
       81 
80 
     | 
    
         
             
                  #   # good
         
     | 
| 
       82 
81 
     | 
    
         
             
                  #   class ErrorA < BaseError; end
         
     | 
| 
       83 
82 
     | 
    
         
             
                  #
         
     | 
| 
       84 
83 
     | 
    
         
             
                  #   class ErrorB < BaseError; end
         
     | 
| 
       85 
84 
     | 
    
         
             
                  #
         
     | 
| 
       86 
     | 
    
         
            -
                  #    
     | 
| 
      
 85 
     | 
    
         
            +
                  #   # good - DefLikeMacros: [memoize]
         
     | 
| 
      
 86 
     | 
    
         
            +
                  #   memoize :attribute_a
         
     | 
| 
      
 87 
     | 
    
         
            +
                  #   memoize :attribute_b
         
     | 
| 
      
 88 
     | 
    
         
            +
                  #
         
     | 
| 
      
 89 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 90 
     | 
    
         
            +
                  #   memoize :attribute_a
         
     | 
| 
      
 91 
     | 
    
         
            +
                  #
         
     | 
| 
      
 92 
     | 
    
         
            +
                  #   memoize :attribute_b
         
     | 
| 
       87 
93 
     | 
    
         
             
                  #
         
     | 
| 
       88 
94 
     | 
    
         
             
                  # @example AllowAdjacentOneLineDefs: false
         
     | 
| 
       89 
95 
     | 
    
         
             
                  #
         
     | 
| 
       90 
96 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       91 
97 
     | 
    
         
             
                  #   class ErrorA < BaseError; end
         
     | 
| 
       92 
98 
     | 
    
         
             
                  #   class ErrorB < BaseError; end
         
     | 
| 
       93 
     | 
    
         
            -
                  #   class ErrorC < BaseError; end
         
     | 
| 
       94 
99 
     | 
    
         
             
                  #
         
     | 
| 
       95 
100 
     | 
    
         
             
                  #   # good
         
     | 
| 
       96 
101 
     | 
    
         
             
                  #   class ErrorA < BaseError; end
         
     | 
| 
       97 
102 
     | 
    
         
             
                  #
         
     | 
| 
       98 
103 
     | 
    
         
             
                  #   class ErrorB < BaseError; end
         
     | 
| 
       99 
104 
     | 
    
         
             
                  #
         
     | 
| 
       100 
     | 
    
         
            -
                  #    
     | 
| 
      
 105 
     | 
    
         
            +
                  #   # bad - DefLikeMacros: [memoize]
         
     | 
| 
      
 106 
     | 
    
         
            +
                  #   memoize :attribute_a
         
     | 
| 
      
 107 
     | 
    
         
            +
                  #   memoize :attribute_b
         
     | 
| 
      
 108 
     | 
    
         
            +
                  #
         
     | 
| 
      
 109 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 110 
     | 
    
         
            +
                  #   memoize :attribute_a
         
     | 
| 
      
 111 
     | 
    
         
            +
                  #
         
     | 
| 
      
 112 
     | 
    
         
            +
                  #   memoize :attribute_b
         
     | 
| 
       101 
113 
     | 
    
         
             
                  #
         
     | 
| 
       102 
114 
     | 
    
         
             
                  class EmptyLineBetweenDefs < Base
         
     | 
| 
       103 
115 
     | 
    
         
             
                    include RangeHelp
         
     | 
| 
         @@ -158,6 +170,8 @@ module RuboCop 
     | 
|
| 
       158 
170 
     | 
    
         
             
                    def def_location(correction_node)
         
     | 
| 
       159 
171 
     | 
    
         
             
                      if correction_node.any_block_type?
         
     | 
| 
       160 
172 
     | 
    
         
             
                        correction_node.source_range.join(correction_node.children.first.source_range)
         
     | 
| 
      
 173 
     | 
    
         
            +
                      elsif correction_node.send_type?
         
     | 
| 
      
 174 
     | 
    
         
            +
                        correction_node.source_range
         
     | 
| 
       161 
175 
     | 
    
         
             
                      else
         
     | 
| 
       162 
176 
     | 
    
         
             
                        correction_node.loc.keyword.join(correction_node.loc.name)
         
     | 
| 
       163 
177 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -175,8 +189,14 @@ module RuboCop 
     | 
|
| 
       175 
189 
     | 
    
         
             
                    end
         
     | 
| 
       176 
190 
     | 
    
         | 
| 
       177 
191 
     | 
    
         
             
                    def macro_candidate?(node)
         
     | 
| 
       178 
     | 
    
         
            -
                       
     | 
| 
       179 
     | 
    
         
            -
             
     | 
| 
      
 192 
     | 
    
         
            +
                      macro_candidate = if node.any_block_type?
         
     | 
| 
      
 193 
     | 
    
         
            +
                                          node.send_node
         
     | 
| 
      
 194 
     | 
    
         
            +
                                        elsif node.send_type?
         
     | 
| 
      
 195 
     | 
    
         
            +
                                          node
         
     | 
| 
      
 196 
     | 
    
         
            +
                                        end
         
     | 
| 
      
 197 
     | 
    
         
            +
                      return false unless macro_candidate
         
     | 
| 
      
 198 
     | 
    
         
            +
             
     | 
| 
      
 199 
     | 
    
         
            +
                      macro_candidate.macro? && empty_line_between_macros.include?(macro_candidate.method_name)
         
     | 
| 
       180 
200 
     | 
    
         
             
                    end
         
     | 
| 
       181 
201 
     | 
    
         | 
| 
       182 
202 
     | 
    
         
             
                    def method_candidate?(node)
         
     | 
| 
         @@ -240,7 +260,9 @@ module RuboCop 
     | 
|
| 
       240 
260 
     | 
    
         
             
                    end
         
     | 
| 
       241 
261 
     | 
    
         | 
| 
       242 
262 
     | 
    
         
             
                    def def_start(node)
         
     | 
| 
       243 
     | 
    
         
            -
                       
     | 
| 
      
 263 
     | 
    
         
            +
                      node = node.send_node if node.any_block_type?
         
     | 
| 
      
 264 
     | 
    
         
            +
             
     | 
| 
      
 265 
     | 
    
         
            +
                      if node.send_type?
         
     | 
| 
       244 
266 
     | 
    
         
             
                        node.source_range.line
         
     | 
| 
       245 
267 
     | 
    
         
             
                      else
         
     | 
| 
       246 
268 
     | 
    
         
             
                        node.loc.keyword.line
         
     | 
| 
         @@ -252,11 +274,7 @@ module RuboCop 
     | 
|
| 
       252 
274 
     | 
    
         
             
                    end
         
     | 
| 
       253 
275 
     | 
    
         | 
| 
       254 
276 
     | 
    
         
             
                    def end_loc(node)
         
     | 
| 
       255 
     | 
    
         
            -
                       
     | 
| 
       256 
     | 
    
         
            -
                        node.source_range.end
         
     | 
| 
       257 
     | 
    
         
            -
                      else
         
     | 
| 
       258 
     | 
    
         
            -
                        node.loc.end
         
     | 
| 
       259 
     | 
    
         
            -
                      end
         
     | 
| 
      
 277 
     | 
    
         
            +
                      node.source_range.end
         
     | 
| 
       260 
278 
     | 
    
         
             
                    end
         
     | 
| 
       261 
279 
     | 
    
         | 
| 
       262 
280 
     | 
    
         
             
                    def autocorrect_remove_lines(corrector, newline_pos, count)
         
     | 
| 
         @@ -193,7 +193,6 @@ module RuboCop 
     | 
|
| 
       193 
193 
     | 
    
         
             
                    SEPARATOR_ALIGNMENT_STYLES = %w[EnforcedColonStyle EnforcedHashRocketStyle].freeze
         
     | 
| 
       194 
194 
     | 
    
         | 
| 
       195 
195 
     | 
    
         
             
                    def on_send(node)
         
     | 
| 
       196 
     | 
    
         
            -
                      return if double_splat?(node)
         
     | 
| 
       197 
196 
     | 
    
         
             
                      return unless node.arguments?
         
     | 
| 
       198 
197 
     | 
    
         | 
| 
       199 
198 
     | 
    
         
             
                      last_argument = node.last_argument
         
     | 
| 
         @@ -233,6 +232,8 @@ module RuboCop 
     | 
|
| 
       233 
232 
     | 
    
         
             
                    end
         
     | 
| 
       234 
233 
     | 
    
         | 
| 
       235 
234 
     | 
    
         
             
                    def argument_before_hash(hash_node)
         
     | 
| 
      
 235 
     | 
    
         
            +
                      return hash_node.children.first.children.first if hash_node.children.first.kwsplat_type?
         
     | 
| 
      
 236 
     | 
    
         
            +
             
     | 
| 
       236 
237 
     | 
    
         
             
                      hash_node.left_sibling.respond_to?(:loc) ? hash_node.left_sibling : nil
         
     | 
| 
       237 
238 
     | 
    
         
             
                    end
         
     | 
| 
       238 
239 
     | 
    
         | 
| 
         @@ -241,10 +242,6 @@ module RuboCop 
     | 
|
| 
       241 
242 
     | 
    
         
             
                      self.column_deltas = Hash.new { |hash, key| hash[key] = {} }
         
     | 
| 
       242 
243 
     | 
    
         
             
                    end
         
     | 
| 
       243 
244 
     | 
    
         | 
| 
       244 
     | 
    
         
            -
                    def double_splat?(node)
         
     | 
| 
       245 
     | 
    
         
            -
                      node.children.last.is_a?(Symbol)
         
     | 
| 
       246 
     | 
    
         
            -
                    end
         
     | 
| 
       247 
     | 
    
         
            -
             
     | 
| 
       248 
245 
     | 
    
         
             
                    def check_pairs(node)
         
     | 
| 
       249 
246 
     | 
    
         
             
                      first_pair = node.pairs.first
         
     | 
| 
       250 
247 
     | 
    
         
             
                      reset!
         
     | 
| 
         @@ -134,6 +134,7 @@ module RuboCop 
     | 
|
| 
       134 
134 
     | 
    
         | 
| 
       135 
135 
     | 
    
         
             
                    def check_for_breakable_block(block_node)
         
     | 
| 
       136 
136 
     | 
    
         
             
                      return unless block_node.single_line?
         
     | 
| 
      
 137 
     | 
    
         
            +
                      return if receiver_contains_heredoc?(block_node)
         
     | 
| 
       137 
138 
     | 
    
         | 
| 
       138 
139 
     | 
    
         
             
                      line_index = block_node.loc.line - 1
         
     | 
| 
       139 
140 
     | 
    
         
             
                      range = breakable_block_range(block_node)
         
     | 
| 
         @@ -321,7 +322,7 @@ module RuboCop 
     | 
|
| 
       321 
322 
     | 
    
         
             
                    def extract_heredocs(ast)
         
     | 
| 
       322 
323 
     | 
    
         
             
                      return [] unless ast
         
     | 
| 
       323 
324 
     | 
    
         | 
| 
       324 
     | 
    
         
            -
                      ast.each_node(: 
     | 
| 
      
 325 
     | 
    
         
            +
                      ast.each_node(:any_str).select(&:heredoc?).map do |node|
         
     | 
| 
       325 
326 
     | 
    
         
             
                        body = node.location.heredoc_body
         
     | 
| 
       326 
327 
     | 
    
         
             
                        delimiter = node.location.heredoc_end.source.strip
         
     | 
| 
       327 
328 
     | 
    
         
             
                        [body.first_line...body.last_line, delimiter]
         
     | 
| 
         @@ -341,6 +342,13 @@ module RuboCop 
     | 
|
| 
       341 
342 
     | 
    
         
             
                      heredocs.any? { |range, _delimiter| range.cover?(line_number) }
         
     | 
| 
       342 
343 
     | 
    
         
             
                    end
         
     | 
| 
       343 
344 
     | 
    
         | 
| 
      
 345 
     | 
    
         
            +
                    def receiver_contains_heredoc?(node)
         
     | 
| 
      
 346 
     | 
    
         
            +
                      return false unless (receiver = node.receiver)
         
     | 
| 
      
 347 
     | 
    
         
            +
                      return true if receiver.any_str_type? && receiver.heredoc?
         
     | 
| 
      
 348 
     | 
    
         
            +
             
     | 
| 
      
 349 
     | 
    
         
            +
                      receiver.each_descendant(:any_str).any?(&:heredoc?)
         
     | 
| 
      
 350 
     | 
    
         
            +
                    end
         
     | 
| 
      
 351 
     | 
    
         
            +
             
     | 
| 
       344 
352 
     | 
    
         
             
                    def check_directive_line(line, line_index)
         
     | 
| 
       345 
353 
     | 
    
         
             
                      length_without_directive = line_length_without_directive(line)
         
     | 
| 
       346 
354 
     | 
    
         
             
                      return if length_without_directive <= max
         
     | 
| 
         @@ -102,10 +102,12 @@ module RuboCop 
     | 
|
| 
       102 
102 
     | 
    
         
             
                        return true if begins_its_line?(assignment_rhs.source_range)
         
     | 
| 
       103 
103 
     | 
    
         
             
                      end
         
     | 
| 
       104 
104 
     | 
    
         | 
| 
       105 
     | 
    
         
            -
                      given_style == :aligned 
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
      
 105 
     | 
    
         
            +
                      return false unless given_style == :aligned
         
     | 
| 
      
 106 
     | 
    
         
            +
                      return true if kw_node_with_special_indentation(node) || assignment_node
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
                      node = argument_in_method_call(node, :with_or_without_parentheses)
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                      node.respond_to?(:def_modifier?) && !node.def_modifier?
         
     | 
| 
       109 
111 
     | 
    
         
             
                    end
         
     | 
| 
       110 
112 
     | 
    
         | 
| 
       111 
113 
     | 
    
         
             
                    def message(node, lhs, rhs)
         
     | 
| 
         @@ -194,6 +194,14 @@ module RuboCop 
     | 
|
| 
       194 
194 
     | 
    
         
             
                    def alignment_location(alignment_node)
         
     | 
| 
       195 
195 
     | 
    
         
             
                      if begin_end_alignment_style == 'start_of_line'
         
     | 
| 
       196 
196 
     | 
    
         
             
                        start_line_range(alignment_node)
         
     | 
| 
      
 197 
     | 
    
         
            +
                      elsif alignment_node.any_block_type?
         
     | 
| 
      
 198 
     | 
    
         
            +
                        # If the alignment node is a block, the `rescue`/`ensure` keyword should
         
     | 
| 
      
 199 
     | 
    
         
            +
                        # be aligned to the start of the block. It is possible that the block's
         
     | 
| 
      
 200 
     | 
    
         
            +
                        # `send_node` spans multiple lines, in which case it should align to the
         
     | 
| 
      
 201 
     | 
    
         
            +
                        # start of the last line.
         
     | 
| 
      
 202 
     | 
    
         
            +
                        send_node = alignment_node.send_node
         
     | 
| 
      
 203 
     | 
    
         
            +
                        range = processed_source.buffer.line_range(send_node.last_line)
         
     | 
| 
      
 204 
     | 
    
         
            +
                        range.adjust(begin_pos: range.source =~ /\S/)
         
     | 
| 
       197 
205 
     | 
    
         
             
                      else
         
     | 
| 
       198 
206 
     | 
    
         
             
                        alignment_node.source_range
         
     | 
| 
       199 
207 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -31,7 +31,7 @@ module RuboCop 
     | 
|
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
                    # @!method overwritten_constant(node)
         
     | 
| 
       33 
33 
     | 
    
         
             
                    def_node_matcher :overwritten_constant, <<~PATTERN
         
     | 
| 
       34 
     | 
    
         
            -
                      (resbody nil? (casgn  
     | 
| 
      
 34 
     | 
    
         
            +
                      (resbody nil? $(casgn _ _) nil?)
         
     | 
| 
       35 
35 
     | 
    
         
             
                    PATTERN
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
37 
     | 
    
         
             
                    def self.autocorrect_incompatible_with
         
     | 
| 
         @@ -41,7 +41,8 @@ module RuboCop 
     | 
|
| 
       41 
41 
     | 
    
         
             
                    def on_resbody(node)
         
     | 
| 
       42 
42 
     | 
    
         
             
                      return unless (constant = overwritten_constant(node))
         
     | 
| 
       43 
43 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
                       
     | 
| 
      
 44 
     | 
    
         
            +
                      message = format(MSG, constant: constant.source)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      add_offense(node.loc.assoc, message: message) do |corrector|
         
     | 
| 
       45 
46 
     | 
    
         
             
                        corrector.remove(range_between(node.loc.keyword.end_pos, node.loc.assoc.end_pos))
         
     | 
| 
       46 
47 
     | 
    
         
             
                      end
         
     | 
| 
       47 
48 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -13,28 +13,34 @@ module RuboCop 
     | 
|
| 
       13 
13 
     | 
    
         
             
                  # @example
         
     | 
| 
       14 
14 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       15 
15 
     | 
    
         
             
                  #   # rubocop:disable Layout/LineLength Style/Encoding
         
     | 
| 
       16 
     | 
    
         
            -
                  # 
     | 
| 
      
 16 
     | 
    
         
            +
                  #
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 18 
     | 
    
         
            +
                  #   # rubocop:disable Layout/LineLength, Style/Encoding
         
     | 
| 
       17 
19 
     | 
    
         
             
                  #
         
     | 
| 
       18 
20 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       19 
21 
     | 
    
         
             
                  #   # rubocop:disable
         
     | 
| 
       20 
22 
     | 
    
         
             
                  #
         
     | 
| 
      
 23 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 24 
     | 
    
         
            +
                  #   # rubocop:disable all
         
     | 
| 
      
 25 
     | 
    
         
            +
                  #
         
     | 
| 
       21 
26 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       22 
27 
     | 
    
         
             
                  #   # rubocop:disable Layout/LineLength # rubocop:disable Style/Encoding
         
     | 
| 
       23 
28 
     | 
    
         
             
                  #
         
     | 
| 
      
 29 
     | 
    
         
            +
                  #   # good
         
     | 
| 
      
 30 
     | 
    
         
            +
                  #   # rubocop:disable Layout/LineLength
         
     | 
| 
      
 31 
     | 
    
         
            +
                  #   # rubocop:disable Style/Encoding
         
     | 
| 
      
 32 
     | 
    
         
            +
                  #
         
     | 
| 
       24 
33 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       25 
34 
     | 
    
         
             
                  #   # rubocop:wrongmode Layout/LineLength
         
     | 
| 
       26 
35 
     | 
    
         
             
                  #
         
     | 
| 
       27 
36 
     | 
    
         
             
                  #   # good
         
     | 
| 
       28 
37 
     | 
    
         
             
                  #   # rubocop:disable Layout/LineLength
         
     | 
| 
       29 
38 
     | 
    
         
             
                  #
         
     | 
| 
       30 
     | 
    
         
            -
                  #   #  
     | 
| 
       31 
     | 
    
         
            -
                  #   # rubocop:disable Layout/LineLength 
     | 
| 
       32 
     | 
    
         
            -
                  #
         
     | 
| 
       33 
     | 
    
         
            -
                  #   # good
         
     | 
| 
       34 
     | 
    
         
            -
                  #   # rubocop:disable all
         
     | 
| 
      
 39 
     | 
    
         
            +
                  #   # bad
         
     | 
| 
      
 40 
     | 
    
         
            +
                  #   # rubocop:disable Layout/LineLength comment
         
     | 
| 
       35 
41 
     | 
    
         
             
                  #
         
     | 
| 
       36 
42 
     | 
    
         
             
                  #   # good
         
     | 
| 
       37 
     | 
    
         
            -
                  #   # rubocop:disable Layout/LineLength --  
     | 
| 
      
 43 
     | 
    
         
            +
                  #   # rubocop:disable Layout/LineLength -- comment
         
     | 
| 
       38 
44 
     | 
    
         
             
                  #
         
     | 
| 
       39 
45 
     | 
    
         
             
                  class CopDirectiveSyntax < Base
         
     | 
| 
       40 
46 
     | 
    
         
             
                    COMMON_MSG = 'Malformed directive comment detected.'
         
     | 
| 
         @@ -118,8 +118,11 @@ module RuboCop 
     | 
|
| 
       118 
118 
     | 
    
         | 
| 
       119 
119 
     | 
    
         
             
                    def replacement_args(node)
         
     | 
| 
       120 
120 
     | 
    
         
             
                      algorithm_constant, = algorithm_const(node)
         
     | 
| 
       121 
     | 
    
         
            -
                       
     | 
| 
      
 121 
     | 
    
         
            +
                      if algorithm_constant.source == 'OpenSSL::Cipher::Cipher'
         
     | 
| 
      
 122 
     | 
    
         
            +
                        return node.first_argument.source
         
     | 
| 
      
 123 
     | 
    
         
            +
                      end
         
     | 
| 
       122 
124 
     | 
    
         | 
| 
      
 125 
     | 
    
         
            +
                      algorithm_name = algorithm_name(algorithm_constant)
         
     | 
| 
       123 
126 
     | 
    
         
             
                      if openssl_class(algorithm_constant) == 'OpenSSL::Cipher'
         
     | 
| 
       124 
127 
     | 
    
         
             
                        build_cipher_arguments(node, algorithm_name, node.arguments.empty?)
         
     | 
| 
       125 
128 
     | 
    
         
             
                      else
         
     | 
| 
         @@ -19,12 +19,23 @@ module RuboCop 
     | 
|
| 
       19 
19 
     | 
    
         
             
                    MSG = 'Empty interpolation detected.'
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
                    def on_interpolation(begin_node)
         
     | 
| 
      
 22 
     | 
    
         
            +
                      return if in_percent_literal_array?(begin_node)
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
       22 
24 
     | 
    
         
             
                      node_children = begin_node.children.dup
         
     | 
| 
       23 
25 
     | 
    
         
             
                      node_children.delete_if { |e| e.nil_type? || (e.basic_literal? && e.str_content&.empty?) }
         
     | 
| 
       24 
26 
     | 
    
         
             
                      return unless node_children.empty?
         
     | 
| 
       25 
27 
     | 
    
         | 
| 
       26 
28 
     | 
    
         
             
                      add_offense(begin_node) { |corrector| corrector.remove(begin_node) }
         
     | 
| 
       27 
29 
     | 
    
         
             
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                    private
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    def in_percent_literal_array?(begin_node)
         
     | 
| 
      
 34 
     | 
    
         
            +
                      array_node = begin_node.each_ancestor(:array).first
         
     | 
| 
      
 35 
     | 
    
         
            +
                      return false unless array_node
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                      array_node.percent_literal?
         
     | 
| 
      
 38 
     | 
    
         
            +
                    end
         
     | 
| 
       28 
39 
     | 
    
         
             
                  end
         
     | 
| 
       29 
40 
     | 
    
         
             
                end
         
     | 
| 
       30 
41 
     | 
    
         
             
              end
         
     | 
| 
         @@ -9,9 +9,21 @@ module RuboCop 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  # cop disables on wide ranges of code, that latter contributors to
         
     | 
| 
       10 
10 
     | 
    
         
             
                  # a file wouldn't be aware of.
         
     | 
| 
       11 
11 
     | 
    
         
             
                  #
         
     | 
| 
       12 
     | 
    
         
            -
                  #  
     | 
| 
       13 
     | 
    
         
            -
                  # 
     | 
| 
       14 
     | 
    
         
            -
                  # 
     | 
| 
      
 12 
     | 
    
         
            +
                  # You can set `MaximumRangeSize` to define the maximum number of
         
     | 
| 
      
 13 
     | 
    
         
            +
                  # consecutive lines a cop can be disabled for.
         
     | 
| 
      
 14 
     | 
    
         
            +
                  #
         
     | 
| 
      
 15 
     | 
    
         
            +
                  # - `.inf` any size (default)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  # - `0` allows only single-line disables
         
     | 
| 
      
 17 
     | 
    
         
            +
                  # - `1` means the maximum allowed is as follows:
         
     | 
| 
      
 18 
     | 
    
         
            +
                  #
         
     | 
| 
      
 19 
     | 
    
         
            +
                  # [source,ruby]
         
     | 
| 
      
 20 
     | 
    
         
            +
                  # ----
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # # rubocop:disable SomeCop
         
     | 
| 
      
 22 
     | 
    
         
            +
                  # a = 1
         
     | 
| 
      
 23 
     | 
    
         
            +
                  # # rubocop:enable SomeCop
         
     | 
| 
      
 24 
     | 
    
         
            +
                  # ----
         
     | 
| 
      
 25 
     | 
    
         
            +
                  #
         
     | 
| 
      
 26 
     | 
    
         
            +
                  # @example MaximumRangeSize: .inf (default)
         
     | 
| 
       15 
27 
     | 
    
         
             
                  #
         
     | 
| 
       16 
28 
     | 
    
         
             
                  #   # good
         
     | 
| 
       17 
29 
     | 
    
         
             
                  #   # rubocop:disable Layout/SpaceAroundOperators
         
     | 
| 
         @@ -25,9 +37,7 @@ module RuboCop 
     | 
|
| 
       25 
37 
     | 
    
         
             
                  #   x= 0
         
     | 
| 
       26 
38 
     | 
    
         
             
                  #   # EOF
         
     | 
| 
       27 
39 
     | 
    
         
             
                  #
         
     | 
| 
       28 
     | 
    
         
            -
                  # @example
         
     | 
| 
       29 
     | 
    
         
            -
                  #   # Lint/MissingCopEnableDirective:
         
     | 
| 
       30 
     | 
    
         
            -
                  #   #   MaximumRangeSize: 2
         
     | 
| 
      
 40 
     | 
    
         
            +
                  # @example MaximumRangeSize: 2
         
     | 
| 
       31 
41 
     | 
    
         
             
                  #
         
     | 
| 
       32 
42 
     | 
    
         
             
                  #   # good
         
     | 
| 
       33 
43 
     | 
    
         
             
                  #   # rubocop:disable Layout/SpaceAroundOperators
         
     | 
| 
         @@ -24,10 +24,7 @@ module RuboCop 
     | 
|
| 
       24 
24 
     | 
    
         
             
                    MSG = 'Avoid rescuing the `Exception` class. Perhaps you meant to rescue `StandardError`?'
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                    def on_resbody(node)
         
     | 
| 
       27 
     | 
    
         
            -
                      return unless node. 
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                      rescue_args = node.children.first.children
         
     | 
| 
       30 
     | 
    
         
            -
                      return unless rescue_args.any? { |a| targets_exception?(a) }
         
     | 
| 
      
 27 
     | 
    
         
            +
                      return unless node.exceptions.any? { |exception| targets_exception?(exception) }
         
     | 
| 
       31 
28 
     | 
    
         | 
| 
       32 
29 
     | 
    
         
             
                      add_offense(node)
         
     | 
| 
       33 
30 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -108,7 +108,7 @@ module RuboCop 
     | 
|
| 
       108 
108 
     | 
    
         
             
                      value_node = node.last_argument
         
     | 
| 
       109 
109 
     | 
    
         
             
                      node_arguments = node.arguments[0...-1]
         
     | 
| 
       110 
110 
     | 
    
         | 
| 
       111 
     | 
    
         
            -
                      if value_node. 
     | 
| 
      
 111 
     | 
    
         
            +
                      if value_node.respond_to?(:method?) && value_node.method?(:[]) &&
         
     | 
| 
       112 
112 
     | 
    
         
             
                         node.receiver == value_node.receiver &&
         
     | 
| 
       113 
113 
     | 
    
         
             
                         node_arguments.none?(&:call_type?) &&
         
     | 
| 
       114 
114 
     | 
    
         
             
                         node_arguments == value_node.arguments
         
     | 
| 
         @@ -125,13 +125,13 @@ module RuboCop 
     | 
|
| 
       125 
125 
     | 
    
         
             
                        next false if assignment_node.shorthand_asgn?
         
     | 
| 
       126 
126 
     | 
    
         
             
                        next false unless assignment_node.parent
         
     | 
| 
       127 
127 
     | 
    
         | 
| 
       128 
     | 
    
         
            -
                         
     | 
| 
       129 
     | 
    
         
            -
                           
     | 
| 
      
 128 
     | 
    
         
            +
                        conditional_assignment =
         
     | 
| 
      
 129 
     | 
    
         
            +
                          conditional_assignment?(assignment_node.parent, argument.scope.node)
         
     | 
| 
       130 
130 
     | 
    
         | 
| 
       131 
131 
     | 
    
         
             
                        unless uses_var?(assignment_node, argument.name)
         
     | 
| 
       132 
132 
     | 
    
         
             
                          # It's impossible to decide whether a branch or block is executed,
         
     | 
| 
       133 
133 
     | 
    
         
             
                          # so the precise reassignment location is undecidable.
         
     | 
| 
       134 
     | 
    
         
            -
                          next false if  
     | 
| 
      
 134 
     | 
    
         
            +
                          next false if conditional_assignment
         
     | 
| 
       135 
135 
     | 
    
         | 
| 
       136 
136 
     | 
    
         
             
                          yield(assignment.node, location_known)
         
     | 
| 
       137 
137 
     | 
    
         
             
                          break
         
     | 
| 
         @@ -147,13 +147,13 @@ module RuboCop 
     | 
|
| 
       147 
147 
     | 
    
         
             
                      node.source_range.begin_pos
         
     | 
| 
       148 
148 
     | 
    
         
             
                    end
         
     | 
| 
       149 
149 
     | 
    
         | 
| 
       150 
     | 
    
         
            -
                    # Check whether the given node is  
     | 
| 
      
 150 
     | 
    
         
            +
                    # Check whether the given node is always executed or not
         
     | 
| 
       151 
151 
     | 
    
         
             
                    #
         
     | 
| 
       152 
     | 
    
         
            -
                    def  
     | 
| 
      
 152 
     | 
    
         
            +
                    def conditional_assignment?(node, stop_search_node)
         
     | 
| 
       153 
153 
     | 
    
         
             
                      return false if node == stop_search_node
         
     | 
| 
       154 
154 
     | 
    
         | 
| 
       155 
     | 
    
         
            -
                      node.conditional? || node. 
     | 
| 
       156 
     | 
    
         
            -
                         
     | 
| 
      
 155 
     | 
    
         
            +
                      node.conditional? || node.type?(:block, :rescue) ||
         
     | 
| 
      
 156 
     | 
    
         
            +
                        conditional_assignment?(node.parent, stop_search_node)
         
     | 
| 
       157 
157 
     | 
    
         
             
                    end
         
     | 
| 
       158 
158 
     | 
    
         | 
| 
       159 
159 
     | 
    
         
             
                    # Get argument references without assignments' references
         
     | 
| 
         @@ -17,6 +17,7 @@ module RuboCop 
     | 
|
| 
       17 
17 
     | 
    
         
             
                  #
         
     | 
| 
       18 
18 
     | 
    
         
             
                  #   # good
         
     | 
| 
       19 
19 
     | 
    
         
             
                  #   CGI.escape('http://example.com')
         
     | 
| 
      
 20 
     | 
    
         
            +
                  #   URI.encode_uri_component(uri) # Since Ruby 3.1
         
     | 
| 
       20 
21 
     | 
    
         
             
                  #   URI.encode_www_form([['example', 'param'], ['lang', 'en']])
         
     | 
| 
       21 
22 
     | 
    
         
             
                  #   URI.encode_www_form(page: 10, locale: 'en')
         
     | 
| 
       22 
23 
     | 
    
         
             
                  #   URI.encode_www_form_component('http://example.com')
         
     | 
| 
         @@ -27,6 +28,7 @@ module RuboCop 
     | 
|
| 
       27 
28 
     | 
    
         
             
                  #
         
     | 
| 
       28 
29 
     | 
    
         
             
                  #   # good
         
     | 
| 
       29 
30 
     | 
    
         
             
                  #   CGI.unescape(enc_uri)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  #   URI.decode_uri_component(uri) # Since Ruby 3.1
         
     | 
| 
       30 
32 
     | 
    
         
             
                  #   URI.decode_www_form(enc_uri)
         
     | 
| 
       31 
33 
     | 
    
         
             
                  #   URI.decode_www_form_component(enc_uri)
         
     | 
| 
       32 
34 
     | 
    
         
             
                  class UriEscapeUnescape < Base
         
     |