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@.)
11 #include "HsVersions.h"
14 AnnCoreBinding(..), SYN_IE(AnnCoreExpr),
15 AnnCoreExpr'(..), -- v sad that this must be exported
16 AnnCoreCaseAlts(..), AnnCoreCaseDefault(..),
18 deAnnotate -- we may eventually export some of the other deAnners
25 import Id ( SYN_IE(Id) )
26 import Literal ( Literal )
27 import PrimOp ( PrimOp )
28 import CostCentre ( CostCentre )
29 import Type ( GenType )
34 data AnnCoreBinding val_bdr val_occ tyvar uvar annot
35 = AnnNonRec val_bdr (AnnCoreExpr val_bdr val_occ tyvar uvar annot)
36 | AnnRec [(val_bdr, AnnCoreExpr val_bdr val_occ tyvar uvar annot)]
40 type AnnCoreExpr val_bdr val_occ tyvar uvar annot
41 = (annot, AnnCoreExpr' val_bdr val_occ tyvar uvar annot)
43 data AnnCoreExpr' val_bdr val_occ tyvar uvar annot
47 | AnnCon Id [GenCoreArg val_occ tyvar uvar]
48 | AnnPrim PrimOp [GenCoreArg val_occ tyvar uvar]
50 | AnnLam (GenCoreBinder val_bdr tyvar uvar)
51 (AnnCoreExpr val_bdr val_occ tyvar uvar annot)
53 | AnnApp (AnnCoreExpr val_bdr val_occ tyvar uvar annot)
54 (GenCoreArg val_occ tyvar uvar)
56 | AnnCase (AnnCoreExpr val_bdr val_occ tyvar uvar annot)
57 (AnnCoreCaseAlts val_bdr val_occ tyvar uvar annot)
59 | AnnLet (AnnCoreBinding val_bdr val_occ tyvar uvar annot)
60 (AnnCoreExpr val_bdr val_occ tyvar uvar annot)
63 (AnnCoreExpr val_bdr val_occ tyvar uvar annot)
67 (AnnCoreExpr val_bdr val_occ tyvar uvar annot)
71 data AnnCoreCaseAlts val_bdr val_occ tyvar uvar annot
74 AnnCoreExpr val_bdr val_occ tyvar uvar annot)]
75 (AnnCoreCaseDefault val_bdr val_occ tyvar uvar annot)
76 | AnnPrimAlts [(Literal,
77 AnnCoreExpr val_bdr val_occ tyvar uvar annot)]
78 (AnnCoreCaseDefault val_bdr val_occ tyvar uvar annot)
80 data AnnCoreCaseDefault val_bdr val_occ tyvar uvar annot
82 | AnnBindDefault val_bdr
83 (AnnCoreExpr val_bdr val_occ tyvar uvar annot)
87 deAnnotate :: AnnCoreExpr val_bdr val_occ tyvar uvar ann
88 -> GenCoreExpr val_bdr val_occ tyvar uvar
90 deAnnotate (_, AnnVar v) = Var v
91 deAnnotate (_, AnnLit lit) = Lit lit
92 deAnnotate (_, AnnCon con args) = Con con args
93 deAnnotate (_, AnnPrim op args) = Prim op args
94 deAnnotate (_, AnnLam binder body)= Lam binder (deAnnotate body)
95 deAnnotate (_, AnnApp fun arg) = App (deAnnotate fun) arg
96 deAnnotate (_, AnnSCC lbl body) = SCC lbl (deAnnotate body)
97 deAnnotate (_, AnnCoerce c ty body) = Coerce c ty (deAnnotate body)
99 deAnnotate (_, AnnLet bind body)
100 = Let (deAnnBind bind) (deAnnotate body)
102 deAnnBind (AnnNonRec var rhs) = NonRec var (deAnnotate rhs)
103 deAnnBind (AnnRec pairs) = Rec [(v,deAnnotate rhs) | (v,rhs) <- pairs]
105 deAnnotate (_, AnnCase scrut alts)
106 = Case (deAnnotate scrut) (deAnnAlts alts)
108 deAnnAlts (AnnAlgAlts alts deflt)
109 = AlgAlts [(con,args,deAnnotate rhs) | (con,args,rhs) <- alts]
112 deAnnAlts (AnnPrimAlts alts deflt)
113 = PrimAlts [(lit,deAnnotate rhs) | (lit,rhs) <- alts]
116 deAnnDeflt AnnNoDefault = NoDefault
117 deAnnDeflt (AnnBindDefault var rhs) = BindDefault var (deAnnotate rhs)