Sha256: ae5dfccf6947ebc55b4ab9e31ee43bf0145d83050d44350c1eb13d827fecdb9a
Contents?: true
Size: 1.84 KB
Versions: 2
Compression:
Stored size: 1.84 KB
Contents
# frozen_string_literal: true module RuboCop module Cop module Lint # Do not mix named captures and numbered captures in a Regexp literal # because numbered capture is ignored if they're mixed. # Replace numbered captures with non-capturing groupings or # named captures. # # # bad # /(?<foo>FOO)(BAR)/ # # # good # /(?<foo>FOO)(?<bar>BAR)/ # # # good # /(?<foo>FOO)(?:BAR)/ # # # good # /(FOO)(BAR)/ # class MixedRegexpCaptureTypes < Base MSG = 'Do not mix named captures and numbered captures ' \ 'in a Regexp literal.' def on_regexp(node) return if contain_non_literal?(node) begin tree = Regexp::Parser.parse(node.content) # Returns if a regular expression that cannot be processed by regexp_parser gem. # https://github.com/rubocop-hq/rubocop/issues/8083 rescue Regexp::Scanner::ScannerError return end return unless named_capture?(tree) return unless numbered_capture?(tree) add_offense(node) end private def contain_non_literal?(node) if node.respond_to?(:type) && (node.variable? || node.send_type? || node.const_type?) return true end return false unless node.respond_to?(:children) node.children.any? { |child| contain_non_literal?(child) } end def named_capture?(tree) tree.each_expression.any? do |e| e.instance_of?(Regexp::Expression::Group::Capture) end end def numbered_capture?(tree) tree.each_expression.any? do |e| e.instance_of?(Regexp::Expression::Group::Named) end end end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
rubocop-0.89.1 | lib/rubocop/cop/lint/mixed_regexp_capture_types.rb |
rubocop-0.89.0 | lib/rubocop/cop/lint/mixed_regexp_capture_types.rb |