public void FinishOperations() { AllStructs.ForEach(dict => { foreach (var pair in dict) { if (pair.Value == null) { continue; } var endStruct = ingressEndStructs[pair.Key]; foreach (var headerPair in pair.Value.Headers) { var headerForEndStruct = endStruct.Headers[headerPair.Key]; headerPair.Value.Variables.ForEach(headerPairVariable => { headerForEndStruct.Variables.ForEach(headerForEndStructVariable => { if (headerPairVariable.Modified && headerForEndStructVariable.IsInitialize) { headerPairVariable.Modified = false; ++headerPairVariable.ModifiedAndUse; } }); }); } } }); ControlFlowGraph.Nodes.ForEach(node => { var dataFlowGraphNodes = DataFlowGraph.Nodes.Where(x => x.ParentId == node.Id).ToList(); if (dataFlowGraphNodes.Count == 1) { node.FillColor = dataFlowGraphNodes.First().FillColor; } else if (dataFlowGraphNodes.Any()) { var colors = dataFlowGraphNodes.Select(x => x.FillColor).Distinct().Except(new List <Color> { Color.Black, Color.White }).ToList(); if (colors.Count == 1) { node.FillColor = colors.First(); } else if (colors.Any()) { node.FillColor = Color.Yellow; } } }); }
private void NodeAnalyze(Node node, List <Dictionary <string, Struct> > ingressStartStructsLists) { ++node.Use; var correct = true; var addAllStruct = true; ingressStartStructsLists.ForEach(x => { switch (node.Type) { case NodeType.If: (correct, addAllStruct) = IfAnalyze(node, x); break; case NodeType.Table: correct = TableAnalyze(node, x); break; case NodeType.Action: var dataFlowGraphNodesAction = DataFlowGraph.Nodes.Where(y => y.ParentId == node.Id).ToList(); if (dataFlowGraphNodesAction.Any()) { correct = ActionAnalyze(dataFlowGraphNodesAction, x, dataFlowGraphNodesAction.MainNodes().FirstOrDefault()); } correct = true; break; case NodeType.ActionMethod: var dataFlowGraphNodesActionMethod = DataFlowGraph.Nodes.Where(y => y.ParentId == node.Id).ToList(); if (dataFlowGraphNodesActionMethod.Any()) { correct = ActionAnalyze(dataFlowGraphNodesActionMethod, x, dataFlowGraphNodesActionMethod.MainNodes().FirstOrDefault()); } correct = true; break; default: node.FillColor = Color.Green; break; } }); if (correct) { node.FillColor = Color.Green; } if (correct && node.Text != "End") { foreach (var edge in node.Edges) { edge.Color = Color.Green; var toChild = new List <Dictionary <string, Struct> >(); ingressStartStructsLists.ForEach(x => { toChild.Add(Copy(x)); }); NodeAnalyze(edge.Child, toChild); } } else if (addAllStruct) { AllStructs.AddRange(ingressStartStructsLists); } }