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)); } } } }
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> >(); }
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; }