summaryrefslogtreecommitdiff
path: root/lib/irb/color.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-12-28 23:20:26 -0800
committerTakashi Kokubun <takashikkbn@gmail.com>2020-12-28 23:29:08 -0800
commitf30a3a06290387dd19c08b48cc7c31a18b359693 (patch)
treef1c96d3aba25e94e24ac3cfb039ced8776756f3c /lib/irb/color.rb
parent9b7ceb676540d0061b2a31fee2da84ae31f93bae (diff)
[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
Diffstat (limited to 'lib/irb/color.rb')
-rw-r--r--lib/irb/color.rb10
1 files changed, 9 insertions, 1 deletions
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]