1 -----------------------------------------------------------------------------
2 -- The purpose of this module is to transform an HsExpr into a CoreExpr which
3 -- when evaluated, returns a (Meta.Q Meta.Exp) computation analogous to the
4 -- input HsExpr. We do this in the DsM monad, which supplies access to
5 -- CoreExpr's of the "smart constructors" of the Meta.Exp datatype.
7 -- It also defines a bunch of knownKeyNames, in the same way as is done
8 -- in prelude/PrelNames. It's much more convenient to do it here, becuase
9 -- otherwise we have to recompile PrelNames whenever we add a Name, which is
10 -- a Royal Pain (triggers other recompilation).
11 -----------------------------------------------------------------------------
14 module DsMeta( dsBracket, dsReify,
15 templateHaskellNames, qTyConName,
16 liftName, expQTyConName, decQTyConName, typeQTyConName,
17 decTyConName, typeTyConName ) where
19 #include "HsVersions.h"
21 import {-# SOURCE #-} DsExpr ( dsExpr )
23 import MatchLit ( dsLit )
24 import DsUtils ( mkListExpr, mkStringLit, mkCoreTup, mkIntExpr )
27 import qualified Language.Haskell.THSyntax as M
29 import HsSyn ( Pat(..), HsExpr(..), Stmt(..), HsLit(..), HsOverLit(..),
30 Match(..), GRHSs(..), GRHS(..), HsBracket(..),
31 HsStmtContext(ListComp,DoExpr), ArithSeqInfo(..),
32 HsBinds(..), MonoBinds(..), HsConDetails(..),
33 TyClDecl(..), HsGroup(..),
34 HsReify(..), ReifyFlavour(..),
35 HsType(..), HsContext(..), HsPred(..), HsTyOp(..),
36 HsTyVarBndr(..), Sig(..), ForeignDecl(..),
37 InstDecl(..), ConDecl(..), BangType(..),
38 PendingSplice, splitHsInstDeclTy,
39 placeHolderType, tyClDeclNames,
40 collectHsBinders, collectPatBinders, collectPatsBinders,
41 hsTyVarName, hsConArgs, getBangType,
45 import PrelNames ( mETA_META_Name, rationalTyConName, negateName,
47 import MkIface ( ifaceTyThing )
48 import Name ( Name, nameOccName, nameModule, getSrcLoc )
49 import OccName ( isDataOcc, isTvOcc, occNameUserString )
50 -- To avoid clashes with DsMeta.varName we must make a local alias for OccName.varName
51 -- we do this by removing varName from the import of OccName above, making
52 -- a qualified instance of OccName and using OccNameAlias.varName where varName
53 -- ws previously used in this file.
54 import qualified OccName( varName, tcName )
56 import Module ( Module, mkThPkgModule, moduleUserString )
57 import Id ( Id, idType )
58 import Name ( mkKnownKeyExternalName )
59 import OccName ( mkOccFS )
62 import Type ( Type, mkGenTyConApp )
63 import TcType ( TyThing(..), tcTyConAppArgs )
64 import TyCon ( DataConDetails(..) )
65 import TysWiredIn ( stringTy )
67 import CoreUtils ( exprType )
68 import SrcLoc ( noSrcLoc )
69 import Maybes ( orElse )
70 import Maybe ( catMaybes, fromMaybe )
71 import Panic ( panic )
72 import Unique ( mkPreludeTyConUnique, mkPreludeMiscIdUnique )
73 import BasicTypes ( NewOrData(..), StrictnessMark(..), isBoxed )
74 import SrcLoc ( SrcLoc )
77 import FastString ( mkFastString )
79 import Monad ( zipWithM )
80 import List ( sortBy )
82 -----------------------------------------------------------------------------
83 dsBracket :: HsBracket Name -> [PendingSplice] -> DsM CoreExpr
84 -- Returns a CoreExpr of type M.ExpQ
85 -- The quoted thing is parameterised over Name, even though it has
86 -- been type checked. We don't want all those type decorations!
88 dsBracket brack splices
89 = dsExtendMetaEnv new_bit (do_brack brack)
91 new_bit = mkNameEnv [(n, Splice e) | (n,e) <- splices]
93 do_brack (ExpBr e) = do { MkC e1 <- repE e ; return e1 }
94 do_brack (PatBr p) = do { MkC p1 <- repP p ; return p1 }
95 do_brack (TypBr t) = do { MkC t1 <- repTy t ; return t1 }
96 do_brack (DecBr ds) = do { MkC ds1 <- repTopDs ds ; return ds1 }
98 -----------------------------------------------------------------------------
99 dsReify :: HsReify Id -> DsM CoreExpr
100 -- Returns a CoreExpr of type reifyType --> M.TypeQ
101 -- reifyDecl --> M.DecQ
102 -- reifyFixty --> Q M.Fix
103 dsReify (ReifyOut ReifyType name)
104 = do { thing <- dsLookupGlobal name ;
105 -- By deferring the lookup until now (rather than doing it
106 -- in the type checker) we ensure that all zonking has
109 AnId id -> do { MkC e <- repTy (toHsType (idType id)) ;
111 other -> pprPanic "dsReify: reifyType" (ppr name)
114 dsReify r@(ReifyOut ReifyDecl name)
115 = do { thing <- dsLookupGlobal name ;
116 mb_d <- repTyClD (ifaceTyThing thing) ;
118 Just (MkC d) -> return d
119 Nothing -> pprPanic "dsReify" (ppr r)
122 {- -------------- Examples --------------------
126 gensym (unpackString "x"#) `bindQ` \ x1::String ->
127 lam (pvar x1) (var x1)
130 [| \x -> $(f [| x |]) |]
132 gensym (unpackString "x"#) `bindQ` \ x1::String ->
133 lam (pvar x1) (f (var x1))
137 -------------------------------------------------------
139 -------------------------------------------------------
141 repTopDs :: HsGroup Name -> DsM (Core (M.Q [M.Dec]))
143 = do { let { bndrs = groupBinders group } ;
144 ss <- mkGenSyms bndrs ;
146 -- Bind all the names mainly to avoid repeated use of explicit strings.
148 -- do { t :: String <- genSym "T" ;
149 -- return (Data t [] ...more t's... }
150 -- The other important reason is that the output must mention
151 -- only "T", not "Foo:T" where Foo is the current module
154 decls <- addBinds ss (do {
155 val_ds <- rep_binds' (hs_valds group) ;
156 tycl_ds <- mapM repTyClD' (hs_tyclds group) ;
157 inst_ds <- mapM repInstD' (hs_instds group) ;
159 return (de_loc $ sort_by_loc $ val_ds ++ catMaybes tycl_ds ++ inst_ds) }) ;
161 decl_ty <- lookupType decQTyConName ;
162 let { core_list = coreList' decl_ty decls } ;
164 dec_ty <- lookupType decTyConName ;
165 q_decs <- repSequenceQ dec_ty core_list ;
167 wrapNongenSyms ss q_decs
168 -- Do *not* gensym top-level binders
171 groupBinders (HsGroup { hs_valds = val_decls, hs_tyclds = tycl_decls,
172 hs_fords = foreign_decls })
173 -- Collect the binders of a Group
174 = collectHsBinders val_decls ++
175 [n | d <- tycl_decls, (n,_) <- tyClDeclNames d] ++
176 [n | ForeignImport n _ _ _ _ <- foreign_decls]
179 {- Note [Binders and occurrences]
180 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
181 When we desugar [d| data T = MkT |]
183 Data "T" [] [Con "MkT" []] []
185 Data "Foo:T" [] [Con "Foo:MkT" []] []
186 That is, the new data decl should fit into whatever new module it is
187 asked to fit in. We do *not* clone, though; no need for this:
194 then we must desugar to
195 foo = Data "Foo:T" [] [Con "Foo:MkT" []] []
197 So in repTopDs we bring the binders into scope with mkGenSyms and addBinds,
198 but in dsReify we do not. And we use lookupOcc, rather than lookupBinder
199 in repTyClD and repC.
203 repTyClD :: TyClDecl Name -> DsM (Maybe (Core M.DecQ))
204 repTyClD decl = do x <- repTyClD' decl
207 repTyClD' :: TyClDecl Name -> DsM (Maybe (SrcLoc, Core M.DecQ))
209 repTyClD' (TyData { tcdND = DataType, tcdCtxt = cxt,
210 tcdName = tc, tcdTyVars = tvs,
211 tcdCons = DataCons cons, tcdDerivs = mb_derivs,
213 = do { tc1 <- lookupOcc tc ; -- See note [Binders and occurrences]
214 dec <- addTyVarBinds tvs $ \bndrs -> do {
215 cxt1 <- repContext cxt ;
216 cons1 <- mapM repC cons ;
217 cons2 <- coreList conQTyConName cons1 ;
218 derivs1 <- repDerivs mb_derivs ;
219 repData cxt1 tc1 (coreList' stringTy bndrs) cons2 derivs1 } ;
220 return $ Just (loc, dec) }
222 repTyClD' (TyData { tcdND = NewType, tcdCtxt = cxt,
223 tcdName = tc, tcdTyVars = tvs,
224 tcdCons = DataCons [con], tcdDerivs = mb_derivs,
226 = do { tc1 <- lookupOcc tc ; -- See note [Binders and occurrences]
227 dec <- addTyVarBinds tvs $ \bndrs -> do {
228 cxt1 <- repContext cxt ;
230 derivs1 <- repDerivs mb_derivs ;
231 repNewtype cxt1 tc1 (coreList' stringTy bndrs) con1 derivs1 } ;
232 return $ Just (loc, dec) }
234 repTyClD' (TySynonym { tcdName = tc, tcdTyVars = tvs, tcdSynRhs = ty,
236 = do { tc1 <- lookupOcc tc ; -- See note [Binders and occurrences]
237 dec <- addTyVarBinds tvs $ \bndrs -> do {
239 repTySyn tc1 (coreList' stringTy bndrs) ty1 } ;
240 return (Just (loc, dec)) }
242 repTyClD' (ClassDecl { tcdCtxt = cxt, tcdName = cls,
244 tcdFDs = [], -- We don't understand functional dependencies
245 tcdSigs = sigs, tcdMeths = mb_meth_binds,
247 = do { cls1 <- lookupOcc cls ; -- See note [Binders and occurrences]
248 dec <- addTyVarBinds tvs $ \bndrs -> do {
249 cxt1 <- repContext cxt ;
250 sigs1 <- rep_sigs sigs ;
251 binds1 <- rep_monobind meth_binds ;
252 decls1 <- coreList decQTyConName (sigs1 ++ binds1) ;
253 repClass cxt1 cls1 (coreList' stringTy bndrs) decls1 } ;
254 return $ Just (loc, dec) }
256 -- If the user quotes a class decl, it'll have default-method
257 -- bindings; but if we (reifyDecl C) where C is a class, we
258 -- won't be given the default methods (a definite infelicity).
259 meth_binds = mb_meth_binds `orElse` EmptyMonoBinds
262 repTyClD' d = do { addDsWarn (hang msg 4 (ppr d)) ;
266 msg = ptext SLIT("Cannot desugar this Template Haskell declaration:")
268 repInstD' (InstDecl ty binds _ _ loc)
269 -- Ignore user pragmas for now
270 = do { cxt1 <- repContext cxt ;
271 inst_ty1 <- repPred (HsClassP cls tys) ;
272 binds1 <- rep_monobind binds ;
273 decls1 <- coreList decQTyConName binds1 ;
274 i <- repInst cxt1 inst_ty1 decls1;
277 (tvs, cxt, cls, tys) = splitHsInstDeclTy ty
280 -------------------------------------------------------
282 -------------------------------------------------------
284 repC :: ConDecl Name -> DsM (Core M.ConQ)
285 repC (ConDecl con [] [] details loc)
286 = do { con1 <- lookupOcc con ; -- See note [Binders and occurrences]
287 repConstr con1 details }
289 repBangTy :: BangType Name -> DsM (Core (M.StrictTypeQ))
290 repBangTy (BangType str ty) = do MkC s <- rep2 strName []
292 rep2 strictTypeName [s, t]
293 where strName = case str of
294 NotMarkedStrict -> notStrictName
297 -------------------------------------------------------
299 -------------------------------------------------------
301 repDerivs :: Maybe (HsContext Name) -> DsM (Core [String])
302 repDerivs Nothing = return (coreList' stringTy [])
303 repDerivs (Just ctxt)
304 = do { strs <- mapM rep_deriv ctxt ;
305 return (coreList' stringTy strs) }
307 rep_deriv :: HsPred Name -> DsM (Core String)
308 -- Deriving clauses must have the simple H98 form
309 rep_deriv (HsClassP cls []) = lookupOcc cls
310 rep_deriv other = panic "rep_deriv"
313 -------------------------------------------------------
314 -- Signatures in a class decl, or a group of bindings
315 -------------------------------------------------------
317 rep_sigs :: [Sig Name] -> DsM [Core M.DecQ]
318 rep_sigs sigs = do locs_cores <- rep_sigs' sigs
319 return $ de_loc $ sort_by_loc locs_cores
321 rep_sigs' :: [Sig Name] -> DsM [(SrcLoc, Core M.DecQ)]
322 -- We silently ignore ones we don't recognise
323 rep_sigs' sigs = do { sigs1 <- mapM rep_sig sigs ;
324 return (concat sigs1) }
326 rep_sig :: Sig Name -> DsM [(SrcLoc, Core M.DecQ)]
328 -- Empty => Too hard, signature ignored
329 rep_sig (ClassOpSig nm _ ty loc) = rep_proto nm ty loc
330 rep_sig (Sig nm ty loc) = rep_proto nm ty loc
331 rep_sig other = return []
333 rep_proto :: Name -> HsType Name -> SrcLoc -> DsM [(SrcLoc, Core M.DecQ)]
334 rep_proto nm ty loc = do { nm1 <- lookupOcc nm ;
336 sig <- repProto nm1 ty1 ;
337 return [(loc, sig)] }
340 -------------------------------------------------------
342 -------------------------------------------------------
344 -- gensym a list of type variables and enter them into the meta environment;
345 -- the computations passed as the second argument is executed in that extended
346 -- meta environment and gets the *new* names on Core-level as an argument
348 addTyVarBinds :: [HsTyVarBndr Name] -- the binders to be added
349 -> ([Core String] -> DsM (Core (M.Q a))) -- action in the ext env
350 -> DsM (Core (M.Q a))
351 addTyVarBinds tvs m =
353 let names = map hsTyVarName tvs
354 freshNames <- mkGenSyms names
355 term <- addBinds freshNames $ do
356 bndrs <- mapM lookupBinder names
358 wrapGenSyns freshNames term
360 -- represent a type context
362 repContext :: HsContext Name -> DsM (Core M.CxtQ)
364 preds <- mapM repPred ctxt
365 predList <- coreList typeQTyConName preds
368 -- represent a type predicate
370 repPred :: HsPred Name -> DsM (Core M.TypeQ)
371 repPred (HsClassP cls tys) = do
372 tcon <- repTy (HsTyVar cls)
375 repPred (HsIParam _ _) =
376 panic "DsMeta.repTy: Can't represent predicates with implicit parameters"
378 -- yield the representation of a list of types
380 repTys :: [HsType Name] -> DsM [Core M.TypeQ]
381 repTys tys = mapM repTy tys
385 repTy :: HsType Name -> DsM (Core M.TypeQ)
386 repTy (HsForAllTy bndrs ctxt ty) =
387 addTyVarBinds (fromMaybe [] bndrs) $ \bndrs' -> do
388 ctxt' <- repContext ctxt
390 repTForall (coreList' stringTy bndrs') ctxt' ty'
393 | isTvOcc (nameOccName n) = do
394 tv1 <- lookupBinder n
399 repTy (HsAppTy f a) = do
403 repTy (HsFunTy f a) = do
406 tcon <- repArrowTyCon
407 repTapps tcon [f1, a1]
408 repTy (HsListTy t) = do
412 repTy (HsPArrTy t) = do
414 tcon <- repTy (HsTyVar parrTyConName)
416 repTy (HsTupleTy tc tys) = do
418 tcon <- repTupleTyCon (length tys)
420 repTy (HsOpTy ty1 HsArrow ty2) = repTy (HsFunTy ty1 ty2)
421 repTy (HsOpTy ty1 (HsTyOp n) ty2) = repTy ((HsTyVar n `HsAppTy` ty1)
423 repTy (HsParTy t) = repTy t
425 panic "DsMeta.repTy: Can't represent number types (for generics)"
426 repTy (HsPredTy pred) = repPred pred
427 repTy (HsKindSig ty kind) =
428 panic "DsMeta.repTy: Can't represent explicit kind signatures yet"
431 -----------------------------------------------------------------------------
433 -----------------------------------------------------------------------------
435 repEs :: [HsExpr Name] -> DsM (Core [M.ExpQ])
436 repEs es = do { es' <- mapM repE es ;
437 coreList expQTyConName es' }
439 -- FIXME: some of these panics should be converted into proper error messages
440 -- unless we can make sure that constructs, which are plainly not
441 -- supported in TH already lead to error messages at an earlier stage
442 repE :: HsExpr Name -> DsM (Core M.ExpQ)
444 do { mb_val <- dsLookupMetaEnv x
446 Nothing -> do { str <- globalVar x
447 ; repVarOrCon x str }
448 Just (Bound y) -> repVarOrCon x (coreVar y)
449 Just (Splice e) -> do { e' <- dsExpr e
450 ; return (MkC e') } }
451 repE (HsIPVar x) = panic "DsMeta.repE: Can't represent implicit parameters"
453 -- Remember, we're desugaring renamer output here, so
454 -- HsOverlit can definitely occur
455 repE (HsOverLit l) = do { a <- repOverloadedLiteral l; repLit a }
456 repE (HsLit l) = do { a <- repLiteral l; repLit a }
457 repE (HsLam m) = repLambda m
458 repE (HsApp x y) = do {a <- repE x; b <- repE y; repApp a b}
460 repE (OpApp e1 op fix e2) =
461 do { arg1 <- repE e1;
464 repInfixApp arg1 the_op arg2 }
465 repE (NegApp x nm) = do
467 negateVar <- lookupOcc negateName >>= repVar
469 repE (HsPar x) = repE x
470 repE (SectionL x y) = do { a <- repE x; b <- repE y; repSectionL a b }
471 repE (SectionR x y) = do { a <- repE x; b <- repE y; repSectionR a b }
472 repE (HsCase e ms loc) = do { arg <- repE e
473 ; ms2 <- mapM repMatchTup ms
474 ; repCaseE arg (nonEmptyCoreList ms2) }
475 repE (HsIf x y z loc) = do
480 repE (HsLet bs e) = do { (ss,ds) <- repBinds bs
481 ; e2 <- addBinds ss (repE e)
484 -- FIXME: I haven't got the types here right yet
485 repE (HsDo DoExpr sts _ ty loc)
486 = do { (ss,zs) <- repSts sts;
487 e <- repDoE (nonEmptyCoreList zs);
489 repE (HsDo ListComp sts _ ty loc)
490 = do { (ss,zs) <- repSts sts;
491 e <- repComp (nonEmptyCoreList zs);
493 repE (HsDo _ _ _ _ _) = panic "DsMeta.repE: Can't represent mdo and [: :] yet"
494 repE (ExplicitList ty es) = do { xs <- repEs es; repListExp xs }
495 repE (ExplicitPArr ty es) =
496 panic "DsMeta.repE: No explicit parallel arrays yet"
497 repE (ExplicitTuple es boxed)
498 | isBoxed boxed = do { xs <- repEs es; repTup xs }
499 | otherwise = panic "DsMeta.repE: Can't represent unboxed tuples"
500 repE (RecordCon c flds)
501 = do { x <- lookupOcc c;
502 fs <- repFields flds;
504 repE (RecordUpd e flds)
506 fs <- repFields flds;
509 repE (ExprWithTySig e ty) = do { e1 <- repE e; t1 <- repTy ty; repSigExp e1 t1 }
510 repE (ArithSeqIn aseq) =
512 From e -> do { ds1 <- repE e; repFrom ds1 }
521 FromThenTo e1 e2 e3 -> do
525 repFromThenTo ds1 ds2 ds3
526 repE (PArrSeqOut _ aseq) = panic "DsMeta.repE: parallel array seq.s missing"
527 repE (HsCoreAnn _ _) = panic "DsMeta.repE: Can't represent CoreAnn" -- hdaume: core annotations
528 repE (HsCCall _ _ _ _ _) = panic "DsMeta.repE: Can't represent __ccall__"
529 repE (HsSCC _ _) = panic "DsMeta.repE: Can't represent SCC"
530 repE (HsBracketOut _ _) =
531 panic "DsMeta.repE: Can't represent Oxford brackets"
532 repE (HsSplice n e loc) = do { mb_val <- dsLookupMetaEnv n
534 Just (Splice e) -> do { e' <- dsExpr e
536 other -> pprPanic "HsSplice" (ppr n) }
537 repE (HsReify _) = panic "DsMeta.repE: Can't represent reification"
539 pprPanic "DsMeta.repE: Illegal expression form" (ppr e)
541 -----------------------------------------------------------------------------
542 -- Building representations of auxillary structures like Match, Clause, Stmt,
544 repMatchTup :: Match Name -> DsM (Core M.MatchQ)
545 repMatchTup (Match [p] ty (GRHSs guards wheres ty2)) =
546 do { ss1 <- mkGenSyms (collectPatBinders p)
547 ; addBinds ss1 $ do {
549 ; (ss2,ds) <- repBinds wheres
550 ; addBinds ss2 $ do {
551 ; gs <- repGuards guards
552 ; match <- repMatch p1 gs ds
553 ; wrapGenSyns (ss1++ss2) match }}}
555 repClauseTup :: Match Name -> DsM (Core M.ClauseQ)
556 repClauseTup (Match ps ty (GRHSs guards wheres ty2)) =
557 do { ss1 <- mkGenSyms (collectPatsBinders ps)
558 ; addBinds ss1 $ do {
560 ; (ss2,ds) <- repBinds wheres
561 ; addBinds ss2 $ do {
562 gs <- repGuards guards
563 ; clause <- repClause ps1 gs ds
564 ; wrapGenSyns (ss1++ss2) clause }}}
566 repGuards :: [GRHS Name] -> DsM (Core M.BodyQ)
567 repGuards [GRHS [ResultStmt e loc] loc2]
568 = do {a <- repE e; repNormal a }
570 = do { zs <- mapM process other;
571 repGuarded (nonEmptyCoreList (map corePair zs)) }
573 process (GRHS [ExprStmt e1 ty loc,ResultStmt e2 _] _)
574 = do { x <- repE e1; y <- repE e2; return (x, y) }
575 process other = panic "Non Haskell 98 guarded body"
577 repFields :: [(Name,HsExpr Name)] -> DsM (Core [M.FieldExp])
579 fnames <- mapM lookupOcc (map fst flds)
580 es <- mapM repE (map snd flds)
581 fs <- zipWithM (\n x -> rep2 fieldExpName [unC n, unC x]) fnames es
582 coreList fieldExpTyConName fs
585 -----------------------------------------------------------------------------
586 -- Representing Stmt's is tricky, especially if bound variables
587 -- shaddow each other. Consider: [| do { x <- f 1; x <- f x; g x } |]
588 -- First gensym new names for every variable in any of the patterns.
589 -- both static (x'1 and x'2), and dynamic ((gensym "x") and (gensym "y"))
590 -- if variables didn't shaddow, the static gensym wouldn't be necessary
591 -- and we could reuse the original names (x and x).
593 -- do { x'1 <- gensym "x"
594 -- ; x'2 <- gensym "x"
595 -- ; doE [ BindSt (pvar x'1) [| f 1 |]
596 -- , BindSt (pvar x'2) [| f x |]
597 -- , NoBindSt [| g x |]
601 -- The strategy is to translate a whole list of do-bindings by building a
602 -- bigger environment, and a bigger set of meta bindings
603 -- (like: x'1 <- gensym "x" ) and then combining these with the translations
604 -- of the expressions within the Do
606 -----------------------------------------------------------------------------
607 -- The helper function repSts computes the translation of each sub expression
608 -- and a bunch of prefix bindings denoting the dynamic renaming.
610 repSts :: [Stmt Name] -> DsM ([GenSymBind], [Core M.StmtQ])
611 repSts [ResultStmt e loc] =
613 ; e1 <- repNoBindSt a
614 ; return ([], [e1]) }
615 repSts (BindStmt p e loc : ss) =
617 ; ss1 <- mkGenSyms (collectPatBinders p)
618 ; addBinds ss1 $ do {
620 ; (ss2,zs) <- repSts ss
621 ; z <- repBindSt p1 e2
622 ; return (ss1++ss2, z : zs) }}
623 repSts (LetStmt bs : ss) =
624 do { (ss1,ds) <- repBinds bs
626 ; (ss2,zs) <- addBinds ss1 (repSts ss)
627 ; return (ss1++ss2, z : zs) }
628 repSts (ExprStmt e ty loc : ss) =
630 ; z <- repNoBindSt e2
631 ; (ss2,zs) <- repSts ss
632 ; return (ss2, z : zs) }
633 repSts other = panic "Exotic Stmt in meta brackets"
636 -----------------------------------------------------------
638 -----------------------------------------------------------
640 repBinds :: HsBinds Name -> DsM ([GenSymBind], Core [M.DecQ])
642 = do { let { bndrs = collectHsBinders decs } ;
643 ss <- mkGenSyms bndrs ;
644 core <- addBinds ss (rep_binds decs) ;
645 core_list <- coreList decQTyConName core ;
646 return (ss, core_list) }
648 rep_binds :: HsBinds Name -> DsM [Core M.DecQ]
649 rep_binds binds = do locs_cores <- rep_binds' binds
650 return $ de_loc $ sort_by_loc locs_cores
652 rep_binds' :: HsBinds Name -> DsM [(SrcLoc, Core M.DecQ)]
653 rep_binds' EmptyBinds = return []
654 rep_binds' (ThenBinds x y)
655 = do { core1 <- rep_binds' x
656 ; core2 <- rep_binds' y
657 ; return (core1 ++ core2) }
658 rep_binds' (MonoBind bs sigs _)
659 = do { core1 <- rep_monobind' bs
660 ; core2 <- rep_sigs' sigs
661 ; return (core1 ++ core2) }
662 rep_binds' (IPBinds _ _)
663 = panic "DsMeta:repBinds: can't do implicit parameters"
665 rep_monobind :: MonoBinds Name -> DsM [Core M.DecQ]
666 rep_monobind binds = do locs_cores <- rep_monobind' binds
667 return $ de_loc $ sort_by_loc locs_cores
669 rep_monobind' :: MonoBinds Name -> DsM [(SrcLoc, Core M.DecQ)]
670 rep_monobind' EmptyMonoBinds = return []
671 rep_monobind' (AndMonoBinds x y) = do { x1 <- rep_monobind' x;
672 y1 <- rep_monobind' y;
675 -- Note GHC treats declarations of a variable (not a pattern)
676 -- e.g. x = g 5 as a Fun MonoBinds. This is indicated by a single match
677 -- with an empty list of patterns
678 rep_monobind' (FunMonoBind fn infx [Match [] ty (GRHSs guards wheres ty2)] loc)
679 = do { (ss,wherecore) <- repBinds wheres
680 ; guardcore <- addBinds ss (repGuards guards)
681 ; fn' <- lookupBinder fn
683 ; ans <- repVal p guardcore wherecore
684 ; return [(loc, ans)] }
686 rep_monobind' (FunMonoBind fn infx ms loc)
687 = do { ms1 <- mapM repClauseTup ms
688 ; fn' <- lookupBinder fn
689 ; ans <- repFun fn' (nonEmptyCoreList ms1)
690 ; return [(loc, ans)] }
692 rep_monobind' (PatMonoBind pat (GRHSs guards wheres ty2) loc)
693 = do { patcore <- repP pat
694 ; (ss,wherecore) <- repBinds wheres
695 ; guardcore <- addBinds ss (repGuards guards)
696 ; ans <- repVal patcore guardcore wherecore
697 ; return [(loc, ans)] }
699 rep_monobind' (VarMonoBind v e)
700 = do { v' <- lookupBinder v
703 ; patcore <- repPvar v'
704 ; empty_decls <- coreList decQTyConName []
705 ; ans <- repVal patcore x empty_decls
706 ; return [(getSrcLoc v, ans)] }
708 -----------------------------------------------------------------------------
709 -- Since everything in a MonoBind is mutually recursive we need rename all
710 -- all the variables simultaneously. For example:
711 -- [| AndMonoBinds (f x = x + g 2) (g x = f 1 + 2) |] would translate to
712 -- do { f'1 <- gensym "f"
713 -- ; g'2 <- gensym "g"
714 -- ; [ do { x'3 <- gensym "x"; fun f'1 [pvar x'3] [| x + g2 |]},
715 -- do { x'4 <- gensym "x"; fun g'2 [pvar x'4] [| f 1 + 2 |]}
717 -- This requires collecting the bindings (f'1 <- gensym "f"), and the
718 -- environment ( f |-> f'1 ) from each binding, and then unioning them
719 -- together. As we do this we collect GenSymBinds's which represent the renamed
720 -- variables bound by the Bindings. In order not to lose track of these
721 -- representations we build a shadow datatype MB with the same structure as
722 -- MonoBinds, but which has slots for the representations
725 -----------------------------------------------------------------------------
726 -- GHC allows a more general form of lambda abstraction than specified
727 -- by Haskell 98. In particular it allows guarded lambda's like :
728 -- (\ x | even x -> 0 | odd x -> 1) at the moment we can't represent this in
729 -- Haskell Template's Meta.Exp type so we punt if it isn't a simple thing like
730 -- (\ p1 .. pn -> exp) by causing an error.
732 repLambda :: Match Name -> DsM (Core M.ExpQ)
733 repLambda (Match ps _ (GRHSs [GRHS [ResultStmt e _ ] _ ]
735 = do { let bndrs = collectPatsBinders ps ;
736 ; ss <- mkGenSyms bndrs
737 ; lam <- addBinds ss (
738 do { xs <- repPs ps; body <- repE e; repLam xs body })
739 ; wrapGenSyns ss lam }
741 repLambda z = panic "Can't represent a guarded lambda in Template Haskell"
744 -----------------------------------------------------------------------------
746 -- repP deals with patterns. It assumes that we have already
747 -- walked over the pattern(s) once to collect the binders, and
748 -- have extended the environment. So every pattern-bound
749 -- variable should already appear in the environment.
751 -- Process a list of patterns
752 repPs :: [Pat Name] -> DsM (Core [M.Pat])
753 repPs ps = do { ps' <- mapM repP ps ;
754 coreList patTyConName ps' }
756 repP :: Pat Name -> DsM (Core M.Pat)
757 repP (WildPat _) = repPwild
758 repP (LitPat l) = do { l2 <- repLiteral l; repPlit l2 }
759 repP (VarPat x) = do { x' <- lookupBinder x; repPvar x' }
760 repP (LazyPat p) = do { p1 <- repP p; repPtilde p1 }
761 repP (AsPat x p) = do { x' <- lookupBinder x; p1 <- repP p; repPaspat x' p1 }
762 repP (ParPat p) = repP p
763 repP (ListPat ps _) = do { qs <- repPs ps; repPlist qs }
764 repP (TuplePat ps _) = do { qs <- repPs ps; repPtup qs }
765 repP (ConPatIn dc details)
766 = do { con_str <- lookupOcc dc
768 PrefixCon ps -> do { qs <- repPs ps; repPcon con_str qs }
769 RecCon pairs -> do { vs <- sequence $ map lookupOcc (map fst pairs)
770 ; ps <- sequence $ map repP (map snd pairs)
771 ; fps <- zipWithM (\x y -> rep2 fieldPatName [unC x,unC y]) vs ps
772 ; fps' <- coreList fieldPatTyConName fps
773 ; repPrec con_str fps' }
774 InfixCon p1 p2 -> do { qs <- repPs [p1,p2]; repPcon con_str qs }
776 repP (NPatIn l (Just _)) = panic "Can't cope with negative overloaded patterns yet (repP (NPatIn _ (Just _)))"
777 repP (NPatIn l Nothing) = do { a <- repOverloadedLiteral l; repPlit a }
778 repP other = panic "Exotic pattern inside meta brackets"
780 ----------------------------------------------------------
781 -- Declaration ordering helpers
783 sort_by_loc :: [(SrcLoc, a)] -> [(SrcLoc, a)]
784 sort_by_loc xs = sortBy comp xs
785 where comp x y = compare (fst x) (fst y)
787 de_loc :: [(SrcLoc, a)] -> [a]
790 ----------------------------------------------------------
791 -- The meta-environment
793 -- A name/identifier association for fresh names of locally bound entities
795 type GenSymBind = (Name, Id) -- Gensym the string and bind it to the Id
796 -- I.e. (x, x_id) means
797 -- let x_id = gensym "x" in ...
799 -- Generate a fresh name for a locally bound entity
801 mkGenSym :: Name -> DsM GenSymBind
802 mkGenSym nm = do { id <- newUniqueId nm stringTy; return (nm,id) }
804 -- Ditto for a list of names
806 mkGenSyms :: [Name] -> DsM [GenSymBind]
807 mkGenSyms ns = mapM mkGenSym ns
809 -- Add a list of fresh names for locally bound entities to the meta
810 -- environment (which is part of the state carried around by the desugarer
813 addBinds :: [GenSymBind] -> DsM a -> DsM a
814 addBinds bs m = dsExtendMetaEnv (mkNameEnv [(n,Bound id) | (n,id) <- bs]) m
816 -- Look up a locally bound name
818 lookupBinder :: Name -> DsM (Core String)
820 = do { mb_val <- dsLookupMetaEnv n;
822 Just (Bound x) -> return (coreVar x)
823 other -> pprPanic "Failed binder lookup:" (ppr n) }
825 -- Look up a name that is either locally bound or a global name
827 -- * If it is a global name, generate the "original name" representation (ie,
828 -- the <module>:<name> form) for the associated entity
830 lookupOcc :: Name -> DsM (Core String)
831 -- Lookup an occurrence; it can't be a splice.
832 -- Use the in-scope bindings if they exist
834 = do { mb_val <- dsLookupMetaEnv n ;
836 Nothing -> globalVar n
837 Just (Bound x) -> return (coreVar x)
838 Just (Splice _) -> pprPanic "repE:lookupOcc" (ppr n)
841 globalVar :: Name -> DsM (Core String)
842 globalVar n = coreStringLit (name_mod ++ ":" ++ name_occ)
844 name_mod = moduleUserString (nameModule n)
845 name_occ = occNameUserString (nameOccName n)
847 localVar :: Name -> DsM (Core String)
848 localVar n = coreStringLit (occNameUserString (nameOccName n))
850 lookupType :: Name -- Name of type constructor (e.g. M.ExpQ)
851 -> DsM Type -- The type
852 lookupType tc_name = do { tc <- dsLookupTyCon tc_name ;
853 return (mkGenTyConApp tc []) }
855 -- wrapGenSyns [(nm1,id1), (nm2,id2)] y
856 -- --> bindQ (gensym nm1) (\ id1 ->
857 -- bindQ (gensym nm2 (\ id2 ->
860 wrapGenSyns :: [GenSymBind]
861 -> Core (M.Q a) -> DsM (Core (M.Q a))
862 wrapGenSyns binds body@(MkC b)
865 [elt_ty] = tcTyConAppArgs (exprType b)
866 -- b :: Q a, so we can get the type 'a' by looking at the
867 -- argument type. NB: this relies on Q being a data/newtype,
868 -- not a type synonym
871 go ((name,id) : binds)
872 = do { MkC body' <- go binds
873 ; lit_str <- localVar name
874 ; gensym_app <- repGensym lit_str
875 ; repBindQ stringTy elt_ty
876 gensym_app (MkC (Lam id body')) }
878 -- Just like wrapGenSym, but don't actually do the gensym
879 -- Instead use the existing name
880 -- Only used for [Decl]
881 wrapNongenSyms :: [GenSymBind] -> Core a -> DsM (Core a)
882 wrapNongenSyms binds (MkC body)
883 = do { binds' <- mapM do_one binds ;
884 return (MkC (mkLets binds' body)) }
887 = do { MkC lit_str <- localVar name -- No gensym
888 ; return (NonRec id lit_str) }
890 void = placeHolderType
892 string :: String -> HsExpr Id
893 string s = HsLit (HsString (mkFastString s))
896 -- %*********************************************************************
900 -- %*********************************************************************
902 -----------------------------------------------------------------------------
903 -- PHANTOM TYPES for consistency. In order to make sure we do this correct
904 -- we invent a new datatype which uses phantom types.
906 newtype Core a = MkC CoreExpr
909 rep2 :: Name -> [ CoreExpr ] -> DsM (Core a)
910 rep2 n xs = do { id <- dsLookupGlobalId n
911 ; return (MkC (foldl App (Var id) xs)) }
913 -- Then we make "repConstructors" which use the phantom types for each of the
914 -- smart constructors of the Meta.Meta datatypes.
917 -- %*********************************************************************
919 -- The 'smart constructors'
921 -- %*********************************************************************
923 --------------- Patterns -----------------
924 repPlit :: Core M.Lit -> DsM (Core M.Pat)
925 repPlit (MkC l) = rep2 litPName [l]
927 repPvar :: Core String -> DsM (Core M.Pat)
928 repPvar (MkC s) = rep2 varPName [s]
930 repPtup :: Core [M.Pat] -> DsM (Core M.Pat)
931 repPtup (MkC ps) = rep2 tupPName [ps]
933 repPcon :: Core String -> Core [M.Pat] -> DsM (Core M.Pat)
934 repPcon (MkC s) (MkC ps) = rep2 conPName [s, ps]
936 repPrec :: Core String -> Core [(String,M.Pat)] -> DsM (Core M.Pat)
937 repPrec (MkC c) (MkC rps) = rep2 recPName [c,rps]
939 repPtilde :: Core M.Pat -> DsM (Core M.Pat)
940 repPtilde (MkC p) = rep2 tildePName [p]
942 repPaspat :: Core String -> Core M.Pat -> DsM (Core M.Pat)
943 repPaspat (MkC s) (MkC p) = rep2 asPName [s, p]
945 repPwild :: DsM (Core M.Pat)
946 repPwild = rep2 wildPName []
948 repPlist :: Core [M.Pat] -> DsM (Core M.Pat)
949 repPlist (MkC ps) = rep2 listPName [ps]
951 --------------- Expressions -----------------
952 repVarOrCon :: Name -> Core String -> DsM (Core M.ExpQ)
953 repVarOrCon vc str | isDataOcc (nameOccName vc) = repCon str
954 | otherwise = repVar str
956 repVar :: Core String -> DsM (Core M.ExpQ)
957 repVar (MkC s) = rep2 varEName [s]
959 repCon :: Core String -> DsM (Core M.ExpQ)
960 repCon (MkC s) = rep2 conEName [s]
962 repLit :: Core M.Lit -> DsM (Core M.ExpQ)
963 repLit (MkC c) = rep2 litEName [c]
965 repApp :: Core M.ExpQ -> Core M.ExpQ -> DsM (Core M.ExpQ)
966 repApp (MkC x) (MkC y) = rep2 appEName [x,y]
968 repLam :: Core [M.Pat] -> Core M.ExpQ -> DsM (Core M.ExpQ)
969 repLam (MkC ps) (MkC e) = rep2 lamEName [ps, e]
971 repTup :: Core [M.ExpQ] -> DsM (Core M.ExpQ)
972 repTup (MkC es) = rep2 tupEName [es]
974 repCond :: Core M.ExpQ -> Core M.ExpQ -> Core M.ExpQ -> DsM (Core M.ExpQ)
975 repCond (MkC x) (MkC y) (MkC z) = rep2 condEName [x,y,z]
977 repLetE :: Core [M.DecQ] -> Core M.ExpQ -> DsM (Core M.ExpQ)
978 repLetE (MkC ds) (MkC e) = rep2 letEName [ds, e]
980 repCaseE :: Core M.ExpQ -> Core [M.MatchQ] -> DsM( Core M.ExpQ)
981 repCaseE (MkC e) (MkC ms) = rep2 caseEName [e, ms]
983 repDoE :: Core [M.StmtQ] -> DsM (Core M.ExpQ)
984 repDoE (MkC ss) = rep2 doEName [ss]
986 repComp :: Core [M.StmtQ] -> DsM (Core M.ExpQ)
987 repComp (MkC ss) = rep2 compEName [ss]
989 repListExp :: Core [M.ExpQ] -> DsM (Core M.ExpQ)
990 repListExp (MkC es) = rep2 listEName [es]
992 repSigExp :: Core M.ExpQ -> Core M.TypeQ -> DsM (Core M.ExpQ)
993 repSigExp (MkC e) (MkC t) = rep2 sigEName [e,t]
995 repRecCon :: Core String -> Core [M.FieldExp]-> DsM (Core M.ExpQ)
996 repRecCon (MkC c) (MkC fs) = rep2 recCName [c,fs]
998 repRecUpd :: Core M.ExpQ -> Core [M.FieldExp] -> DsM (Core M.ExpQ)
999 repRecUpd (MkC e) (MkC fs) = rep2 recUpdEName [e,fs]
1001 repInfixApp :: Core M.ExpQ -> Core M.ExpQ -> Core M.ExpQ -> DsM (Core M.ExpQ)
1002 repInfixApp (MkC x) (MkC y) (MkC z) = rep2 infixAppName [x,y,z]
1004 repSectionL :: Core M.ExpQ -> Core M.ExpQ -> DsM (Core M.ExpQ)
1005 repSectionL (MkC x) (MkC y) = rep2 sectionLName [x,y]
1007 repSectionR :: Core M.ExpQ -> Core M.ExpQ -> DsM (Core M.ExpQ)
1008 repSectionR (MkC x) (MkC y) = rep2 sectionRName [x,y]
1010 ------------ Right hand sides (guarded expressions) ----
1011 repGuarded :: Core [(M.ExpQ, M.ExpQ)] -> DsM (Core M.BodyQ)
1012 repGuarded (MkC pairs) = rep2 guardedBName [pairs]
1014 repNormal :: Core M.ExpQ -> DsM (Core M.BodyQ)
1015 repNormal (MkC e) = rep2 normalBName [e]
1017 ------------- Stmts -------------------
1018 repBindSt :: Core M.Pat -> Core M.ExpQ -> DsM (Core M.StmtQ)
1019 repBindSt (MkC p) (MkC e) = rep2 bindSName [p,e]
1021 repLetSt :: Core [M.DecQ] -> DsM (Core M.StmtQ)
1022 repLetSt (MkC ds) = rep2 letSName [ds]
1024 repNoBindSt :: Core M.ExpQ -> DsM (Core M.StmtQ)
1025 repNoBindSt (MkC e) = rep2 noBindSName [e]
1027 -------------- Range (Arithmetic sequences) -----------
1028 repFrom :: Core M.ExpQ -> DsM (Core M.ExpQ)
1029 repFrom (MkC x) = rep2 fromEName [x]
1031 repFromThen :: Core M.ExpQ -> Core M.ExpQ -> DsM (Core M.ExpQ)
1032 repFromThen (MkC x) (MkC y) = rep2 fromThenEName [x,y]
1034 repFromTo :: Core M.ExpQ -> Core M.ExpQ -> DsM (Core M.ExpQ)
1035 repFromTo (MkC x) (MkC y) = rep2 fromToEName [x,y]
1037 repFromThenTo :: Core M.ExpQ -> Core M.ExpQ -> Core M.ExpQ -> DsM (Core M.ExpQ)
1038 repFromThenTo (MkC x) (MkC y) (MkC z) = rep2 fromThenToEName [x,y,z]
1040 ------------ Match and Clause Tuples -----------
1041 repMatch :: Core M.Pat -> Core M.BodyQ -> Core [M.DecQ] -> DsM (Core M.MatchQ)
1042 repMatch (MkC p) (MkC bod) (MkC ds) = rep2 matchName [p, bod, ds]
1044 repClause :: Core [M.Pat] -> Core M.BodyQ -> Core [M.DecQ] -> DsM (Core M.ClauseQ)
1045 repClause (MkC ps) (MkC bod) (MkC ds) = rep2 clauseName [ps, bod, ds]
1047 -------------- Dec -----------------------------
1048 repVal :: Core M.Pat -> Core M.BodyQ -> Core [M.DecQ] -> DsM (Core M.DecQ)
1049 repVal (MkC p) (MkC b) (MkC ds) = rep2 valDName [p, b, ds]
1051 repFun :: Core String -> Core [M.ClauseQ] -> DsM (Core M.DecQ)
1052 repFun (MkC nm) (MkC b) = rep2 funDName [nm, b]
1054 repData :: Core M.CxtQ -> Core String -> Core [String] -> Core [M.ConQ] -> Core [String] -> DsM (Core M.DecQ)
1055 repData (MkC cxt) (MkC nm) (MkC tvs) (MkC cons) (MkC derivs)
1056 = rep2 dataDName [cxt, nm, tvs, cons, derivs]
1058 repNewtype :: Core M.CxtQ -> Core String -> Core [String] -> Core M.ConQ -> Core [String] -> DsM (Core M.DecQ)
1059 repNewtype (MkC cxt) (MkC nm) (MkC tvs) (MkC con) (MkC derivs)
1060 = rep2 newtypeDName [cxt, nm, tvs, con, derivs]
1062 repTySyn :: Core String -> Core [String] -> Core M.TypeQ -> DsM (Core M.DecQ)
1063 repTySyn (MkC nm) (MkC tvs) (MkC rhs) = rep2 tySynDName [nm, tvs, rhs]
1065 repInst :: Core M.CxtQ -> Core M.TypeQ -> Core [M.DecQ] -> DsM (Core M.DecQ)
1066 repInst (MkC cxt) (MkC ty) (MkC ds) = rep2 instanceDName [cxt, ty, ds]
1068 repClass :: Core M.CxtQ -> Core String -> Core [String] -> Core [M.DecQ] -> DsM (Core M.DecQ)
1069 repClass (MkC cxt) (MkC cls) (MkC tvs) (MkC ds) = rep2 classDName [cxt, cls, tvs, ds]
1071 repProto :: Core String -> Core M.TypeQ -> DsM (Core M.DecQ)
1072 repProto (MkC s) (MkC ty) = rep2 sigDName [s, ty]
1074 repCtxt :: Core [M.TypeQ] -> DsM (Core M.CxtQ)
1075 repCtxt (MkC tys) = rep2 cxtName [tys]
1077 repConstr :: Core String -> HsConDetails Name (BangType Name)
1078 -> DsM (Core M.ConQ)
1079 repConstr con (PrefixCon ps)
1080 = do arg_tys <- mapM repBangTy ps
1081 arg_tys1 <- coreList strictTypeQTyConName arg_tys
1082 rep2 normalCName [unC con, unC arg_tys1]
1083 repConstr con (RecCon ips)
1084 = do arg_vs <- mapM lookupOcc (map fst ips)
1085 arg_tys <- mapM repBangTy (map snd ips)
1086 arg_vtys <- zipWithM (\x y -> rep2 varStrictTypeName [unC x, unC y])
1088 arg_vtys' <- coreList varStrictTypeQTyConName arg_vtys
1089 rep2 recCName [unC con, unC arg_vtys']
1090 repConstr con (InfixCon st1 st2)
1091 = do arg1 <- repBangTy st1
1092 arg2 <- repBangTy st2
1093 rep2 infixCName [unC arg1, unC con, unC arg2]
1095 ------------ Types -------------------
1097 repTForall :: Core [String] -> Core M.CxtQ -> Core M.TypeQ -> DsM (Core M.TypeQ)
1098 repTForall (MkC tvars) (MkC ctxt) (MkC ty)
1099 = rep2 forallTName [tvars, ctxt, ty]
1101 repTvar :: Core String -> DsM (Core M.TypeQ)
1102 repTvar (MkC s) = rep2 varTName [s]
1104 repTapp :: Core M.TypeQ -> Core M.TypeQ -> DsM (Core M.TypeQ)
1105 repTapp (MkC t1) (MkC t2) = rep2 appTName [t1,t2]
1107 repTapps :: Core M.TypeQ -> [Core M.TypeQ] -> DsM (Core M.TypeQ)
1108 repTapps f [] = return f
1109 repTapps f (t:ts) = do { f1 <- repTapp f t; repTapps f1 ts }
1111 --------- Type constructors --------------
1113 repNamedTyCon :: Core String -> DsM (Core M.TypeQ)
1114 repNamedTyCon (MkC s) = rep2 conTName [s]
1116 repTupleTyCon :: Int -> DsM (Core M.TypeQ)
1117 -- Note: not Core Int; it's easier to be direct here
1118 repTupleTyCon i = rep2 tupleTName [mkIntExpr (fromIntegral i)]
1120 repArrowTyCon :: DsM (Core M.TypeQ)
1121 repArrowTyCon = rep2 arrowTName []
1123 repListTyCon :: DsM (Core M.TypeQ)
1124 repListTyCon = rep2 listTName []
1127 ----------------------------------------------------------
1130 repLiteral :: HsLit -> DsM (Core M.Lit)
1132 = do lit' <- case lit of
1133 HsIntPrim i -> return $ HsInteger i
1134 HsInt i -> return $ HsInteger i
1135 HsFloatPrim r -> do rat_ty <- lookupType rationalTyConName
1136 return $ HsRat r rat_ty
1137 HsDoublePrim r -> do rat_ty <- lookupType rationalTyConName
1138 return $ HsRat r rat_ty
1140 lit_expr <- dsLit lit'
1141 rep2 lit_name [lit_expr]
1143 lit_name = case lit of
1144 HsInteger _ -> integerLName
1145 HsInt _ -> integerLName
1146 HsIntPrim _ -> intPrimLName
1147 HsFloatPrim _ -> floatPrimLName
1148 HsDoublePrim _ -> doublePrimLName
1149 HsChar _ -> charLName
1150 HsString _ -> stringLName
1151 HsRat _ _ -> rationalLName
1153 uh_oh = pprPanic "DsMeta.repLiteral: trying to represent exotic literal"
1156 repOverloadedLiteral :: HsOverLit -> DsM (Core M.Lit)
1157 repOverloadedLiteral (HsIntegral i _) = repLiteral (HsInteger i)
1158 repOverloadedLiteral (HsFractional f _) = do { rat_ty <- lookupType rationalTyConName ;
1159 repLiteral (HsRat f rat_ty) }
1160 -- The type Rational will be in the environment, becuase
1161 -- the smart constructor 'THSyntax.rationalL' uses it in its type,
1162 -- and rationalL is sucked in when any TH stuff is used
1164 --------------- Miscellaneous -------------------
1166 repLift :: Core e -> DsM (Core M.ExpQ)
1167 repLift (MkC x) = rep2 liftName [x]
1169 repGensym :: Core String -> DsM (Core (M.Q String))
1170 repGensym (MkC lit_str) = rep2 gensymName [lit_str]
1172 repBindQ :: Type -> Type -- a and b
1173 -> Core (M.Q a) -> Core (a -> M.Q b) -> DsM (Core (M.Q b))
1174 repBindQ ty_a ty_b (MkC x) (MkC y)
1175 = rep2 bindQName [Type ty_a, Type ty_b, x, y]
1177 repSequenceQ :: Type -> Core [M.Q a] -> DsM (Core (M.Q [a]))
1178 repSequenceQ ty_a (MkC list)
1179 = rep2 sequenceQName [Type ty_a, list]
1181 ------------ Lists and Tuples -------------------
1182 -- turn a list of patterns into a single pattern matching a list
1184 coreList :: Name -- Of the TyCon of the element type
1185 -> [Core a] -> DsM (Core [a])
1187 = do { elt_ty <- lookupType tc_name; return (coreList' elt_ty es) }
1189 coreList' :: Type -- The element type
1190 -> [Core a] -> Core [a]
1191 coreList' elt_ty es = MkC (mkListExpr elt_ty (map unC es ))
1193 nonEmptyCoreList :: [Core a] -> Core [a]
1194 -- The list must be non-empty so we can get the element type
1195 -- Otherwise use coreList
1196 nonEmptyCoreList [] = panic "coreList: empty argument"
1197 nonEmptyCoreList xs@(MkC x:_) = MkC (mkListExpr (exprType x) (map unC xs))
1199 corePair :: (Core a, Core b) -> Core (a,b)
1200 corePair (MkC x, MkC y) = MkC (mkCoreTup [x,y])
1202 coreStringLit :: String -> DsM (Core String)
1203 coreStringLit s = do { z <- mkStringLit s; return(MkC z) }
1205 coreVar :: Id -> Core String -- The Id has type String
1206 coreVar id = MkC (Var id)
1210 -- %************************************************************************
1212 -- The known-key names for Template Haskell
1214 -- %************************************************************************
1216 -- To add a name, do three things
1218 -- 1) Allocate a key
1220 -- 3) Add the name to knownKeyNames
1222 templateHaskellNames :: NameSet
1223 -- The names that are implicitly mentioned by ``bracket''
1224 -- Should stay in sync with the import list of DsMeta
1226 templateHaskellNames = mkNameSet [
1227 returnQName, bindQName, sequenceQName, gensymName, liftName,
1229 charLName, stringLName, integerLName, intPrimLName,
1230 floatPrimLName, doublePrimLName, rationalLName,
1232 litPName, varPName, tupPName, conPName, tildePName,
1233 asPName, wildPName, recPName, listPName,
1241 varEName, conEName, litEName, appEName, infixEName,
1242 infixAppName, sectionLName, sectionRName, lamEName, tupEName,
1243 condEName, letEName, caseEName, doEName, compEName,
1244 fromEName, fromThenEName, fromToEName, fromThenToEName,
1245 listEName, sigEName, recConEName, recUpdEName,
1249 guardedBName, normalBName,
1251 bindSName, letSName, noBindSName, parSName,
1253 funDName, valDName, dataDName, newtypeDName, tySynDName,
1254 classDName, instanceDName, sigDName,
1258 isStrictName, notStrictName,
1260 normalCName, recCName, infixCName,
1266 forallTName, varTName, conTName, appTName,
1267 tupleTName, arrowTName, listTName,
1270 qTyConName, patTyConName, fieldPatTyConName, matchQTyConName,
1271 clauseQTyConName, expQTyConName, fieldExpTyConName, stmtQTyConName,
1272 decQTyConName, conQTyConName, strictTypeQTyConName,
1273 varStrictTypeQTyConName, typeQTyConName, expTyConName, decTyConName,
1274 typeTyConName, matchTyConName, clauseTyConName]
1276 varQual = mk_known_key_name OccName.varName
1277 tcQual = mk_known_key_name OccName.tcName
1280 -- NB: the THSyntax module comes from the "haskell-src" package
1281 thModule = mkThPkgModule mETA_META_Name
1283 mk_known_key_name space str uniq
1284 = mkKnownKeyExternalName thModule (mkOccFS space str) uniq
1286 returnQName = varQual FSLIT("returnQ") returnQIdKey
1287 bindQName = varQual FSLIT("bindQ") bindQIdKey
1288 sequenceQName = varQual FSLIT("sequenceQ") sequenceQIdKey
1289 gensymName = varQual FSLIT("gensym") gensymIdKey
1290 liftName = varQual FSLIT("lift") liftIdKey
1293 charLName = varQual FSLIT("charL") charLIdKey
1294 stringLName = varQual FSLIT("stringL") stringLIdKey
1295 integerLName = varQual FSLIT("integerL") integerLIdKey
1296 intPrimLName = varQual FSLIT("intPrimL") intPrimLIdKey
1297 floatPrimLName = varQual FSLIT("floatPrimL") floatPrimLIdKey
1298 doublePrimLName = varQual FSLIT("doublePrimL") doublePrimLIdKey
1299 rationalLName = varQual FSLIT("rationalL") rationalLIdKey
1302 litPName = varQual FSLIT("litP") litPIdKey
1303 varPName = varQual FSLIT("varP") varPIdKey
1304 tupPName = varQual FSLIT("tupP") tupPIdKey
1305 conPName = varQual FSLIT("conP") conPIdKey
1306 tildePName = varQual FSLIT("tildeP") tildePIdKey
1307 asPName = varQual FSLIT("asP") asPIdKey
1308 wildPName = varQual FSLIT("wildP") wildPIdKey
1309 recPName = varQual FSLIT("recP") recPIdKey
1310 listPName = varQual FSLIT("listP") listPIdKey
1312 -- type FieldPat = ...
1313 fieldPatName = varQual FSLIT("fieldPat") fieldPatIdKey
1316 matchName = varQual FSLIT("match") matchIdKey
1318 -- data Clause = ...
1319 clauseName = varQual FSLIT("clause") clauseIdKey
1322 varEName = varQual FSLIT("varE") varEIdKey
1323 conEName = varQual FSLIT("conE") conEIdKey
1324 litEName = varQual FSLIT("litE") litEIdKey
1325 appEName = varQual FSLIT("appE") appEIdKey
1326 infixEName = varQual FSLIT("infixE") infixEIdKey
1327 infixAppName = varQual FSLIT("infixApp") infixAppIdKey
1328 sectionLName = varQual FSLIT("sectionL") sectionLIdKey
1329 sectionRName = varQual FSLIT("sectionR") sectionRIdKey
1330 lamEName = varQual FSLIT("lamE") lamEIdKey
1331 tupEName = varQual FSLIT("tupE") tupEIdKey
1332 condEName = varQual FSLIT("condE") condEIdKey
1333 letEName = varQual FSLIT("letE") letEIdKey
1334 caseEName = varQual FSLIT("caseE") caseEIdKey
1335 doEName = varQual FSLIT("doE") doEIdKey
1336 compEName = varQual FSLIT("compE") compEIdKey
1337 -- ArithSeq skips a level
1338 fromEName = varQual FSLIT("fromE") fromEIdKey
1339 fromThenEName = varQual FSLIT("fromThenE") fromThenEIdKey
1340 fromToEName = varQual FSLIT("fromToE") fromToEIdKey
1341 fromThenToEName = varQual FSLIT("fromThenToE") fromThenToEIdKey
1343 listEName = varQual FSLIT("listE") listEIdKey
1344 sigEName = varQual FSLIT("sigE") sigEIdKey
1345 recConEName = varQual FSLIT("recConE") recConEIdKey
1346 recUpdEName = varQual FSLIT("recUpdE") recUpdEIdKey
1348 -- type FieldExp = ...
1349 fieldExpName = varQual FSLIT("fieldExp") fieldExpIdKey
1352 guardedBName = varQual FSLIT("guardedB") guardedBIdKey
1353 normalBName = varQual FSLIT("normalB") normalBIdKey
1356 bindSName = varQual FSLIT("bindS") bindSIdKey
1357 letSName = varQual FSLIT("letS") letSIdKey
1358 noBindSName = varQual FSLIT("noBindS") noBindSIdKey
1359 parSName = varQual FSLIT("parS") parSIdKey
1362 funDName = varQual FSLIT("funD") funDIdKey
1363 valDName = varQual FSLIT("valD") valDIdKey
1364 dataDName = varQual FSLIT("dataD") dataDIdKey
1365 newtypeDName = varQual FSLIT("newtypeD") newtypeDIdKey
1366 tySynDName = varQual FSLIT("tySynD") tySynDIdKey
1367 classDName = varQual FSLIT("classD") classDIdKey
1368 instanceDName = varQual FSLIT("instanceD") instanceDIdKey
1369 sigDName = varQual FSLIT("sigD") sigDIdKey
1372 cxtName = varQual FSLIT("cxt") cxtIdKey
1374 -- data Strict = ...
1375 isStrictName = varQual FSLIT("isStrict") isStrictKey
1376 notStrictName = varQual FSLIT("notStrict") notStrictKey
1379 normalCName = varQual FSLIT("normalC") normalCIdKey
1380 recCName = varQual FSLIT("recC") recCIdKey
1381 infixCName = varQual FSLIT("infixC") infixCIdKey
1383 -- type StrictType = ...
1384 strictTypeName = varQual FSLIT("strictType") strictTKey
1386 -- type VarStrictType = ...
1387 varStrictTypeName = varQual FSLIT("varStrictType") varStrictTKey
1390 forallTName = varQual FSLIT("forallT") forallTIdKey
1391 varTName = varQual FSLIT("varT") varTIdKey
1392 conTName = varQual FSLIT("conT") conTIdKey
1393 tupleTName = varQual FSLIT("tupleT") tupleTIdKey
1394 arrowTName = varQual FSLIT("arrowT") arrowTIdKey
1395 listTName = varQual FSLIT("listT") listTIdKey
1396 appTName = varQual FSLIT("appT") appTIdKey
1398 qTyConName = tcQual FSLIT("Q") qTyConKey
1399 patTyConName = tcQual FSLIT("Pat") patTyConKey
1400 fieldPatTyConName = tcQual FSLIT("FieldPat") fieldPatTyConKey
1401 matchQTyConName = tcQual FSLIT("MatchQ") matchQTyConKey
1402 clauseQTyConName = tcQual FSLIT("ClauseQ") clauseQTyConKey
1403 expQTyConName = tcQual FSLIT("ExpQ") expQTyConKey
1404 fieldExpTyConName = tcQual FSLIT("FieldExp") fieldExpTyConKey
1405 stmtQTyConName = tcQual FSLIT("StmtQ") stmtQTyConKey
1406 decQTyConName = tcQual FSLIT("DecQ") decQTyConKey
1407 conQTyConName = tcQual FSLIT("ConQ") conQTyConKey
1408 strictTypeQTyConName = tcQual FSLIT("StrictTypeQ") strictTypeQTyConKey
1409 varStrictTypeQTyConName = tcQual FSLIT("VarStrictTypeQ") varStrictTypeQTyConKey
1410 typeQTyConName = tcQual FSLIT("TypeQ") typeQTyConKey
1412 expTyConName = tcQual FSLIT("Exp") expTyConKey
1413 decTyConName = tcQual FSLIT("Dec") decTyConKey
1414 typeTyConName = tcQual FSLIT("Type") typeTyConKey
1415 matchTyConName = tcQual FSLIT("Match") matchTyConKey
1416 clauseTyConName = tcQual FSLIT("Clause") clauseTyConKey
1418 -- TyConUniques available: 100-119
1419 -- Check in PrelNames if you want to change this
1421 expTyConKey = mkPreludeTyConUnique 100
1422 matchTyConKey = mkPreludeTyConUnique 101
1423 clauseTyConKey = mkPreludeTyConUnique 102
1424 qTyConKey = mkPreludeTyConUnique 103
1425 expQTyConKey = mkPreludeTyConUnique 104
1426 decQTyConKey = mkPreludeTyConUnique 105
1427 patTyConKey = mkPreludeTyConUnique 106
1428 matchQTyConKey = mkPreludeTyConUnique 107
1429 clauseQTyConKey = mkPreludeTyConUnique 108
1430 stmtQTyConKey = mkPreludeTyConUnique 109
1431 conQTyConKey = mkPreludeTyConUnique 110
1432 typeQTyConKey = mkPreludeTyConUnique 111
1433 typeTyConKey = mkPreludeTyConUnique 112
1434 decTyConKey = mkPreludeTyConUnique 113
1435 varStrictTypeQTyConKey = mkPreludeTyConUnique 114
1436 strictTypeQTyConKey = mkPreludeTyConUnique 115
1437 fieldExpTyConKey = mkPreludeTyConUnique 116
1438 fieldPatTyConKey = mkPreludeTyConUnique 117
1440 -- IdUniques available: 200-299
1441 -- If you want to change this, make sure you check in PrelNames
1443 returnQIdKey = mkPreludeMiscIdUnique 200
1444 bindQIdKey = mkPreludeMiscIdUnique 201
1445 sequenceQIdKey = mkPreludeMiscIdUnique 202
1446 gensymIdKey = mkPreludeMiscIdUnique 203
1447 liftIdKey = mkPreludeMiscIdUnique 204
1450 charLIdKey = mkPreludeMiscIdUnique 210
1451 stringLIdKey = mkPreludeMiscIdUnique 211
1452 integerLIdKey = mkPreludeMiscIdUnique 212
1453 intPrimLIdKey = mkPreludeMiscIdUnique 213
1454 floatPrimLIdKey = mkPreludeMiscIdUnique 214
1455 doublePrimLIdKey = mkPreludeMiscIdUnique 215
1456 rationalLIdKey = mkPreludeMiscIdUnique 216
1459 litPIdKey = mkPreludeMiscIdUnique 220
1460 varPIdKey = mkPreludeMiscIdUnique 221
1461 tupPIdKey = mkPreludeMiscIdUnique 222
1462 conPIdKey = mkPreludeMiscIdUnique 223
1463 tildePIdKey = mkPreludeMiscIdUnique 224
1464 asPIdKey = mkPreludeMiscIdUnique 225
1465 wildPIdKey = mkPreludeMiscIdUnique 226
1466 recPIdKey = mkPreludeMiscIdUnique 227
1467 listPIdKey = mkPreludeMiscIdUnique 228
1469 -- type FieldPat = ...
1470 fieldPatIdKey = mkPreludeMiscIdUnique 230
1473 matchIdKey = mkPreludeMiscIdUnique 231
1475 -- data Clause = ...
1476 clauseIdKey = mkPreludeMiscIdUnique 232
1479 varEIdKey = mkPreludeMiscIdUnique 240
1480 conEIdKey = mkPreludeMiscIdUnique 241
1481 litEIdKey = mkPreludeMiscIdUnique 242
1482 appEIdKey = mkPreludeMiscIdUnique 243
1483 infixEIdKey = mkPreludeMiscIdUnique 244
1484 infixAppIdKey = mkPreludeMiscIdUnique 245
1485 sectionLIdKey = mkPreludeMiscIdUnique 246
1486 sectionRIdKey = mkPreludeMiscIdUnique 247
1487 lamEIdKey = mkPreludeMiscIdUnique 248
1488 tupEIdKey = mkPreludeMiscIdUnique 249
1489 condEIdKey = mkPreludeMiscIdUnique 250
1490 letEIdKey = mkPreludeMiscIdUnique 251
1491 caseEIdKey = mkPreludeMiscIdUnique 252
1492 doEIdKey = mkPreludeMiscIdUnique 253
1493 compEIdKey = mkPreludeMiscIdUnique 254
1494 fromEIdKey = mkPreludeMiscIdUnique 255
1495 fromThenEIdKey = mkPreludeMiscIdUnique 256
1496 fromToEIdKey = mkPreludeMiscIdUnique 257
1497 fromThenToEIdKey = mkPreludeMiscIdUnique 258
1498 listEIdKey = mkPreludeMiscIdUnique 259
1499 sigEIdKey = mkPreludeMiscIdUnique 260
1500 recConEIdKey = mkPreludeMiscIdUnique 261
1501 recUpdEIdKey = mkPreludeMiscIdUnique 262
1503 -- type FieldExp = ...
1504 fieldExpIdKey = mkPreludeMiscIdUnique 265
1507 guardedBIdKey = mkPreludeMiscIdUnique 266
1508 normalBIdKey = mkPreludeMiscIdUnique 267
1511 bindSIdKey = mkPreludeMiscIdUnique 268
1512 letSIdKey = mkPreludeMiscIdUnique 269
1513 noBindSIdKey = mkPreludeMiscIdUnique 270
1514 parSIdKey = mkPreludeMiscIdUnique 271
1517 funDIdKey = mkPreludeMiscIdUnique 272
1518 valDIdKey = mkPreludeMiscIdUnique 273
1519 dataDIdKey = mkPreludeMiscIdUnique 274
1520 newtypeDIdKey = mkPreludeMiscIdUnique 275
1521 tySynDIdKey = mkPreludeMiscIdUnique 276
1522 classDIdKey = mkPreludeMiscIdUnique 277
1523 instanceDIdKey = mkPreludeMiscIdUnique 278
1524 sigDIdKey = mkPreludeMiscIdUnique 279
1527 cxtIdKey = mkPreludeMiscIdUnique 280
1529 -- data Strict = ...
1530 isStrictKey = mkPreludeMiscIdUnique 281
1531 notStrictKey = mkPreludeMiscIdUnique 282
1534 normalCIdKey = mkPreludeMiscIdUnique 283
1535 recCIdKey = mkPreludeMiscIdUnique 284
1536 infixCIdKey = mkPreludeMiscIdUnique 285
1538 -- type StrictType = ...
1539 strictTKey = mkPreludeMiscIdUnique 2286
1541 -- type VarStrictType = ...
1542 varStrictTKey = mkPreludeMiscIdUnique 287
1545 forallTIdKey = mkPreludeMiscIdUnique 290
1546 varTIdKey = mkPreludeMiscIdUnique 291
1547 conTIdKey = mkPreludeMiscIdUnique 292
1548 tupleTIdKey = mkPreludeMiscIdUnique 294
1549 arrowTIdKey = mkPreludeMiscIdUnique 295
1550 listTIdKey = mkPreludeMiscIdUnique 296
1551 appTIdKey = mkPreludeMiscIdUnique 293
1553 -- %************************************************************************
1557 -- %************************************************************************
1559 -- It is rather usatisfactory that we don't have a SrcLoc
1560 addDsWarn :: SDoc -> DsM ()
1561 addDsWarn msg = dsWarn (noSrcLoc, msg)