summaryrefslogtreecommitdiff
path: root/lib/irb/color.rb
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2019-10-14 21:58:13 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2019-10-14 21:58:13 -0700
commitc800967acd35a763a6f09fe2b2e29870f064c22e (patch)
tree55383b63885f5abd80528e17ac2bf31a3257fa78 /lib/irb/color.rb
parent96617ad1d57a13e9a282fb663ea73e4801519389 (diff)
Simplify circular reference check of IRB::Color
Diffstat (limited to 'lib/irb/color.rb')
-rw-r--r--lib/irb/color.rb30
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)