コード例 #1
0
        public GraphStructuredProgram(
            Func <TNode> nodesProvider,
            Action <TNode> onNodeRemovedHandler,
            GraphStructuredProgramDump <TNode> dump)
        {
            myNodesProvider        = nodesProvider;
            myOnNodeRemovedHandler = onNodeRemovedHandler;

            Files       = dump.FilesIndex;
            Classes     = dump.ClassesIndex;
            Methods     = dump.MethodsIndex;
            ClassFields = dump.ClassFieldsIndex;
            Attributes  = dump.AttributesIndex;

            myUsedMethodIds = new HashSet <int>();
            myClasses       = dump.Classes;
            myFiles         = dump.Files;

            var nodes = CollectAllMethods()
                        .SelectMany(method => method.GetOwnedNodes());

            AddVertexRange(nodes);
            AddVerticesAndEdgeRange(dump.Edges);

            RestoreBaseClasses();

            foreach (var rootMethodPair in myClasses.Values.SelectMany(@class => @class.Methods()))
            {
                RestoreLocalFunctionsVariables(rootMethodPair.Item2);
            }

            foreach (var method in CollectAllMethods())
            {
                method.ResetAdditionalVariables();

                var containingEdges = method.GetOwnedNodes()
                                      .SelectMany(OutEdges)
                                      .ToList();

                foreach (var edge in containingEdges)
                {
                    if (edge.Statement is InternalStatement internalStatement)
                    {
                        var restored = StatementRestorer.Restore(this, method, internalStatement);
                        base.RemoveEdge(edge);
                        base.AddEdge(new OperationEdge <TNode>(edge.Source, restored, edge.Target));
                    }
                }
            }
        }
コード例 #2
0
        public GraphStructuredProgram(Func <TNode> nodesProvider, Action <TNode> onNodeRemovedHandler)
        {
            Files       = new DenseBidirectionalIndex <string>();
            Classes     = new DenseBidirectionalIndex <string>();
            Methods     = new DenseBidirectionalIndex <string>();
            ClassFields = new DenseBidirectionalIndex <string>();
            Attributes  = new DenseBidirectionalIndex <string>();

            myNodesProvider        = nodesProvider;
            myOnNodeRemovedHandler = onNodeRemovedHandler;

            myUsedMethodIds = new HashSet <int>();

            myFiles   = new Dictionary <int, File>();
            myClasses = new Dictionary <ResolvedClassId, ResolvedClass <TNode> >();
        }
コード例 #3
0
 public GraphStructuredProgramDump(
     List <OperationEdge <TNode> > edges,
     DenseBidirectionalIndex <string> filesIndex,
     DenseBidirectionalIndex <string> classesIndex,
     DenseBidirectionalIndex <string> methodsIndex,
     DenseBidirectionalIndex <string> classFieldsIndex,
     DenseBidirectionalIndex <string> attributesIndex,
     Dictionary <ResolvedClassId, ResolvedClass <TNode> > classes,
     Dictionary <int, File> files)
 {
     Edges            = edges;
     FilesIndex       = filesIndex;
     ClassesIndex     = classesIndex;
     MethodsIndex     = methodsIndex;
     ClassFieldsIndex = classFieldsIndex;
     AttributesIndex  = attributesIndex;
     Classes          = classes;
     Files            = files;
 }