From f30a3a06290387dd19c08b48cc7c31a18b359693 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 28 Dec 2020 23:20:26 -0800 Subject: [ruby/irb] Do not colorize partially-correct inspect This is to prevent a yellow-mixed output for ActiveSupport::TimeWithZone. Follows up https://github.com/ruby/irb/pull/159 and https://github.com/ruby/ruby/pull/3967. https://github.com/ruby/irb/commit/a5804c3560bb1de3ea8e40002635bff87f6a2825 --- lib/irb/color.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'lib/irb/color.rb') diff --git a/lib/irb/color.rb b/lib/irb/color.rb index e3f4a1d475..eb157be71d 100644 --- a/lib/irb/color.rb +++ b/lib/irb/color.rb @@ -71,6 +71,9 @@ module IRB # :nodoc: end private_constant :TOKEN_SEQ_EXPRS + ERROR_TOKENS = TOKEN_SEQ_EXPRS.keys.select { |k| k.to_s.end_with?('error') } + private_constant :ERROR_TOKENS + class << self def colorable? $stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb')) @@ -119,6 +122,11 @@ module IRB # :nodoc: length = 0 scan(code, allow_last_error: !complete) do |token, str, expr| + # IRB::ColorPrinter skips colorizing fragments with any invalid token + if ignore_error && ERROR_TOKENS.include?(token) + return Reline::Unicode.escape_for_print(code) + end + in_symbol = symbol_state.scan_token(token) str.each_line do |line| line = Reline::Unicode.escape_for_print(line) @@ -188,7 +196,7 @@ module IRB # :nodoc: end def dispatch_seq(token, expr, str, in_symbol:, ignore_error:) - if token == :on_parse_error or token == :compile_error + if ERROR_TOKENS.include?(token) ignore_error ? nil : TOKEN_SEQ_EXPRS[token][0] elsif in_symbol [YELLOW] -- cgit v1.2.3