Simplify circular reference check of IRB::Color

This commit is contained in:
Takashi Kokubun 2019-10-14 21:58:13 -07:00
parent 96617ad1d5
commit c800967acd
No known key found for this signature in database
GPG Key ID: 6FFC433B12EE23DD
1 changed files with 14 additions and 16 deletions

View File

@ -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)