rubocop 1.53.0 → 1.54.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 +4 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +26 -3
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
- data/lib/rubocop/cop/layout/space_around_operators.rb +3 -1
- data/lib/rubocop/cop/lint/debugger.rb +8 -4
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +11 -17
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +30 -2
- data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/lambda.rb +3 -3
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +17 -4
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -2
- data/lib/rubocop/lsp/routes.rb +8 -0
- data/lib/rubocop/lsp/runtime.rb +4 -1
- data/lib/rubocop/lsp/server.rb +6 -2
- data/lib/rubocop/version.rb +1 -1
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b952fc5852376637345f505d8753d44608bc082ea9bb64f9d4e61b5cc9cd6005
         | 
| 4 | 
            +
              data.tar.gz: e7a695e76983fe1ff49d7951be70eabcb149de9bd20179f564cb61adc04d8b33
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1b2f4d9249a3e283b1ed762a73c8d68b31db632de1a2e0005b99769314598fbe9394ea86a56abfff7ead03acd17d4ab343a6540ee712196bc36326959b8f9138
         | 
| 7 | 
            +
              data.tar.gz: 1d8d0d7ac82f4440385d2b502070f3bfb872d651af0707f78ff2df6f90cd6ee51bd03ccf84c71f4f582d812a661be3af2a637895b1b0137dc37ec7606fcfcb45
         | 
    
        data/README.md
    CHANGED
    
    | @@ -53,7 +53,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi | |
| 53 53 | 
             
            in your `Gemfile`:
         | 
| 54 54 |  | 
| 55 55 | 
             
            ```rb
         | 
| 56 | 
            -
            gem 'rubocop', '~> 1. | 
| 56 | 
            +
            gem 'rubocop', '~> 1.54', require: false
         | 
| 57 57 | 
             
            ```
         | 
| 58 58 |  | 
| 59 59 | 
             
            See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
         | 
    
        data/config/default.yml
    CHANGED
    
    | @@ -30,6 +30,7 @@ AllCops: | |
| 30 30 | 
             
                - '**/*.rbx'
         | 
| 31 31 | 
             
                - '**/*.ru'
         | 
| 32 32 | 
             
                - '**/*.ruby'
         | 
| 33 | 
            +
                - '**/*.schema'
         | 
| 33 34 | 
             
                - '**/*.spec'
         | 
| 34 35 | 
             
                - '**/*.thor'
         | 
| 35 36 | 
             
                - '**/*.watchr'
         | 
| @@ -55,6 +56,7 @@ AllCops: | |
| 55 56 | 
             
                - '**/Puppetfile'
         | 
| 56 57 | 
             
                - '**/Rakefile'
         | 
| 57 58 | 
             
                - '**/rakefile'
         | 
| 59 | 
            +
                - '**/Schemafile'
         | 
| 58 60 | 
             
                - '**/Snapfile'
         | 
| 59 61 | 
             
                - '**/Steepfile'
         | 
| 60 62 | 
             
                - '**/Thorfile'
         | 
| @@ -577,6 +579,8 @@ Layout/EmptyLineBetweenDefs: | |
| 577 579 | 
             
              EmptyLineBetweenMethodDefs: true
         | 
| 578 580 | 
             
              EmptyLineBetweenClassDefs: true
         | 
| 579 581 | 
             
              EmptyLineBetweenModuleDefs: true
         | 
| 582 | 
            +
              # `DefLikeMacros` takes the name of any macro that you want to treat like a def.
         | 
| 583 | 
            +
              DefLikeMacros: []
         | 
| 580 584 | 
             
              # `AllowAdjacentOneLineDefs` means that single line method definitions don't
         | 
| 581 585 | 
             
              # need an empty line between them. `true` by default.
         | 
| 582 586 | 
             
              AllowAdjacentOneLineDefs: true
         | 
| @@ -135,7 +135,8 @@ module RuboCop | |
| 135 135 | 
             
                      return if nodes.all?(&:single_line?) && cop_config['AllowAdjacentOneLineDefs']
         | 
| 136 136 |  | 
| 137 137 | 
             
                      correction_node = nodes.last
         | 
| 138 | 
            -
             | 
| 138 | 
            +
             | 
| 139 | 
            +
                      location = def_location(correction_node)
         | 
| 139 140 | 
             
                      add_offense(location, message: message(correction_node, count: count)) do |corrector|
         | 
| 140 141 | 
             
                        autocorrect(corrector, *nodes, count)
         | 
| 141 142 | 
             
                      end
         | 
| @@ -159,10 +160,28 @@ module RuboCop | |
| 159 160 |  | 
| 160 161 | 
             
                    private
         | 
| 161 162 |  | 
| 163 | 
            +
                    def def_location(correction_node)
         | 
| 164 | 
            +
                      if correction_node.block_type?
         | 
| 165 | 
            +
                        correction_node.source_range.join(correction_node.children.first.source_range)
         | 
| 166 | 
            +
                      else
         | 
| 167 | 
            +
                        correction_node.loc.keyword.join(correction_node.loc.name)
         | 
| 168 | 
            +
                      end
         | 
| 169 | 
            +
                    end
         | 
| 170 | 
            +
             | 
| 162 171 | 
             
                    def candidate?(node)
         | 
| 163 172 | 
             
                      return false unless node
         | 
| 164 173 |  | 
| 165 | 
            -
                      method_candidate?(node) || class_candidate?(node) || module_candidate?(node)
         | 
| 174 | 
            +
                      method_candidate?(node) || class_candidate?(node) || module_candidate?(node) ||
         | 
| 175 | 
            +
                        macro_candidate?(node)
         | 
| 176 | 
            +
                    end
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                    def empty_line_between_macros
         | 
| 179 | 
            +
                      cop_config.fetch('DefLikeMacros', []).map(&:to_sym)
         | 
| 180 | 
            +
                    end
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                    def macro_candidate?(node)
         | 
| 183 | 
            +
                      node.block_type? && node.children.first.macro? &&
         | 
| 184 | 
            +
                        empty_line_between_macros.include?(node.children.first.method_name)
         | 
| 166 185 | 
             
                    end
         | 
| 167 186 |  | 
| 168 187 | 
             
                    def method_candidate?(node)
         | 
| @@ -226,7 +245,11 @@ module RuboCop | |
| 226 245 | 
             
                    end
         | 
| 227 246 |  | 
| 228 247 | 
             
                    def def_start(node)
         | 
| 229 | 
            -
                      node. | 
| 248 | 
            +
                      if node.block_type? && node.children.first.send_type?
         | 
| 249 | 
            +
                        node.source_range.line
         | 
| 250 | 
            +
                      else
         | 
| 251 | 
            +
                        node.loc.keyword.line
         | 
| 252 | 
            +
                      end
         | 
| 230 253 | 
             
                    end
         | 
| 231 254 |  | 
| 232 255 | 
             
                    def def_end(node)
         | 
| @@ -153,7 +153,9 @@ module RuboCop | |
| 153 153 | 
             
                    private
         | 
| 154 154 |  | 
| 155 155 | 
             
                    def regular_operator?(send_node)
         | 
| 156 | 
            -
                       | 
| 156 | 
            +
                      return false if send_node.unary_operation? || send_node.dot? || send_node.double_colon?
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                      operator_with_regular_syntax?(send_node)
         | 
| 157 159 | 
             
                    end
         | 
| 158 160 |  | 
| 159 161 | 
             
                    def operator_with_regular_syntax?(send_node)
         | 
| @@ -68,10 +68,7 @@ module RuboCop | |
| 68 68 | 
             
                    MSG = 'Remove debugger entry point `%<source>s`.'
         | 
| 69 69 |  | 
| 70 70 | 
             
                    def on_send(node)
         | 
| 71 | 
            -
                      return  | 
| 72 | 
            -
             | 
| 73 | 
            -
                      # Basically, debugger methods are not used as a method argument without arguments.
         | 
| 74 | 
            -
                      return if node.arguments.empty? && node.each_ancestor(:send, :csend).any?
         | 
| 71 | 
            +
                      return if !debugger_method?(node) || assumed_usage_context?(node)
         | 
| 75 72 |  | 
| 76 73 | 
             
                      add_offense(node)
         | 
| 77 74 | 
             
                    end
         | 
| @@ -95,6 +92,13 @@ module RuboCop | |
| 95 92 | 
             
                      debugger_methods.include?(chained_method_name(send_node))
         | 
| 96 93 | 
             
                    end
         | 
| 97 94 |  | 
| 95 | 
            +
                    def assumed_usage_context?(node)
         | 
| 96 | 
            +
                      # Basically, debugger methods are not used as a method argument without arguments.
         | 
| 97 | 
            +
                      return false unless node.arguments.empty? && node.each_ancestor(:send, :csend).any?
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                      node.each_ancestor.none?(&:lambda_or_proc?)
         | 
| 100 | 
            +
                    end
         | 
| 101 | 
            +
             | 
| 98 102 | 
             
                    def chained_method_name(send_node)
         | 
| 99 103 | 
             
                      chained_method_name = send_node.method_name.to_s
         | 
| 100 104 | 
             
                      receiver = send_node.receiver
         | 
| @@ -124,7 +124,7 @@ module RuboCop | |
| 124 124 | 
             
                      source == value ||
         | 
| 125 125 | 
             
                        # `Symbol#inspect` uses double quotes, but allow single-quoted
         | 
| 126 126 | 
             
                        # symbols to work as well.
         | 
| 127 | 
            -
                        source.tr("'", '"') == value
         | 
| 127 | 
            +
                        source.gsub('"', '\"').tr("'", '"') == value
         | 
| 128 128 | 
             
                    end
         | 
| 129 129 |  | 
| 130 130 | 
             
                    def requires_quotes?(sym_node)
         | 
| @@ -113,9 +113,15 @@ module RuboCop | |
| 113 113 | 
             
                    def check_var(node)
         | 
| 114 114 | 
             
                      return unless node.variable? || node.const_type?
         | 
| 115 115 |  | 
| 116 | 
            -
                       | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 116 | 
            +
                      if node.const_type? && node.special_keyword?
         | 
| 117 | 
            +
                        add_offense(node, message: format(VAR_MSG, var: node.source)) do |corrector|
         | 
| 118 | 
            +
                          autocorrect_void_expression(corrector, node)
         | 
| 119 | 
            +
                        end
         | 
| 120 | 
            +
                      else
         | 
| 121 | 
            +
                        add_offense(node.loc.name,
         | 
| 122 | 
            +
                                    message: format(VAR_MSG, var: node.loc.name.source)) do |corrector|
         | 
| 123 | 
            +
                          autocorrect_void_expression(corrector, node)
         | 
| 124 | 
            +
                        end
         | 
| 119 125 | 
             
                      end
         | 
| 120 126 | 
             
                    end
         | 
| 121 127 |  | 
| @@ -123,7 +129,7 @@ module RuboCop | |
| 123 129 | 
             
                      return if !node.literal? || node.xstr_type? || node.range_type?
         | 
| 124 130 |  | 
| 125 131 | 
             
                      add_offense(node, message: format(LIT_MSG, lit: node.source)) do |corrector|
         | 
| 126 | 
            -
                         | 
| 132 | 
            +
                        autocorrect_void_expression(corrector, node)
         | 
| 127 133 | 
             
                      end
         | 
| 128 134 | 
             
                    end
         | 
| 129 135 |  | 
| @@ -131,7 +137,7 @@ module RuboCop | |
| 131 137 | 
             
                      return unless node.self_type?
         | 
| 132 138 |  | 
| 133 139 | 
             
                      add_offense(node, message: SELF_MSG) do |corrector|
         | 
| 134 | 
            -
                         | 
| 140 | 
            +
                        autocorrect_void_expression(corrector, node)
         | 
| 135 141 | 
             
                      end
         | 
| 136 142 | 
             
                    end
         | 
| 137 143 |  | 
| @@ -181,18 +187,6 @@ module RuboCop | |
| 181 187 | 
             
                      end
         | 
| 182 188 | 
             
                    end
         | 
| 183 189 |  | 
| 184 | 
            -
                    def autocorrect_void_var(corrector, node)
         | 
| 185 | 
            -
                      corrector.remove(range_with_surrounding_space(range: node.loc.name, side: :left))
         | 
| 186 | 
            -
                    end
         | 
| 187 | 
            -
             | 
| 188 | 
            -
                    def autocorrect_void_literal(corrector, node)
         | 
| 189 | 
            -
                      corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
         | 
| 190 | 
            -
                    end
         | 
| 191 | 
            -
             | 
| 192 | 
            -
                    def autocorrect_void_self(corrector, node)
         | 
| 193 | 
            -
                      corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
         | 
| 194 | 
            -
                    end
         | 
| 195 | 
            -
             | 
| 196 190 | 
             
                    def autocorrect_void_expression(corrector, node)
         | 
| 197 191 | 
             
                      corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
         | 
| 198 192 | 
             
                    end
         | 
| @@ -63,7 +63,7 @@ module RuboCop | |
| 63 63 | 
             
                        types
         | 
| 64 64 | 
             
                      end
         | 
| 65 65 |  | 
| 66 | 
            -
                      def code_length(node)
         | 
| 66 | 
            +
                      def code_length(node) # rubocop:disable Metrics/MethodLength
         | 
| 67 67 | 
             
                        if classlike_node?(node)
         | 
| 68 68 | 
             
                          classlike_code_length(node)
         | 
| 69 69 | 
             
                        elsif heredoc_node?(node)
         | 
| @@ -72,7 +72,14 @@ module RuboCop | |
| 72 72 | 
             
                          body = extract_body(node)
         | 
| 73 73 | 
             
                          return 0 unless body
         | 
| 74 74 |  | 
| 75 | 
            -
                           | 
| 75 | 
            +
                          source =
         | 
| 76 | 
            +
                            if node_with_heredoc?(body)
         | 
| 77 | 
            +
                              source_from_node_with_heredoc(body)
         | 
| 78 | 
            +
                            else
         | 
| 79 | 
            +
                              body.source.lines
         | 
| 80 | 
            +
                            end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                          source.count { |line| !irrelevant_line?(line) }
         | 
| 76 83 | 
             
                        end
         | 
| 77 84 | 
             
                      end
         | 
| 78 85 |  | 
| @@ -175,6 +182,27 @@ module RuboCop | |
| 175 182 | 
             
                      def another_args?(node)
         | 
| 176 183 | 
             
                        node.call_type? && node.arguments.count > 1
         | 
| 177 184 | 
             
                      end
         | 
| 185 | 
            +
             | 
| 186 | 
            +
                      def node_with_heredoc?(node)
         | 
| 187 | 
            +
                        node.each_descendant(:str, :dstr).any? { |descendant| heredoc_node?(descendant) }
         | 
| 188 | 
            +
                      end
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                      def source_from_node_with_heredoc(node)
         | 
| 191 | 
            +
                        last_line = -1
         | 
| 192 | 
            +
                        node.each_descendant do |descendant|
         | 
| 193 | 
            +
                          next unless descendant.loc
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                          descendant_last_line =
         | 
| 196 | 
            +
                            if heredoc_node?(descendant)
         | 
| 197 | 
            +
                              descendant.loc.heredoc_end.line
         | 
| 198 | 
            +
                            else
         | 
| 199 | 
            +
                              descendant.last_line
         | 
| 200 | 
            +
                            end
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                          last_line = [last_line, descendant_last_line].max
         | 
| 203 | 
            +
                        end
         | 
| 204 | 
            +
                        @processed_source[(node.first_line - 1)..(last_line - 1)]
         | 
| 205 | 
            +
                      end
         | 
| 178 206 | 
             
                    end
         | 
| 179 207 | 
             
                  end
         | 
| 180 208 | 
             
                end
         | 
| @@ -26,11 +26,15 @@ module RuboCop | |
| 26 26 | 
             
                  end
         | 
| 27 27 |  | 
| 28 28 | 
             
                  def delimiter_string(node)
         | 
| 29 | 
            -
                    node.source.match(OPENING_DELIMITER) | 
| 29 | 
            +
                    return '' unless (match = node.source.match(OPENING_DELIMITER))
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                    match.captures[1]
         | 
| 30 32 | 
             
                  end
         | 
| 31 33 |  | 
| 32 34 | 
             
                  def heredoc_type(node)
         | 
| 33 | 
            -
                    node.source.match(OPENING_DELIMITER) | 
| 35 | 
            +
                    return '' unless (match = node.source.match(OPENING_DELIMITER))
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    match.captures[0]
         | 
| 34 38 | 
             
                  end
         | 
| 35 39 | 
             
                end
         | 
| 36 40 | 
             
              end
         | 
| @@ -47,7 +47,7 @@ module RuboCop | |
| 47 47 | 
             
                    def correct_elsif(node)
         | 
| 48 48 | 
             
                      <<~RUBY.chop
         | 
| 49 49 | 
             
                        if #{node.condition.source}
         | 
| 50 | 
            -
                          #{node.if_branch | 
| 50 | 
            +
                          #{node.if_branch&.source}
         | 
| 51 51 | 
             
                        #{build_else_branch(node.else_branch).chop}
         | 
| 52 52 | 
             
                        end
         | 
| 53 53 | 
             
                      RUBY
         | 
| @@ -56,7 +56,7 @@ module RuboCop | |
| 56 56 | 
             
                    def build_else_branch(second_condition)
         | 
| 57 57 | 
             
                      result = <<~RUBY
         | 
| 58 58 | 
             
                        elsif #{second_condition.condition.source}
         | 
| 59 | 
            -
                          #{second_condition.if_branch | 
| 59 | 
            +
                          #{second_condition.if_branch&.source}
         | 
| 60 60 | 
             
                      RUBY
         | 
| 61 61 |  | 
| 62 62 | 
             
                      if second_condition.else_branch
         | 
| @@ -69,10 +69,10 @@ module RuboCop | |
| 69 69 | 
             
                      return unless offending_selector?(node, selector)
         | 
| 70 70 |  | 
| 71 71 | 
             
                      add_offense(node.send_node.source_range, message: message(node, selector)) do |corrector|
         | 
| 72 | 
            -
                        if node.send_node. | 
| 73 | 
            -
                          autocorrect_method_to_literal(corrector, node)
         | 
| 74 | 
            -
                        else
         | 
| 72 | 
            +
                        if node.send_node.lambda_literal?
         | 
| 75 73 | 
             
                          LambdaLiteralToMethodCorrector.new(node).call(corrector)
         | 
| 74 | 
            +
                        else
         | 
| 75 | 
            +
                          autocorrect_method_to_literal(corrector, node)
         | 
| 76 76 | 
             
                        end
         | 
| 77 77 | 
             
                      end
         | 
| 78 78 | 
             
                    end
         | 
| @@ -22,7 +22,7 @@ module RuboCop | |
| 22 22 |  | 
| 23 23 | 
             
                    def on_send(node)
         | 
| 24 24 | 
             
                      return unless node.method?(:require_relative)
         | 
| 25 | 
            -
                      return unless node.first_argument.str_content | 
| 25 | 
            +
                      return unless node.first_argument.str_content&.start_with?(CURRENT_DIRECTORY_PATH)
         | 
| 26 26 | 
             
                      return unless (index = node.first_argument.source.index(CURRENT_DIRECTORY_PATH))
         | 
| 27 27 |  | 
| 28 28 | 
             
                      begin_pos = node.first_argument.source_range.begin.begin_pos + index
         | 
| @@ -40,7 +40,9 @@ module RuboCop | |
| 40 40 | 
             
                      byteindex byterindex gsub gsub! partition rpartition scan split start_with? sub sub!
         | 
| 41 41 | 
             
                    ].freeze
         | 
| 42 42 | 
             
                    DETERMINISTIC_REGEX = /\A(?:#{LITERAL_REGEX})+\Z/.freeze
         | 
| 43 | 
            -
                    STR_SPECIAL_CHARS = %w[ | 
| 43 | 
            +
                    STR_SPECIAL_CHARS = %w[
         | 
| 44 | 
            +
                      \a \c \C \e \f \M \n \" \' \\\\ \t \b \f \r \u \v \x \0 \1 \2 \3 \4 \5 \6 \7
         | 
| 45 | 
            +
                    ].freeze
         | 
| 44 46 |  | 
| 45 47 | 
             
                    def on_send(node)
         | 
| 46 48 | 
             
                      return unless (regexp_node = node.first_argument)
         | 
| @@ -48,9 +50,7 @@ module RuboCop | |
| 48 50 | 
             
                      return if !regexp_node.regopt.children.empty? || regexp_node.content == ' '
         | 
| 49 51 | 
             
                      return unless determinist_regexp?(regexp_node)
         | 
| 50 52 |  | 
| 51 | 
            -
                       | 
| 52 | 
            -
                      quote = new_argument.include?('"') ? "'" : '"'
         | 
| 53 | 
            -
                      prefer = "#{quote}#{new_argument}#{quote}"
         | 
| 53 | 
            +
                      prefer = preferred_argument(regexp_node)
         | 
| 54 54 | 
             
                      message = format(MSG, prefer: prefer, current: regexp_node.source)
         | 
| 55 55 |  | 
| 56 56 | 
             
                      add_offense(regexp_node, message: message) do |corrector|
         | 
| @@ -64,6 +64,19 @@ module RuboCop | |
| 64 64 | 
             
                      DETERMINISTIC_REGEX.match?(regexp_node.source)
         | 
| 65 65 | 
             
                    end
         | 
| 66 66 |  | 
| 67 | 
            +
                    def preferred_argument(regexp_node)
         | 
| 68 | 
            +
                      new_argument = replacement(regexp_node)
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                      if new_argument.include?('"')
         | 
| 71 | 
            +
                        new_argument.gsub!("'", "\\\\'")
         | 
| 72 | 
            +
                        quote = "'"
         | 
| 73 | 
            +
                      else
         | 
| 74 | 
            +
                        quote = '"'
         | 
| 75 | 
            +
                      end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                      "#{quote}#{new_argument}#{quote}"
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
             | 
| 67 80 | 
             
                    def replacement(regexp_node)
         | 
| 68 81 | 
             
                      regexp_content = regexp_node.content
         | 
| 69 82 | 
             
                      stack = []
         | 
| @@ -118,16 +118,18 @@ module RuboCop | |
| 118 118 | 
             
                      node.comparison_method? && !noncommutative_operator?(node)
         | 
| 119 119 | 
             
                    end
         | 
| 120 120 |  | 
| 121 | 
            +
                    # rubocop:disable Metrics/CyclomaticComplexity
         | 
| 121 122 | 
             
                    def valid_yoda?(node)
         | 
| 122 | 
            -
                       | 
| 123 | 
            -
                      rhs = node.first_argument
         | 
| 123 | 
            +
                      return true unless (rhs = node.first_argument)
         | 
| 124 124 |  | 
| 125 | 
            +
                      lhs = node.receiver
         | 
| 125 126 | 
             
                      return true if (constant_portion?(lhs) && constant_portion?(rhs)) ||
         | 
| 126 127 | 
             
                                     (!constant_portion?(lhs) && !constant_portion?(rhs)) ||
         | 
| 127 128 | 
             
                                     interpolation?(lhs)
         | 
| 128 129 |  | 
| 129 130 | 
             
                      enforce_yoda? ? constant_portion?(lhs) : constant_portion?(rhs)
         | 
| 130 131 | 
             
                    end
         | 
| 132 | 
            +
                    # rubocop:enable Metrics/CyclomaticComplexity
         | 
| 131 133 |  | 
| 132 134 | 
             
                    def message(node)
         | 
| 133 135 | 
             
                      format(MSG, source: node.source)
         | 
    
        data/lib/rubocop/lsp/routes.rb
    CHANGED
    
    | @@ -36,6 +36,8 @@ module RuboCop | |
| 36 36 | 
             
                  end
         | 
| 37 37 |  | 
| 38 38 | 
             
                  handle 'initialize' do |request|
         | 
| 39 | 
            +
                    @server.configure(safe_autocorrect: safe_autocorrect?(request))
         | 
| 40 | 
            +
             | 
| 39 41 | 
             
                    @server.write(
         | 
| 40 42 | 
             
                      id: request[:id],
         | 
| 41 43 | 
             
                      result: LanguageServer::Protocol::Interface::InitializeResult.new(
         | 
| @@ -162,6 +164,12 @@ module RuboCop | |
| 162 164 |  | 
| 163 165 | 
             
                  private
         | 
| 164 166 |  | 
| 167 | 
            +
                  def safe_autocorrect?(request)
         | 
| 168 | 
            +
                    safe_autocorrect = request.dig(:params, :initializationOptions, :safeAutocorrect)
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                    safe_autocorrect.nil? || safe_autocorrect == true
         | 
| 171 | 
            +
                  end
         | 
| 172 | 
            +
             | 
| 165 173 | 
             
                  def format_file(file_uri)
         | 
| 166 174 | 
             
                    unless (text = @text_cache[file_uri])
         | 
| 167 175 | 
             
                      Logger.log("Format request arrived before text synchronized; skipping: `#{file_uri}'")
         | 
    
        data/lib/rubocop/lsp/runtime.rb
    CHANGED
    
    | @@ -14,9 +14,12 @@ module RuboCop | |
| 14 14 | 
             
                # Runtime for Language Server Protocol of RuboCop.
         | 
| 15 15 | 
             
                # @api private
         | 
| 16 16 | 
             
                class Runtime
         | 
| 17 | 
            +
                  attr_writer :safe_autocorrect
         | 
| 18 | 
            +
             | 
| 17 19 | 
             
                  def initialize(config_store)
         | 
| 18 20 | 
             
                    @config_store = config_store
         | 
| 19 21 | 
             
                    @logged_paths = []
         | 
| 22 | 
            +
                    @safe_autocorrect = true
         | 
| 20 23 | 
             
                  end
         | 
| 21 24 |  | 
| 22 25 | 
             
                  # This abuses the `--stdin` option of rubocop and reads the formatted text
         | 
| @@ -32,7 +35,7 @@ module RuboCop | |
| 32 35 | 
             
                  #   https://github.com/rubocop/rubocop/blob/v1.52.0/lib/rubocop/runner.rb#L72
         | 
| 33 36 | 
             
                  def format(path, text)
         | 
| 34 37 | 
             
                    formatting_options = {
         | 
| 35 | 
            -
                      stdin: text, force_exclusion: true, autocorrect: true, safe_autocorrect:  | 
| 38 | 
            +
                      stdin: text, force_exclusion: true, autocorrect: true, safe_autocorrect: @safe_autocorrect
         | 
| 36 39 | 
             
                    }
         | 
| 37 40 |  | 
| 38 41 | 
             
                    redirect_stdout { run_rubocop(formatting_options, path) }
         | 
    
        data/lib/rubocop/lsp/server.rb
    CHANGED
    
    | @@ -36,8 +36,8 @@ module RuboCop | |
| 36 36 | 
             
                        @routes.handle_unsupported_method(request)
         | 
| 37 37 | 
             
                      end
         | 
| 38 38 | 
             
                    rescue StandardError => e
         | 
| 39 | 
            -
                      log("Error #{e.class} #{e.message[0..100]}")
         | 
| 40 | 
            -
                      log(e.backtrace.inspect)
         | 
| 39 | 
            +
                      Logger.log("Error #{e.class} #{e.message[0..100]}")
         | 
| 40 | 
            +
                      Logger.log(e.backtrace.inspect)
         | 
| 41 41 | 
             
                    end
         | 
| 42 42 | 
             
                  end
         | 
| 43 43 |  | 
| @@ -53,6 +53,10 @@ module RuboCop | |
| 53 53 | 
             
                    @runtime.offenses(path, text)
         | 
| 54 54 | 
             
                  end
         | 
| 55 55 |  | 
| 56 | 
            +
                  def configure(safe_autocorrect: true)
         | 
| 57 | 
            +
                    @runtime.safe_autocorrect = safe_autocorrect
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 56 60 | 
             
                  def stop(&block)
         | 
| 57 61 | 
             
                    at_exit(&block) if block
         | 
| 58 62 | 
             
                    exit
         | 
    
        data/lib/rubocop/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rubocop
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.54.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Bozhidar Batsov
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: exe
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date: 2023- | 
| 13 | 
            +
            date: 2023-07-01 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: json
         | 
| @@ -1023,7 +1023,7 @@ metadata: | |
| 1023 1023 | 
             
              homepage_uri: https://rubocop.org/
         | 
| 1024 1024 | 
             
              changelog_uri: https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md
         | 
| 1025 1025 | 
             
              source_code_uri: https://github.com/rubocop/rubocop/
         | 
| 1026 | 
            -
              documentation_uri: https://docs.rubocop.org/rubocop/1. | 
| 1026 | 
            +
              documentation_uri: https://docs.rubocop.org/rubocop/1.54/
         | 
| 1027 1027 | 
             
              bug_tracker_uri: https://github.com/rubocop/rubocop/issues
         | 
| 1028 1028 | 
             
              rubygems_mfa_required: 'true'
         | 
| 1029 1029 | 
             
            post_install_message: 
         |