1 -----------------------------------------------------------------------------
3 -- (c) The University of Glasgow 2006
5 -- The purpose of this module is to transform an HsExpr into a CoreExpr which
6 -- when evaluated, returns a (Meta.Q Meta.Exp) computation analogous to the
7 -- input HsExpr. We do this in the DsM monad, which supplies access to
8 -- CoreExpr's of the "smart constructors" of the Meta.Exp datatype.
10 -- It also defines a bunch of knownKeyNames, in the same way as is done
11 -- in prelude/PrelNames. It's much more convenient to do it here, becuase
12 -- otherwise we have to recompile PrelNames whenever we add a Name, which is
13 -- a Royal Pain (triggers other recompilation).
14 -----------------------------------------------------------------------------
17 module DsMeta( dsBracket,
18 templateHaskellNames, qTyConName, nameTyConName,
19 liftName, expQTyConName, decQTyConName, typeQTyConName,
20 decTyConName, typeTyConName, mkNameG_dName, mkNameG_vName, mkNameG_tcName
23 #include "HsVersions.h"
25 import {-# SOURCE #-} DsExpr ( dsExpr )
31 import qualified Language.Haskell.TH as TH
37 -- To avoid clashes with DsMeta.varName we must make a local alias for
38 -- OccName.varName we do this by removing varName from the import of
39 -- OccName above, making a qualified instance of OccName and using
40 -- OccNameAlias.varName where varName ws previously used in this file.
41 import qualified OccName
67 -----------------------------------------------------------------------------
68 dsBracket :: HsBracket Name -> [PendingSplice] -> DsM CoreExpr
69 -- Returns a CoreExpr of type TH.ExpQ
70 -- The quoted thing is parameterised over Name, even though it has
71 -- been type checked. We don't want all those type decorations!
73 dsBracket brack splices
74 = dsExtendMetaEnv new_bit (do_brack brack)
76 new_bit = mkNameEnv [(n, Splice (unLoc e)) | (n,e) <- splices]
78 do_brack (VarBr n) = do { MkC e1 <- lookupOcc n ; return e1 }
79 do_brack (ExpBr e) = do { MkC e1 <- repLE e ; return e1 }
80 do_brack (PatBr p) = do { MkC p1 <- repLP p ; return p1 }
81 do_brack (TypBr t) = do { MkC t1 <- repLTy t ; return t1 }
82 do_brack (DecBr ds) = do { MkC ds1 <- repTopDs ds ; return ds1 }
84 {- -------------- Examples --------------------
88 gensym (unpackString "x"#) `bindQ` \ x1::String ->
89 lam (pvar x1) (var x1)
92 [| \x -> $(f [| x |]) |]
94 gensym (unpackString "x"#) `bindQ` \ x1::String ->
95 lam (pvar x1) (f (var x1))
99 -------------------------------------------------------
101 -------------------------------------------------------
103 repTopDs :: HsGroup Name -> DsM (Core (TH.Q [TH.Dec]))
105 = do { let { bndrs = map unLoc (groupBinders group) } ;
106 ss <- mkGenSyms bndrs ;
108 -- Bind all the names mainly to avoid repeated use of explicit strings.
110 -- do { t :: String <- genSym "T" ;
111 -- return (Data t [] ...more t's... }
112 -- The other important reason is that the output must mention
113 -- only "T", not "Foo:T" where Foo is the current module
116 decls <- addBinds ss (do {
117 val_ds <- rep_val_binds (hs_valds group) ;
118 tycl_ds <- mapM repTyClD (hs_tyclds group) ;
119 inst_ds <- mapM repInstD' (hs_instds group) ;
120 for_ds <- mapM repForD (hs_fords group) ;
122 return (de_loc $ sort_by_loc $ val_ds ++ catMaybes tycl_ds ++ inst_ds ++ for_ds) }) ;
124 decl_ty <- lookupType decQTyConName ;
125 let { core_list = coreList' decl_ty decls } ;
127 dec_ty <- lookupType decTyConName ;
128 q_decs <- repSequenceQ dec_ty core_list ;
130 wrapNongenSyms ss q_decs
131 -- Do *not* gensym top-level binders
134 groupBinders (HsGroup { hs_valds = val_decls, hs_tyclds = tycl_decls,
135 hs_fords = foreign_decls })
136 -- Collect the binders of a Group
137 = collectHsValBinders val_decls ++
138 [n | d <- tycl_decls, n <- tyClDeclNames (unLoc d)] ++
139 [n | L _ (ForeignImport n _ _) <- foreign_decls]
142 {- Note [Binders and occurrences]
143 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
144 When we desugar [d| data T = MkT |]
146 Data "T" [] [Con "MkT" []] []
148 Data "Foo:T" [] [Con "Foo:MkT" []] []
149 That is, the new data decl should fit into whatever new module it is
150 asked to fit in. We do *not* clone, though; no need for this:
157 then we must desugar to
158 foo = Data "Foo:T" [] [Con "Foo:MkT" []] []
160 So in repTopDs we bring the binders into scope with mkGenSyms and addBinds.
161 And we use lookupOcc, rather than lookupBinder
162 in repTyClD and repC.
166 repTyClD :: LTyClDecl Name -> DsM (Maybe (SrcSpan, Core TH.DecQ))
168 repTyClD (L loc (TyData { tcdND = DataType, tcdCtxt = cxt,
169 tcdLName = tc, tcdTyVars = tvs,
170 tcdCons = cons, tcdDerivs = mb_derivs }))
171 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
172 dec <- addTyVarBinds tvs $ \bndrs -> do {
173 cxt1 <- repLContext cxt ;
174 cons1 <- mapM repC cons ;
175 cons2 <- coreList conQTyConName cons1 ;
176 derivs1 <- repDerivs mb_derivs ;
177 bndrs1 <- coreList nameTyConName bndrs ;
178 repData cxt1 tc1 bndrs1 cons2 derivs1 } ;
179 return $ Just (loc, dec) }
181 repTyClD (L loc (TyData { tcdND = NewType, tcdCtxt = cxt,
182 tcdLName = tc, tcdTyVars = tvs,
183 tcdCons = [con], tcdDerivs = mb_derivs }))
184 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
185 dec <- addTyVarBinds tvs $ \bndrs -> do {
186 cxt1 <- repLContext cxt ;
188 derivs1 <- repDerivs mb_derivs ;
189 bndrs1 <- coreList nameTyConName bndrs ;
190 repNewtype cxt1 tc1 bndrs1 con1 derivs1 } ;
191 return $ Just (loc, dec) }
193 repTyClD (L loc (TySynonym { tcdLName = tc, tcdTyVars = tvs, tcdSynRhs = ty }))
194 = do { tc1 <- lookupLOcc tc ; -- See note [Binders and occurrences]
195 dec <- addTyVarBinds tvs $ \bndrs -> do {
197 bndrs1 <- coreList nameTyConName bndrs ;
198 repTySyn tc1 bndrs1 ty1 } ;
199 return (Just (loc, dec)) }
201 repTyClD (L loc (ClassDecl { tcdCtxt = cxt, tcdLName = cls,
204 tcdSigs = sigs, tcdMeths = meth_binds }))
205 = do { cls1 <- lookupLOcc cls ; -- See note [Binders and occurrences]
206 dec <- addTyVarBinds tvs $ \bndrs -> do {
207 cxt1 <- repLContext cxt ;
208 sigs1 <- rep_sigs sigs ;
209 binds1 <- rep_binds meth_binds ;
210 fds1 <- repLFunDeps fds;
211 decls1 <- coreList decQTyConName (sigs1 ++ binds1) ;
212 bndrs1 <- coreList nameTyConName bndrs ;
213 repClass cxt1 cls1 bndrs1 fds1 decls1 } ;
214 return $ Just (loc, dec) }
217 repTyClD (L loc d) = putSrcSpanDs loc $
218 do { warnDs (hang ds_msg 4 (ppr d))
223 repLFunDeps :: [Located (FunDep Name)] -> DsM (Core [TH.FunDep])
224 repLFunDeps fds = do fds' <- mapM repLFunDep fds
225 fdList <- coreList funDepTyConName fds'
228 repLFunDep :: Located (FunDep Name) -> DsM (Core TH.FunDep)
229 repLFunDep (L _ (xs, ys)) = do xs' <- mapM lookupBinder xs
230 ys' <- mapM lookupBinder ys
231 xs_list <- coreList nameTyConName xs'
232 ys_list <- coreList nameTyConName ys'
233 repFunDep xs_list ys_list
235 repInstD' (L loc (InstDecl ty binds _ _)) -- Ignore user pragmas for now
236 = do { i <- addTyVarBinds tvs $ \tv_bndrs ->
237 -- We must bring the type variables into scope, so their occurrences
238 -- don't fail, even though the binders don't appear in the resulting
240 do { cxt1 <- repContext cxt
241 ; inst_ty1 <- repPred (HsClassP cls tys)
242 ; ss <- mkGenSyms (collectHsBindBinders binds)
243 ; binds1 <- addBinds ss (rep_binds binds)
244 ; decls1 <- coreList decQTyConName binds1
245 ; decls2 <- wrapNongenSyms ss decls1
246 -- wrapNonGenSyms: do not clone the class op names!
247 -- They must be called 'op' etc, not 'op34'
248 ; repInst cxt1 inst_ty1 decls2 }
252 (tvs, cxt, cls, tys) = splitHsInstDeclTy (unLoc ty)
254 repForD :: Located (ForeignDecl Name) -> DsM (SrcSpan, Core TH.DecQ)
255 repForD (L loc (ForeignImport name typ (CImport cc s ch cn cis)))
256 = do MkC name' <- lookupLOcc name
257 MkC typ' <- repLTy typ
258 MkC cc' <- repCCallConv cc
259 MkC s' <- repSafety s
260 cis' <- conv_cimportspec cis
261 MkC str <- coreStringLit $ static
262 ++ unpackFS ch ++ " "
263 ++ unpackFS cn ++ " "
265 dec <- rep2 forImpDName [cc', s', str, name', typ']
268 conv_cimportspec (CLabel cls) = notHandled "Foreign label" (doubleQuotes (ppr cls))
269 conv_cimportspec (CFunction DynamicTarget) = return "dynamic"
270 conv_cimportspec (CFunction (StaticTarget fs)) = return (unpackFS fs)
271 conv_cimportspec CWrapper = return "wrapper"
273 CFunction (StaticTarget _) -> "static "
275 repForD decl = notHandled "Foreign declaration" (ppr decl)
277 repCCallConv :: CCallConv -> DsM (Core TH.Callconv)
278 repCCallConv CCallConv = rep2 cCallName []
279 repCCallConv StdCallConv = rep2 stdCallName []
281 repSafety :: Safety -> DsM (Core TH.Safety)
282 repSafety PlayRisky = rep2 unsafeName []
283 repSafety (PlaySafe False) = rep2 safeName []
284 repSafety (PlaySafe True) = rep2 threadsafeName []
286 ds_msg = ptext SLIT("Cannot desugar this Template Haskell declaration:")
288 -------------------------------------------------------
290 -------------------------------------------------------
292 repC :: LConDecl Name -> DsM (Core TH.ConQ)
293 repC (L loc (ConDecl con expl [] (L _ []) details ResTyH98 _))
294 = do { con1 <- lookupLOcc con ; -- See note [Binders and occurrences]
295 repConstr con1 details }
296 repC (L loc (ConDecl con expl tvs (L cloc ctxt) details ResTyH98 doc))
297 = do { addTyVarBinds tvs $ \bndrs -> do {
298 c' <- repC (L loc (ConDecl con expl [] (L cloc []) details ResTyH98 doc));
299 ctxt' <- repContext ctxt;
300 bndrs' <- coreList nameTyConName bndrs;
301 rep2 forallCName [unC bndrs', unC ctxt', unC c']
304 repC (L loc con_decl) -- GADTs
306 notHandled "GADT declaration" (ppr con_decl)
308 repBangTy :: LBangType Name -> DsM (Core (TH.StrictTypeQ))
312 rep2 strictTypeName [s, t]
314 (str, ty') = case ty of
315 L _ (HsBangTy _ ty) -> (isStrictName, ty)
316 other -> (notStrictName, ty)
318 -------------------------------------------------------
320 -------------------------------------------------------
322 repDerivs :: Maybe [LHsType Name] -> DsM (Core [TH.Name])
323 repDerivs Nothing = coreList nameTyConName []
324 repDerivs (Just ctxt)
325 = do { strs <- mapM rep_deriv ctxt ;
326 coreList nameTyConName strs }
328 rep_deriv :: LHsType Name -> DsM (Core TH.Name)
329 -- Deriving clauses must have the simple H98 form
330 rep_deriv (L _ (HsPredTy (HsClassP cls []))) = lookupOcc cls
331 rep_deriv other = notHandled "Non-H98 deriving clause" (ppr other)
334 -------------------------------------------------------
335 -- Signatures in a class decl, or a group of bindings
336 -------------------------------------------------------
338 rep_sigs :: [LSig Name] -> DsM [Core TH.DecQ]
339 rep_sigs sigs = do locs_cores <- rep_sigs' sigs
340 return $ de_loc $ sort_by_loc locs_cores
342 rep_sigs' :: [LSig Name] -> DsM [(SrcSpan, Core TH.DecQ)]
343 -- We silently ignore ones we don't recognise
344 rep_sigs' sigs = do { sigs1 <- mapM rep_sig sigs ;
345 return (concat sigs1) }
347 rep_sig :: LSig Name -> DsM [(SrcSpan, Core TH.DecQ)]
349 -- Empty => Too hard, signature ignored
350 rep_sig (L loc (TypeSig nm ty)) = rep_proto nm ty loc
351 rep_sig other = return []
353 rep_proto :: Located Name -> LHsType Name -> SrcSpan -> DsM [(SrcSpan, Core TH.DecQ)]
354 rep_proto nm ty loc = do { nm1 <- lookupLOcc nm ;
356 sig <- repProto nm1 ty1 ;
357 return [(loc, sig)] }
360 -------------------------------------------------------
362 -------------------------------------------------------
364 -- gensym a list of type variables and enter them into the meta environment;
365 -- the computations passed as the second argument is executed in that extended
366 -- meta environment and gets the *new* names on Core-level as an argument
368 addTyVarBinds :: [LHsTyVarBndr Name] -- the binders to be added
369 -> ([Core TH.Name] -> DsM (Core (TH.Q a))) -- action in the ext env
370 -> DsM (Core (TH.Q a))
371 addTyVarBinds tvs m =
373 let names = map (hsTyVarName.unLoc) tvs
374 freshNames <- mkGenSyms names
375 term <- addBinds freshNames $ do
376 bndrs <- mapM lookupBinder names
378 wrapGenSyns freshNames term
380 -- represent a type context
382 repLContext :: LHsContext Name -> DsM (Core TH.CxtQ)
383 repLContext (L _ ctxt) = repContext ctxt
385 repContext :: HsContext Name -> DsM (Core TH.CxtQ)
387 preds <- mapM repLPred ctxt
388 predList <- coreList typeQTyConName preds
391 -- represent a type predicate
393 repLPred :: LHsPred Name -> DsM (Core TH.TypeQ)
394 repLPred (L _ p) = repPred p
396 repPred :: HsPred Name -> DsM (Core TH.TypeQ)
397 repPred (HsClassP cls tys) = do
398 tcon <- repTy (HsTyVar cls)
401 repPred p@(HsIParam _ _) = notHandled "Implicit parameter constraint" (ppr p)
403 -- yield the representation of a list of types
405 repLTys :: [LHsType Name] -> DsM [Core TH.TypeQ]
406 repLTys tys = mapM repLTy tys
410 repLTy :: LHsType Name -> DsM (Core TH.TypeQ)
411 repLTy (L _ ty) = repTy ty
413 repTy :: HsType Name -> DsM (Core TH.TypeQ)
414 repTy (HsForAllTy _ tvs ctxt ty) =
415 addTyVarBinds tvs $ \bndrs -> do
416 ctxt1 <- repLContext ctxt
418 bndrs1 <- coreList nameTyConName bndrs
419 repTForall bndrs1 ctxt1 ty1
422 | isTvOcc (nameOccName n) = do
423 tv1 <- lookupBinder n
428 repTy (HsAppTy f a) = do
432 repTy (HsFunTy f a) = do
435 tcon <- repArrowTyCon
436 repTapps tcon [f1, a1]
437 repTy (HsListTy t) = do
441 repTy (HsPArrTy t) = do
443 tcon <- repTy (HsTyVar (tyConName parrTyCon))
445 repTy (HsTupleTy tc tys) = do
447 tcon <- repTupleTyCon (length tys)
449 repTy (HsOpTy ty1 n ty2) = repLTy ((nlHsTyVar (unLoc n) `nlHsAppTy` ty1)
451 repTy (HsParTy t) = repLTy t
452 repTy (HsPredTy pred) = repPred pred
453 repTy ty@(HsNumTy _) = notHandled "Number types (for generics)" (ppr ty)
454 repTy ty = notHandled "Exotic form of type" (ppr ty)
457 -----------------------------------------------------------------------------
459 -----------------------------------------------------------------------------
461 repLEs :: [LHsExpr Name] -> DsM (Core [TH.ExpQ])
462 repLEs es = do { es' <- mapM repLE es ;
463 coreList expQTyConName es' }
465 -- FIXME: some of these panics should be converted into proper error messages
466 -- unless we can make sure that constructs, which are plainly not
467 -- supported in TH already lead to error messages at an earlier stage
468 repLE :: LHsExpr Name -> DsM (Core TH.ExpQ)
469 repLE (L loc e) = putSrcSpanDs loc (repE e)
471 repE :: HsExpr Name -> DsM (Core TH.ExpQ)
473 do { mb_val <- dsLookupMetaEnv x
475 Nothing -> do { str <- globalVar x
476 ; repVarOrCon x str }
477 Just (Bound y) -> repVarOrCon x (coreVar y)
478 Just (Splice e) -> do { e' <- dsExpr e
479 ; return (MkC e') } }
480 repE e@(HsIPVar x) = notHandled "Implicit parameters" (ppr e)
482 -- Remember, we're desugaring renamer output here, so
483 -- HsOverlit can definitely occur
484 repE (HsOverLit l) = do { a <- repOverloadedLiteral l; repLit a }
485 repE (HsLit l) = do { a <- repLiteral l; repLit a }
486 repE (HsLam (MatchGroup [m] _)) = repLambda m
487 repE (HsApp x y) = do {a <- repLE x; b <- repLE y; repApp a b}
489 repE (OpApp e1 op fix e2) =
490 do { arg1 <- repLE e1;
493 repInfixApp arg1 the_op arg2 }
494 repE (NegApp x nm) = do
496 negateVar <- lookupOcc negateName >>= repVar
498 repE (HsPar x) = repLE x
499 repE (SectionL x y) = do { a <- repLE x; b <- repLE y; repSectionL a b }
500 repE (SectionR x y) = do { a <- repLE x; b <- repLE y; repSectionR a b }
501 repE (HsCase e (MatchGroup ms _)) = do { arg <- repLE e
502 ; ms2 <- mapM repMatchTup ms
503 ; repCaseE arg (nonEmptyCoreList ms2) }
504 repE (HsIf x y z) = do
509 repE (HsLet bs e) = do { (ss,ds) <- repBinds bs
510 ; e2 <- addBinds ss (repLE e)
513 -- FIXME: I haven't got the types here right yet
514 repE (HsDo DoExpr sts body ty)
515 = do { (ss,zs) <- repLSts sts;
516 body' <- addBinds ss $ repLE body;
517 ret <- repNoBindSt body';
518 e <- repDoE (nonEmptyCoreList (zs ++ [ret]));
520 repE (HsDo ListComp sts body ty)
521 = do { (ss,zs) <- repLSts sts;
522 body' <- addBinds ss $ repLE body;
523 ret <- repNoBindSt body';
524 e <- repComp (nonEmptyCoreList (zs ++ [ret]));
526 repE e@(HsDo _ _ _ _) = notHandled "mdo and [: :]" (ppr e)
527 repE (ExplicitList ty es) = do { xs <- repLEs es; repListExp xs }
528 repE e@(ExplicitPArr ty es) = notHandled "Parallel arrays" (ppr e)
529 repE e@(ExplicitTuple es boxed)
530 | isBoxed boxed = do { xs <- repLEs es; repTup xs }
531 | otherwise = notHandled "Unboxed tuples" (ppr e)
532 repE (RecordCon c _ flds)
533 = do { x <- lookupLOcc c;
534 fs <- repFields flds;
536 repE (RecordUpd e flds _ _)
538 fs <- repFields flds;
541 repE (ExprWithTySig e ty) = do { e1 <- repLE e; t1 <- repLTy ty; repSigExp e1 t1 }
542 repE (ArithSeq _ aseq) =
544 From e -> do { ds1 <- repLE e; repFrom ds1 }
553 FromThenTo e1 e2 e3 -> do
557 repFromThenTo ds1 ds2 ds3
558 repE (HsSpliceE (HsSplice n _))
559 = do { mb_val <- dsLookupMetaEnv n
561 Just (Splice e) -> do { e' <- dsExpr e
563 other -> pprPanic "HsSplice" (ppr n) }
564 -- Should not happen; statically checked
566 repE e@(PArrSeq {}) = notHandled "Parallel arrays" (ppr e)
567 repE e@(HsCoreAnn {}) = notHandled "Core annotations" (ppr e)
568 repE e@(HsSCC {}) = notHandled "Cost centres" (ppr e)
569 repE e@(HsBracketOut {}) = notHandled "TH brackets" (ppr e)
570 repE e = notHandled "Expression form" (ppr e)
572 -----------------------------------------------------------------------------
573 -- Building representations of auxillary structures like Match, Clause, Stmt,
575 repMatchTup :: LMatch Name -> DsM (Core TH.MatchQ)
576 repMatchTup (L _ (Match [p] ty (GRHSs guards wheres))) =
577 do { ss1 <- mkGenSyms (collectPatBinders p)
578 ; addBinds ss1 $ do {
580 ; (ss2,ds) <- repBinds wheres
581 ; addBinds ss2 $ do {
582 ; gs <- repGuards guards
583 ; match <- repMatch p1 gs ds
584 ; wrapGenSyns (ss1++ss2) match }}}
585 repMatchTup other = panic "repMatchTup: case alt with more than one arg"
587 repClauseTup :: LMatch Name -> DsM (Core TH.ClauseQ)
588 repClauseTup (L _ (Match ps ty (GRHSs guards wheres))) =
589 do { ss1 <- mkGenSyms (collectPatsBinders ps)
590 ; addBinds ss1 $ do {
592 ; (ss2,ds) <- repBinds wheres
593 ; addBinds ss2 $ do {
594 gs <- repGuards guards
595 ; clause <- repClause ps1 gs ds
596 ; wrapGenSyns (ss1++ss2) clause }}}
598 repGuards :: [LGRHS Name] -> DsM (Core TH.BodyQ)
599 repGuards [L _ (GRHS [] e)]
600 = do {a <- repLE e; repNormal a }
602 = do { zs <- mapM process other;
603 let {(xs, ys) = unzip zs};
604 gd <- repGuarded (nonEmptyCoreList ys);
605 wrapGenSyns (concat xs) gd }
607 process :: LGRHS Name -> DsM ([GenSymBind], (Core (TH.Q (TH.Guard, TH.Exp))))
608 process (L _ (GRHS [L _ (ExprStmt e1 _ _)] e2))
609 = do { x <- repLNormalGE e1 e2;
611 process (L _ (GRHS ss rhs))
612 = do (gs, ss') <- repLSts ss
613 rhs' <- addBinds gs $ repLE rhs
614 g <- repPatGE (nonEmptyCoreList ss') rhs'
617 repFields :: [(Located Name, LHsExpr Name)] -> DsM (Core [TH.Q TH.FieldExp])
619 fnames <- mapM lookupLOcc (map fst flds)
620 es <- mapM repLE (map snd flds)
621 fs <- zipWithM repFieldExp fnames es
622 coreList fieldExpQTyConName fs
625 -----------------------------------------------------------------------------
626 -- Representing Stmt's is tricky, especially if bound variables
627 -- shadow each other. Consider: [| do { x <- f 1; x <- f x; g x } |]
628 -- First gensym new names for every variable in any of the patterns.
629 -- both static (x'1 and x'2), and dynamic ((gensym "x") and (gensym "y"))
630 -- if variables didn't shaddow, the static gensym wouldn't be necessary
631 -- and we could reuse the original names (x and x).
633 -- do { x'1 <- gensym "x"
634 -- ; x'2 <- gensym "x"
635 -- ; doE [ BindSt (pvar x'1) [| f 1 |]
636 -- , BindSt (pvar x'2) [| f x |]
637 -- , NoBindSt [| g x |]
641 -- The strategy is to translate a whole list of do-bindings by building a
642 -- bigger environment, and a bigger set of meta bindings
643 -- (like: x'1 <- gensym "x" ) and then combining these with the translations
644 -- of the expressions within the Do
646 -----------------------------------------------------------------------------
647 -- The helper function repSts computes the translation of each sub expression
648 -- and a bunch of prefix bindings denoting the dynamic renaming.
650 repLSts :: [LStmt Name] -> DsM ([GenSymBind], [Core TH.StmtQ])
651 repLSts stmts = repSts (map unLoc stmts)
653 repSts :: [Stmt Name] -> DsM ([GenSymBind], [Core TH.StmtQ])
654 repSts (BindStmt p e _ _ : ss) =
656 ; ss1 <- mkGenSyms (collectPatBinders p)
657 ; addBinds ss1 $ do {
659 ; (ss2,zs) <- repSts ss
660 ; z <- repBindSt p1 e2
661 ; return (ss1++ss2, z : zs) }}
662 repSts (LetStmt bs : ss) =
663 do { (ss1,ds) <- repBinds bs
665 ; (ss2,zs) <- addBinds ss1 (repSts ss)
666 ; return (ss1++ss2, z : zs) }
667 repSts (ExprStmt e _ _ : ss) =
669 ; z <- repNoBindSt e2
670 ; (ss2,zs) <- repSts ss
671 ; return (ss2, z : zs) }
672 repSts [] = return ([],[])
673 repSts other = notHandled "Exotic statement" (ppr other)
676 -----------------------------------------------------------
678 -----------------------------------------------------------
680 repBinds :: HsLocalBinds Name -> DsM ([GenSymBind], Core [TH.DecQ])
681 repBinds EmptyLocalBinds
682 = do { core_list <- coreList decQTyConName []
683 ; return ([], core_list) }
685 repBinds b@(HsIPBinds _) = notHandled "Implicit parameters" (ppr b)
687 repBinds (HsValBinds decs)
688 = do { let { bndrs = map unLoc (collectHsValBinders decs) }
689 -- No need to worrry about detailed scopes within
690 -- the binding group, because we are talking Names
691 -- here, so we can safely treat it as a mutually
693 ; ss <- mkGenSyms bndrs
694 ; prs <- addBinds ss (rep_val_binds decs)
695 ; core_list <- coreList decQTyConName
696 (de_loc (sort_by_loc prs))
697 ; return (ss, core_list) }
699 rep_val_binds :: HsValBinds Name -> DsM [(SrcSpan, Core TH.DecQ)]
700 -- Assumes: all the binders of the binding are alrady in the meta-env
701 rep_val_binds (ValBindsOut binds sigs)
702 = do { core1 <- rep_binds' (unionManyBags (map snd binds))
703 ; core2 <- rep_sigs' sigs
704 ; return (core1 ++ core2) }
705 rep_val_binds (ValBindsOut binds sigs)
706 = panic "rep_val_binds: ValBindsOut"
708 rep_binds :: LHsBinds Name -> DsM [Core TH.DecQ]
709 rep_binds binds = do { binds_w_locs <- rep_binds' binds
710 ; return (de_loc (sort_by_loc binds_w_locs)) }
712 rep_binds' :: LHsBinds Name -> DsM [(SrcSpan, Core TH.DecQ)]
713 rep_binds' binds = mapM rep_bind (bagToList binds)
715 rep_bind :: LHsBind Name -> DsM (SrcSpan, Core TH.DecQ)
716 -- Assumes: all the binders of the binding are alrady in the meta-env
718 -- Note GHC treats declarations of a variable (not a pattern)
719 -- e.g. x = g 5 as a Fun MonoBinds. This is indicated by a single match
720 -- with an empty list of patterns
721 rep_bind (L loc (FunBind { fun_id = fn,
722 fun_matches = MatchGroup [L _ (Match [] ty (GRHSs guards wheres))] _ }))
723 = do { (ss,wherecore) <- repBinds wheres
724 ; guardcore <- addBinds ss (repGuards guards)
725 ; fn' <- lookupLBinder fn
727 ; ans <- repVal p guardcore wherecore
728 ; ans' <- wrapGenSyns ss ans
729 ; return (loc, ans') }
731 rep_bind (L loc (FunBind { fun_id = fn, fun_matches = MatchGroup ms _ }))
732 = do { ms1 <- mapM repClauseTup ms
733 ; fn' <- lookupLBinder fn
734 ; ans <- repFun fn' (nonEmptyCoreList ms1)
735 ; return (loc, ans) }
737 rep_bind (L loc (PatBind { pat_lhs = pat, pat_rhs = GRHSs guards wheres }))
738 = do { patcore <- repLP pat
739 ; (ss,wherecore) <- repBinds wheres
740 ; guardcore <- addBinds ss (repGuards guards)
741 ; ans <- repVal patcore guardcore wherecore
742 ; ans' <- wrapGenSyns ss ans
743 ; return (loc, ans') }
745 rep_bind (L loc (VarBind { var_id = v, var_rhs = e}))
746 = do { v' <- lookupBinder v
749 ; patcore <- repPvar v'
750 ; empty_decls <- coreList decQTyConName []
751 ; ans <- repVal patcore x empty_decls
752 ; return (srcLocSpan (getSrcLoc v), ans) }
754 rep_bind other = panic "rep_bind: AbsBinds"
756 -----------------------------------------------------------------------------
757 -- Since everything in a Bind is mutually recursive we need rename all
758 -- all the variables simultaneously. For example:
759 -- [| AndMonoBinds (f x = x + g 2) (g x = f 1 + 2) |] would translate to
760 -- do { f'1 <- gensym "f"
761 -- ; g'2 <- gensym "g"
762 -- ; [ do { x'3 <- gensym "x"; fun f'1 [pvar x'3] [| x + g2 |]},
763 -- do { x'4 <- gensym "x"; fun g'2 [pvar x'4] [| f 1 + 2 |]}
765 -- This requires collecting the bindings (f'1 <- gensym "f"), and the
766 -- environment ( f |-> f'1 ) from each binding, and then unioning them
767 -- together. As we do this we collect GenSymBinds's which represent the renamed
768 -- variables bound by the Bindings. In order not to lose track of these
769 -- representations we build a shadow datatype MB with the same structure as
770 -- MonoBinds, but which has slots for the representations
773 -----------------------------------------------------------------------------
774 -- GHC allows a more general form of lambda abstraction than specified
775 -- by Haskell 98. In particular it allows guarded lambda's like :
776 -- (\ x | even x -> 0 | odd x -> 1) at the moment we can't represent this in
777 -- Haskell Template's Meta.Exp type so we punt if it isn't a simple thing like
778 -- (\ p1 .. pn -> exp) by causing an error.
780 repLambda :: LMatch Name -> DsM (Core TH.ExpQ)
781 repLambda (L _ (Match ps _ (GRHSs [L _ (GRHS [] e)] EmptyLocalBinds)))
782 = do { let bndrs = collectPatsBinders ps ;
783 ; ss <- mkGenSyms bndrs
784 ; lam <- addBinds ss (
785 do { xs <- repLPs ps; body <- repLE e; repLam xs body })
786 ; wrapGenSyns ss lam }
788 repLambda (L _ m) = notHandled "Guarded labmdas" (pprMatch LambdaExpr m)
791 -----------------------------------------------------------------------------
793 -- repP deals with patterns. It assumes that we have already
794 -- walked over the pattern(s) once to collect the binders, and
795 -- have extended the environment. So every pattern-bound
796 -- variable should already appear in the environment.
798 -- Process a list of patterns
799 repLPs :: [LPat Name] -> DsM (Core [TH.PatQ])
800 repLPs ps = do { ps' <- mapM repLP ps ;
801 coreList patQTyConName ps' }
803 repLP :: LPat Name -> DsM (Core TH.PatQ)
804 repLP (L _ p) = repP p
806 repP :: Pat Name -> DsM (Core TH.PatQ)
807 repP (WildPat _) = repPwild
808 repP (LitPat l) = do { l2 <- repLiteral l; repPlit l2 }
809 repP (VarPat x) = do { x' <- lookupBinder x; repPvar x' }
810 repP (LazyPat p) = do { p1 <- repLP p; repPtilde p1 }
811 repP (AsPat x p) = do { x' <- lookupLBinder x; p1 <- repLP p; repPaspat x' p1 }
812 repP (ParPat p) = repLP p
813 repP (ListPat ps _) = do { qs <- repLPs ps; repPlist qs }
814 repP (TuplePat ps _ _) = do { qs <- repLPs ps; repPtup qs }
815 repP (ConPatIn dc details)
816 = do { con_str <- lookupLOcc dc
818 PrefixCon ps -> do { qs <- repLPs ps; repPcon con_str qs }
819 RecCon pairs -> do { vs <- sequence $ map lookupLOcc (map hsRecFieldId pairs)
820 ; ps <- sequence $ map repLP (map hsRecFieldArg pairs)
821 ; fps <- zipWithM (\x y -> rep2 fieldPatName [unC x,unC y]) vs ps
822 ; fps' <- coreList fieldPatQTyConName fps
823 ; repPrec con_str fps' }
824 InfixCon p1 p2 -> do { p1' <- repLP p1;
826 repPinfix p1' con_str p2' }
828 repP (NPat l Nothing _ _) = do { a <- repOverloadedLiteral l; repPlit a }
829 repP p@(NPat l (Just _) _ _) = notHandled "Negative overloaded patterns" (ppr p)
830 repP p@(SigPatIn {}) = notHandled "Type signatures in patterns" (ppr p)
831 -- The problem is to do with scoped type variables.
832 -- To implement them, we have to implement the scoping rules
833 -- here in DsMeta, and I don't want to do that today!
834 -- do { p' <- repLP p; t' <- repLTy t; repPsig p' t' }
835 -- repPsig :: Core TH.PatQ -> Core TH.TypeQ -> DsM (Core TH.PatQ)
836 -- repPsig (MkC p) (MkC t) = rep2 sigPName [p, t]
838 repP other = notHandled "Exotic pattern" (ppr other)
840 ----------------------------------------------------------
841 -- Declaration ordering helpers
843 sort_by_loc :: [(SrcSpan, a)] -> [(SrcSpan, a)]
844 sort_by_loc xs = sortBy comp xs
845 where comp x y = compare (fst x) (fst y)
847 de_loc :: [(a, b)] -> [b]
850 ----------------------------------------------------------
851 -- The meta-environment
853 -- A name/identifier association for fresh names of locally bound entities
854 type GenSymBind = (Name, Id) -- Gensym the string and bind it to the Id
855 -- I.e. (x, x_id) means
856 -- let x_id = gensym "x" in ...
858 -- Generate a fresh name for a locally bound entity
860 mkGenSyms :: [Name] -> DsM [GenSymBind]
861 -- We can use the existing name. For example:
862 -- [| \x_77 -> x_77 + x_77 |]
864 -- do { x_77 <- genSym "x"; .... }
865 -- We use the same x_77 in the desugared program, but with the type Bndr
868 -- We do make it an Internal name, though (hence localiseName)
870 -- Nevertheless, it's monadic because we have to generate nameTy
871 mkGenSyms ns = do { var_ty <- lookupType nameTyConName
872 ; return [(nm, mkLocalId (localiseName nm) var_ty) | nm <- ns] }
875 addBinds :: [GenSymBind] -> DsM a -> DsM a
876 -- Add a list of fresh names for locally bound entities to the
877 -- meta environment (which is part of the state carried around
878 -- by the desugarer monad)
879 addBinds bs m = dsExtendMetaEnv (mkNameEnv [(n,Bound id) | (n,id) <- bs]) m
881 -- Look up a locally bound name
883 lookupLBinder :: Located Name -> DsM (Core TH.Name)
884 lookupLBinder (L _ n) = lookupBinder n
886 lookupBinder :: Name -> DsM (Core TH.Name)
888 = do { mb_val <- dsLookupMetaEnv n;
890 Just (Bound x) -> return (coreVar x)
891 other -> failWithDs msg }
893 msg = ptext SLIT("DsMeta: failed binder lookup when desugaring a TH bracket:") <+> ppr n
895 -- Look up a name that is either locally bound or a global name
897 -- * If it is a global name, generate the "original name" representation (ie,
898 -- the <module>:<name> form) for the associated entity
900 lookupLOcc :: Located Name -> DsM (Core TH.Name)
901 -- Lookup an occurrence; it can't be a splice.
902 -- Use the in-scope bindings if they exist
903 lookupLOcc (L _ n) = lookupOcc n
905 lookupOcc :: Name -> DsM (Core TH.Name)
907 = do { mb_val <- dsLookupMetaEnv n ;
909 Nothing -> globalVar n
910 Just (Bound x) -> return (coreVar x)
911 Just (Splice _) -> pprPanic "repE:lookupOcc" (ppr n)
914 globalVar :: Name -> DsM (Core TH.Name)
915 -- Not bound by the meta-env
916 -- Could be top-level; or could be local
917 -- f x = $(g [| x |])
918 -- Here the x will be local
920 | isExternalName name
921 = do { MkC mod <- coreStringLit name_mod
922 ; MkC pkg <- coreStringLit name_pkg
923 ; MkC occ <- occNameLit name
924 ; rep2 mk_varg [pkg,mod,occ] }
926 = do { MkC occ <- occNameLit name
927 ; MkC uni <- coreIntLit (getKey (getUnique name))
928 ; rep2 mkNameLName [occ,uni] }
930 mod = nameModule name
931 name_mod = moduleNameString (moduleName mod)
932 name_pkg = packageIdString (modulePackageId mod)
933 name_occ = nameOccName name
934 mk_varg | OccName.isDataOcc name_occ = mkNameG_dName
935 | OccName.isVarOcc name_occ = mkNameG_vName
936 | OccName.isTcOcc name_occ = mkNameG_tcName
937 | otherwise = pprPanic "DsMeta.globalVar" (ppr name)
939 lookupType :: Name -- Name of type constructor (e.g. TH.ExpQ)
940 -> DsM Type -- The type
941 lookupType tc_name = do { tc <- dsLookupTyCon tc_name ;
942 return (mkTyConApp tc []) }
944 wrapGenSyns :: [GenSymBind]
945 -> Core (TH.Q a) -> DsM (Core (TH.Q a))
946 -- wrapGenSyns [(nm1,id1), (nm2,id2)] y
947 -- --> bindQ (gensym nm1) (\ id1 ->
948 -- bindQ (gensym nm2 (\ id2 ->
951 wrapGenSyns binds body@(MkC b)
952 = do { var_ty <- lookupType nameTyConName
955 [elt_ty] = tcTyConAppArgs (exprType b)
956 -- b :: Q a, so we can get the type 'a' by looking at the
957 -- argument type. NB: this relies on Q being a data/newtype,
958 -- not a type synonym
960 go var_ty [] = return body
961 go var_ty ((name,id) : binds)
962 = do { MkC body' <- go var_ty binds
963 ; lit_str <- occNameLit name
964 ; gensym_app <- repGensym lit_str
965 ; repBindQ var_ty elt_ty
966 gensym_app (MkC (Lam id body')) }
968 -- Just like wrapGenSym, but don't actually do the gensym
969 -- Instead use the existing name:
970 -- let x = "x" in ...
971 -- Only used for [Decl], and for the class ops in class
972 -- and instance decls
973 wrapNongenSyms :: [GenSymBind] -> Core a -> DsM (Core a)
974 wrapNongenSyms binds (MkC body)
975 = do { binds' <- mapM do_one binds ;
976 return (MkC (mkLets binds' body)) }
979 = do { MkC lit_str <- occNameLit name
980 ; MkC var <- rep2 mkNameName [lit_str]
981 ; return (NonRec id var) }
983 occNameLit :: Name -> DsM (Core String)
984 occNameLit n = coreStringLit (occNameString (nameOccName n))
987 -- %*********************************************************************
991 -- %*********************************************************************
993 -----------------------------------------------------------------------------
994 -- PHANTOM TYPES for consistency. In order to make sure we do this correct
995 -- we invent a new datatype which uses phantom types.
997 newtype Core a = MkC CoreExpr
1000 rep2 :: Name -> [ CoreExpr ] -> DsM (Core a)
1001 rep2 n xs = do { id <- dsLookupGlobalId n
1002 ; return (MkC (foldl App (Var id) xs)) }
1004 -- Then we make "repConstructors" which use the phantom types for each of the
1005 -- smart constructors of the Meta.Meta datatypes.
1008 -- %*********************************************************************
1010 -- The 'smart constructors'
1012 -- %*********************************************************************
1014 --------------- Patterns -----------------
1015 repPlit :: Core TH.Lit -> DsM (Core TH.PatQ)
1016 repPlit (MkC l) = rep2 litPName [l]
1018 repPvar :: Core TH.Name -> DsM (Core TH.PatQ)
1019 repPvar (MkC s) = rep2 varPName [s]
1021 repPtup :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1022 repPtup (MkC ps) = rep2 tupPName [ps]
1024 repPcon :: Core TH.Name -> Core [TH.PatQ] -> DsM (Core TH.PatQ)
1025 repPcon (MkC s) (MkC ps) = rep2 conPName [s, ps]
1027 repPrec :: Core TH.Name -> Core [(TH.Name,TH.PatQ)] -> DsM (Core TH.PatQ)
1028 repPrec (MkC c) (MkC rps) = rep2 recPName [c,rps]
1030 repPinfix :: Core TH.PatQ -> Core TH.Name -> Core TH.PatQ -> DsM (Core TH.PatQ)
1031 repPinfix (MkC p1) (MkC n) (MkC p2) = rep2 infixPName [p1, n, p2]
1033 repPtilde :: Core TH.PatQ -> DsM (Core TH.PatQ)
1034 repPtilde (MkC p) = rep2 tildePName [p]
1036 repPaspat :: Core TH.Name -> Core TH.PatQ -> DsM (Core TH.PatQ)
1037 repPaspat (MkC s) (MkC p) = rep2 asPName [s, p]
1039 repPwild :: DsM (Core TH.PatQ)
1040 repPwild = rep2 wildPName []
1042 repPlist :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1043 repPlist (MkC ps) = rep2 listPName [ps]
1045 --------------- Expressions -----------------
1046 repVarOrCon :: Name -> Core TH.Name -> DsM (Core TH.ExpQ)
1047 repVarOrCon vc str | isDataOcc (nameOccName vc) = repCon str
1048 | otherwise = repVar str
1050 repVar :: Core TH.Name -> DsM (Core TH.ExpQ)
1051 repVar (MkC s) = rep2 varEName [s]
1053 repCon :: Core TH.Name -> DsM (Core TH.ExpQ)
1054 repCon (MkC s) = rep2 conEName [s]
1056 repLit :: Core TH.Lit -> DsM (Core TH.ExpQ)
1057 repLit (MkC c) = rep2 litEName [c]
1059 repApp :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1060 repApp (MkC x) (MkC y) = rep2 appEName [x,y]
1062 repLam :: Core [TH.PatQ] -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1063 repLam (MkC ps) (MkC e) = rep2 lamEName [ps, e]
1065 repTup :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1066 repTup (MkC es) = rep2 tupEName [es]
1068 repCond :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1069 repCond (MkC x) (MkC y) (MkC z) = rep2 condEName [x,y,z]
1071 repLetE :: Core [TH.DecQ] -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1072 repLetE (MkC ds) (MkC e) = rep2 letEName [ds, e]
1074 repCaseE :: Core TH.ExpQ -> Core [TH.MatchQ] -> DsM( Core TH.ExpQ)
1075 repCaseE (MkC e) (MkC ms) = rep2 caseEName [e, ms]
1077 repDoE :: Core [TH.StmtQ] -> DsM (Core TH.ExpQ)
1078 repDoE (MkC ss) = rep2 doEName [ss]
1080 repComp :: Core [TH.StmtQ] -> DsM (Core TH.ExpQ)
1081 repComp (MkC ss) = rep2 compEName [ss]
1083 repListExp :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1084 repListExp (MkC es) = rep2 listEName [es]
1086 repSigExp :: Core TH.ExpQ -> Core TH.TypeQ -> DsM (Core TH.ExpQ)
1087 repSigExp (MkC e) (MkC t) = rep2 sigEName [e,t]
1089 repRecCon :: Core TH.Name -> Core [TH.Q TH.FieldExp]-> DsM (Core TH.ExpQ)
1090 repRecCon (MkC c) (MkC fs) = rep2 recConEName [c,fs]
1092 repRecUpd :: Core TH.ExpQ -> Core [TH.Q TH.FieldExp] -> DsM (Core TH.ExpQ)
1093 repRecUpd (MkC e) (MkC fs) = rep2 recUpdEName [e,fs]
1095 repFieldExp :: Core TH.Name -> Core TH.ExpQ -> DsM (Core (TH.Q TH.FieldExp))
1096 repFieldExp (MkC n) (MkC x) = rep2 fieldExpName [n,x]
1098 repInfixApp :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1099 repInfixApp (MkC x) (MkC y) (MkC z) = rep2 infixAppName [x,y,z]
1101 repSectionL :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1102 repSectionL (MkC x) (MkC y) = rep2 sectionLName [x,y]
1104 repSectionR :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1105 repSectionR (MkC x) (MkC y) = rep2 sectionRName [x,y]
1107 ------------ Right hand sides (guarded expressions) ----
1108 repGuarded :: Core [TH.Q (TH.Guard, TH.Exp)] -> DsM (Core TH.BodyQ)
1109 repGuarded (MkC pairs) = rep2 guardedBName [pairs]
1111 repNormal :: Core TH.ExpQ -> DsM (Core TH.BodyQ)
1112 repNormal (MkC e) = rep2 normalBName [e]
1114 ------------ Guards ----
1115 repLNormalGE :: LHsExpr Name -> LHsExpr Name -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1116 repLNormalGE g e = do g' <- repLE g
1120 repNormalGE :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1121 repNormalGE (MkC g) (MkC e) = rep2 normalGEName [g, e]
1123 repPatGE :: Core [TH.StmtQ] -> Core TH.ExpQ -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1124 repPatGE (MkC ss) (MkC e) = rep2 patGEName [ss, e]
1126 ------------- Stmts -------------------
1127 repBindSt :: Core TH.PatQ -> Core TH.ExpQ -> DsM (Core TH.StmtQ)
1128 repBindSt (MkC p) (MkC e) = rep2 bindSName [p,e]
1130 repLetSt :: Core [TH.DecQ] -> DsM (Core TH.StmtQ)
1131 repLetSt (MkC ds) = rep2 letSName [ds]
1133 repNoBindSt :: Core TH.ExpQ -> DsM (Core TH.StmtQ)
1134 repNoBindSt (MkC e) = rep2 noBindSName [e]
1136 -------------- Range (Arithmetic sequences) -----------
1137 repFrom :: Core TH.ExpQ -> DsM (Core TH.ExpQ)
1138 repFrom (MkC x) = rep2 fromEName [x]
1140 repFromThen :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1141 repFromThen (MkC x) (MkC y) = rep2 fromThenEName [x,y]
1143 repFromTo :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1144 repFromTo (MkC x) (MkC y) = rep2 fromToEName [x,y]
1146 repFromThenTo :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1147 repFromThenTo (MkC x) (MkC y) (MkC z) = rep2 fromThenToEName [x,y,z]
1149 ------------ Match and Clause Tuples -----------
1150 repMatch :: Core TH.PatQ -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.MatchQ)
1151 repMatch (MkC p) (MkC bod) (MkC ds) = rep2 matchName [p, bod, ds]
1153 repClause :: Core [TH.PatQ] -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.ClauseQ)
1154 repClause (MkC ps) (MkC bod) (MkC ds) = rep2 clauseName [ps, bod, ds]
1156 -------------- Dec -----------------------------
1157 repVal :: Core TH.PatQ -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1158 repVal (MkC p) (MkC b) (MkC ds) = rep2 valDName [p, b, ds]
1160 repFun :: Core TH.Name -> Core [TH.ClauseQ] -> DsM (Core TH.DecQ)
1161 repFun (MkC nm) (MkC b) = rep2 funDName [nm, b]
1163 repData :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core [TH.ConQ] -> Core [TH.Name] -> DsM (Core TH.DecQ)
1164 repData (MkC cxt) (MkC nm) (MkC tvs) (MkC cons) (MkC derivs)
1165 = rep2 dataDName [cxt, nm, tvs, cons, derivs]
1167 repNewtype :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core TH.ConQ -> Core [TH.Name] -> DsM (Core TH.DecQ)
1168 repNewtype (MkC cxt) (MkC nm) (MkC tvs) (MkC con) (MkC derivs)
1169 = rep2 newtypeDName [cxt, nm, tvs, con, derivs]
1171 repTySyn :: Core TH.Name -> Core [TH.Name] -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1172 repTySyn (MkC nm) (MkC tvs) (MkC rhs) = rep2 tySynDName [nm, tvs, rhs]
1174 repInst :: Core TH.CxtQ -> Core TH.TypeQ -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1175 repInst (MkC cxt) (MkC ty) (MkC ds) = rep2 instanceDName [cxt, ty, ds]
1177 repClass :: Core TH.CxtQ -> Core TH.Name -> Core [TH.Name] -> Core [TH.FunDep] -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1178 repClass (MkC cxt) (MkC cls) (MkC tvs) (MkC fds) (MkC ds) = rep2 classDName [cxt, cls, tvs, fds, ds]
1180 repFunDep :: Core [TH.Name] -> Core [TH.Name] -> DsM (Core TH.FunDep)
1181 repFunDep (MkC xs) (MkC ys) = rep2 funDepName [xs, ys]
1183 repProto :: Core TH.Name -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1184 repProto (MkC s) (MkC ty) = rep2 sigDName [s, ty]
1186 repCtxt :: Core [TH.TypeQ] -> DsM (Core TH.CxtQ)
1187 repCtxt (MkC tys) = rep2 cxtName [tys]
1189 repConstr :: Core TH.Name -> HsConDetails Name (LBangType Name)
1190 -> DsM (Core TH.ConQ)
1191 repConstr con (PrefixCon ps)
1192 = do arg_tys <- mapM repBangTy ps
1193 arg_tys1 <- coreList strictTypeQTyConName arg_tys
1194 rep2 normalCName [unC con, unC arg_tys1]
1195 repConstr con (RecCon ips)
1196 = do arg_vs <- mapM lookupLOcc (map hsRecFieldId ips)
1197 arg_tys <- mapM repBangTy (map hsRecFieldArg ips)
1198 arg_vtys <- zipWithM (\x y -> rep2 varStrictTypeName [unC x, unC y])
1200 arg_vtys' <- coreList varStrictTypeQTyConName arg_vtys
1201 rep2 recCName [unC con, unC arg_vtys']
1202 repConstr con (InfixCon st1 st2)
1203 = do arg1 <- repBangTy st1
1204 arg2 <- repBangTy st2
1205 rep2 infixCName [unC arg1, unC con, unC arg2]
1207 ------------ Types -------------------
1209 repTForall :: Core [TH.Name] -> Core TH.CxtQ -> Core TH.TypeQ -> DsM (Core TH.TypeQ)
1210 repTForall (MkC tvars) (MkC ctxt) (MkC ty)
1211 = rep2 forallTName [tvars, ctxt, ty]
1213 repTvar :: Core TH.Name -> DsM (Core TH.TypeQ)
1214 repTvar (MkC s) = rep2 varTName [s]
1216 repTapp :: Core TH.TypeQ -> Core TH.TypeQ -> DsM (Core TH.TypeQ)
1217 repTapp (MkC t1) (MkC t2) = rep2 appTName [t1,t2]
1219 repTapps :: Core TH.TypeQ -> [Core TH.TypeQ] -> DsM (Core TH.TypeQ)
1220 repTapps f [] = return f
1221 repTapps f (t:ts) = do { f1 <- repTapp f t; repTapps f1 ts }
1223 --------- Type constructors --------------
1225 repNamedTyCon :: Core TH.Name -> DsM (Core TH.TypeQ)
1226 repNamedTyCon (MkC s) = rep2 conTName [s]
1228 repTupleTyCon :: Int -> DsM (Core TH.TypeQ)
1229 -- Note: not Core Int; it's easier to be direct here
1230 repTupleTyCon i = rep2 tupleTName [mkIntExpr (fromIntegral i)]
1232 repArrowTyCon :: DsM (Core TH.TypeQ)
1233 repArrowTyCon = rep2 arrowTName []
1235 repListTyCon :: DsM (Core TH.TypeQ)
1236 repListTyCon = rep2 listTName []
1239 ----------------------------------------------------------
1242 repLiteral :: HsLit -> DsM (Core TH.Lit)
1244 = do lit' <- case lit of
1245 HsIntPrim i -> mk_integer i
1246 HsInt i -> mk_integer i
1247 HsFloatPrim r -> mk_rational r
1248 HsDoublePrim r -> mk_rational r
1250 lit_expr <- dsLit lit'
1252 Just lit_name -> rep2 lit_name [lit_expr]
1253 Nothing -> notHandled "Exotic literal" (ppr lit)
1255 mb_lit_name = case lit of
1256 HsInteger _ _ -> Just integerLName
1257 HsInt _ -> Just integerLName
1258 HsIntPrim _ -> Just intPrimLName
1259 HsFloatPrim _ -> Just floatPrimLName
1260 HsDoublePrim _ -> Just doublePrimLName
1261 HsChar _ -> Just charLName
1262 HsString _ -> Just stringLName
1263 HsRat _ _ -> Just rationalLName
1266 mk_integer i = do integer_ty <- lookupType integerTyConName
1267 return $ HsInteger i integer_ty
1268 mk_rational r = do rat_ty <- lookupType rationalTyConName
1269 return $ HsRat r rat_ty
1271 repOverloadedLiteral :: HsOverLit Name -> DsM (Core TH.Lit)
1272 repOverloadedLiteral (HsIntegral i _) = do { lit <- mk_integer i; repLiteral lit }
1273 repOverloadedLiteral (HsFractional f _) = do { lit <- mk_rational f; repLiteral lit }
1274 -- The type Rational will be in the environment, becuase
1275 -- the smart constructor 'TH.Syntax.rationalL' uses it in its type,
1276 -- and rationalL is sucked in when any TH stuff is used
1278 --------------- Miscellaneous -------------------
1280 repGensym :: Core String -> DsM (Core (TH.Q TH.Name))
1281 repGensym (MkC lit_str) = rep2 newNameName [lit_str]
1283 repBindQ :: Type -> Type -- a and b
1284 -> Core (TH.Q a) -> Core (a -> TH.Q b) -> DsM (Core (TH.Q b))
1285 repBindQ ty_a ty_b (MkC x) (MkC y)
1286 = rep2 bindQName [Type ty_a, Type ty_b, x, y]
1288 repSequenceQ :: Type -> Core [TH.Q a] -> DsM (Core (TH.Q [a]))
1289 repSequenceQ ty_a (MkC list)
1290 = rep2 sequenceQName [Type ty_a, list]
1292 ------------ Lists and Tuples -------------------
1293 -- turn a list of patterns into a single pattern matching a list
1295 coreList :: Name -- Of the TyCon of the element type
1296 -> [Core a] -> DsM (Core [a])
1298 = do { elt_ty <- lookupType tc_name; return (coreList' elt_ty es) }
1300 coreList' :: Type -- The element type
1301 -> [Core a] -> Core [a]
1302 coreList' elt_ty es = MkC (mkListExpr elt_ty (map unC es ))
1304 nonEmptyCoreList :: [Core a] -> Core [a]
1305 -- The list must be non-empty so we can get the element type
1306 -- Otherwise use coreList
1307 nonEmptyCoreList [] = panic "coreList: empty argument"
1308 nonEmptyCoreList xs@(MkC x:_) = MkC (mkListExpr (exprType x) (map unC xs))
1310 corePair :: (Core a, Core b) -> Core (a,b)
1311 corePair (MkC x, MkC y) = MkC (mkCoreTup [x,y])
1313 coreStringLit :: String -> DsM (Core String)
1314 coreStringLit s = do { z <- mkStringExpr s; return(MkC z) }
1316 coreIntLit :: Int -> DsM (Core Int)
1317 coreIntLit i = return (MkC (mkIntExpr (fromIntegral i)))
1319 coreVar :: Id -> Core TH.Name -- The Id has type Name
1320 coreVar id = MkC (Var id)
1322 ----------------- Failure -----------------------
1323 notHandled :: String -> SDoc -> DsM a
1324 notHandled what doc = failWithDs msg
1326 msg = hang (text what <+> ptext SLIT("not (yet) handled by Template Haskell"))
1330 -- %************************************************************************
1332 -- The known-key names for Template Haskell
1334 -- %************************************************************************
1336 -- To add a name, do three things
1338 -- 1) Allocate a key
1340 -- 3) Add the name to knownKeyNames
1342 templateHaskellNames :: [Name]
1343 -- The names that are implicitly mentioned by ``bracket''
1344 -- Should stay in sync with the import list of DsMeta
1346 templateHaskellNames = [
1347 returnQName, bindQName, sequenceQName, newNameName, liftName,
1348 mkNameName, mkNameG_vName, mkNameG_dName, mkNameG_tcName, mkNameLName,
1351 charLName, stringLName, integerLName, intPrimLName,
1352 floatPrimLName, doublePrimLName, rationalLName,
1354 litPName, varPName, tupPName, conPName, tildePName, infixPName,
1355 asPName, wildPName, recPName, listPName, sigPName,
1363 varEName, conEName, litEName, appEName, infixEName,
1364 infixAppName, sectionLName, sectionRName, lamEName, tupEName,
1365 condEName, letEName, caseEName, doEName, compEName,
1366 fromEName, fromThenEName, fromToEName, fromThenToEName,
1367 listEName, sigEName, recConEName, recUpdEName,
1371 guardedBName, normalBName,
1373 normalGEName, patGEName,
1375 bindSName, letSName, noBindSName, parSName,
1377 funDName, valDName, dataDName, newtypeDName, tySynDName,
1378 classDName, instanceDName, sigDName, forImpDName,
1382 isStrictName, notStrictName,
1384 normalCName, recCName, infixCName, forallCName,
1390 forallTName, varTName, conTName, appTName,
1391 tupleTName, arrowTName, listTName,
1393 cCallName, stdCallName,
1402 qTyConName, nameTyConName, patTyConName, fieldPatTyConName, matchQTyConName,
1403 clauseQTyConName, expQTyConName, fieldExpTyConName, stmtQTyConName,
1404 decQTyConName, conQTyConName, strictTypeQTyConName,
1405 varStrictTypeQTyConName, typeQTyConName, expTyConName, decTyConName,
1406 typeTyConName, matchTyConName, clauseTyConName, patQTyConName,
1407 fieldPatQTyConName, fieldExpQTyConName, funDepTyConName]
1410 thSyn = mkTHModule FSLIT("Language.Haskell.TH.Syntax")
1411 thLib = mkTHModule FSLIT("Language.Haskell.TH.Lib")
1413 mkTHModule m = mkModule thPackageId (mkModuleNameFS m)
1415 libFun = mk_known_key_name OccName.varName thLib
1416 libTc = mk_known_key_name OccName.tcName thLib
1417 thFun = mk_known_key_name OccName.varName thSyn
1418 thTc = mk_known_key_name OccName.tcName thSyn
1420 -------------------- TH.Syntax -----------------------
1421 qTyConName = thTc FSLIT("Q") qTyConKey
1422 nameTyConName = thTc FSLIT("Name") nameTyConKey
1423 fieldExpTyConName = thTc FSLIT("FieldExp") fieldExpTyConKey
1424 patTyConName = thTc FSLIT("Pat") patTyConKey
1425 fieldPatTyConName = thTc FSLIT("FieldPat") fieldPatTyConKey
1426 expTyConName = thTc FSLIT("Exp") expTyConKey
1427 decTyConName = thTc FSLIT("Dec") decTyConKey
1428 typeTyConName = thTc FSLIT("Type") typeTyConKey
1429 matchTyConName = thTc FSLIT("Match") matchTyConKey
1430 clauseTyConName = thTc FSLIT("Clause") clauseTyConKey
1431 funDepTyConName = thTc FSLIT("FunDep") funDepTyConKey
1433 returnQName = thFun FSLIT("returnQ") returnQIdKey
1434 bindQName = thFun FSLIT("bindQ") bindQIdKey
1435 sequenceQName = thFun FSLIT("sequenceQ") sequenceQIdKey
1436 newNameName = thFun FSLIT("newName") newNameIdKey
1437 liftName = thFun FSLIT("lift") liftIdKey
1438 mkNameName = thFun FSLIT("mkName") mkNameIdKey
1439 mkNameG_vName = thFun FSLIT("mkNameG_v") mkNameG_vIdKey
1440 mkNameG_dName = thFun FSLIT("mkNameG_d") mkNameG_dIdKey
1441 mkNameG_tcName = thFun FSLIT("mkNameG_tc") mkNameG_tcIdKey
1442 mkNameLName = thFun FSLIT("mkNameL") mkNameLIdKey
1445 -------------------- TH.Lib -----------------------
1447 charLName = libFun FSLIT("charL") charLIdKey
1448 stringLName = libFun FSLIT("stringL") stringLIdKey
1449 integerLName = libFun FSLIT("integerL") integerLIdKey
1450 intPrimLName = libFun FSLIT("intPrimL") intPrimLIdKey
1451 floatPrimLName = libFun FSLIT("floatPrimL") floatPrimLIdKey
1452 doublePrimLName = libFun FSLIT("doublePrimL") doublePrimLIdKey
1453 rationalLName = libFun FSLIT("rationalL") rationalLIdKey
1456 litPName = libFun FSLIT("litP") litPIdKey
1457 varPName = libFun FSLIT("varP") varPIdKey
1458 tupPName = libFun FSLIT("tupP") tupPIdKey
1459 conPName = libFun FSLIT("conP") conPIdKey
1460 infixPName = libFun FSLIT("infixP") infixPIdKey
1461 tildePName = libFun FSLIT("tildeP") tildePIdKey
1462 asPName = libFun FSLIT("asP") asPIdKey
1463 wildPName = libFun FSLIT("wildP") wildPIdKey
1464 recPName = libFun FSLIT("recP") recPIdKey
1465 listPName = libFun FSLIT("listP") listPIdKey
1466 sigPName = libFun FSLIT("sigP") sigPIdKey
1468 -- type FieldPat = ...
1469 fieldPatName = libFun FSLIT("fieldPat") fieldPatIdKey
1472 matchName = libFun FSLIT("match") matchIdKey
1474 -- data Clause = ...
1475 clauseName = libFun FSLIT("clause") clauseIdKey
1478 varEName = libFun FSLIT("varE") varEIdKey
1479 conEName = libFun FSLIT("conE") conEIdKey
1480 litEName = libFun FSLIT("litE") litEIdKey
1481 appEName = libFun FSLIT("appE") appEIdKey
1482 infixEName = libFun FSLIT("infixE") infixEIdKey
1483 infixAppName = libFun FSLIT("infixApp") infixAppIdKey
1484 sectionLName = libFun FSLIT("sectionL") sectionLIdKey
1485 sectionRName = libFun FSLIT("sectionR") sectionRIdKey
1486 lamEName = libFun FSLIT("lamE") lamEIdKey
1487 tupEName = libFun FSLIT("tupE") tupEIdKey
1488 condEName = libFun FSLIT("condE") condEIdKey
1489 letEName = libFun FSLIT("letE") letEIdKey
1490 caseEName = libFun FSLIT("caseE") caseEIdKey
1491 doEName = libFun FSLIT("doE") doEIdKey
1492 compEName = libFun FSLIT("compE") compEIdKey
1493 -- ArithSeq skips a level
1494 fromEName = libFun FSLIT("fromE") fromEIdKey
1495 fromThenEName = libFun FSLIT("fromThenE") fromThenEIdKey
1496 fromToEName = libFun FSLIT("fromToE") fromToEIdKey
1497 fromThenToEName = libFun FSLIT("fromThenToE") fromThenToEIdKey
1499 listEName = libFun FSLIT("listE") listEIdKey
1500 sigEName = libFun FSLIT("sigE") sigEIdKey
1501 recConEName = libFun FSLIT("recConE") recConEIdKey
1502 recUpdEName = libFun FSLIT("recUpdE") recUpdEIdKey
1504 -- type FieldExp = ...
1505 fieldExpName = libFun FSLIT("fieldExp") fieldExpIdKey
1508 guardedBName = libFun FSLIT("guardedB") guardedBIdKey
1509 normalBName = libFun FSLIT("normalB") normalBIdKey
1512 normalGEName = libFun FSLIT("normalGE") normalGEIdKey
1513 patGEName = libFun FSLIT("patGE") patGEIdKey
1516 bindSName = libFun FSLIT("bindS") bindSIdKey
1517 letSName = libFun FSLIT("letS") letSIdKey
1518 noBindSName = libFun FSLIT("noBindS") noBindSIdKey
1519 parSName = libFun FSLIT("parS") parSIdKey
1522 funDName = libFun FSLIT("funD") funDIdKey
1523 valDName = libFun FSLIT("valD") valDIdKey
1524 dataDName = libFun FSLIT("dataD") dataDIdKey
1525 newtypeDName = libFun FSLIT("newtypeD") newtypeDIdKey
1526 tySynDName = libFun FSLIT("tySynD") tySynDIdKey
1527 classDName = libFun FSLIT("classD") classDIdKey
1528 instanceDName = libFun FSLIT("instanceD") instanceDIdKey
1529 sigDName = libFun FSLIT("sigD") sigDIdKey
1530 forImpDName = libFun FSLIT("forImpD") forImpDIdKey
1533 cxtName = libFun FSLIT("cxt") cxtIdKey
1535 -- data Strict = ...
1536 isStrictName = libFun FSLIT("isStrict") isStrictKey
1537 notStrictName = libFun FSLIT("notStrict") notStrictKey
1540 normalCName = libFun FSLIT("normalC") normalCIdKey
1541 recCName = libFun FSLIT("recC") recCIdKey
1542 infixCName = libFun FSLIT("infixC") infixCIdKey
1543 forallCName = libFun FSLIT("forallC") forallCIdKey
1545 -- type StrictType = ...
1546 strictTypeName = libFun FSLIT("strictType") strictTKey
1548 -- type VarStrictType = ...
1549 varStrictTypeName = libFun FSLIT("varStrictType") varStrictTKey
1552 forallTName = libFun FSLIT("forallT") forallTIdKey
1553 varTName = libFun FSLIT("varT") varTIdKey
1554 conTName = libFun FSLIT("conT") conTIdKey
1555 tupleTName = libFun FSLIT("tupleT") tupleTIdKey
1556 arrowTName = libFun FSLIT("arrowT") arrowTIdKey
1557 listTName = libFun FSLIT("listT") listTIdKey
1558 appTName = libFun FSLIT("appT") appTIdKey
1560 -- data Callconv = ...
1561 cCallName = libFun FSLIT("cCall") cCallIdKey
1562 stdCallName = libFun FSLIT("stdCall") stdCallIdKey
1564 -- data Safety = ...
1565 unsafeName = libFun FSLIT("unsafe") unsafeIdKey
1566 safeName = libFun FSLIT("safe") safeIdKey
1567 threadsafeName = libFun FSLIT("threadsafe") threadsafeIdKey
1569 -- data FunDep = ...
1570 funDepName = libFun FSLIT("funDep") funDepIdKey
1572 matchQTyConName = libTc FSLIT("MatchQ") matchQTyConKey
1573 clauseQTyConName = libTc FSLIT("ClauseQ") clauseQTyConKey
1574 expQTyConName = libTc FSLIT("ExpQ") expQTyConKey
1575 stmtQTyConName = libTc FSLIT("StmtQ") stmtQTyConKey
1576 decQTyConName = libTc FSLIT("DecQ") decQTyConKey
1577 conQTyConName = libTc FSLIT("ConQ") conQTyConKey
1578 strictTypeQTyConName = libTc FSLIT("StrictTypeQ") strictTypeQTyConKey
1579 varStrictTypeQTyConName = libTc FSLIT("VarStrictTypeQ") varStrictTypeQTyConKey
1580 typeQTyConName = libTc FSLIT("TypeQ") typeQTyConKey
1581 fieldExpQTyConName = libTc FSLIT("FieldExpQ") fieldExpQTyConKey
1582 patQTyConName = libTc FSLIT("PatQ") patQTyConKey
1583 fieldPatQTyConName = libTc FSLIT("FieldPatQ") fieldPatQTyConKey
1585 -- TyConUniques available: 100-129
1586 -- Check in PrelNames if you want to change this
1588 expTyConKey = mkPreludeTyConUnique 100
1589 matchTyConKey = mkPreludeTyConUnique 101
1590 clauseTyConKey = mkPreludeTyConUnique 102
1591 qTyConKey = mkPreludeTyConUnique 103
1592 expQTyConKey = mkPreludeTyConUnique 104
1593 decQTyConKey = mkPreludeTyConUnique 105
1594 patTyConKey = mkPreludeTyConUnique 106
1595 matchQTyConKey = mkPreludeTyConUnique 107
1596 clauseQTyConKey = mkPreludeTyConUnique 108
1597 stmtQTyConKey = mkPreludeTyConUnique 109
1598 conQTyConKey = mkPreludeTyConUnique 110
1599 typeQTyConKey = mkPreludeTyConUnique 111
1600 typeTyConKey = mkPreludeTyConUnique 112
1601 decTyConKey = mkPreludeTyConUnique 113
1602 varStrictTypeQTyConKey = mkPreludeTyConUnique 114
1603 strictTypeQTyConKey = mkPreludeTyConUnique 115
1604 fieldExpTyConKey = mkPreludeTyConUnique 116
1605 fieldPatTyConKey = mkPreludeTyConUnique 117
1606 nameTyConKey = mkPreludeTyConUnique 118
1607 patQTyConKey = mkPreludeTyConUnique 119
1608 fieldPatQTyConKey = mkPreludeTyConUnique 120
1609 fieldExpQTyConKey = mkPreludeTyConUnique 121
1610 funDepTyConKey = mkPreludeTyConUnique 122
1612 -- IdUniques available: 200-399
1613 -- If you want to change this, make sure you check in PrelNames
1615 returnQIdKey = mkPreludeMiscIdUnique 200
1616 bindQIdKey = mkPreludeMiscIdUnique 201
1617 sequenceQIdKey = mkPreludeMiscIdUnique 202
1618 liftIdKey = mkPreludeMiscIdUnique 203
1619 newNameIdKey = mkPreludeMiscIdUnique 204
1620 mkNameIdKey = mkPreludeMiscIdUnique 205
1621 mkNameG_vIdKey = mkPreludeMiscIdUnique 206
1622 mkNameG_dIdKey = mkPreludeMiscIdUnique 207
1623 mkNameG_tcIdKey = mkPreludeMiscIdUnique 208
1624 mkNameLIdKey = mkPreludeMiscIdUnique 209
1628 charLIdKey = mkPreludeMiscIdUnique 210
1629 stringLIdKey = mkPreludeMiscIdUnique 211
1630 integerLIdKey = mkPreludeMiscIdUnique 212
1631 intPrimLIdKey = mkPreludeMiscIdUnique 213
1632 floatPrimLIdKey = mkPreludeMiscIdUnique 214
1633 doublePrimLIdKey = mkPreludeMiscIdUnique 215
1634 rationalLIdKey = mkPreludeMiscIdUnique 216
1637 litPIdKey = mkPreludeMiscIdUnique 220
1638 varPIdKey = mkPreludeMiscIdUnique 221
1639 tupPIdKey = mkPreludeMiscIdUnique 222
1640 conPIdKey = mkPreludeMiscIdUnique 223
1641 infixPIdKey = mkPreludeMiscIdUnique 312
1642 tildePIdKey = mkPreludeMiscIdUnique 224
1643 asPIdKey = mkPreludeMiscIdUnique 225
1644 wildPIdKey = mkPreludeMiscIdUnique 226
1645 recPIdKey = mkPreludeMiscIdUnique 227
1646 listPIdKey = mkPreludeMiscIdUnique 228
1647 sigPIdKey = mkPreludeMiscIdUnique 229
1649 -- type FieldPat = ...
1650 fieldPatIdKey = mkPreludeMiscIdUnique 230
1653 matchIdKey = mkPreludeMiscIdUnique 231
1655 -- data Clause = ...
1656 clauseIdKey = mkPreludeMiscIdUnique 232
1659 varEIdKey = mkPreludeMiscIdUnique 240
1660 conEIdKey = mkPreludeMiscIdUnique 241
1661 litEIdKey = mkPreludeMiscIdUnique 242
1662 appEIdKey = mkPreludeMiscIdUnique 243
1663 infixEIdKey = mkPreludeMiscIdUnique 244
1664 infixAppIdKey = mkPreludeMiscIdUnique 245
1665 sectionLIdKey = mkPreludeMiscIdUnique 246
1666 sectionRIdKey = mkPreludeMiscIdUnique 247
1667 lamEIdKey = mkPreludeMiscIdUnique 248
1668 tupEIdKey = mkPreludeMiscIdUnique 249
1669 condEIdKey = mkPreludeMiscIdUnique 250
1670 letEIdKey = mkPreludeMiscIdUnique 251
1671 caseEIdKey = mkPreludeMiscIdUnique 252
1672 doEIdKey = mkPreludeMiscIdUnique 253
1673 compEIdKey = mkPreludeMiscIdUnique 254
1674 fromEIdKey = mkPreludeMiscIdUnique 255
1675 fromThenEIdKey = mkPreludeMiscIdUnique 256
1676 fromToEIdKey = mkPreludeMiscIdUnique 257
1677 fromThenToEIdKey = mkPreludeMiscIdUnique 258
1678 listEIdKey = mkPreludeMiscIdUnique 259
1679 sigEIdKey = mkPreludeMiscIdUnique 260
1680 recConEIdKey = mkPreludeMiscIdUnique 261
1681 recUpdEIdKey = mkPreludeMiscIdUnique 262
1683 -- type FieldExp = ...
1684 fieldExpIdKey = mkPreludeMiscIdUnique 265
1687 guardedBIdKey = mkPreludeMiscIdUnique 266
1688 normalBIdKey = mkPreludeMiscIdUnique 267
1691 normalGEIdKey = mkPreludeMiscIdUnique 310
1692 patGEIdKey = mkPreludeMiscIdUnique 311
1695 bindSIdKey = mkPreludeMiscIdUnique 268
1696 letSIdKey = mkPreludeMiscIdUnique 269
1697 noBindSIdKey = mkPreludeMiscIdUnique 270
1698 parSIdKey = mkPreludeMiscIdUnique 271
1701 funDIdKey = mkPreludeMiscIdUnique 272
1702 valDIdKey = mkPreludeMiscIdUnique 273
1703 dataDIdKey = mkPreludeMiscIdUnique 274
1704 newtypeDIdKey = mkPreludeMiscIdUnique 275
1705 tySynDIdKey = mkPreludeMiscIdUnique 276
1706 classDIdKey = mkPreludeMiscIdUnique 277
1707 instanceDIdKey = mkPreludeMiscIdUnique 278
1708 sigDIdKey = mkPreludeMiscIdUnique 279
1709 forImpDIdKey = mkPreludeMiscIdUnique 297
1712 cxtIdKey = mkPreludeMiscIdUnique 280
1714 -- data Strict = ...
1715 isStrictKey = mkPreludeMiscIdUnique 281
1716 notStrictKey = mkPreludeMiscIdUnique 282
1719 normalCIdKey = mkPreludeMiscIdUnique 283
1720 recCIdKey = mkPreludeMiscIdUnique 284
1721 infixCIdKey = mkPreludeMiscIdUnique 285
1722 forallCIdKey = mkPreludeMiscIdUnique 288
1724 -- type StrictType = ...
1725 strictTKey = mkPreludeMiscIdUnique 286
1727 -- type VarStrictType = ...
1728 varStrictTKey = mkPreludeMiscIdUnique 287
1731 forallTIdKey = mkPreludeMiscIdUnique 290
1732 varTIdKey = mkPreludeMiscIdUnique 291
1733 conTIdKey = mkPreludeMiscIdUnique 292
1734 tupleTIdKey = mkPreludeMiscIdUnique 294
1735 arrowTIdKey = mkPreludeMiscIdUnique 295
1736 listTIdKey = mkPreludeMiscIdUnique 296
1737 appTIdKey = mkPreludeMiscIdUnique 293
1739 -- data Callconv = ...
1740 cCallIdKey = mkPreludeMiscIdUnique 300
1741 stdCallIdKey = mkPreludeMiscIdUnique 301
1743 -- data Safety = ...
1744 unsafeIdKey = mkPreludeMiscIdUnique 305
1745 safeIdKey = mkPreludeMiscIdUnique 306
1746 threadsafeIdKey = mkPreludeMiscIdUnique 307
1748 -- data FunDep = ...
1749 funDepIdKey = mkPreludeMiscIdUnique 320