1
0
Fork 0
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:
Takashi Kokubun 2019-05-31 06:17:56 +09:00
parent 8f83fe3b02
commit 6e052817f9
No known key found for this signature in database
GPG key ID: 6FFC433B12EE23DD

View file

@ -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]