public override List <GraphNode <SStatement> > BuildGraphNodes(Graph <SStatement> graph, List <GraphNode <SStatement> > previousNodes) { var currentNode = graph.AddNode(new GraphNode <SStatement>(this)); foreach (var node in previousNodes) { graph.AddDirectedEdge(node, currentNode, 1); } var currentNodes = new List <GraphNode <SStatement> > { currentNode }; var ntrue = IfTrueStatement.BuildGraphNodes(graph, currentNodes); if (ElseStatement != null) { var nfalse = ElseStatement.BuildGraphNodes(graph, currentNodes); ntrue.AddRange(nfalse); } else { ntrue.Add(currentNode); } previousNodes = NextStatement != null?NextStatement.BuildGraphNodes(graph, ntrue) : ntrue; return(previousNodes); }
public override List <GraphNode <SStatement> > BuildGraphNodes(Graph <SStatement> graph, List <GraphNode <SStatement> > previousNodes) { var currentNodes = new List <GraphNode <SStatement> >(); var currentNode = graph.AddNode(new GraphNode <SStatement>(this)); graph.AddDirectedEdges(previousNodes, currentNode, 1); var currentNodeList = new List <GraphNode <SStatement> > { currentNode }; var nextNode = new List <GraphNode <SStatement> >(); if (SwitchStatement != null) { nextNode.AddRange(SwitchStatement.BuildGraphNodes(graph, currentNodeList)); } foreach (var jumpTarget in jumpTargets) { var a = FindNodes(graph, jumpTarget.NextStatement); if (a != null) { foreach (var graphNode in a) { graphNode.Neighbors.Clear(); graphNode.Costs.Clear(); } } AddDirectedEdgeToElements(graph, currentNode.Value, jumpTarget.LabeledStatement); currentNodes.AddRange(FindNodes(graph, jumpTarget.NextStatement)); } currentNodes.AddRange(nextNode); //todo: change default on enum if (jumpTargets.Count(q => q.CodeString == "default") == 0) { currentNodes.Add(currentNode); } if (NextStatement != null) { currentNodes = new List <GraphNode <SStatement> >(NextStatement.BuildGraphNodes(graph, currentNodes)); } return(currentNodes); }