Sha256: 87a7d4a8db2121537ef77b54352545c69ffe64a52460e21bd2d3f6d4cf9688dd

Contents?: true

Size: 1.1 KB

Versions: 10

Compression:

Stored size: 1.1 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.strip.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

10 entries across 10 versions & 1 rubygems

Version Path
slim_lint-0.15.1 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.15.0 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.14.0 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.13.0 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.12.0 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.11.0 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.10.0 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.9.0 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.8.3 lib/slim_lint/filters/inject_line_numbers.rb
slim_lint-0.8.2 lib/slim_lint/filters/inject_line_numbers.rb