class Parser::Runner::RubyParse::LocationProcessor

Public Instance Methods

process(node) click to toggle source
Calls superclass method
# File lib/parser/runner/ruby_parse.rb, line 9
def process(node)
  if node
    p node

    source_line_no = nil
    source_line    = ''
    hilight_line   = ''

    print_line = lambda do
      unless hilight_line.empty?
        puts hilight_line.
          gsub(/[a-z_]+/) { |m| "\e[1;33m#{m}\e[0m" }.
          gsub(/[~.]+/)   { |m| "\e[1;35m#{m}\e[0m" }
        hilight_line = ''
      end
    end

    print_source = lambda do |range|
      source_line = range.source_line
      puts "\e[32m#{source_line}\e[0m"
      source_line
    end

    (node.loc || {}).to_hash.
      sort_by do |name, range|
        [(range ? range.line : 0),
         (name == :expression ? 1 : 0)]
      end.
      each do |name, range|
        next if range.nil?

        if source_line_no != range.line
          print_line.call()
          source_line    = print_source.call(range)
          source_line_no = range.line
        end

        beg_col = range.begin.column

        if beg_col + range.length > source_line.length
          multiline    = true
          range_length = source_line.length - beg_col + 3
        else
          multiline    = false
          range_length = range.length
        end

        length  = range_length + 1 + name.length
        end_col = beg_col + length

        if beg_col > 0
          col_range = (beg_col - 1)...end_col
        else
          col_range = beg_col...end_col
        end

        if hilight_line.length < end_col
          hilight_line = hilight_line.ljust(end_col)
        end

        if hilight_line[col_range] =~ /^\s*$/
          if multiline
            tail = ('~' * (source_line.length - beg_col)) + '...'
          else
            tail = '~' * range_length
          end

          tail = ' ' + tail if beg_col > 0

          hilight_line[col_range] = tail + " #{name}"
        else
          print_line.call
          redo
        end
      end

    print_line.call
  end

  super
end