class Parser::Runner::RubyParse::LocationProcessor

def process(node)

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