diff options
author | Takashi Kokubun <takashikkbn@gmail.com> | 2019-10-14 21:58:13 -0700 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2019-10-14 21:58:13 -0700 |
commit | c800967acd35a763a6f09fe2b2e29870f064c22e (patch) | |
tree | 55383b63885f5abd80528e17ac2bf31a3257fa78 /lib/irb/color.rb | |
parent | 96617ad1d57a13e9a282fb663ea73e4801519389 (diff) | |
download | ruby-c800967acd35a763a6f09fe2b2e29870f064c22e.tar.gz |
Simplify circular reference check of IRB::Color
Diffstat (limited to 'lib/irb/color.rb')
-rw-r--r-- | lib/irb/color.rb | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/lib/irb/color.rb b/lib/irb/color.rb index 32de6cdbea..fbcb0bda6d 100644 --- a/lib/irb/color.rb +++ b/lib/irb/color.rb @@ -70,30 +70,20 @@ module IRB # :nodoc: $stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb')) end - def inspect_colorable?(obj, seen = {}) + def inspect_colorable?(obj, seen: {}) case obj when String, Symbol, Regexp, Integer, Float, FalseClass, TrueClass, NilClass true when Hash - if seen.has_key?(obj.object_id) - false - else - seen[obj.object_id] = true - colorable = obj.all? { |k, v| inspect_colorable?(k, seen) && inspect_colorable?(v, seen) } - seen.delete(obj.object_id) - colorable + without_circular_ref(obj, seen: seen) do + obj.all? { |k, v| inspect_colorable?(k, seen: seen) && inspect_colorable?(v, seen: seen) } end when Array - if seen.has_key?(obj.object_id) - false - else - seen[obj.object_id] = true - colorable = obj.all? { |o| inspect_colorable?(o, seen) } - seen.delete(obj.object_id) - colorable + without_circular_ref(obj, seen: seen) do + obj.all? { |o| inspect_colorable?(o, seen: seen) } end when Range - inspect_colorable?(obj.begin, seen) && inspect_colorable?(obj.end, seen) + inspect_colorable?(obj.begin, seen: seen) && inspect_colorable?(obj.end, seen: seen) when Module !obj.name.nil? else @@ -146,6 +136,14 @@ module IRB # :nodoc: private + def without_circular_ref(obj, seen:, &block) + return false if seen.key?(obj.object_id) + seen[obj.object_id] = true + block.call + ensure + seen.delete(obj.object_id) + end + # Ripper::Lexer::Elem#state is supported on Ruby 2.5+ def supported? return @supported if defined?(@supported) |