Пример #1
0
        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;
                    }
                }
            });
        }
Пример #2
0
        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);
            }
        }