<> <> 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]]