<> <> <> <> DIRECTORY CD, CDDirectory, CDGenerate, CDGenerateBackdoor, CDGenerateImports, CDImports, FileNames, RefTab, Rope, SymTab, TerminalIO; CDGenerateImportsImpl: CEDAR PROGRAM IMPORTS CDDirectory, CDGenerate, CDGenerateBackdoor, CDImports, FileNames, RefTab, Rope, SymTab, TerminalIO EXPORTS CDGenerateImports SHARES CDImports = BEGIN <<--directory>> <<>> DirectorySelector: CDGenerateBackdoor.SelectorProc = { key _ TerminalIO.RequestRope[" from directory>"]; }; DirectoryIndirector: CDGenerateBackdoor.IGeneratorProc = { IF Rope.IsEmpty[key] THEN key _ TerminalIO.RequestRope["type name >"]; RETURN [CDDirectory.Fetch[design, key].object] }; <<>> <<--imports>> dummy: CDGenerate.Context _ CDGenerate.Create[]; contextToName: RefTab.Ref _ RefTab.Create[]; nameToContext: SymTab.Ref _ SymTab.Create[]; UnspecSelector: CDGenerateBackdoor.SelectorProc = { key _ TerminalIO.RequestRope[" import [design.object] >"]; }; Selector: CDGenerateBackdoor.SelectorProc = { dName: Rope.ROPE = ImporteeName[context]; key _ TerminalIO.RequestRope[Rope.Cat[label, " import object from ", dName, " >"]]; }; ImportIGenerator: CDGenerateBackdoor.IGeneratorProc = { importeeName: Rope.ROPE _ ImporteeName[realContext]; IF Rope.IsEmpty[importeeName] THEN { TerminalIO.PutRope["**generate with bad importee name\n"]; RETURN }; IF Rope.Equal[importeeName, design.name] THEN { ob _ CDDirectory.Fetch[design, key].object; RETURN }; [] _ CDImports.GetCache[design, importeeName, true]; ob _ CDImports.CreateImportFromCache[design, key, importeeName]; }; UnspecImportIGenerator: CDGenerateBackdoor.IGeneratorProc = { dotIndex: INT; importeeName, objectName: Rope.ROPE _ NIL; name: Rope.ROPE _ FileNames.GetShortName[key]; dotIndex _ Rope.Index[name, 0, "."]; --the first dot! multiple dots belong to the object name IF dotIndex r _ n ENDCASE => { context _ CDGenerateBackdoor.Indiretee[context]; IF context#NIL THEN RETURN[ImporteeName[context]] }; }; GetImportContext: PUBLIC PROC [designName: Rope.ROPE] RETURNS [context: CDGenerate.Context_NIL] = { WITH nameToContext.Fetch[designName].val SELECT FROM t: CDGenerate.Context => RETURN [t] ENDCASE => NULL; context _ CDGenerateBackdoor.CreateIndirect[onTopOf: dummy, iGenerator: ImportIGenerator, selector: Selector, cache: TRUE, flushThrough: FALSE, clearThrough: FALSE, registerThrough: FALSE]; [] _ contextToName.Insert[context, designName]; IF nameToContext.Insert[designName, context] THEN RETURN; RETURN [GetImportContext[designName]] --indirection for concurrency problems }; fromDirectory: CDGenerate.Context _ CDGenerateBackdoor.CreateIndirect[ onTopOf: CDGenerate.Create[], iGenerator: DirectoryIndirector, selector: DirectorySelector ]; unspecImportContext: CDGenerate.Context _ CDGenerateBackdoor.CreateIndirect[ onTopOf: dummy, iGenerator: UnspecImportIGenerator, selector: UnspecSelector ]; [] _ SymTab.Insert[CDGenerateBackdoor.publicContexts, "IMPORT", unspecImportContext]; [] _ SymTab.Insert[CDGenerateBackdoor.publicContexts, "DIRECTORY", fromDirectory]; END.