private void Visit(BfsTopologicalNode node) { //If the node was found in the depth stack, report an error as this means a circular dependence was found. if (stackVisitedNodes.Contains(node)) { List<BfsTopologicalNode> reversed = new List<BfsTopologicalNode>(stackVisitedNodes); reversed.Reverse(); StringBuilder b = new StringBuilder("A circular depencence was detected: "); foreach (BfsTopologicalNode topoNode in reversed) b.Append( topoNode.NamedField.Name + " -> "); b.Append(node.NamedField.Name); BfsCompiler.ReportError(node.NamedField.SourceRange,b.ToString()); } if (!node.Visited) { node.Visited = true; stackVisitedNodes.Push(node); foreach (BfsTopologicalNode subnode in node.Nodes) Visit(subnode); stackVisitedNodes.Pop(); if(this.nodes.Contains(node)) resultList.Add(node.NamedField); } }
private BfsTopologicalNode GetTopoNode(IBfsNamedField namedField) { if (topoDictionary.ContainsKey(namedField)) return topoDictionary[namedField]; BfsTopologicalNode newNode = new BfsTopologicalNode(namedField); topoDictionary.Add(namedField, newNode); return newNode; }