DIRECTORY Asserting, AssertingIO, Basics, Convert, FS, IO, OrderedSymbolTableRef, Rope, RoseTranslateTypes, RoseTranslateInsides, TiogaFileOps, TiogaStreams; RoseTranslateWrite2: CEDAR PROGRAM IMPORTS Asserting, AssertingIO, Convert, IO, OSTR: OrderedSymbolTableRef, Rope, TS: TiogaStreams, RoseTranslateInsides EXPORTS RoseTranslateInsides = BEGIN OPEN RoseTranslateTypes, RoseTranslateInsides; WriteExpand: PUBLIC PROC [job: Job, name: ROPE, ec: LORA, cellDef: CellDef] = BEGIN TS.EndNode[job.to]; job.to.PutF["%gExpand: PROC [thisCell: Cell, to: ExpansionReceiver] --ExpandProc-- = {", IO.rope[name]]; TS.ChangeDepth[job.to, 1]; IF cellDef.forFn # NIL THEN { job.to.PutF["args: REF %gArgs _ NARROW[thisCell.type.typeData];", IO.rope[name]]; TS.ChangeDepth[job.to, 1]; job.to.PutRope["{OPEN args;"]; TS.EndNode[job.to]}; IF (cellDef.interfaceLiteral # NIL) AND (cellDef.interfaceLiteral.asList # NIL) THEN { job.to.PutRope["PrivateLookupNode: PROC [name: ROPE] RETURNS [node: Node] = {node _ RoseCreate.LookupNode[from: thisCell, path: LIST[name]]};"]; TS.EndNode[job.to]; }; IF cellDef.interfaceLiteral # NIL THEN FOR iel: InterfaceEltList _ cellDef.interfaceLiteral.asList, iel.rest WHILE iel # NIL DO job.to.PutF[ "%g: Node _ PrivateLookupNode[\"%g\"];", IO.rope[iel.first.name], IO.rope[iel.first.name]]; TS.EndNode[job.to]; ENDLOOP; job.to.PutF["others: SymbolTable _ RoseCreate.GetOthers[otherss, %g];", IO.refAny[name]]; TS.EndNode[job.to]; job.partsAssertionsStream.PutF["\n%g\n", IO.refAny[name]]; job.nodeCreateHacks _ OSTR.CreateTable[CompareNCHs]; job.nchCount _ 0; job.previewing _ TRUE; FOR lora: LORA _ ec, lora.rest WHILE lora # NIL DO WriteBinding: PROC [b: Binding] = BEGIN WITH b.value SELECT FROM sti: SignalTypeInvocation => WriteNodeInstance[job, b.name, sti.st, b.assertions, b.initial]; a: Application => WriteCellInstance[job, name, b.name, a, b.assertions]; id: ID => WriteWhateverInstance[job, b.name, id.rope, b.assertions, b.initial]; ENDCASE => ERROR; END; WITH lora.first SELECT FROM cs: CedarSource => NULL; bl: BindingList => FOR bl _ bl, bl.rest WHILE bl # NIL DO WriteBinding[bl.first] ENDLOOP; b: Binding => WriteBinding[b]; ENDCASE => ERROR; ENDLOOP; job.previewing _ FALSE; FOR lora: LORA _ ec, lora.rest WHILE lora # NIL DO WriteBinding: PROC [b: Binding] = BEGIN WITH b.value SELECT FROM sti: SignalTypeInvocation => WriteNodeInstance[job, b.name, sti.st, b.assertions, b.initial]; a: Application => WriteCellInstance[job, name, b.name, a, b.assertions]; id: ID => WriteWhateverInstance[job, b.name, id.rope, b.assertions, b.initial]; ENDCASE => ERROR; END; WITH lora.first SELECT FROM cs: CedarSource => InjectCedar[job, cs]; bl: BindingList => FOR bl _ bl, bl.rest WHILE bl # NIL DO WriteBinding[bl.first] ENDLOOP; b: Binding => WriteBinding[b]; ENDCASE => ERROR; ENDLOOP; IF cellDef.forFn # NIL THEN { job.to.PutRope["};"]; TS.ChangeDepth[job.to, -1]}; job.to.PutRope["};"]; TS.ChangeDepth[job.to, -1]; job.partsAssertionsStream.PutRope[" .\n"]; END; InjectCedar: PUBLIC PROC [job: Job, cs: CedarSource] = BEGIN where: TiogaFileOps.Ref; TS.EndNode[job.to]; job.to.PutRope["--explicitly requested CEDAR:"]; TS.EndNode[job.to]; where _ TS.CurOutNode[job.to]; TS.EndNode[job.to]; TS.CopyChildren[from: cs.parent, to: where]; END; NodeCreateHack: TYPE = REF NodeCreateHackRep; NodeCreateHackRep: TYPE = RECORD [ key, name: ROPE, callCount: CARDINAL]; CompareNCHs: PROC [r1, r2: REF ANY] RETURNS [c: Basics.Comparison] = BEGIN Key: PROC [r: REF ANY] RETURNS [k: ROPE] = {k _ WITH r SELECT FROM x: ROPE => x, nch: NodeCreateHack => nch.key, ENDCASE => ERROR}; c _ Key[r1].Compare[Key[r2]]; END; WriteNodeInstance: PROC [job: Job, name: ROPE, st: NodeType, assertions: Assertions, initialValue: REF ANY] = BEGIN initialExpression: ROPE _ NIL; xPhobicize: BOOL _ NOT st.simple; xPhobeHead: ROPE; otherAssertions: Assertions _ NIL; FOR assertions _ assertions, assertions.rest WHILE assertions # NIL DO key: ATOM _ NARROW[Asserting.RelnOf[assertions.first]]; SELECT key FROM $XPhobic => xPhobicize _ TRUE; $XPhillic => xPhobicize _ FALSE; ENDCASE => otherAssertions _ CONS[assertions.first, otherAssertions]; ENDLOOP; IF xPhobicize AND st.simple THEN { Whimper[nullSR, job, "Don't xphobicize a simple node (%g, of type %g)", IO.rope[name], IO.rope[st.procs.UserDescription[st]]]; xPhobicize _ FALSE}; xPhobeHead _ IF xPhobicize THEN "RoseCreate.XPhobicize[" ELSE ""; IF initialValue # NIL THEN WITH initialValue SELECT FROM q: Quoted => initialExpression _ IO.PutFR["\"%q\"", IO.rope[q.rope]]; cl: CedarLiteral => initialExpression _ cl.cedar; ENDCASE => ERROR; IF job.previewing THEN BEGIN roseType: Mesa _ st.procs.MesaDescription[st]; key: ROPE _ IO.PutFR["\"%q\"%g _ %g", IO.rope[roseType.mesa], IO.bool[xPhobicize], IO.rope[initialExpression]]; nch: NodeCreateHack _ NARROW[job.nodeCreateHacks.Lookup[key]]; IF nch = NIL THEN job.nodeCreateHacks.Insert[nch _ NEW [NodeCreateHackRep _ [ key: key, name: NIL, callCount: 0]]]; nch.callCount _ nch.callCount + 1; END ELSE BEGIN roseType: Mesa _ st.procs.MesaDescription[st]; key: ROPE _ IO.PutFR["\"%q\"%g _ %g", IO.rope[roseType.mesa], IO.bool[xPhobicize], IO.rope[initialExpression]]; nch: NodeCreateHack _ NARROW[job.nodeCreateHacks.Lookup[key]]; ne: nodeEntry _ NEW [SymbolTableEntryRep[node] _ [name: name, value: node[st]]]; IF otherAssertions # NIL THEN { job.partsAssertionsStream.PutRope[Convert.RopeFromRope[name].Cat[" "]]; AssertingIO.Write[job.partsAssertionsStream, otherAssertions]; job.partsAssertionsStream.PutRope["\n"]; }; IF job.things.Lookup[name] = NIL THEN job.things.Insert[ne] ELSE Whimper[nullSR, job, "node %g multiply defined", IO.rope[name]]; AddMesa[job, roseType]; IF nch.callCount >= nodeCreateHackThreshold THEN BEGIN IF nch.name = NIL THEN BEGIN nch.name _ IO.PutFR["NodeCreateHack%g", IO.card[job.nchCount _ job.nchCount + 1]]; job.to.PutF["%g: PROC [name: ROPE] RETURNS [node: Node] = {node _ %gto.class.NodeInstance[erInstance: to.instance, name: name, type: %g, other: RoseCreate.GetOther[others, name]", IO.rope[nch.name], IO.rope[xPhobeHead], IO.rope[roseType.mesa]]; IF initialExpression # NIL THEN job.to.PutF[", initialValue: %g", IO.rope[initialExpression]]; IF xPhobicize THEN job.to.PutRope["]"]; job.to.PutRope["]};"]; TS.EndNode[job.to]; END; job.to.PutF["%g: Node _ %g[\"%g\"", IO.rope[name], IO.rope[nch.name], IO.rope[name]]; END ELSE BEGIN job.to.PutF["%g: Node _ %gto.class.NodeInstance[erInstance: to.instance, name: \"%g\", type: %g, other: RoseCreate.GetOther[others, \"%g\"]", IO.rope[name], IO.rope[xPhobeHead], IO.rope[name], IO.rope[roseType.mesa], IO.rope[name]]; IF initialExpression # NIL THEN job.to.PutF[", initialValue: %g", IO.rope[initialExpression]]; IF xPhobicize THEN job.to.PutRope["]"]; END; job.to.PutRope["];"]; TS.EndNode[job.to]; END; END; nodeCreateHackThreshold: CARDINAL _ 3; WriteCellInstance: PROC [job: Job, defName, instanceName: ROPE, a: Application, assertions: Assertions] = BEGIN ste: SymbolTableEntry; cd: CellDef; definedIn: ROPE; typeNameExpr: ROPE; fromSelf: BOOLEAN; IF job.previewing THEN RETURN; IF assertions # NIL THEN { job.partsAssertionsStream.PutRope[Convert.RopeFromRope[instanceName].Cat[" "]]; AssertingIO.Write[job.partsAssertionsStream, assertions]; job.partsAssertionsStream.PutRope["\n"]; }; WITH a.subject SELECT FROM id: ID => { lit: ROPE _ id.rope; typeNameExpr _ IO.PutFR["\"%q\"", IO.rope[lit]]; ste _ NARROW[job.things.Lookup[lit]]; IF ste = NIL THEN BEGIN [] _ Complain[a.sr, job, "Cell Class %g undefined!", IO.rope[lit]]; cd _ NEW [CellDefRep _ []]; definedIn _ NIL; IF lit # NIL THEN AddCellClass[job, NEW [SymbolTableEntryRep[cellClass] _ [name: lit, value: cellClass[globvar: FALSE, definedIn: definedIn, cd: cd]]]]; END ELSE WITH ste SELECT FROM cce: ccEntry => { fromSelf _ (definedIn _ cce.definedIn).Equal[job.rootName, FALSE]; cd _ cce.cd; IF NOT cce.globvar THEN typeNameExpr _ IO.PutFR["\"%q\"", IO.rope[ste.name]] ELSE { typeNameExpr _ ste.name.Cat[".name"]; IF NOT fromSelf THEN typeNameExpr _ definedIn.Cat[".", typeNameExpr]}; }; ENDCASE => BEGIN [] _ Complain[a.sr, job, "Can't instantiate %g like a Cell Class", IO.refAny[ste]]; definedIn _ NIL; cd _ NEW [CellDefRep _ []]; END; }; ia: Application => {s: IO.STREAM _ IO.ROS[]; sub: ID _ NARROW[ia.subject]; functionName: ROPE _ Rope.Cat["?", sub.rope, "?"]; ste: SymbolTableEntry _ NARROW[job.things.Lookup[sub.rope]]; ok: BOOL _ FALSE; cd _ NEW [CellDefRep _ []]; IF ste # NIL THEN WITH ste SELECT FROM cfe: cfEntry => { fromSelf _ (definedIn _ cfe.definedIn).Equal[job.rootName, FALSE]; functionName _ IF fromSelf THEN sub.rope ELSE definedIn.Cat[".", sub.rope]; IF NOT fromSelf THEN AddImport[job, definedIn]; cd _ cfe.cf.cd; ok _ TRUE}; ENDCASE; IF NOT ok THEN Whimper[ia.sr, job, "You tried to use %g as a CellTypeFunction name, but it ain't (it's a %g)", IO.rope[sub.rope], IO.refAny[ste]]; WriteCellFnInvocation[s, [nullSR, functionName, ia.args]]; typeNameExpr _ IO.RopeFromROS[s].Cat[".name"]; }; ENDCASE => ERROR; fromSelf _ definedIn.Equal[job.rootName, FALSE]; job.to.PutF["[] _ to.class.CellInstance[erInstance: to.instance, instanceName: \"%g\", typeName: %g, other: RoseCreate.GetOther[others, \"%g\"], interfaceNodes: ", IO.rope[instanceName], IO.rope[typeNameExpr], IO.rope[instanceName]]; IF cd.interfaceLiteral # NIL THEN TypeCheck[job, defName, a.args, cd.interfaceLiteral, instanceName]; IF a.args # NIL THEN BEGIN job.to.PutRope["\""]; WITH a.args SELECT FROM bl: BindingList => WriteBindingList[job.to, bl]; a: Args => WriteArgs[job.to, a]; ENDCASE => ERROR; job.to.PutRope["\""]; END ELSE job.to.PutRope["NIL"]; job.to.PutRope["];"]; TS.EndNode[job.to]; IF definedIn # NIL AND NOT fromSelf THEN AddImport[job, definedIn]; END; WriteWhateverInstance: PROC [job: Job, name, class: ROPE, assertions: Assertions, initialValue: REF ANY] = BEGIN sti: SignalTypeInvocation _ InstantiateSignalType[job, class, NIL]; IF sti # NIL THEN WriteNodeInstance[job, name, sti.st, assertions, initialValue]; END; END. ΔRoseTranslateWrite2.Mesa Last Edited by: Spreitzer, November 19, 1984 2:56:46 pm PST Last Edited by: Barth, March 8, 1983 10:45 am Last Edited by: Gasbarro, August 16, 1984 4:05:44 pm PDT Κ §– "cedar" style˜Icode™K™œ ˜hKšœ˜šœœœ˜KšœBœ ˜QKšœ˜K˜Kšœ˜—š œœœ$œœ˜VKšœ˜Kšœ˜K˜—š œœœœCœœ˜šœ ˜ Kšœ(˜(Kšœœ˜2—Kšœ˜Kšœ˜—KšœHœ˜YKšœ˜Kšœ)œ˜:Kšœœ˜4Kšœ˜Kšœœ˜š œœœœ˜2šŸ œœ˜!Kš˜šœ œ˜Kšœ]˜]K˜HKšœœI˜OKšœœ˜—Kšœ˜—šœ œ˜Kšœœ˜Kš œœœœœœ˜YKšœ˜Kšœœ˜—Kšœ˜—Kšœœ˜š œœœœ˜2šŸ œœ˜!Kš˜šœ œ˜Kšœ]˜]KšœH˜HKšœœJ˜PKšœœ˜—Kšœ˜—šœ œ˜K˜(Kš œœœœœœ˜YKšœ˜Kšœœ˜—Kšœ˜—šœœœ˜Kšœœ˜2—Kšœœ˜1Kšœ*˜*Kšœ˜—K˜šŸ œœœ˜6Kš˜Kšœ˜Kšœ˜Kšœ0˜0Kšœ˜Kšœœ˜Kšœ˜Kšœ*˜,Kšœ˜—K˜Kšœœœ˜-šœœœ˜"Kšœ œ˜Kšœ œ˜—K˜š Ÿ œœ œœœ˜DKš˜šŸœœœœœœ œœ˜BKšœœ˜ Kšœ˜Kšœœ˜—K˜Kšœ˜—K˜š Ÿœœœ6œœ˜mKš˜Kšœœœ˜Kšœ œœ ˜!Kšœ œ˜Kšœœ˜"šœ*œœ˜FKšœœœ%˜7šœ˜Kšœœ˜Kšœœ˜ Kšœœ$˜E—Kšœ˜—šœ œ œ˜"KšœHœ œ%˜~Kšœ œ˜—Kšœ œ œœ˜Aš œœœœœ˜8Kšœ!œœ˜EKšœ1˜1Kšœœ˜—šœœ˜Kšœ.˜.Kš œœœœœœ˜oKšœœ"˜>šœœœ"œ˜MK˜ Kšœœ˜ K˜—K˜"Kš˜—šœ˜ Kšœ.˜.Kš œœœœœœ˜oKšœœ"˜>Kšœœ=˜Pšœœœ˜KšœG˜GKšœ>˜>Kšœ(˜(K˜—Kšœœœ˜;Kšœ2œ ˜EK˜šœ*œ˜6šœ œœ˜Kšœ œœ(˜RKšœ΄œœœ˜τKšœœœ#œ˜^Kšœ œ˜'Kšœœ˜*Kšœ˜—Kšœ$œ œœ ˜UKš˜—šœ˜ Kš œŽœ œœ œœ ˜θKšœœœ#œ˜^Kšœ œ˜'Kšœ˜—K˜Kšœ˜Kšœ˜—Kšœ˜—K˜Kšœœ˜&K˜šŸœœ#œ+˜iKš˜Kšœ˜Kšœ ˜ Kšœ œ˜Kšœœ˜Kšœ œ˜Kšœœœ˜šœœœ˜KšœO˜OKšœ9˜9Kšœ(˜(K˜—šœ œ˜šœœ˜ Kšœœ ˜Kšœœœ ˜0Kšœœ˜%šœœ˜Kš˜Kšœ5œ ˜CKšœœ œ˜,Kš œœœœIœ#˜˜Kš˜—šœœœ˜šœ˜Kšœ;œ˜BKšœ ˜ šœœ ˜Kšœœœ˜9šœ˜Kšœ%˜%šœœ ˜Kšœ2˜6———Kšœ˜—šœ˜KšœCœ˜SKšœ œ˜Kšœœ˜Kšœ˜——K˜—š œœœœœ˜,Kšœœœ ˜Kšœœ ˜2Kšœœ˜œ˜CKšœœœ@˜QKšœ˜—K˜Kšœ˜—…—'3ƒ