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