Simplify circular reference check of IRB::Color
This commit is contained in:
parent
96617ad1d5
commit
c800967acd
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user