Sha256: b2ab9a7ccd73a3e0aa400a27a0ac0aaaa87352abbee2986ceb62095a9dd1b3af

Contents?: true

Size: 1.82 KB

Versions: 19

Compression:

Stored size: 1.82 KB

Contents

# frozen_string_literal: true

module RuboCop
  module Cop
    module Performance
      # Identifies places where `split` argument can be replaced from
      # a deterministic regexp to a string.
      #
      # @example
      #   # bad
      #   'a,b,c'.split(/,/)
      #
      #   # good
      #   'a,b,c'.split(',')
      class RedundantSplitRegexpArgument < Base
        extend AutoCorrector

        MSG = 'Use string as argument instead of regexp.'
        RESTRICT_ON_SEND = %i[split].freeze
        DETERMINISTIC_REGEX = /\A(?:#{LITERAL_REGEX})+\Z/.freeze
        STR_SPECIAL_CHARS = %w[\n \" \' \\\\ \t \b \f \r].freeze

        def_node_matcher :split_call_with_regexp?, <<~PATTERN
          {(send !nil? :split $regexp)}
        PATTERN

        def on_send(node)
          return unless (regexp_node = split_call_with_regexp?(node))
          return if regexp_node.ignore_case? || regexp_node.content == ' '
          return unless determinist_regexp?(regexp_node)

          add_offense(regexp_node) do |corrector|
            new_argument = replacement(regexp_node)

            corrector.replace(regexp_node, "\"#{new_argument}\"")
          end
        end

        private

        def determinist_regexp?(regexp_node)
          DETERMINISTIC_REGEX.match?(regexp_node.source)
        end

        def replacement(regexp_node)
          regexp_content = regexp_node.content
          stack = []
          chars = regexp_content.chars.each_with_object([]) do |char, strings|
            if stack.empty? && char == '\\'
              stack.push(char)
            else
              strings << "#{stack.pop}#{char}"
            end
          end
          chars.map do |char|
            char = char.dup
            char.delete!('\\') unless STR_SPECIAL_CHARS.include?(char)
            char
          end.join
        end
      end
    end
  end
end

Version data entries

19 entries across 17 versions & 4 rubygems

Version Path
cm-admin-1.5.22 vendor/bundle/ruby/3.3.0/gems/rubocop-performance-1.14.3/lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
cm-admin-1.5.21 vendor/bundle/ruby/3.3.0/gems/rubocop-performance-1.14.3/lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
cm-admin-1.5.20 vendor/bundle/ruby/3.3.0/gems/rubocop-performance-1.14.3/lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
scrapbook-0.3.2 vendor/ruby/2.7.0/gems/rubocop-performance-1.14.3/lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
scrapbook-0.3.2 vendor/ruby/2.7.0/gems/rubocop-performance-1.18.0/lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
mlh-rubocop-config-1.0.2 vendor/bundle/ruby/3.2.0/gems/rubocop-performance-1.18.0/lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
scrapbook-0.3.1 vendor/ruby/2.7.0/gems/rubocop-performance-1.14.3/lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
scrapbook-0.3.1 vendor/ruby/2.7.0/gems/rubocop-performance-1.18.0/lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.18.0 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.17.1 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.17.0 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.16.0 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.15.2 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.15.1 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.15.0 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.14.3 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.14.2 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.14.1 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb
rubocop-performance-1.14.0 lib/rubocop/cop/performance/redundant_split_regexp_argument.rb