lib/rake/invocation_chain.rb in rake-10.1.0.beta.1 vs lib/rake/invocation_chain.rb in rake-10.1.0.beta.2
- old
+ new
@@ -1,47 +1,51 @@
module Rake
####################################################################
# InvocationChain tracks the chain of task invocations to detect
# circular dependencies.
- class InvocationChain
- def initialize(value, tail)
- @value = value
- @tail = tail
- end
+ class InvocationChain < LinkedList
- def member?(obj)
- @value == obj || @tail.member?(obj)
+ # Is the invocation already in the chain?
+ def member?(invocation)
+ head == invocation || tail.member?(invocation)
end
- def append(value)
- if member?(value)
- fail RuntimeError, "Circular dependency detected: #{to_s} => #{value}"
+ # 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
- self.class.new(value, self)
+ conj(invocation)
end
+ # Convert to string, ie: TOP => invocation => invocation
def to_s
- "#{prefix}#{@value}"
+ "#{prefix}#{head}"
end
- def self.append(value, chain)
- chain.append(value)
+ # Class level append.
+ def self.append(invocation, chain)
+ chain.append(invocation)
end
private
def prefix
- "#{@tail.to_s} => "
+ "#{tail.to_s} => "
end
- class EmptyInvocationChain
+ # Null object for an empty chain.
+ class EmptyInvocationChain < LinkedList::EmptyLinkedList
+ @parent = InvocationChain
+
def member?(obj)
false
end
- def append(value)
- InvocationChain.new(value, self)
+ def append(invocation)
+ conj(invocation)
end
def to_s
"TOP"
end