TypesImpl.mesa
Copyright Ó 1992 by Xerox Corporation. All rights reserved.
Theimer, May 17, 1989 3:56:05 pm PDT
Changed by Theimer on May 20, 1989 6:42:37 pm PDT
Last changed by Theimer on June 4, 1989 5:17:39 pm PDT
Last tweaked by Mike Spreitzer January 9, 1992 11:33 am PST
DIRECTORY
CCTypes USING [CCTypeProcs, CreateCedarType, PrintType],
CirioTypes USING[CompilerContext, Type, Node],
CedarCode USING [CreateCedarNode, OperationsBody, GetDataFromNode, GetTypeOfNode],
IO,
Rope USING[ROPE],
Types USING [TypeIndirectNodeInfo];
TypesImpl: CEDAR PROGRAM
IMPORTS CCTypes, CedarCode, IO
EXPORTS Types
= BEGIN OPEN CCTypes;
CC: TYPE = CirioTypes.CompilerContext;
Type: TYPE = CirioTypes.Type;
Node: TYPE = CirioTypes.Node;
Type operations.
TypeTypeInfo: TYPE = REF TypeTypeInfoBody;
TypeTypeInfoBody: TYPE = RECORD [
underType: Type,
name: Rope.ROPE];
CreateTypeType: PUBLIC PROC [cc: CC] RETURNS [Type] = {
type: Type ← CCTypes.CreateCedarType[$type, TypeTypeCCTypeProcs, IndirectTypeTypeCCTypeProcs, cc];
RETURN [type];
};
TypeTypeCCTypeProcs: REF CCTypes.CCTypeProcs ← NEW[CCTypes.CCTypeProcs ←[
printType: TypeCCTypesPrintType]];
IndirectTypeTypeCCTypeProcs: REF CCTypes.CCTypeProcs ← NEW[CCTypes.CCTypeProcs ←[
printType: TypeCCTypesPrintType]];
TypeCCTypesPrintType: PROC [to: IO.STREAM, type: Type, printDepth: INT, printWidth: INT, cc: CC, procData: REF ANY]
= {to.PutRope["TYPE"]};
Node operations.
CreateTypeIndirectNode: PUBLIC PROC [type: Type, info: REF ANY] RETURNS [Node] = {
RETURN [CedarCode.CreateCedarNode[TypeIndirectOps, type, info]];
};
TypeIndirectOps: REF CedarCode.OperationsBody ← NEW[CedarCode.OperationsBody ←[
load: TypeIndirectLoad,
show: TypeShow
]];
TypeIndirectLoad: PROC [indirectType: Type, indirectNode: Node, cc: CC] RETURNS [Node] = {
RETURN [indirectNode];
};
TypeShow: PROC [to: IO.STREAM, node: Node, depth: INT, width: INT, cc: CC] = {
info: Types.TypeIndirectNodeInfo ← NARROW[CedarCode.GetDataFromNode[node]];
defType: CirioTypes.Typeinfo.getDefinitionType[info.data];
IF depth = 0
THEN {
defType: CirioTypes.Type ← CedarCode.GetTypeOfNode[node];
CCTypes.PrintType[to, defType, depth, width, cc];
}
ELSE {
CCTypes.PrintType[to, defType, depth, width, cc];
};
};
END.