2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[AnnCoreSyntax]{Annotated core syntax}
6 For when you want @CoreSyntax@ trees annotated at every node. Other
7 than that, just like @CoreSyntax@. (Important to be sure that it {\em
8 really is} just like @CoreSyntax@.)
12 AnnCoreBinding(..), AnnCoreExpr,
13 AnnCoreExpr'(..), -- v sad that this must be exported
14 AnnCoreCaseAlts(..), AnnCoreCaseDefault(..),
16 deAnnotate -- we may eventually export some of the other deAnners
19 #include "HsVersions.h"
24 import Literal ( Literal )
25 import PrimOp ( PrimOp )
26 import CostCentre ( CostCentre )
27 import Type ( GenType )
32 data AnnCoreBinding val_bdr val_occ flexi annot
33 = AnnNonRec val_bdr (AnnCoreExpr val_bdr val_occ flexi annot)
34 | AnnRec [(val_bdr, AnnCoreExpr val_bdr val_occ flexi annot)]
38 type AnnCoreExpr val_bdr val_occ flexi annot
39 = (annot, AnnCoreExpr' val_bdr val_occ flexi annot)
41 data AnnCoreExpr' val_bdr val_occ flexi annot
45 | AnnCon Id [GenCoreArg val_occ flexi]
46 | AnnPrim PrimOp [GenCoreArg val_occ flexi]
48 | AnnLam (GenCoreBinder val_bdr flexi)
49 (AnnCoreExpr val_bdr val_occ flexi annot)
51 | AnnApp (AnnCoreExpr val_bdr val_occ flexi annot)
52 (GenCoreArg val_occ flexi)
54 | AnnCase (AnnCoreExpr val_bdr val_occ flexi annot)
55 (AnnCoreCaseAlts val_bdr val_occ flexi annot)
57 | AnnLet (AnnCoreBinding val_bdr val_occ flexi annot)
58 (AnnCoreExpr val_bdr val_occ flexi annot)
60 | AnnNote (CoreNote flexi)
61 (AnnCoreExpr val_bdr val_occ flexi annot)
65 data AnnCoreCaseAlts val_bdr val_occ flexi annot
68 AnnCoreExpr val_bdr val_occ flexi annot)]
69 (AnnCoreCaseDefault val_bdr val_occ flexi annot)
70 | AnnPrimAlts [(Literal,
71 AnnCoreExpr val_bdr val_occ flexi annot)]
72 (AnnCoreCaseDefault val_bdr val_occ flexi annot)
74 data AnnCoreCaseDefault val_bdr val_occ flexi annot
76 | AnnBindDefault val_bdr
77 (AnnCoreExpr val_bdr val_occ flexi annot)
81 deAnnotate :: AnnCoreExpr val_bdr val_occ flexi ann
82 -> GenCoreExpr val_bdr val_occ flexi
84 deAnnotate (_, AnnVar v) = Var v
85 deAnnotate (_, AnnLit lit) = Lit lit
86 deAnnotate (_, AnnCon con args) = Con con args
87 deAnnotate (_, AnnPrim op args) = Prim op args
88 deAnnotate (_, AnnLam binder body)= Lam binder (deAnnotate body)
89 deAnnotate (_, AnnApp fun arg) = App (deAnnotate fun) arg
90 deAnnotate (_, AnnNote note body) = Note note (deAnnotate body)
92 deAnnotate (_, AnnLet bind body)
93 = Let (deAnnBind bind) (deAnnotate body)
95 deAnnBind (AnnNonRec var rhs) = NonRec var (deAnnotate rhs)
96 deAnnBind (AnnRec pairs) = Rec [(v,deAnnotate rhs) | (v,rhs) <- pairs]
98 deAnnotate (_, AnnCase scrut alts)
99 = Case (deAnnotate scrut) (deAnnAlts alts)
101 deAnnAlts (AnnAlgAlts alts deflt)
102 = AlgAlts [(con,args,deAnnotate rhs) | (con,args,rhs) <- alts]
105 deAnnAlts (AnnPrimAlts alts deflt)
106 = PrimAlts [(lit,deAnnotate rhs) | (lit,rhs) <- alts]
109 deAnnDeflt AnnNoDefault = NoDefault
110 deAnnDeflt (AnnBindDefault var rhs) = BindDefault var (deAnnotate rhs)