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

View File

@ -70,30 +70,20 @@ module IRB # :nodoc:
$stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb')) $stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb'))
end end
def inspect_colorable?(obj, seen = {}) def inspect_colorable?(obj, seen: {})
case obj case obj
when String, Symbol, Regexp, Integer, Float, FalseClass, TrueClass, NilClass when String, Symbol, Regexp, Integer, Float, FalseClass, TrueClass, NilClass
true true
when Hash when Hash
if seen.has_key?(obj.object_id) without_circular_ref(obj, seen: seen) do
false obj.all? { |k, v| inspect_colorable?(k, seen: seen) && inspect_colorable?(v, seen: seen) }
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
end end
when Array when Array
if seen.has_key?(obj.object_id) without_circular_ref(obj, seen: seen) do
false obj.all? { |o| inspect_colorable?(o, seen: seen) }
else
seen[obj.object_id] = true
colorable = obj.all? { |o| inspect_colorable?(o, seen) }
seen.delete(obj.object_id)
colorable
end end
when Range 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 when Module
!obj.name.nil? !obj.name.nil?
else else
@ -146,6 +136,14 @@ module IRB # :nodoc:
private 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+ # Ripper::Lexer::Elem#state is supported on Ruby 2.5+
def supported? def supported?
return @supported if defined?(@supported) return @supported if defined?(@supported)