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