mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
d001539a05
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32217 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
51 lines
962 B
Ruby
51 lines
962 B
Ruby
module Rake
|
|
|
|
####################################################################
|
|
# InvocationChain tracks the chain of task invocations to detect
|
|
# circular dependencies.
|
|
class InvocationChain
|
|
def initialize(value, tail)
|
|
@value = value
|
|
@tail = tail
|
|
end
|
|
|
|
def member?(obj)
|
|
@value == obj || @tail.member?(obj)
|
|
end
|
|
|
|
def append(value)
|
|
if member?(value)
|
|
fail RuntimeError, "Circular dependency detected: #{to_s} => #{value}"
|
|
end
|
|
self.class.new(value, self)
|
|
end
|
|
|
|
def to_s
|
|
"#{prefix}#{@value}"
|
|
end
|
|
|
|
def self.append(value, chain)
|
|
chain.append(value)
|
|
end
|
|
|
|
private
|
|
|
|
def prefix
|
|
"#{@tail.to_s} => "
|
|
end
|
|
|
|
class EmptyInvocationChain
|
|
def member?(obj)
|
|
false
|
|
end
|
|
def append(value)
|
|
InvocationChain.new(value, self)
|
|
end
|
|
def to_s
|
|
"TOP"
|
|
end
|
|
end
|
|
|
|
EMPTY = EmptyInvocationChain.new
|
|
end
|
|
end
|