[前][次][番号順一覧][スレッド一覧]

ruby-changes:55856

From: Takashi <ko1@a...>
Date: Mon, 27 May 2019 03:08:18 +0900 (JST)
Subject: [ruby-changes:55856] Takashi Kokubun: 897901283c (trunk): Refactor IRB color dispatch

https://git.ruby-lang.org/ruby.git/commit/?id=897901283c

From 897901283c79e5f5f33656abdd453dc272268748 Mon Sep 17 00:00:00 2001
From: Takashi Kokubun <takashikkbn@g...>
Date: Sun, 26 May 2019 10:29:20 -0700
Subject: Refactor IRB color dispatch

The reason why we were checking lexer state in addition to token was
that we do not want to colorize local variable, method call, etc., while
they share the :on_ident token with a name of method definition which
should be colored as blue.

It means that we're concerned about the lexer state only for :on_ident.
Thus we can skip checking lexer state for non-:on_ident tokens. This
refactoring is based on that idea.

Also, now we manage Ripper's lexer state as Integer (use `|` if you
need to check multiple states). It should be faster than using Array of
Integer because #any? block call is not needed.

diff --git a/lib/irb/color.rb b/lib/irb/color.rb
index b0a275c..694835c 100644
--- a/lib/irb/color.rb
+++ b/lib/irb/color.rb
@@ -18,40 +18,44 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/color.rb#L18
       on_kw: ['nil', 'self', 'true', 'false', '__FILE__', '__LINE__'],
       on_const: ['ENV'],
     }
+    private_constant :TOKEN_KEYWORDS
 
     begin
       # Following pry's colors where possible, but sometimes having a compromise like making
       # backtick and regexp as red (string's color, because they're sharing tokens).
       TOKEN_SEQ_EXPRS = {
-        on_CHAR:            [[BLUE, BOLD],            [Ripper::EXPR_END]],
-        on_backtick:        [[RED],                   [Ripper::EXPR_BEG]],
-        on_const:           [[BLUE, BOLD, UNDERLINE], [Ripper::EXPR_ARG, Ripper::EXPR_CMDARG, Ripper::EXPR_ENDFN]],
-        on_embexpr_beg:     [[RED],                   [Ripper::EXPR_BEG, Ripper::EXPR_END, Ripper::EXPR_CMDARG, Ripper::EXPR_FNAME, Ripper::EXPR_ARG]],
-        on_embexpr_end:     [[RED],                   [Ripper::EXPR_BEG, Ripper::EXPR_END, Ripper::EXPR_CMDARG, Ripper::EXPR_ENDFN, Ripper::EXPR_ARG]],
-        on_embvar:          [[RED],                   [Ripper::EXPR_BEG]],
-        on_float:           [[MAGENTA, BOLD],         [Ripper::EXPR_END]],
-        on_heredoc_beg:     [[RED],                   [Ripper::EXPR_BEG]],
-        on_heredoc_end:     [[RED],                   [Ripper::EXPR_BEG]],
-        on_ident:           [[BLUE, BOLD],            [Ripper::EXPR_ENDFN]],
-        on_imaginary:       [[BLUE, BOLD],            [Ripper::EXPR_END]],
-        on_int:             [[BLUE, BOLD],            [Ripper::EXPR_END]],
-        on_kw:              [[GREEN],                 [Ripper::EXPR_ARG, Ripper::EXPR_CLASS, Ripper::EXPR_BEG, Ripper::EXPR_END, Ripper::EXPR_FNAME, Ripper::EXPR_MID]],
-        on_label:           [[MAGENTA],               [Ripper::EXPR_LABELED]],
-        on_label_end:       [[RED],                   [Ripper::EXPR_BEG]],
-        on_qsymbols_beg:    [[RED],                   [Ripper::EXPR_BEG, Ripper::EXPR_CMDARG]],
-        on_qwords_beg:      [[RED],                   [Ripper::EXPR_BEG, Ripper::EXPR_CMDARG]],
-        on_rational:        [[BLUE, BOLD],            [Ripper::EXPR_END]],
-        on_regexp_beg:      [[RED, BOLD],             [Ripper::EXPR_BEG]],
-        on_regexp_end:      [[RED, BOLD],             [Ripper::EXPR_BEG]],
-        on_symbeg:          [[YELLOW],                [Ripper::EXPR_FNAME]],
-        on_tstring_beg:     [[RED],                   [Ripper::EXPR_BEG, Ripper::EXPR_END, Ripper::EXPR_ARG, Ripper::EXPR_CMDARG]],
-        on_tstring_content: [[RED],                   [Ripper::EXPR_BEG, Ripper::EXPR_END, Ripper::EXPR_ARG, Ripper::EXPR_CMDARG, Ripper::EXPR_FNAME]],
-        on_tstring_end:     [[RED],                   [Ripper::EXPR_END]],
-        on_words_beg:       [[RED],                   [Ripper::EXPR_BEG]],
+        on_CHAR:            [[BLUE, BOLD],            :all],
+        on_backtick:        [[RED],                   :all],
+        on_const:           [[BLUE, BOLD, UNDERLINE], :all],
+        on_comment:         [[BLUE, BOLD],            :all],
+        on_embexpr_beg:     [[RED],                   :all],
+        on_embexpr_end:     [[RED],                   :all],
+        on_embvar:          [[RED],                   :all],
+        on_float:           [[MAGENTA, BOLD],         :all],
+        on_heredoc_beg:     [[RED],                   :all],
+        on_heredoc_end:     [[RED],                   :all],
+        on_ident:           [[BLUE, BOLD],            Ripper::EXPR_ENDFN],
+        on_imaginary:       [[BLUE, BOLD],            :all],
+        on_int:             [[BLUE, BOLD],            :all],
+        on_kw:              [[GREEN],                 :all],
+        on_label:           [[MAGENTA],               :all],
+        on_label_end:       [[RED],                   :all],
+        on_qsymbols_beg:    [[RED],                   :all],
+        on_qwords_beg:      [[RED],                   :all],
+        on_rational:        [[BLUE, BOLD],            :all],
+        on_regexp_beg:      [[RED, BOLD],             :all],
+        on_regexp_end:      [[RED, BOLD],             :all],
+        on_symbeg:          [[YELLOW],                :all],
+        on_tstring_beg:     [[RED],                   :all],
+        on_tstring_content: [[RED],                   :all],
+        on_tstring_end:     [[RED],                   :all],
+        on_words_beg:       [[RED],                   :all],
       }
     rescue NameError
+      # Give up highlighting Ripper-incompatible older Ruby
       TOKEN_SEQ_EXPRS = {}
     end
+    private_constant :TOKEN_SEQ_EXPRS
 
     class << self
       def colorable?
@@ -113,13 +117,11 @@ module IRB # :nodoc: https://github.com/ruby/ruby/blob/trunk/lib/irb/color.rb#L117
       private
 
       def dispatch_seq(token, expr, str, in_symbol:)
-        if token == :on_comment
-          [BLUE, BOLD]
-        elsif in_symbol
+        if in_symbol
           [YELLOW]
         elsif TOKEN_KEYWORDS.fetch(token, []).include?(str)
           [CYAN, BOLD]
-        elsif (seq, exprs = TOKEN_SEQ_EXPRS[token]; exprs&.any? { |e| (expr & e) != 0 })
+        elsif (seq, exprs = TOKEN_SEQ_EXPRS[token]; exprs == :all || (exprs != nil && (expr & exprs) != 0))
           seq
         else
           nil
diff --git a/test/irb/test_color.rb b/test/irb/test_color.rb
index 98dfbb1..577c737 100644
--- a/test/irb/test_color.rb
+++ b/test/irb/test_color.rb
@@ -30,7 +30,7 @@ module TestIRB https://github.com/ruby/ruby/blob/trunk/test/irb/test_color.rb#L30
         "['foo', :bar]" => "[#{RED}'#{CLEAR}#{RED}foo#{CLEAR}#{RED}'#{CLEAR}, #{YELLOW}:#{CLEAR}#{YELLOW}bar#{CLEAR}]",
         "class A; end" => "#{GREEN}class#{CLEAR} #{BLUE}#{BOLD}#{UNDERLINE}A#{CLEAR}; #{GREEN}end#{CLEAR}",
         "def self.foo; bar; end" => "#{GREEN}def#{CLEAR} #{CYAN}#{BOLD}self#{CLEAR}.#{BLUE}#{BOLD}foo#{CLEAR}; bar; #{GREEN}end#{CLEAR}",
-        'ERB.new("a#{nil}b", trim_mode: "-")' => "#{BLUE}#{BOLD}#{UNDERLINE}ERB#{CLEAR}.new(#{RED}\"#{CLEAR}#{RED}a#{CLEAR}#{RED}\#{#{CLEAR}#{CYAN}#{BOLD}nil#{CLEAR}#{RED}}#{CLEAR}#{RED}b#{CLEAR}#{RED}\"#{CLEAR}, #{MAGENTA}trim_mode:#{CLEAR} #{RED}\"#{CLEAR}#{RED}-#{CLEAR}#{RED}\"#{CLEAR})",
+        'erb = ERB.new("a#{nil}b", trim_mode: "-")' => "erb = #{BLUE}#{BOLD}#{UNDERLINE}ERB#{CLEAR}.new(#{RED}\"#{CLEAR}#{RED}a#{CLEAR}#{RED}\#{#{CLEAR}#{CYAN}#{BOLD}nil#{CLEAR}#{RED}}#{CLEAR}#{RED}b#{CLEAR}#{RED}\"#{CLEAR}, #{MAGENTA}trim_mode:#{CLEAR} #{RED}\"#{CLEAR}#{RED}-#{CLEAR}#{RED}\"#{CLEAR})",
         "# comment" => "#{BLUE}#{BOLD}# comment#{CLEAR}",
         "yield(hello)" => "#{GREEN}yield#{CLEAR}(hello)",
         '"##@var]"' => "#{RED}\"#{CLEAR}#{RED}##{CLEAR}#{RED}##{CLEAR}@var#{RED}]#{CLEAR}#{RED}\"#{CLEAR}",
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]