Sha256: 4db2807662f3c2e4b67d57e6623fece83737c2a94a44f550a4d0a0755ad47a2b

Contents?: true

Size: 1.09 KB

Versions: 1

Compression:

Stored size: 1.09 KB

Contents

module SlimLint::Filters
  # Traverses a Temple S-expression (that has already been converted to
  # {SlimLint::Sexp} instances) and annotates them with line numbers.
  #
  # This is a hack that allows us to access line information directly from the
  # S-expressions, which makes a lot of other tasks easier.
  class InjectLineNumbers < Temple::Filter
    # {Sexp} representing a newline.
    NEWLINE_SEXP = SlimLint::Sexp.new([:newline])

    # Annotates the given {SlimLint::Sexp} with line number information.
    #
    # @param sexp [SlimLint::Sexp]
    # @return [SlimLint::Sexp]
    def call(sexp)
      @line_number = 1
      traverse(sexp)
      sexp
    end

    private

    # Traverses an {Sexp}, annotating it with line numbers.
    #
    # @param sexp [SlimLint::Sexp]
    def traverse(sexp)
      sexp.line = @line_number

      case sexp
      when SlimLint::Atom
        @line_number += sexp.count("\n") if sexp.respond_to?(:count)
      when NEWLINE_SEXP
        @line_number += 1
      else
        sexp.each do |nested_sexp|
          traverse(nested_sexp)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
slim_lint-0.8.1 lib/slim_lint/filters/inject_line_numbers.rb