DIRECTORY AMModel, Atom, Graphs, Rope, VM, WorldVM; DirectedModuleGraphs: CEDAR PROGRAM IMPORTS AMModel, Atom, Graphs, Rope, VM, WorldVM = BEGIN ROPE: TYPE = Rope.ROPE; vertexKey: ATOM _ Atom.MakeAtom["Spreitzer January 5, 1984 6:48 pm"]; worldContext: AMModel.Context; NewModuleVertex: PROC [moduleName: ROPE] RETURNS [vertex: Graphs.Vertex] = { vertex _ [moduleName, moduleVertexClass]; }; GetLabel: PROC [vertex: Graphs.Vertex] RETURNS [label: ROPE] --Graphs.GetLabelProc-- = { label _ NARROW[vertex.rep]}; ExpandModule: PROC [vertex: Graphs.Vertex, Consume: Graphs.EdgeConsumer, filter: Graphs.DirectionFilter _ Graphs.allDirections] --Graphs.ExpandProc-- = { moduleName: ROPE = NARROW[vertex.rep]; IF filter[Incoming] THEN { context: AMModel.Context; imports: LIST OF AMModel.PartialInterfaceInstance; TRUSTED {context _ AMModel.MostRecentNamedContext[name: moduleName, context: worldContext]}; IF context = NIL THEN RETURN; TRUSTED {imports _ AMModel.Imports[context !VM.AddressFault => CONTINUE]}; FOR imports _ imports, imports.rest WHILE imports # NIL DO name: ROPE; TRUSTED {name _ AMModel.ContextName[imports.first.ir]}; Consume[Graphs.dullEdge, Incoming, NewInterfaceVertex[name]]; ENDLOOP; }; IF filter[Outgoing] THEN { context: AMModel.Context; exports: LIST OF AMModel.PartialInterfaceInstance; TRUSTED {context _ AMModel.MostRecentNamedContext[name: moduleName, context: worldContext]}; IF context = NIL THEN RETURN; TRUSTED {exports _ AMModel.Exports[context !VM.AddressFault => CONTINUE]}; FOR exports _ exports, exports.rest WHILE exports # NIL DO name: ROPE; TRUSTED {name _ AMModel.ContextName[exports.first.ir]}; Consume[Graphs.dullEdge, Outgoing, NewInterfaceVertex[name]]; ENDLOOP; }; }; NewInterfaceVertex: PROC [moduleName: ROPE] RETURNS [vertex: Graphs.Vertex] = { vertex _ [moduleName, interfaceVertexClass]}; ExpandInterface: PROC [vertex: Graphs.Vertex, Consume: Graphs.EdgeConsumer, filter: Graphs.DirectionFilter _ Graphs.allDirections] --Graphs.ExpandProc-- = { interfaceName: ROPE = NARROW[vertex.rep]; FindInterface: PROC [prog: AMModel.Context] RETURNS [stop: BOOLEAN] = BEGIN progName: ROPE; imports, exports: LIST OF AMModel.PartialInterfaceInstance _ NIL; stop _ FALSE; IF filter[Incoming] THEN { TRUSTED {exports _ AMModel.Exports[prog !VM.AddressFault => CONTINUE]}; FOR exports _ exports, exports.rest WHILE exports # NIL DO name: ROPE; TRUSTED {name _ AMModel.ContextName[exports.first.ir]}; IF name.Equal[interfaceName] THEN { TRUSTED {progName _ AMModel.ContextName[prog]}; Consume[Graphs.dullEdge, Incoming, NewModuleVertex[progName]]; EXIT}; ENDLOOP; }; IF filter[Outgoing] THEN { TRUSTED {imports _ AMModel.Imports[prog !VM.AddressFault => CONTINUE]}; FOR imports _ imports, imports.rest WHILE imports # NIL DO name: ROPE; TRUSTED {name _ AMModel.ContextName[imports.first.ir]}; IF name.Equal[interfaceName] THEN { IF progName = NIL THEN TRUSTED {progName _ AMModel.ContextName[prog]}; Consume[Graphs.dullEdge, Outgoing, NewModuleVertex[progName]]; EXIT}; ENDLOOP; }; END; TRUSTED {[] _ AMModel.ContextChildren[context: worldContext, proc: FindInterface]}; }; moduleVertexClass: Graphs.VertexClass _ Graphs.NewVertexClass[[ Expand: ExpandModule, GetLabel: GetLabel ]]; interfaceVertexClass: Graphs.VertexClass _ Graphs.NewVertexClass[[ Expand: ExpandInterface, GetLabel: GetLabel ]]; TRUSTED {worldContext _ AMModel.RootContext[WorldVM.LocalWorld[]]}; END. _ &b _ GraphBrowsers.Browse[vertex: &dmg _ DirectedModuleGraphs.NewModuleVertex["DirectedModuleGraphs"], browserClass: GraphBrowsers.basicBrowserClass, viewerInit: [name: "DirectedModuleGraphs", iconic: FALSE]] RDirectedModuleGraphs.Mesa Mike Spreitzer September 27, 1986 3:20:11 pm PDT สI– "cedar" style˜™Icode™0—J˜Kšฯk œœ ˜3K˜šัbnxœœ˜#Kšœœ ˜0Kšœ˜—K˜Kš˜K˜Kšœœœ˜K˜Kšœ œ6˜EK˜Kšœ˜K˜šฯnœœœœ˜LKšœ)˜)Kšœ˜—K˜š Ÿœœœ œฯcœ˜XKšœœ˜—K˜šŸ œœŸœN œ˜™Kšœ œœ ˜&šœœ˜Kšœ˜Kšœ œœ"˜2KšœU˜\Kšœ œœœ˜Kšœ%œœ˜Jšœ!œ œ˜:Kšœœ˜ Kšœ0˜7Kšœ=˜=Kšœ˜—K˜—šœœ˜Kšœ˜Kšœ œœ"˜2KšœU˜\Kšœ œœœ˜Kšœ%œœ˜Jšœ!œ œ˜:Kšœœ˜ Kšœ0˜7Kšœ=˜=Kšœ˜—K˜—Kšœ˜—K˜šŸœœœœ˜OKšœ-˜-—K˜šŸœœŸœN œ˜œKšœœœ ˜)šŸ œœœœ˜EKš˜Kšœ œ˜Kšœœœ$œ˜AKšœœ˜ šœœ˜Kšœ"œœ˜Gšœ!œ œ˜:Kšœœ˜ Kšœ0˜7šœœ˜#Kšœ(˜/Kšœ>˜>Kšœ˜—Kšœ˜—K˜—šœœ˜Kšœ"œœ˜Gšœ!œ œ˜:Kšœœ˜ Kšœ0˜7šœœ˜#Kšœ œœœ(˜FKšœ>˜>Kšœ˜—Kšœ˜—K˜—Kšœ˜—KšœL˜SKšœ˜—K˜šœ?˜?KšŸœ˜KšŸœ ˜K˜—K˜šœB˜BKšŸœ˜K˜K˜—K˜Kšœ<˜CK˜Kšœ˜K˜Kšœา˜า—…—2อ