mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Abstract away Ripper::Lexer#scan in IRB::Color#scan
because 5b64d7ac6e
made it hard to
understand #colorize_code for me and this change is needed for my next
commit.
This commit is contained in:
parent
8f83fe3b02
commit
6e052817f9
1 changed files with 21 additions and 16 deletions
|
@ -98,31 +98,16 @@ module IRB # :nodoc:
|
|||
"#{seq}#{text}#{clear}"
|
||||
end
|
||||
|
||||
def scan(code)
|
||||
Ripper::Lexer.new(code).scan
|
||||
end
|
||||
|
||||
def colorize_code(code)
|
||||
return code unless colorable?
|
||||
|
||||
symbol_state = SymbolState.new
|
||||
colored = +''
|
||||
length = 0
|
||||
pos = [1, 0]
|
||||
|
||||
scan(code).each do |elem|
|
||||
token = elem.event
|
||||
str = elem.tok
|
||||
expr = elem.state
|
||||
scan(code) do |token, str, expr|
|
||||
in_symbol = symbol_state.scan_token(token)
|
||||
next if ([elem.pos[0], elem.pos[1] + str.bytesize] <=> pos) <= 0
|
||||
str.each_line do |line|
|
||||
if line.end_with?("\n")
|
||||
pos[0] += 1
|
||||
pos[1] = 0
|
||||
else
|
||||
pos[1] += line.bytesize
|
||||
end
|
||||
line = Reline::Unicode.escape_for_print(line)
|
||||
if seq = dispatch_seq(token, expr, line, in_symbol: in_symbol)
|
||||
colored << seq.map { |s| "\e[#{s}m" }.join('')
|
||||
|
@ -142,6 +127,26 @@ module IRB # :nodoc:
|
|||
|
||||
private
|
||||
|
||||
def scan(code)
|
||||
pos = [1, 0]
|
||||
|
||||
Ripper::Lexer.new(code).scan.each do |elem|
|
||||
str = elem.tok
|
||||
next if ([elem.pos[0], elem.pos[1] + str.bytesize] <=> pos) <= 0
|
||||
|
||||
str.each_line do |line|
|
||||
if line.end_with?("\n")
|
||||
pos[0] += 1
|
||||
pos[1] = 0
|
||||
else
|
||||
pos[1] += line.bytesize
|
||||
end
|
||||
end
|
||||
|
||||
yield(elem.event, str, elem.state)
|
||||
end
|
||||
end
|
||||
|
||||
def dispatch_seq(token, expr, str, in_symbol:)
|
||||
if token == :on_parse_error or token == :compile_error
|
||||
TOKEN_SEQ_EXPRS[token][0]
|
||||
|
|
Loading…
Add table
Reference in a new issue