diff options
Diffstat (limited to 'lib/irb/color.rb')
-rw-r--r-- | lib/irb/color.rb | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/irb/color.rb b/lib/irb/color.rb index 0f49291d85..a054bb20f8 100644 --- a/lib/irb/color.rb +++ b/lib/irb/color.rb @@ -17,7 +17,7 @@ module IRB # :nodoc: CYAN = 36 TOKEN_KEYWORDS = { - on_kw: ['nil', 'self', 'true', 'false', '__FILE__', '__LINE__'], + on_kw: ['nil', 'self', 'true', 'false', '__FILE__', '__LINE__', '__ENCODING__'], on_const: ['ENV'], } private_constant :TOKEN_KEYWORDS @@ -60,6 +60,10 @@ module IRB # :nodoc: on_words_beg: [[RED, BOLD], ALL], on_parse_error: [[RED, REVERSE], ALL], compile_error: [[RED, REVERSE], ALL], + on_assign_error: [[RED, REVERSE], ALL], + on_alias_error: [[RED, REVERSE], ALL], + on_class_name_error:[[RED, REVERSE], ALL], + on_param_error: [[RED, REVERSE], ALL], } rescue NameError # Give up highlighting Ripper-incompatible older Ruby @@ -67,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')) @@ -107,7 +114,7 @@ module IRB # :nodoc: # If `complete` is false (code is incomplete), this does not warn compile_error. # This option is needed to avoid warning a user when the compile_error is happening # because the input is not wrong but just incomplete. - def colorize_code(code, complete: true) + def colorize_code(code, complete: true, ignore_error: false) return code unless colorable? symbol_state = SymbolState.new @@ -115,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) @@ -180,11 +192,12 @@ module IRB # :nodoc: end end end + ensure $VERBOSE = verbose end def dispatch_seq(token, expr, str, in_symbol:) - if token == :on_parse_error or token == :compile_error + if ERROR_TOKENS.include?(token) TOKEN_SEQ_EXPRS[token][0] elsif in_symbol [YELLOW] |