sds/scss-lint

View on GitHub
lib/scss_lint/linter/qualifying_element.rb

Summary

Maintainability
A
45 mins
Test Coverage
module SCSSLint
  # Checks for element selectors qualifying id, classes, or attribute selectors.
  class Linter::QualifyingElement < Linter
    include LinterRegistry

    def visit_simple_sequence(seq)
      return unless seq_contains_sel_class?(seq, Sass::Selector::Element)
      check_id(seq) unless config['allow_element_with_id']
      check_class(seq) unless config['allow_element_with_class']
      check_attribute(seq) unless config['allow_element_with_attribute']
    end

  private

    # Checks if a simple sequence contains a
    # simple selector of a certain class.
    #
    # @param seq [Sass::Selector::SimpleSequence]
    # @param selector_class [Sass::Selector::Simple]
    # @returns [Boolean]
    def seq_contains_sel_class?(seq, selector_class)
      seq.members.any? do |simple|
        simple.is_a?(selector_class)
      end
    end

    def check_id(seq)
      return unless seq_contains_sel_class?(seq, Sass::Selector::Id)
      add_lint(seq.line, 'Avoid qualifying id selectors with an element.')
    end

    def check_class(seq)
      return unless seq_contains_sel_class?(seq, Sass::Selector::Class)
      add_lint(seq.line, 'Avoid qualifying class selectors with an element.')
    end

    def check_attribute(seq)
      return unless seq_contains_sel_class?(seq, Sass::Selector::Attribute)
      add_lint(seq.line, 'Avoid qualifying attribute selectors with an element.')
    end
  end
end