mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
6361928083
[fix GH-668] * test/rake/*.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46818 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
56 lines
1.2 KiB
Ruby
56 lines
1.2 KiB
Ruby
module Rake
|
|
|
|
# InvocationChain tracks the chain of task invocations to detect
|
|
# circular dependencies.
|
|
class InvocationChain < LinkedList
|
|
|
|
# Is the invocation already in the chain?
|
|
def member?(invocation)
|
|
head == invocation || tail.member?(invocation)
|
|
end
|
|
|
|
# Append an invocation to the chain of invocations. It is an error
|
|
# if the invocation already listed.
|
|
def append(invocation)
|
|
if member?(invocation)
|
|
fail RuntimeError, "Circular dependency detected: #{to_s} => #{invocation}"
|
|
end
|
|
conj(invocation)
|
|
end
|
|
|
|
# Convert to string, ie: TOP => invocation => invocation
|
|
def to_s
|
|
"#{prefix}#{head}"
|
|
end
|
|
|
|
# Class level append.
|
|
def self.append(invocation, chain)
|
|
chain.append(invocation)
|
|
end
|
|
|
|
private
|
|
|
|
def prefix
|
|
"#{tail.to_s} => "
|
|
end
|
|
|
|
# Null object for an empty chain.
|
|
class EmptyInvocationChain < LinkedList::EmptyLinkedList
|
|
@parent = InvocationChain
|
|
|
|
def member?(obj)
|
|
false
|
|
end
|
|
|
|
def append(invocation)
|
|
conj(invocation)
|
|
end
|
|
|
|
def to_s
|
|
"TOP"
|
|
end
|
|
end
|
|
|
|
EMPTY = EmptyInvocationChain.new
|
|
end
|
|
end
|