<> <> <> <> <> <> 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 = BEGIN dummy: CDGenerate.Table _ CDGenerate.Create[]; tableToName: RefTab.Ref _ RefTab.Create[]; nameToTable: SymTab.Ref _ SymTab.Create[]; UnspecSelector: CDGenerateBackdoor.SelectorProc = BEGIN key _ TerminalIO.RequestRope[" import [design.object] >"]; END; Selector: CDGenerateBackdoor.SelectorProc = { dName: Rope.ROPE = ImporteeName[table]; key _ TerminalIO.RequestRope[Rope.Cat[label, " import object from ", dName, " >"]]; }; ImportIGenerator: CDGenerateBackdoor.IGeneratorProc = BEGIN importeeName: Rope.ROPE _ ImporteeName[realTable]; IF Rope.IsEmpty[importeeName] THEN { TerminalIO.WriteRope["**generate with bad importee name\n"]; RETURN }; IF Rope.Equal[importeeName, design.name] THEN { ob _ CDDirectory.Fetch[design, key].object; RETURN }; ob _ CDImports.CreateImport[design, key, importeeName]; END; UnspecImportIGenerator: CDGenerateBackdoor.IGeneratorProc = BEGIN 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 => { table _ CDGenerateBackdoor.Indiretee[table]; IF table#NIL THEN RETURN[ImporteeName[table]] }; END; GetImportTable: PUBLIC PROC [designName: Rope.ROPE] RETURNS [table: CDGenerate.Table_NIL] = TRUSTED BEGIN WITH nameToTable.Fetch[designName].val SELECT FROM t: CDGenerate.Table => RETURN [t] ENDCASE => NULL; table _ CDGenerateBackdoor.CreateIndirect[onTopOf: dummy, iGenerator: ImportIGenerator, selector: Selector, cache: TRUE, flushThrough: FALSE, clearThrough: FALSE, registerThrough: FALSE]; [] _ tableToName.Insert[LOOPHOLE[table], designName]; IF nameToTable.Insert[designName, LOOPHOLE[table]] THEN RETURN; RETURN [GetImportTable[designName]] --indirection for concurrency problems END; DoImport: PROC [importer: CD.Design, importeeName: Rope.ROPE] = BEGIN done: BOOL _ FALSE; done _ CDImports.Load[into: importer, importeeName: importeeName, overload: interactive, allowConflicts: interactive]; TerminalIO.WriteRope[IF done THEN "import done\n" ELSE "import not done\n"]; END; unspecImportTable: CDGenerate.Table _ CDGenerateBackdoor.CreateIndirect[ onTopOf: dummy, iGenerator: UnspecImportIGenerator, selector: UnspecSelector ]; TRUSTED { [] _ SymTab.Insert[CDGenerateBackdoor.publicTables, "IMPORT", LOOPHOLE[unspecImportTable]]; }; END.