diff options
Diffstat (limited to 'lib/rake/invocation_chain.rb')
-rw-r--r-- | lib/rake/invocation_chain.rb | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/lib/rake/invocation_chain.rb b/lib/rake/invocation_chain.rb index 8a01ab4c29..dae9a35915 100644 --- a/lib/rake/invocation_chain.rb +++ b/lib/rake/invocation_chain.rb @@ -3,44 +3,50 @@ 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 |