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)
61 (AnnCoreExpr val_bdr val_occ flexi annot)
65 (AnnCoreExpr val_bdr val_occ flexi annot)
69 data AnnCoreCaseAlts val_bdr val_occ flexi annot
72 AnnCoreExpr val_bdr val_occ flexi annot)]
73 (AnnCoreCaseDefault val_bdr val_occ flexi annot)
74 | AnnPrimAlts [(Literal,
75 AnnCoreExpr val_bdr val_occ flexi annot)]
76 (AnnCoreCaseDefault val_bdr val_occ flexi annot)
78 data AnnCoreCaseDefault val_bdr val_occ flexi annot
80 | AnnBindDefault val_bdr
81 (AnnCoreExpr val_bdr val_occ flexi annot)
85 deAnnotate :: AnnCoreExpr val_bdr val_occ flexi ann
86 -> GenCoreExpr val_bdr val_occ flexi
88 deAnnotate (_, AnnVar v) = Var v
89 deAnnotate (_, AnnLit lit) = Lit lit
90 deAnnotate (_, AnnCon con args) = Con con args
91 deAnnotate (_, AnnPrim op args) = Prim op args
92 deAnnotate (_, AnnLam binder body)= Lam binder (deAnnotate body)
93 deAnnotate (_, AnnApp fun arg) = App (deAnnotate fun) arg
94 deAnnotate (_, AnnSCC lbl body) = SCC lbl (deAnnotate body)
95 deAnnotate (_, AnnCoerce c ty body) = Coerce c ty (deAnnotate body)
97 deAnnotate (_, AnnLet bind body)
98 = Let (deAnnBind bind) (deAnnotate body)
100 deAnnBind (AnnNonRec var rhs) = NonRec var (deAnnotate rhs)
101 deAnnBind (AnnRec pairs) = Rec [(v,deAnnotate rhs) | (v,rhs) <- pairs]
103 deAnnotate (_, AnnCase scrut alts)
104 = Case (deAnnotate scrut) (deAnnAlts alts)
106 deAnnAlts (AnnAlgAlts alts deflt)
107 = AlgAlts [(con,args,deAnnotate rhs) | (con,args,rhs) <- alts]
110 deAnnAlts (AnnPrimAlts alts deflt)
111 = PrimAlts [(lit,deAnnotate rhs) | (lit,rhs) <- alts]
114 deAnnDeflt AnnNoDefault = NoDefault
115 deAnnDeflt (AnnBindDefault var rhs) = BindDefault var (deAnnotate rhs)