public void Write(DotWriter dotWriter, IDictionary <string, Binding> allBindings)
{
var nameIndex = GetNodeNames(allBindings);
var visited = new HashSet <Binding>();
var q = new Queue <Tuple <Binding, string> >(nameIndex.Select(kvp => Tuple.Create(kvp.Key, kvp.Value)));
dotWriter.BeginGraph("cluster", "true");
while (q.Count > 0)
{
var current = q.Dequeue();
if (visited.Contains(current.Item1))
{
continue;
}
var binding = current.Item1;
var sourceName = current.Item2;
var dependencies = new HashSet <Binding>();
binding.GetDependencies(dependencies, dependencies);
foreach (var dependency in dependencies)
{
string targetName;
if (nameIndex.TryGetValue(dependency, out targetName))
{
dotWriter.WriteEdge(sourceName, targetName);
q.Enqueue(Tuple.Create(dependency, targetName));
}
else if (binding is CompilerSetBinding)
{
var providesBinding = Unwrap(dependency);
var gen = providesBinding.Generator;
var name = gen.Key + " (" + gen.ProviderMethod.Name + ")";
dotWriter.WriteEdge(sourceName, name);
q.Enqueue(Tuple.Create(dependency, name));
}
else
{
dotWriter.WriteEdge(sourceName, "Unbound: " + dependency.ProviderKey);
}
}
visited.Add(binding);
}
dotWriter.EndGraph();
}