mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
e47fec1f86
[Feature #10174][ruby-core:64584] * lib/erb.rb: ditto. * lib/observer.rb: ditto. * lib/rake/invocation_chain.rb: ditto. * lib/rubygems/command_manager.rb: ditto. * lib/rubygems/config_file.rb: ditto. * lib/uri/common.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47299 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} => "
|
|
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
|