<<>> <> <> <> <> <<>> DIRECTORY CCTypes, CirioTypes USING [CompilerContext, Type], DeferringTypes; DeferringTypesImpl: CEDAR PROGRAM IMPORTS CCTypes EXPORTS DeferringTypes SHARES CirioTypes = BEGIN CC: TYPE = CirioTypes.CompilerContext; Type: TYPE = CirioTypes.Type; CreateDeferringType: PUBLIC PROC [cc: CC] RETURNS [Type] ~ { dt: Type _ CCTypes.CreateCedarType[$defer, NIL, NIL, cc]; RETURN [dt]}; SetUndertype: PUBLIC PROC [deferring, under: Type] ~ { IF under=NIL THEN CCTypes.CCError[cirioError, "SetUndertype[.., NIL]"]; IF deferring.procData#NIL THEN CCTypes.CCError[cirioError, "Re-Setting the undertype of a deferring type"]; deferring.procData _ deferring.defaultType _ under; deferring.indirectType.defaultType _ under.indirectType; RETURN}; GetUndertype: PUBLIC PROC [deferring: Type] RETURNS [Type] ~ { RETURN [deferring.defaultType]}; IsDeferring: PUBLIC PROC [t: Type] RETURNS [BOOL] ~ { RETURN [t.class = $defer]}; UndertypeStar: PUBLIC PROC [deferring: Type] RETURNS [Type] ~ { IF NOT IsDeferring[deferring] THEN RETURN [deferring]; RETURN [UndertypeStar[GetUndertype[deferring]]]}; <> END.