Use FractionalLit more extensively to improve other pretty printers
[ghc-hetmet.git] / compiler / deSugar / DsMeta.hs
1 -----------------------------------------------------------------------------
2 --
3 -- (c) The University of Glasgow 2006
4 --
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.
9 --
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 -----------------------------------------------------------------------------
15
16 module DsMeta( dsBracket, 
17                templateHaskellNames, qTyConName, nameTyConName,
18                liftName, liftStringName, expQTyConName, patQTyConName, 
19                decQTyConName, decsQTyConName, typeQTyConName,
20                decTyConName, typeTyConName, mkNameG_dName, mkNameG_vName, mkNameG_tcName,
21                quoteExpName, quotePatName, quoteDecName, quoteTypeName
22                 ) where
23
24 #include "HsVersions.h"
25
26 import {-# SOURCE #-}   DsExpr ( dsExpr )
27
28 import MatchLit
29 import DsMonad
30
31 import qualified Language.Haskell.TH as TH
32
33 import HsSyn
34 import Class
35 import PrelNames
36 -- To avoid clashes with DsMeta.varName we must make a local alias for
37 -- OccName.varName we do this by removing varName from the import of
38 -- OccName above, making a qualified instance of OccName and using
39 -- OccNameAlias.varName where varName ws previously used in this file.
40 import qualified OccName( isDataOcc, isVarOcc, isTcOcc, varName, tcName ) 
41
42 import Module
43 import Id
44 import Name hiding( isVarOcc, isTcOcc, varName, tcName ) 
45 import NameEnv
46 import TcType
47 import TyCon
48 import TysWiredIn
49 import CoreSyn
50 import MkCore
51 import CoreUtils
52 import SrcLoc
53 import Unique
54 import BasicTypes
55 import Outputable
56 import Bag
57 import FastString
58 import ForeignCall
59 import MonadUtils
60
61 import Data.Maybe
62 import Control.Monad
63 import Data.List
64
65 -----------------------------------------------------------------------------
66 dsBracket :: HsBracket Name -> [PendingSplice] -> DsM CoreExpr
67 -- Returns a CoreExpr of type TH.ExpQ
68 -- The quoted thing is parameterised over Name, even though it has
69 -- been type checked.  We don't want all those type decorations!
70
71 dsBracket brack splices
72   = dsExtendMetaEnv new_bit (do_brack brack)
73   where
74     new_bit = mkNameEnv [(n, Splice (unLoc e)) | (n,e) <- splices]
75
76     do_brack (VarBr n)   = do { MkC e1  <- lookupOcc n ; return e1 }
77     do_brack (ExpBr e)   = do { MkC e1  <- repLE e     ; return e1 }
78     do_brack (PatBr p)   = do { MkC p1  <- repTopP p   ; return p1 }
79     do_brack (TypBr t)   = do { MkC t1  <- repLTy t    ; return t1 }
80     do_brack (DecBrG gp) = do { MkC ds1 <- repTopDs gp ; return ds1 }
81     do_brack (DecBrL _)  = panic "dsBracket: unexpected DecBrL"
82
83 {- -------------- Examples --------------------
84
85   [| \x -> x |]
86 ====>
87   gensym (unpackString "x"#) `bindQ` \ x1::String ->
88   lam (pvar x1) (var x1)
89
90
91   [| \x -> $(f [| x |]) |]
92 ====>
93   gensym (unpackString "x"#) `bindQ` \ x1::String ->
94   lam (pvar x1) (f (var x1))
95 -}
96
97
98 -------------------------------------------------------
99 --                      Declarations
100 -------------------------------------------------------
101
102 repTopP :: LPat Name -> DsM (Core TH.PatQ)
103 repTopP pat = do { ss <- mkGenSyms (collectPatBinders pat) 
104                  ; pat' <- addBinds ss (repLP pat)
105                  ; wrapNongenSyms ss pat' }
106
107 repTopDs :: HsGroup Name -> DsM (Core (TH.Q [TH.Dec]))
108 repTopDs group
109  = do { let { bndrs = hsGroupBinders group } ;
110         ss <- mkGenSyms bndrs ;
111
112         -- Bind all the names mainly to avoid repeated use of explicit strings.
113         -- Thus we get
114         --      do { t :: String <- genSym "T" ;
115         --           return (Data t [] ...more t's... }
116         -- The other important reason is that the output must mention
117         -- only "T", not "Foo:T" where Foo is the current module
118
119         
120         decls <- addBinds ss (do {
121                         val_ds  <- rep_val_binds (hs_valds group) ;
122                         tycl_ds <- mapM repTyClD (concat (hs_tyclds group)) ;
123                         inst_ds <- mapM repInstD' (hs_instds group) ;
124                         for_ds <- mapM repForD (hs_fords group) ;
125                         -- more needed
126                         return (de_loc $ sort_by_loc $ val_ds ++ catMaybes tycl_ds ++ inst_ds ++ for_ds) }) ;
127
128         decl_ty <- lookupType decQTyConName ;
129         let { core_list = coreList' decl_ty decls } ;
130
131         dec_ty <- lookupType decTyConName ;
132         q_decs  <- repSequenceQ dec_ty core_list ;
133
134         wrapNongenSyms ss q_decs
135         -- Do *not* gensym top-level binders
136       }
137
138
139 {-      Note [Binders and occurrences]
140         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
141 When we desugar [d| data T = MkT |]
142 we want to get
143         Data "T" [] [Con "MkT" []] []
144 and *not*
145         Data "Foo:T" [] [Con "Foo:MkT" []] []
146 That is, the new data decl should fit into whatever new module it is
147 asked to fit in.   We do *not* clone, though; no need for this:
148         Data "T79" ....
149
150 But if we see this:
151         data T = MkT 
152         foo = reifyDecl T
153
154 then we must desugar to
155         foo = Data "Foo:T" [] [Con "Foo:MkT" []] []
156
157 So in repTopDs we bring the binders into scope with mkGenSyms and addBinds.
158 And we use lookupOcc, rather than lookupBinder
159 in repTyClD and repC.
160
161 -}
162
163 repTyClD :: LTyClDecl Name -> DsM (Maybe (SrcSpan, Core TH.DecQ))
164
165 repTyClD tydecl@(L _ (TyFamily {}))
166   = repTyFamily tydecl addTyVarBinds
167
168 repTyClD (L loc (TyData { tcdND = DataType, tcdCtxt = cxt, 
169                           tcdLName = tc, tcdTyVars = tvs, tcdTyPats = opt_tys,
170                           tcdCons = cons, tcdDerivs = mb_derivs }))
171   = do { tc1 <- lookupLOcc tc           -- See note [Binders and occurrences] 
172        ; dec <- addTyVarBinds tvs $ \bndrs -> 
173            do { cxt1     <- repLContext cxt
174               ; opt_tys1 <- maybeMapM repLTys opt_tys   -- only for family insts
175               ; opt_tys2 <- maybeMapM (coreList typeQTyConName) opt_tys1
176               ; cons1    <- mapM repC cons
177               ; cons2    <- coreList conQTyConName cons1
178               ; derivs1  <- repDerivs mb_derivs
179               ; bndrs1   <- coreList tyVarBndrTyConName bndrs
180               ; repData cxt1 tc1 bndrs1 opt_tys2 cons2 derivs1 
181               }
182        ; return $ Just (loc, dec) 
183        }
184
185 repTyClD (L loc (TyData { tcdND = NewType, tcdCtxt = cxt, 
186                           tcdLName = tc, tcdTyVars = tvs, tcdTyPats = opt_tys,
187                           tcdCons = [con], tcdDerivs = mb_derivs }))
188   = do { tc1 <- lookupLOcc tc           -- See note [Binders and occurrences] 
189        ; dec <- addTyVarBinds tvs $ \bndrs -> 
190            do { cxt1     <- repLContext cxt
191               ; opt_tys1 <- maybeMapM repLTys opt_tys   -- only for family insts
192               ; opt_tys2 <- maybeMapM (coreList typeQTyConName) opt_tys1
193               ; con1     <- repC con
194               ; derivs1  <- repDerivs mb_derivs
195               ; bndrs1   <- coreList tyVarBndrTyConName bndrs
196               ; repNewtype cxt1 tc1 bndrs1 opt_tys2 con1 derivs1
197               }
198        ; return $ Just (loc, dec) 
199        }
200
201 repTyClD (L loc (TySynonym { tcdLName = tc, tcdTyVars = tvs, tcdTyPats = opt_tys,
202                              tcdSynRhs = ty }))
203   = do { tc1 <- lookupLOcc tc           -- See note [Binders and occurrences] 
204        ; dec <- addTyVarBinds tvs $ \bndrs -> 
205            do { opt_tys1 <- maybeMapM repLTys opt_tys   -- only for family insts
206               ; opt_tys2 <- maybeMapM (coreList typeQTyConName) opt_tys1
207               ; ty1      <- repLTy ty
208               ; bndrs1   <- coreList tyVarBndrTyConName bndrs
209               ; repTySyn tc1 bndrs1 opt_tys2 ty1 
210               }
211        ; return (Just (loc, dec)) 
212        }
213
214 repTyClD (L loc (ClassDecl { tcdCtxt = cxt, tcdLName = cls, 
215                              tcdTyVars = tvs, tcdFDs = fds,
216                              tcdSigs = sigs, tcdMeths = meth_binds, 
217                              tcdATs = ats }))
218   = do { cls1 <- lookupLOcc cls         -- See note [Binders and occurrences] 
219        ; dec  <- addTyVarBinds tvs $ \bndrs -> 
220            do { cxt1   <- repLContext cxt
221               ; sigs1  <- rep_sigs sigs
222               ; binds1 <- rep_binds meth_binds
223               ; fds1   <- repLFunDeps fds
224               ; ats1   <- repLAssocFamilys ats
225               ; decls1 <- coreList decQTyConName (ats1 ++ sigs1 ++ binds1)
226               ; bndrs1 <- coreList tyVarBndrTyConName bndrs
227               ; repClass cxt1 cls1 bndrs1 fds1 decls1 
228               }
229        ; return $ Just (loc, dec) 
230        }
231
232 -- Un-handled cases
233 repTyClD (L loc d) = putSrcSpanDs loc $
234                      do { warnDs (hang ds_msg 4 (ppr d))
235                         ; return Nothing }
236
237 -- The type variables in the head of families are treated differently when the
238 -- family declaration is associated.  In that case, they are usage, not binding
239 -- occurences.
240 --
241 repTyFamily :: LTyClDecl Name 
242             -> ProcessTyVarBinds TH.Dec
243             -> DsM (Maybe (SrcSpan, Core TH.DecQ))
244 repTyFamily (L loc (TyFamily { tcdFlavour = flavour,
245                                tcdLName = tc, tcdTyVars = tvs, 
246                                tcdKind = opt_kind }))
247             tyVarBinds
248   = do { tc1 <- lookupLOcc tc           -- See note [Binders and occurrences] 
249        ; dec <- tyVarBinds tvs $ \bndrs ->
250            do { flav   <- repFamilyFlavour flavour
251               ; bndrs1 <- coreList tyVarBndrTyConName bndrs
252               ; case opt_kind of 
253                   Nothing -> repFamilyNoKind flav tc1 bndrs1
254                   Just ki -> do { ki1 <- repKind ki 
255                                 ; repFamilyKind flav tc1 bndrs1 ki1
256                                 }
257               }
258        ; return $ Just (loc, dec)
259        }
260 repTyFamily _ _ = panic "DsMeta.repTyFamily: internal error"
261
262 -- represent fundeps
263 --
264 repLFunDeps :: [Located (FunDep Name)] -> DsM (Core [TH.FunDep])
265 repLFunDeps fds = do fds' <- mapM repLFunDep fds
266                      fdList <- coreList funDepTyConName fds'
267                      return fdList
268
269 repLFunDep :: Located (FunDep Name) -> DsM (Core TH.FunDep)
270 repLFunDep (L _ (xs, ys)) = do xs' <- mapM lookupBinder xs
271                                ys' <- mapM lookupBinder ys
272                                xs_list <- coreList nameTyConName xs'
273                                ys_list <- coreList nameTyConName ys'
274                                repFunDep xs_list ys_list
275
276 -- represent family declaration flavours
277 --
278 repFamilyFlavour :: FamilyFlavour -> DsM (Core TH.FamFlavour)
279 repFamilyFlavour TypeFamily = rep2 typeFamName []
280 repFamilyFlavour DataFamily = rep2 dataFamName []
281
282 -- represent associated family declarations
283 --
284 repLAssocFamilys :: [LTyClDecl Name] -> DsM [Core TH.DecQ]
285 repLAssocFamilys = mapM repLAssocFamily
286   where
287     repLAssocFamily tydecl@(L _ (TyFamily {})) 
288       = liftM (snd . fromJust) $ repTyFamily tydecl lookupTyVarBinds
289     repLAssocFamily tydecl
290       = failWithDs msg
291       where
292         msg = ptext (sLit "Illegal associated declaration in class:") <+> 
293               ppr tydecl
294
295 -- represent associated family instances
296 --
297 repLAssocFamInst :: [LTyClDecl Name] -> DsM [Core TH.DecQ]
298 repLAssocFamInst = liftM de_loc . mapMaybeM repTyClD
299
300 -- represent instance declarations
301 --
302 repInstD' :: LInstDecl Name -> DsM (SrcSpan, Core TH.DecQ)
303 repInstD' (L loc (InstDecl ty binds _ ats))     -- Ignore user pragmas for now
304   = do { i <- addTyVarBinds tvs $ \_ ->
305                 -- We must bring the type variables into scope, so their
306                 -- occurrences don't fail, even though the binders don't 
307                 -- appear in the resulting data structure
308                 do { cxt1 <- repContext cxt
309                    ; inst_ty1 <- repPredTy (HsClassP cls tys)
310                    ; ss <- mkGenSyms (collectHsBindsBinders binds)
311                    ; binds1 <- addBinds ss (rep_binds binds)
312                    ; ats1   <- repLAssocFamInst ats
313                    ; decls1 <- coreList decQTyConName (ats1 ++ binds1)
314                    ; decls2 <- wrapNongenSyms ss decls1
315                    -- wrapNongenSyms: do not clone the class op names!
316                    -- They must be called 'op' etc, not 'op34'
317                    ; repInst cxt1 inst_ty1 (decls2)
318                    }
319         ; return (loc, i)}
320  where
321    (tvs, cxt, cls, tys) = splitHsInstDeclTy (unLoc ty)
322
323 repForD :: Located (ForeignDecl Name) -> DsM (SrcSpan, Core TH.DecQ)
324 repForD (L loc (ForeignImport name typ (CImport cc s ch cis)))
325  = do MkC name' <- lookupLOcc name
326       MkC typ' <- repLTy typ
327       MkC cc' <- repCCallConv cc
328       MkC s' <- repSafety s
329       cis' <- conv_cimportspec cis
330       MkC str <- coreStringLit $ static
331                               ++ unpackFS ch ++ " "
332                               ++ cis'
333       dec <- rep2 forImpDName [cc', s', str, name', typ']
334       return (loc, dec)
335  where
336     conv_cimportspec (CLabel cls) = notHandled "Foreign label" (doubleQuotes (ppr cls))
337     conv_cimportspec (CFunction DynamicTarget) = return "dynamic"
338     conv_cimportspec (CFunction (StaticTarget fs _)) = return (unpackFS fs)
339     conv_cimportspec CWrapper = return "wrapper"
340     static = case cis of
341                  CFunction (StaticTarget _ _) -> "static "
342                  _ -> ""
343 repForD decl = notHandled "Foreign declaration" (ppr decl)
344
345 repCCallConv :: CCallConv -> DsM (Core TH.Callconv)
346 repCCallConv CCallConv = rep2 cCallName []
347 repCCallConv StdCallConv = rep2 stdCallName []
348 repCCallConv callConv    = notHandled "repCCallConv" (ppr callConv)
349
350 repSafety :: Safety -> DsM (Core TH.Safety)
351 repSafety PlayRisky = rep2 unsafeName []
352 repSafety PlayInterruptible = rep2 interruptibleName []
353 repSafety (PlaySafe False) = rep2 safeName []
354 repSafety (PlaySafe True) = rep2 threadsafeName []
355
356 ds_msg :: SDoc
357 ds_msg = ptext (sLit "Cannot desugar this Template Haskell declaration:")
358
359 -------------------------------------------------------
360 --                      Constructors
361 -------------------------------------------------------
362
363 repC :: LConDecl Name -> DsM (Core TH.ConQ)
364 repC (L _ (ConDecl { con_name = con, con_qvars = [], con_cxt = L _ []
365                    , con_details = details, con_res = ResTyH98 }))
366   = do { con1 <- lookupLOcc con         -- See note [Binders and occurrences] 
367        ; repConstr con1 details 
368        }
369 repC (L loc con_decl@(ConDecl { con_qvars = tvs, con_cxt = L cloc ctxt, con_res = ResTyH98 }))
370   = addTyVarBinds tvs $ \bndrs -> 
371       do { c' <- repC (L loc (con_decl { con_qvars = [], con_cxt = L cloc [] }))
372          ; ctxt' <- repContext ctxt
373          ; bndrs' <- coreList tyVarBndrTyConName bndrs
374          ; rep2 forallCName [unC bndrs', unC ctxt', unC c']
375          }
376 repC (L loc con_decl)           -- GADTs
377   = putSrcSpanDs loc $
378     notHandled "GADT declaration" (ppr con_decl) 
379
380 repBangTy :: LBangType Name -> DsM (Core (TH.StrictTypeQ))
381 repBangTy ty= do 
382   MkC s <- rep2 str []
383   MkC t <- repLTy ty'
384   rep2 strictTypeName [s, t]
385   where 
386     (str, ty') = case ty of
387                    L _ (HsBangTy _ ty) -> (isStrictName,  ty)
388                    _                   -> (notStrictName, ty)
389
390 -------------------------------------------------------
391 --                      Deriving clause
392 -------------------------------------------------------
393
394 repDerivs :: Maybe [LHsType Name] -> DsM (Core [TH.Name])
395 repDerivs Nothing = coreList nameTyConName []
396 repDerivs (Just ctxt)
397   = do { strs <- mapM rep_deriv ctxt ; 
398          coreList nameTyConName strs }
399   where
400     rep_deriv :: LHsType Name -> DsM (Core TH.Name)
401         -- Deriving clauses must have the simple H98 form
402     rep_deriv (L _ (HsPredTy (HsClassP cls []))) = lookupOcc cls
403     rep_deriv other = notHandled "Non-H98 deriving clause" (ppr other)
404
405
406 -------------------------------------------------------
407 --   Signatures in a class decl, or a group of bindings
408 -------------------------------------------------------
409
410 rep_sigs :: [LSig Name] -> DsM [Core TH.DecQ]
411 rep_sigs sigs = do locs_cores <- rep_sigs' sigs
412                    return $ de_loc $ sort_by_loc locs_cores
413
414 rep_sigs' :: [LSig Name] -> DsM [(SrcSpan, Core TH.DecQ)]
415         -- We silently ignore ones we don't recognise
416 rep_sigs' sigs = do { sigs1 <- mapM rep_sig sigs ;
417                      return (concat sigs1) }
418
419 rep_sig :: LSig Name -> DsM [(SrcSpan, Core TH.DecQ)]
420         -- Singleton => Ok
421         -- Empty     => Too hard, signature ignored
422 rep_sig (L loc (TypeSig nm ty))       = rep_proto nm ty loc
423 rep_sig (L loc (InlineSig nm ispec))  = rep_inline nm ispec loc
424 rep_sig (L loc (SpecSig nm ty ispec)) = rep_specialise nm ty ispec loc
425 rep_sig _                             = return []
426
427 rep_proto :: Located Name -> LHsType Name -> SrcSpan 
428           -> DsM [(SrcSpan, Core TH.DecQ)]
429 rep_proto nm ty loc 
430   = do { nm1 <- lookupLOcc nm
431        ; ty1 <- repLTy ty
432        ; sig <- repProto nm1 ty1
433        ; return [(loc, sig)]
434        }
435
436 rep_inline :: Located Name 
437            -> InlinePragma      -- Never defaultInlinePragma
438            -> SrcSpan 
439            -> DsM [(SrcSpan, Core TH.DecQ)]
440 rep_inline nm ispec loc
441   = do { nm1 <- lookupLOcc nm
442        ; ispec1 <- rep_InlinePrag ispec
443        ; pragma <- repPragInl nm1 ispec1
444        ; return [(loc, pragma)]
445        }
446
447 rep_specialise :: Located Name -> LHsType Name -> InlinePragma -> SrcSpan 
448                -> DsM [(SrcSpan, Core TH.DecQ)]
449 rep_specialise nm ty ispec loc
450   = do { nm1 <- lookupLOcc nm
451        ; ty1 <- repLTy ty
452        ; pragma <- if isDefaultInlinePragma ispec
453                    then repPragSpec nm1 ty1                  -- SPECIALISE
454                    else do { ispec1 <- rep_InlinePrag ispec  -- SPECIALISE INLINE
455                            ; repPragSpecInl nm1 ty1 ispec1 } 
456        ; return [(loc, pragma)]
457        }
458
459 -- Extract all the information needed to build a TH.InlinePrag
460 --
461 rep_InlinePrag :: InlinePragma  -- Never defaultInlinePragma
462                -> DsM (Core TH.InlineSpecQ)
463 rep_InlinePrag (InlinePragma { inl_act = activation, inl_rule = match, inl_inline = inline })
464   | Just (flag, phase) <- activation1 
465   = repInlineSpecPhase inline1 match1 flag phase
466   | otherwise
467   = repInlineSpecNoPhase inline1 match1
468   where
469       match1      = coreBool (rep_RuleMatchInfo match)
470       activation1 = rep_Activation activation
471       inline1     = case inline of 
472                        Inline -> coreBool True
473                        _other -> coreBool False
474                        -- We have no representation for Inlinable
475
476       rep_RuleMatchInfo FunLike = False
477       rep_RuleMatchInfo ConLike = True
478
479       rep_Activation NeverActive          = Nothing     -- We never have NOINLINE/AlwaysActive
480       rep_Activation AlwaysActive         = Nothing     -- or            INLINE/NeverActive
481       rep_Activation (ActiveBefore phase) = Just (coreBool False, 
482                                                   MkC $ mkIntExprInt phase)
483       rep_Activation (ActiveAfter phase)  = Just (coreBool True, 
484                                                   MkC $ mkIntExprInt phase)
485
486
487 -------------------------------------------------------
488 --                      Types
489 -------------------------------------------------------
490
491 -- We process type variable bindings in two ways, either by generating fresh
492 -- names or looking up existing names.  The difference is crucial for type
493 -- families, depending on whether they are associated or not.
494 --
495 type ProcessTyVarBinds a = 
496          [LHsTyVarBndr Name]                           -- the binders to be added
497       -> ([Core TH.TyVarBndr] -> DsM (Core (TH.Q a)))  -- action in the ext env
498       -> DsM (Core (TH.Q a))
499
500 -- gensym a list of type variables and enter them into the meta environment;
501 -- the computations passed as the second argument is executed in that extended
502 -- meta environment and gets the *new* names on Core-level as an argument
503 --
504 addTyVarBinds :: ProcessTyVarBinds a
505 addTyVarBinds tvs m =
506   do
507     let names       = hsLTyVarNames tvs
508         mkWithKinds = map repTyVarBndrWithKind tvs
509     freshNames <- mkGenSyms names
510     term       <- addBinds freshNames $ do
511                     bndrs       <- mapM lookupBinder names 
512                     kindedBndrs <- zipWithM ($) mkWithKinds bndrs
513                     m kindedBndrs
514     wrapGenSyms freshNames term
515
516 -- Look up a list of type variables; the computations passed as the second 
517 -- argument gets the *new* names on Core-level as an argument
518 --
519 lookupTyVarBinds :: ProcessTyVarBinds a
520 lookupTyVarBinds tvs m =
521   do
522     let names       = hsLTyVarNames tvs
523         mkWithKinds = map repTyVarBndrWithKind tvs
524     bndrs       <- mapM lookupBinder names 
525     kindedBndrs <- zipWithM ($) mkWithKinds bndrs
526     m kindedBndrs
527
528 -- Produce kinded binder constructors from the Haskell tyvar binders
529 --
530 repTyVarBndrWithKind :: LHsTyVarBndr Name 
531                      -> Core TH.Name -> DsM (Core TH.TyVarBndr)
532 repTyVarBndrWithKind (L _ (UserTyVar {})) nm
533   = repPlainTV nm
534 repTyVarBndrWithKind (L _ (KindedTyVar _ ki)) nm
535   = repKind ki >>= repKindedTV nm
536
537 -- represent a type context
538 --
539 repLContext :: LHsContext Name -> DsM (Core TH.CxtQ)
540 repLContext (L _ ctxt) = repContext ctxt
541
542 repContext :: HsContext Name -> DsM (Core TH.CxtQ)
543 repContext ctxt = do 
544                     preds    <- mapM repLPred ctxt
545                     predList <- coreList predQTyConName preds
546                     repCtxt predList
547
548 -- represent a type predicate
549 --
550 repLPred :: LHsPred Name -> DsM (Core TH.PredQ)
551 repLPred (L _ p) = repPred p
552
553 repPred :: HsPred Name -> DsM (Core TH.PredQ)
554 repPred (HsClassP cls tys) 
555   = do
556       cls1 <- lookupOcc cls
557       tys1 <- repLTys tys
558       tys2 <- coreList typeQTyConName tys1
559       repClassP cls1 tys2
560 repPred (HsEqualP tyleft tyright) 
561   = do
562       tyleft1  <- repLTy tyleft
563       tyright1 <- repLTy tyright
564       repEqualP tyleft1 tyright1
565 repPred p@(HsIParam _ _) = notHandled "Implicit parameter constraint" (ppr p)
566
567 repPredTy :: HsPred Name -> DsM (Core TH.TypeQ)
568 repPredTy (HsClassP cls tys) 
569   = do
570       tcon <- repTy (HsTyVar cls)
571       tys1 <- repLTys tys
572       repTapps tcon tys1
573 repPredTy _ = panic "DsMeta.repPredTy: unexpected equality: internal error"
574
575 -- yield the representation of a list of types
576 --
577 repLTys :: [LHsType Name] -> DsM [Core TH.TypeQ]
578 repLTys tys = mapM repLTy tys
579
580 -- represent a type
581 --
582 repLTy :: LHsType Name -> DsM (Core TH.TypeQ)
583 repLTy (L _ ty) = repTy ty
584
585 repTy :: HsType Name -> DsM (Core TH.TypeQ)
586 repTy (HsForAllTy _ tvs ctxt ty)  = 
587   addTyVarBinds tvs $ \bndrs -> do
588     ctxt1  <- repLContext ctxt
589     ty1    <- repLTy ty
590     bndrs1 <- coreList tyVarBndrTyConName bndrs
591     repTForall bndrs1 ctxt1 ty1
592
593 repTy (HsTyVar n)
594   | isTvOcc (nameOccName n) = do 
595                                 tv1 <- lookupTvOcc n
596                                 repTvar tv1
597   | otherwise               = do 
598                                 tc1 <- lookupOcc n
599                                 repNamedTyCon tc1
600 repTy (HsAppTy f a)         = do 
601                                 f1 <- repLTy f
602                                 a1 <- repLTy a
603                                 repTapp f1 a1
604 repTy (HsFunTy f a)         = do 
605                                 f1   <- repLTy f
606                                 a1   <- repLTy a
607                                 tcon <- repArrowTyCon
608                                 repTapps tcon [f1, a1]
609 repTy (HsListTy t)          = do
610                                 t1   <- repLTy t
611                                 tcon <- repListTyCon
612                                 repTapp tcon t1
613 repTy (HsPArrTy t)          = do
614                                 t1   <- repLTy t
615                                 tcon <- repTy (HsTyVar (tyConName parrTyCon))
616                                 repTapp tcon t1
617 repTy (HsTupleTy Boxed tys)         = do
618                                 tys1 <- repLTys tys 
619                                 tcon <- repTupleTyCon (length tys)
620                                 repTapps tcon tys1
621 repTy (HsTupleTy Unboxed tys)       = do
622                                 tys1 <- repLTys tys
623                                 tcon <- repUnboxedTupleTyCon (length tys)
624                                 repTapps tcon tys1
625 repTy (HsOpTy ty1 n ty2)    = repLTy ((nlHsTyVar (unLoc n) `nlHsAppTy` ty1) 
626                                    `nlHsAppTy` ty2)
627 repTy (HsParTy t)           = repLTy t
628 repTy (HsPredTy pred)       = repPredTy pred
629 repTy (HsKindSig t k)       = do
630                                 t1 <- repLTy t
631                                 k1 <- repKind k
632                                 repTSig t1 k1
633 repTy (HsSpliceTy splice _ _) = repSplice splice
634 repTy ty@(HsNumTy _)          = notHandled "Number types (for generics)" (ppr ty)
635 repTy ty                      = notHandled "Exotic form of type" (ppr ty)
636
637 -- represent a kind
638 --
639 repKind :: Kind -> DsM (Core TH.Kind)
640 repKind ki
641   = do { let (kis, ki') = splitKindFunTys ki
642        ; kis_rep <- mapM repKind kis
643        ; ki'_rep <- repNonArrowKind ki'
644        ; foldrM repArrowK ki'_rep kis_rep
645        }
646   where
647     repNonArrowKind k | isLiftedTypeKind k = repStarK
648                       | otherwise          = notHandled "Exotic form of kind" 
649                                                         (ppr k)
650
651 -----------------------------------------------------------------------------
652 --              Splices
653 -----------------------------------------------------------------------------
654
655 repSplice :: HsSplice Name -> DsM (Core a)
656 -- See Note [How brackets and nested splices are handled] in TcSplice
657 -- We return a CoreExpr of any old type; the context should know
658 repSplice (HsSplice n _) 
659  = do { mb_val <- dsLookupMetaEnv n
660        ; case mb_val of
661            Just (Splice e) -> do { e' <- dsExpr e
662                                  ; return (MkC e') }
663            _ -> pprPanic "HsSplice" (ppr n) }
664                         -- Should not happen; statically checked
665
666 -----------------------------------------------------------------------------
667 --              Expressions
668 -----------------------------------------------------------------------------
669
670 repLEs :: [LHsExpr Name] -> DsM (Core [TH.ExpQ])
671 repLEs es = do { es'  <- mapM repLE es ;
672                  coreList expQTyConName es' }
673
674 -- FIXME: some of these panics should be converted into proper error messages
675 --        unless we can make sure that constructs, which are plainly not
676 --        supported in TH already lead to error messages at an earlier stage
677 repLE :: LHsExpr Name -> DsM (Core TH.ExpQ)
678 repLE (L loc e) = putSrcSpanDs loc (repE e)
679
680 repE :: HsExpr Name -> DsM (Core TH.ExpQ)
681 repE (HsVar x)            =
682   do { mb_val <- dsLookupMetaEnv x 
683      ; case mb_val of
684         Nothing          -> do { str <- globalVar x
685                                ; repVarOrCon x str }
686         Just (Bound y)   -> repVarOrCon x (coreVar y)
687         Just (Splice e)  -> do { e' <- dsExpr e
688                                ; return (MkC e') } }
689 repE e@(HsIPVar _) = notHandled "Implicit parameters" (ppr e)
690
691         -- Remember, we're desugaring renamer output here, so
692         -- HsOverlit can definitely occur
693 repE (HsOverLit l) = do { a <- repOverloadedLiteral l; repLit a }
694 repE (HsLit l)     = do { a <- repLiteral l;           repLit a }
695 repE (HsLam (MatchGroup [m] _)) = repLambda m
696 repE (HsApp x y)   = do {a <- repLE x; b <- repLE y; repApp a b}
697
698 repE (OpApp e1 op _ e2) =
699   do { arg1 <- repLE e1; 
700        arg2 <- repLE e2; 
701        the_op <- repLE op ;
702        repInfixApp arg1 the_op arg2 } 
703 repE (NegApp x _)        = do
704                               a         <- repLE x
705                               negateVar <- lookupOcc negateName >>= repVar
706                               negateVar `repApp` a
707 repE (HsPar x)            = repLE x
708 repE (SectionL x y)       = do { a <- repLE x; b <- repLE y; repSectionL a b } 
709 repE (SectionR x y)       = do { a <- repLE x; b <- repLE y; repSectionR a b } 
710 repE (HsCase e (MatchGroup ms _)) = do { arg <- repLE e
711                                        ; ms2 <- mapM repMatchTup ms
712                                        ; repCaseE arg (nonEmptyCoreList ms2) }
713 repE (HsIf _ x y z)         = do
714                               a <- repLE x
715                               b <- repLE y
716                               c <- repLE z
717                               repCond a b c
718 repE (HsLet bs e)         = do { (ss,ds) <- repBinds bs
719                                ; e2 <- addBinds ss (repLE e)
720                                ; z <- repLetE ds e2
721                                ; wrapGenSyms ss z }
722
723 -- FIXME: I haven't got the types here right yet
724 repE e@(HsDo ctxt sts _) 
725  | case ctxt of { DoExpr -> True; GhciStmt -> True; _ -> False }
726  = do { (ss,zs) <- repLSts sts; 
727         e'      <- repDoE (nonEmptyCoreList zs);
728         wrapGenSyms ss e' }
729
730  | ListComp <- ctxt
731  = do { (ss,zs) <- repLSts sts; 
732         e'      <- repComp (nonEmptyCoreList zs);
733         wrapGenSyms ss e' }
734
735   | otherwise
736   = notHandled "mdo, monad comprehension and [: :]" (ppr e)
737
738 repE (ExplicitList _ es) = do { xs <- repLEs es; repListExp xs }
739 repE e@(ExplicitPArr _ _) = notHandled "Parallel arrays" (ppr e)
740 repE e@(ExplicitTuple es boxed) 
741   | not (all tupArgPresent es) = notHandled "Tuple sections" (ppr e)
742   | isBoxed boxed              = do { xs <- repLEs [e | Present e <- es]; repTup xs }
743   | otherwise                  = do { xs <- repLEs [e | Present e <- es]; repUnboxedTup xs }
744
745 repE (RecordCon c _ flds)
746  = do { x <- lookupLOcc c;
747         fs <- repFields flds;
748         repRecCon x fs }
749 repE (RecordUpd e flds _ _ _)
750  = do { x <- repLE e;
751         fs <- repFields flds;
752         repRecUpd x fs }
753
754 repE (ExprWithTySig e ty) = do { e1 <- repLE e; t1 <- repLTy ty; repSigExp e1 t1 }
755 repE (ArithSeq _ aseq) =
756   case aseq of
757     From e              -> do { ds1 <- repLE e; repFrom ds1 }
758     FromThen e1 e2      -> do 
759                              ds1 <- repLE e1
760                              ds2 <- repLE e2
761                              repFromThen ds1 ds2
762     FromTo   e1 e2      -> do 
763                              ds1 <- repLE e1
764                              ds2 <- repLE e2
765                              repFromTo ds1 ds2
766     FromThenTo e1 e2 e3 -> do 
767                              ds1 <- repLE e1
768                              ds2 <- repLE e2
769                              ds3 <- repLE e3
770                              repFromThenTo ds1 ds2 ds3
771
772 repE (HsSpliceE splice)  = repSplice splice
773 repE e@(PArrSeq {})      = notHandled "Parallel arrays" (ppr e)
774 repE e@(HsCoreAnn {})    = notHandled "Core annotations" (ppr e)
775 repE e@(HsSCC {})        = notHandled "Cost centres" (ppr e)
776 repE e@(HsTickPragma {}) = notHandled "Tick Pragma" (ppr e)
777 repE e@(HsBracketOut {}) = notHandled "TH brackets" (ppr e)
778 repE e                   = notHandled "Expression form" (ppr e)
779
780 -----------------------------------------------------------------------------
781 -- Building representations of auxillary structures like Match, Clause, Stmt, 
782
783 repMatchTup ::  LMatch Name -> DsM (Core TH.MatchQ) 
784 repMatchTup (L _ (Match [p] _ (GRHSs guards wheres))) =
785   do { ss1 <- mkGenSyms (collectPatBinders p) 
786      ; addBinds ss1 $ do {
787      ; p1 <- repLP p
788      ; (ss2,ds) <- repBinds wheres
789      ; addBinds ss2 $ do {
790      ; gs    <- repGuards guards
791      ; match <- repMatch p1 gs ds
792      ; wrapGenSyms (ss1++ss2) match }}}
793 repMatchTup _ = panic "repMatchTup: case alt with more than one arg"
794
795 repClauseTup ::  LMatch Name -> DsM (Core TH.ClauseQ)
796 repClauseTup (L _ (Match ps _ (GRHSs guards wheres))) =
797   do { ss1 <- mkGenSyms (collectPatsBinders ps) 
798      ; addBinds ss1 $ do {
799        ps1 <- repLPs ps
800      ; (ss2,ds) <- repBinds wheres
801      ; addBinds ss2 $ do {
802        gs <- repGuards guards
803      ; clause <- repClause ps1 gs ds
804      ; wrapGenSyms (ss1++ss2) clause }}}
805
806 repGuards ::  [LGRHS Name] ->  DsM (Core TH.BodyQ)
807 repGuards [L _ (GRHS [] e)]
808   = do {a <- repLE e; repNormal a }
809 repGuards other 
810   = do { zs <- mapM process other;
811      let {(xs, ys) = unzip zs};
812          gd <- repGuarded (nonEmptyCoreList ys);
813      wrapGenSyms (concat xs) gd }
814   where 
815     process :: LGRHS Name -> DsM ([GenSymBind], (Core (TH.Q (TH.Guard, TH.Exp))))
816     process (L _ (GRHS [L _ (ExprStmt e1 _ _ _)] e2))
817            = do { x <- repLNormalGE e1 e2;
818                   return ([], x) }
819     process (L _ (GRHS ss rhs))
820            = do (gs, ss') <- repLSts ss
821                 rhs' <- addBinds gs $ repLE rhs
822                 g <- repPatGE (nonEmptyCoreList ss') rhs'
823                 return (gs, g)
824
825 repFields :: HsRecordBinds Name -> DsM (Core [TH.Q TH.FieldExp])
826 repFields (HsRecFields { rec_flds = flds })
827   = do  { fnames <- mapM lookupLOcc (map hsRecFieldId flds)
828         ; es <- mapM repLE (map hsRecFieldArg flds)
829         ; fs <- zipWithM repFieldExp fnames es
830         ; coreList fieldExpQTyConName fs }
831
832
833 -----------------------------------------------------------------------------
834 -- Representing Stmt's is tricky, especially if bound variables
835 -- shadow each other. Consider:  [| do { x <- f 1; x <- f x; g x } |]
836 -- First gensym new names for every variable in any of the patterns.
837 -- both static (x'1 and x'2), and dynamic ((gensym "x") and (gensym "y"))
838 -- if variables didn't shaddow, the static gensym wouldn't be necessary
839 -- and we could reuse the original names (x and x).
840 --
841 -- do { x'1 <- gensym "x"
842 --    ; x'2 <- gensym "x"   
843 --    ; doE [ BindSt (pvar x'1) [| f 1 |]
844 --          , BindSt (pvar x'2) [| f x |] 
845 --          , NoBindSt [| g x |] 
846 --          ]
847 --    }
848
849 -- The strategy is to translate a whole list of do-bindings by building a
850 -- bigger environment, and a bigger set of meta bindings 
851 -- (like:  x'1 <- gensym "x" ) and then combining these with the translations
852 -- of the expressions within the Do
853       
854 -----------------------------------------------------------------------------
855 -- The helper function repSts computes the translation of each sub expression
856 -- and a bunch of prefix bindings denoting the dynamic renaming.
857
858 repLSts :: [LStmt Name] -> DsM ([GenSymBind], [Core TH.StmtQ])
859 repLSts stmts = repSts (map unLoc stmts)
860
861 repSts :: [Stmt Name] -> DsM ([GenSymBind], [Core TH.StmtQ])
862 repSts (BindStmt p e _ _ : ss) =
863    do { e2 <- repLE e 
864       ; ss1 <- mkGenSyms (collectPatBinders p) 
865       ; addBinds ss1 $ do {
866       ; p1 <- repLP p; 
867       ; (ss2,zs) <- repSts ss
868       ; z <- repBindSt p1 e2
869       ; return (ss1++ss2, z : zs) }}
870 repSts (LetStmt bs : ss) =
871    do { (ss1,ds) <- repBinds bs
872       ; z <- repLetSt ds
873       ; (ss2,zs) <- addBinds ss1 (repSts ss)
874       ; return (ss1++ss2, z : zs) } 
875 repSts (ExprStmt e _ _ _ : ss) =       
876    do { e2 <- repLE e
877       ; z <- repNoBindSt e2 
878       ; (ss2,zs) <- repSts ss
879       ; return (ss2, z : zs) }
880 repSts []    = return ([],[])
881 repSts other = notHandled "Exotic statement" (ppr other)
882
883
884 -----------------------------------------------------------
885 --                      Bindings
886 -----------------------------------------------------------
887
888 repBinds :: HsLocalBinds Name -> DsM ([GenSymBind], Core [TH.DecQ]) 
889 repBinds EmptyLocalBinds
890   = do  { core_list <- coreList decQTyConName []
891         ; return ([], core_list) }
892
893 repBinds b@(HsIPBinds _) = notHandled "Implicit parameters" (ppr b)
894
895 repBinds (HsValBinds decs)
896  = do   { let { bndrs = collectHsValBinders decs }
897                 -- No need to worrry about detailed scopes within
898                 -- the binding group, because we are talking Names
899                 -- here, so we can safely treat it as a mutually 
900                 -- recursive group
901         ; ss        <- mkGenSyms bndrs
902         ; prs       <- addBinds ss (rep_val_binds decs)
903         ; core_list <- coreList decQTyConName 
904                                 (de_loc (sort_by_loc prs))
905         ; return (ss, core_list) }
906
907 rep_val_binds :: HsValBinds Name -> DsM [(SrcSpan, Core TH.DecQ)]
908 -- Assumes: all the binders of the binding are alrady in the meta-env
909 rep_val_binds (ValBindsOut binds sigs)
910  = do { core1 <- rep_binds' (unionManyBags (map snd binds))
911       ; core2 <- rep_sigs' sigs
912       ; return (core1 ++ core2) }
913 rep_val_binds (ValBindsIn _ _)
914  = panic "rep_val_binds: ValBindsIn"
915
916 rep_binds :: LHsBinds Name -> DsM [Core TH.DecQ]
917 rep_binds binds = do { binds_w_locs <- rep_binds' binds
918                      ; return (de_loc (sort_by_loc binds_w_locs)) }
919
920 rep_binds' :: LHsBinds Name -> DsM [(SrcSpan, Core TH.DecQ)]
921 rep_binds' binds = mapM rep_bind (bagToList binds)
922
923 rep_bind :: LHsBind Name -> DsM (SrcSpan, Core TH.DecQ)
924 -- Assumes: all the binders of the binding are alrady in the meta-env
925
926 -- Note GHC treats declarations of a variable (not a pattern) 
927 -- e.g.  x = g 5 as a Fun MonoBinds. This is indicated by a single match 
928 -- with an empty list of patterns
929 rep_bind (L loc (FunBind { fun_id = fn, 
930                            fun_matches = MatchGroup [L _ (Match [] _ (GRHSs guards wheres))] _ }))
931  = do { (ss,wherecore) <- repBinds wheres
932         ; guardcore <- addBinds ss (repGuards guards)
933         ; fn'  <- lookupLBinder fn
934         ; p    <- repPvar fn'
935         ; ans  <- repVal p guardcore wherecore
936         ; ans' <- wrapGenSyms ss ans
937         ; return (loc, ans') }
938
939 rep_bind (L loc (FunBind { fun_id = fn, fun_matches = MatchGroup ms _ }))
940  =   do { ms1 <- mapM repClauseTup ms
941         ; fn' <- lookupLBinder fn
942         ; ans <- repFun fn' (nonEmptyCoreList ms1)
943         ; return (loc, ans) }
944
945 rep_bind (L loc (PatBind { pat_lhs = pat, pat_rhs = GRHSs guards wheres }))
946  =   do { patcore <- repLP pat 
947         ; (ss,wherecore) <- repBinds wheres
948         ; guardcore <- addBinds ss (repGuards guards)
949         ; ans  <- repVal patcore guardcore wherecore
950         ; ans' <- wrapGenSyms ss ans
951         ; return (loc, ans') }
952
953 rep_bind (L _ (VarBind { var_id = v, var_rhs = e}))
954  =   do { v' <- lookupBinder v 
955         ; e2 <- repLE e
956         ; x <- repNormal e2
957         ; patcore <- repPvar v'
958         ; empty_decls <- coreList decQTyConName [] 
959         ; ans <- repVal patcore x empty_decls
960         ; return (srcLocSpan (getSrcLoc v), ans) }
961
962 rep_bind (L _ (AbsBinds {}))  = panic "rep_bind: AbsBinds"
963
964 -----------------------------------------------------------------------------
965 -- Since everything in a Bind is mutually recursive we need rename all
966 -- all the variables simultaneously. For example: 
967 -- [| AndMonoBinds (f x = x + g 2) (g x = f 1 + 2) |] would translate to
968 -- do { f'1 <- gensym "f"
969 --    ; g'2 <- gensym "g"
970 --    ; [ do { x'3 <- gensym "x"; fun f'1 [pvar x'3] [| x + g2 |]},
971 --        do { x'4 <- gensym "x"; fun g'2 [pvar x'4] [| f 1 + 2 |]}
972 --      ]}
973 -- This requires collecting the bindings (f'1 <- gensym "f"), and the 
974 -- environment ( f |-> f'1 ) from each binding, and then unioning them 
975 -- together. As we do this we collect GenSymBinds's which represent the renamed 
976 -- variables bound by the Bindings. In order not to lose track of these 
977 -- representations we build a shadow datatype MB with the same structure as 
978 -- MonoBinds, but which has slots for the representations
979
980
981 -----------------------------------------------------------------------------
982 -- GHC allows a more general form of lambda abstraction than specified
983 -- by Haskell 98. In particular it allows guarded lambda's like : 
984 -- (\  x | even x -> 0 | odd x -> 1) at the moment we can't represent this in
985 -- Haskell Template's Meta.Exp type so we punt if it isn't a simple thing like
986 -- (\ p1 .. pn -> exp) by causing an error.  
987
988 repLambda :: LMatch Name -> DsM (Core TH.ExpQ)
989 repLambda (L _ (Match ps _ (GRHSs [L _ (GRHS [] e)] EmptyLocalBinds)))
990  = do { let bndrs = collectPatsBinders ps ;
991       ; ss  <- mkGenSyms bndrs
992       ; lam <- addBinds ss (
993                 do { xs <- repLPs ps; body <- repLE e; repLam xs body })
994       ; wrapGenSyms ss lam }
995
996 repLambda (L _ m) = notHandled "Guarded labmdas" (pprMatch (LambdaExpr :: HsMatchContext Name) m)
997
998   
999 -----------------------------------------------------------------------------
1000 --                      Patterns
1001 -- repP deals with patterns.  It assumes that we have already
1002 -- walked over the pattern(s) once to collect the binders, and 
1003 -- have extended the environment.  So every pattern-bound 
1004 -- variable should already appear in the environment.
1005
1006 -- Process a list of patterns
1007 repLPs :: [LPat Name] -> DsM (Core [TH.PatQ])
1008 repLPs ps = do { ps' <- mapM repLP ps ;
1009                  coreList patQTyConName ps' }
1010
1011 repLP :: LPat Name -> DsM (Core TH.PatQ)
1012 repLP (L _ p) = repP p
1013
1014 repP :: Pat Name -> DsM (Core TH.PatQ)
1015 repP (WildPat _)       = repPwild 
1016 repP (LitPat l)        = do { l2 <- repLiteral l; repPlit l2 }
1017 repP (VarPat x)        = do { x' <- lookupBinder x; repPvar x' }
1018 repP (LazyPat p)       = do { p1 <- repLP p; repPtilde p1 }
1019 repP (BangPat p)       = do { p1 <- repLP p; repPbang p1 }
1020 repP (AsPat x p)       = do { x' <- lookupLBinder x; p1 <- repLP p; repPaspat x' p1 }
1021 repP (ParPat p)        = repLP p 
1022 repP (ListPat ps _)    = do { qs <- repLPs ps; repPlist qs }
1023 repP (TuplePat ps boxed _)
1024   | isBoxed boxed       = do { qs <- repLPs ps; repPtup qs }
1025   | otherwise           = do { qs <- repLPs ps; repPunboxedTup qs }
1026 repP (ConPatIn dc details)
1027  = do { con_str <- lookupLOcc dc
1028       ; case details of
1029          PrefixCon ps -> do { qs <- repLPs ps; repPcon con_str qs }
1030          RecCon rec   -> do { let flds = rec_flds rec
1031                             ; vs <- sequence $ map lookupLOcc (map hsRecFieldId flds)
1032                             ; ps <- sequence $ map repLP (map hsRecFieldArg flds)
1033                             ; fps <- zipWithM (\x y -> rep2 fieldPatName [unC x,unC y]) vs ps
1034                             ; fps' <- coreList fieldPatQTyConName fps
1035                             ; repPrec con_str fps' }
1036          InfixCon p1 p2 -> do { p1' <- repLP p1;
1037                                 p2' <- repLP p2;
1038                                 repPinfix p1' con_str p2' }
1039    }
1040 repP (NPat l Nothing _)  = do { a <- repOverloadedLiteral l; repPlit a }
1041 repP (ViewPat e p _) = do { e' <- repLE e; p' <- repLP p; repPview e' p' }
1042 repP p@(NPat _ (Just _) _) = notHandled "Negative overloaded patterns" (ppr p)
1043 repP p@(SigPatIn {})  = notHandled "Type signatures in patterns" (ppr p)
1044         -- The problem is to do with scoped type variables.
1045         -- To implement them, we have to implement the scoping rules
1046         -- here in DsMeta, and I don't want to do that today!
1047         --       do { p' <- repLP p; t' <- repLTy t; repPsig p' t' }
1048         --      repPsig :: Core TH.PatQ -> Core TH.TypeQ -> DsM (Core TH.PatQ)
1049         --      repPsig (MkC p) (MkC t) = rep2 sigPName [p, t]
1050
1051 repP other = notHandled "Exotic pattern" (ppr other)
1052
1053 ----------------------------------------------------------
1054 -- Declaration ordering helpers
1055
1056 sort_by_loc :: [(SrcSpan, a)] -> [(SrcSpan, a)]
1057 sort_by_loc xs = sortBy comp xs
1058     where comp x y = compare (fst x) (fst y)
1059
1060 de_loc :: [(a, b)] -> [b]
1061 de_loc = map snd
1062
1063 ----------------------------------------------------------
1064 --      The meta-environment
1065
1066 -- A name/identifier association for fresh names of locally bound entities
1067 type GenSymBind = (Name, Id)    -- Gensym the string and bind it to the Id
1068                                 -- I.e.         (x, x_id) means
1069                                 --      let x_id = gensym "x" in ...
1070
1071 -- Generate a fresh name for a locally bound entity
1072
1073 mkGenSyms :: [Name] -> DsM [GenSymBind]
1074 -- We can use the existing name.  For example:
1075 --      [| \x_77 -> x_77 + x_77 |]
1076 -- desugars to
1077 --      do { x_77 <- genSym "x"; .... }
1078 -- We use the same x_77 in the desugared program, but with the type Bndr
1079 -- instead of Int
1080 --
1081 -- We do make it an Internal name, though (hence localiseName)
1082 --
1083 -- Nevertheless, it's monadic because we have to generate nameTy
1084 mkGenSyms ns = do { var_ty <- lookupType nameTyConName
1085                   ; return [(nm, mkLocalId (localiseName nm) var_ty) | nm <- ns] }
1086
1087              
1088 addBinds :: [GenSymBind] -> DsM a -> DsM a
1089 -- Add a list of fresh names for locally bound entities to the 
1090 -- meta environment (which is part of the state carried around 
1091 -- by the desugarer monad) 
1092 addBinds bs m = dsExtendMetaEnv (mkNameEnv [(n,Bound id) | (n,id) <- bs]) m
1093
1094 -- Look up a locally bound name
1095 --
1096 lookupLBinder :: Located Name -> DsM (Core TH.Name)
1097 lookupLBinder (L _ n) = lookupBinder n
1098
1099 lookupBinder :: Name -> DsM (Core TH.Name)
1100 lookupBinder n 
1101   = do { mb_val <- dsLookupMetaEnv n;
1102          case mb_val of
1103             Just (Bound x) -> return (coreVar x)
1104             _              -> failWithDs msg }
1105   where
1106     msg = ptext (sLit "DsMeta: failed binder lookup when desugaring a TH bracket:") <+> ppr n
1107
1108 -- Look up a name that is either locally bound or a global name
1109 --
1110 --  * If it is a global name, generate the "original name" representation (ie,
1111 --   the <module>:<name> form) for the associated entity
1112 --
1113 lookupLOcc :: Located Name -> DsM (Core TH.Name)
1114 -- Lookup an occurrence; it can't be a splice.
1115 -- Use the in-scope bindings if they exist
1116 lookupLOcc (L _ n) = lookupOcc n
1117
1118 lookupOcc :: Name -> DsM (Core TH.Name)
1119 lookupOcc n
1120   = do {  mb_val <- dsLookupMetaEnv n ;
1121           case mb_val of
1122                 Nothing         -> globalVar n
1123                 Just (Bound x)  -> return (coreVar x)
1124                 Just (Splice _) -> pprPanic "repE:lookupOcc" (ppr n) 
1125     }
1126
1127 lookupTvOcc :: Name -> DsM (Core TH.Name)
1128 -- Type variables can't be staged and are not lexically scoped in TH
1129 lookupTvOcc n   
1130   = do {  mb_val <- dsLookupMetaEnv n ;
1131           case mb_val of
1132                 Just (Bound x)  -> return (coreVar x)
1133                 _               -> failWithDs msg
1134     }
1135   where
1136     msg = vcat  [ ptext (sLit "Illegal lexically-scoped type variable") <+> quotes (ppr n)
1137                 , ptext (sLit "Lexically scoped type variables are not supported by Template Haskell") ]
1138
1139 globalVar :: Name -> DsM (Core TH.Name)
1140 -- Not bound by the meta-env
1141 -- Could be top-level; or could be local
1142 --      f x = $(g [| x |])
1143 -- Here the x will be local
1144 globalVar name
1145   | isExternalName name
1146   = do  { MkC mod <- coreStringLit name_mod
1147         ; MkC pkg <- coreStringLit name_pkg
1148         ; MkC occ <- occNameLit name
1149         ; rep2 mk_varg [pkg,mod,occ] }
1150   | otherwise
1151   = do  { MkC occ <- occNameLit name
1152         ; MkC uni <- coreIntLit (getKey (getUnique name))
1153         ; rep2 mkNameLName [occ,uni] }
1154   where
1155       mod = ASSERT( isExternalName name) nameModule name
1156       name_mod = moduleNameString (moduleName mod)
1157       name_pkg = packageIdString (modulePackageId mod)
1158       name_occ = nameOccName name
1159       mk_varg | OccName.isDataOcc name_occ = mkNameG_dName
1160               | OccName.isVarOcc  name_occ = mkNameG_vName
1161               | OccName.isTcOcc   name_occ = mkNameG_tcName
1162               | otherwise                  = pprPanic "DsMeta.globalVar" (ppr name)
1163
1164 lookupType :: Name      -- Name of type constructor (e.g. TH.ExpQ)
1165            -> DsM Type  -- The type
1166 lookupType tc_name = do { tc <- dsLookupTyCon tc_name ;
1167                           return (mkTyConApp tc []) }
1168
1169 wrapGenSyms :: [GenSymBind] 
1170             -> Core (TH.Q a) -> DsM (Core (TH.Q a))
1171 -- wrapGenSyms [(nm1,id1), (nm2,id2)] y 
1172 --      --> bindQ (gensym nm1) (\ id1 -> 
1173 --          bindQ (gensym nm2 (\ id2 -> 
1174 --          y))
1175
1176 wrapGenSyms binds body@(MkC b)
1177   = do  { var_ty <- lookupType nameTyConName
1178         ; go var_ty binds }
1179   where
1180     [elt_ty] = tcTyConAppArgs (exprType b) 
1181         -- b :: Q a, so we can get the type 'a' by looking at the
1182         -- argument type. NB: this relies on Q being a data/newtype,
1183         -- not a type synonym
1184
1185     go _ [] = return body
1186     go var_ty ((name,id) : binds)
1187       = do { MkC body'  <- go var_ty binds
1188            ; lit_str    <- occNameLit name
1189            ; gensym_app <- repGensym lit_str
1190            ; repBindQ var_ty elt_ty 
1191                       gensym_app (MkC (Lam id body')) }
1192
1193 -- Just like wrapGenSym, but don't actually do the gensym
1194 -- Instead use the existing name:
1195 --      let x = "x" in ...
1196 -- Only used for [Decl], and for the class ops in class 
1197 -- and instance decls
1198 wrapNongenSyms :: [GenSymBind] -> Core a -> DsM (Core a)
1199 wrapNongenSyms binds (MkC body)
1200   = do { binds' <- mapM do_one binds ;
1201          return (MkC (mkLets binds' body)) }
1202   where
1203     do_one (name,id) 
1204         = do { MkC lit_str <- occNameLit name
1205              ; MkC var <- rep2 mkNameName [lit_str]
1206              ; return (NonRec id var) }
1207
1208 occNameLit :: Name -> DsM (Core String)
1209 occNameLit n = coreStringLit (occNameString (nameOccName n))
1210
1211
1212 -- %*********************************************************************
1213 -- %*                                                                   *
1214 --              Constructing code
1215 -- %*                                                                   *
1216 -- %*********************************************************************
1217
1218 -----------------------------------------------------------------------------
1219 -- PHANTOM TYPES for consistency. In order to make sure we do this correct 
1220 -- we invent a new datatype which uses phantom types.
1221
1222 newtype Core a = MkC CoreExpr
1223 unC :: Core a -> CoreExpr
1224 unC (MkC x) = x
1225
1226 rep2 :: Name -> [ CoreExpr ] -> DsM (Core a)
1227 rep2 n xs = do { id <- dsLookupGlobalId n
1228                ; return (MkC (foldl App (Var id) xs)) }
1229
1230 -- Then we make "repConstructors" which use the phantom types for each of the
1231 -- smart constructors of the Meta.Meta datatypes.
1232
1233
1234 -- %*********************************************************************
1235 -- %*                                                                   *
1236 --              The 'smart constructors'
1237 -- %*                                                                   *
1238 -- %*********************************************************************
1239
1240 --------------- Patterns -----------------
1241 repPlit   :: Core TH.Lit -> DsM (Core TH.PatQ) 
1242 repPlit (MkC l) = rep2 litPName [l]
1243
1244 repPvar :: Core TH.Name -> DsM (Core TH.PatQ)
1245 repPvar (MkC s) = rep2 varPName [s]
1246
1247 repPtup :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1248 repPtup (MkC ps) = rep2 tupPName [ps]
1249
1250 repPunboxedTup :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1251 repPunboxedTup (MkC ps) = rep2 unboxedTupPName [ps]
1252
1253 repPcon   :: Core TH.Name -> Core [TH.PatQ] -> DsM (Core TH.PatQ)
1254 repPcon (MkC s) (MkC ps) = rep2 conPName [s, ps]
1255
1256 repPrec   :: Core TH.Name -> Core [(TH.Name,TH.PatQ)] -> DsM (Core TH.PatQ)
1257 repPrec (MkC c) (MkC rps) = rep2 recPName [c,rps]
1258
1259 repPinfix :: Core TH.PatQ -> Core TH.Name -> Core TH.PatQ -> DsM (Core TH.PatQ)
1260 repPinfix (MkC p1) (MkC n) (MkC p2) = rep2 infixPName [p1, n, p2]
1261
1262 repPtilde :: Core TH.PatQ -> DsM (Core TH.PatQ)
1263 repPtilde (MkC p) = rep2 tildePName [p]
1264
1265 repPbang :: Core TH.PatQ -> DsM (Core TH.PatQ)
1266 repPbang (MkC p) = rep2 bangPName [p]
1267
1268 repPaspat :: Core TH.Name -> Core TH.PatQ -> DsM (Core TH.PatQ)
1269 repPaspat (MkC s) (MkC p) = rep2 asPName [s, p]
1270
1271 repPwild  :: DsM (Core TH.PatQ)
1272 repPwild = rep2 wildPName []
1273
1274 repPlist :: Core [TH.PatQ] -> DsM (Core TH.PatQ)
1275 repPlist (MkC ps) = rep2 listPName [ps]
1276
1277 repPview :: Core TH.ExpQ -> Core TH.PatQ -> DsM (Core TH.PatQ)
1278 repPview (MkC e) (MkC p) = rep2 viewPName [e,p]
1279
1280 --------------- Expressions -----------------
1281 repVarOrCon :: Name -> Core TH.Name -> DsM (Core TH.ExpQ)
1282 repVarOrCon vc str | isDataOcc (nameOccName vc) = repCon str
1283                    | otherwise                  = repVar str
1284
1285 repVar :: Core TH.Name -> DsM (Core TH.ExpQ)
1286 repVar (MkC s) = rep2 varEName [s] 
1287
1288 repCon :: Core TH.Name -> DsM (Core TH.ExpQ)
1289 repCon (MkC s) = rep2 conEName [s] 
1290
1291 repLit :: Core TH.Lit -> DsM (Core TH.ExpQ)
1292 repLit (MkC c) = rep2 litEName [c] 
1293
1294 repApp :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1295 repApp (MkC x) (MkC y) = rep2 appEName [x,y] 
1296
1297 repLam :: Core [TH.PatQ] -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1298 repLam (MkC ps) (MkC e) = rep2 lamEName [ps, e]
1299
1300 repTup :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1301 repTup (MkC es) = rep2 tupEName [es]
1302
1303 repUnboxedTup :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1304 repUnboxedTup (MkC es) = rep2 unboxedTupEName [es]
1305
1306 repCond :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1307 repCond (MkC x) (MkC y) (MkC z) = rep2 condEName [x,y,z] 
1308
1309 repLetE :: Core [TH.DecQ] -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1310 repLetE (MkC ds) (MkC e) = rep2 letEName [ds, e] 
1311
1312 repCaseE :: Core TH.ExpQ -> Core [TH.MatchQ] -> DsM( Core TH.ExpQ)
1313 repCaseE (MkC e) (MkC ms) = rep2 caseEName [e, ms]
1314
1315 repDoE :: Core [TH.StmtQ] -> DsM (Core TH.ExpQ)
1316 repDoE (MkC ss) = rep2 doEName [ss]
1317
1318 repComp :: Core [TH.StmtQ] -> DsM (Core TH.ExpQ)
1319 repComp (MkC ss) = rep2 compEName [ss]
1320
1321 repListExp :: Core [TH.ExpQ] -> DsM (Core TH.ExpQ)
1322 repListExp (MkC es) = rep2 listEName [es]
1323
1324 repSigExp :: Core TH.ExpQ -> Core TH.TypeQ -> DsM (Core TH.ExpQ)
1325 repSigExp (MkC e) (MkC t) = rep2 sigEName [e,t]
1326
1327 repRecCon :: Core TH.Name -> Core [TH.Q TH.FieldExp]-> DsM (Core TH.ExpQ)
1328 repRecCon (MkC c) (MkC fs) = rep2 recConEName [c,fs]
1329
1330 repRecUpd :: Core TH.ExpQ -> Core [TH.Q TH.FieldExp] -> DsM (Core TH.ExpQ)
1331 repRecUpd (MkC e) (MkC fs) = rep2 recUpdEName [e,fs]
1332
1333 repFieldExp :: Core TH.Name -> Core TH.ExpQ -> DsM (Core (TH.Q TH.FieldExp))
1334 repFieldExp (MkC n) (MkC x) = rep2 fieldExpName [n,x]
1335
1336 repInfixApp :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1337 repInfixApp (MkC x) (MkC y) (MkC z) = rep2 infixAppName [x,y,z]
1338
1339 repSectionL :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1340 repSectionL (MkC x) (MkC y) = rep2 sectionLName [x,y]
1341
1342 repSectionR :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1343 repSectionR (MkC x) (MkC y) = rep2 sectionRName [x,y]
1344
1345 ------------ Right hand sides (guarded expressions) ----
1346 repGuarded :: Core [TH.Q (TH.Guard, TH.Exp)] -> DsM (Core TH.BodyQ)
1347 repGuarded (MkC pairs) = rep2 guardedBName [pairs]
1348
1349 repNormal :: Core TH.ExpQ -> DsM (Core TH.BodyQ)
1350 repNormal (MkC e) = rep2 normalBName [e]
1351
1352 ------------ Guards ----
1353 repLNormalGE :: LHsExpr Name -> LHsExpr Name -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1354 repLNormalGE g e = do g' <- repLE g
1355                       e' <- repLE e
1356                       repNormalGE g' e'
1357
1358 repNormalGE :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1359 repNormalGE (MkC g) (MkC e) = rep2 normalGEName [g, e]
1360
1361 repPatGE :: Core [TH.StmtQ] -> Core TH.ExpQ -> DsM (Core (TH.Q (TH.Guard, TH.Exp)))
1362 repPatGE (MkC ss) (MkC e) = rep2 patGEName [ss, e]
1363
1364 ------------- Stmts -------------------
1365 repBindSt :: Core TH.PatQ -> Core TH.ExpQ -> DsM (Core TH.StmtQ)
1366 repBindSt (MkC p) (MkC e) = rep2 bindSName [p,e]
1367
1368 repLetSt :: Core [TH.DecQ] -> DsM (Core TH.StmtQ)
1369 repLetSt (MkC ds) = rep2 letSName [ds]
1370
1371 repNoBindSt :: Core TH.ExpQ -> DsM (Core TH.StmtQ)
1372 repNoBindSt (MkC e) = rep2 noBindSName [e]
1373
1374 -------------- Range (Arithmetic sequences) -----------
1375 repFrom :: Core TH.ExpQ -> DsM (Core TH.ExpQ)
1376 repFrom (MkC x) = rep2 fromEName [x]
1377
1378 repFromThen :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1379 repFromThen (MkC x) (MkC y) = rep2 fromThenEName [x,y]
1380
1381 repFromTo :: Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1382 repFromTo (MkC x) (MkC y) = rep2 fromToEName [x,y]
1383
1384 repFromThenTo :: Core TH.ExpQ -> Core TH.ExpQ -> Core TH.ExpQ -> DsM (Core TH.ExpQ)
1385 repFromThenTo (MkC x) (MkC y) (MkC z) = rep2 fromThenToEName [x,y,z]
1386
1387 ------------ Match and Clause Tuples -----------
1388 repMatch :: Core TH.PatQ -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.MatchQ)
1389 repMatch (MkC p) (MkC bod) (MkC ds) = rep2 matchName [p, bod, ds]
1390
1391 repClause :: Core [TH.PatQ] -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.ClauseQ)
1392 repClause (MkC ps) (MkC bod) (MkC ds) = rep2 clauseName [ps, bod, ds]
1393
1394 -------------- Dec -----------------------------
1395 repVal :: Core TH.PatQ -> Core TH.BodyQ -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1396 repVal (MkC p) (MkC b) (MkC ds) = rep2 valDName [p, b, ds]
1397
1398 repFun :: Core TH.Name -> Core [TH.ClauseQ] -> DsM (Core TH.DecQ)  
1399 repFun (MkC nm) (MkC b) = rep2 funDName [nm, b]
1400
1401 repData :: Core TH.CxtQ -> Core TH.Name -> Core [TH.TyVarBndr] 
1402         -> Maybe (Core [TH.TypeQ])
1403         -> Core [TH.ConQ] -> Core [TH.Name] -> DsM (Core TH.DecQ)
1404 repData (MkC cxt) (MkC nm) (MkC tvs) Nothing (MkC cons) (MkC derivs)
1405   = rep2 dataDName [cxt, nm, tvs, cons, derivs]
1406 repData (MkC cxt) (MkC nm) (MkC _) (Just (MkC tys)) (MkC cons) (MkC derivs)
1407   = rep2 dataInstDName [cxt, nm, tys, cons, derivs]
1408
1409 repNewtype :: Core TH.CxtQ -> Core TH.Name -> Core [TH.TyVarBndr] 
1410            -> Maybe (Core [TH.TypeQ])
1411            -> Core TH.ConQ -> Core [TH.Name] -> DsM (Core TH.DecQ)
1412 repNewtype (MkC cxt) (MkC nm) (MkC tvs) Nothing (MkC con) (MkC derivs)
1413   = rep2 newtypeDName [cxt, nm, tvs, con, derivs]
1414 repNewtype (MkC cxt) (MkC nm) (MkC _) (Just (MkC tys)) (MkC con) (MkC derivs)
1415   = rep2 newtypeInstDName [cxt, nm, tys, con, derivs]
1416
1417 repTySyn :: Core TH.Name -> Core [TH.TyVarBndr] 
1418          -> Maybe (Core [TH.TypeQ])
1419          -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1420 repTySyn (MkC nm) (MkC tvs) Nothing (MkC rhs) 
1421   = rep2 tySynDName [nm, tvs, rhs]
1422 repTySyn (MkC nm) (MkC _) (Just (MkC tys)) (MkC rhs) 
1423   = rep2 tySynInstDName [nm, tys, rhs]
1424
1425 repInst :: Core TH.CxtQ -> Core TH.TypeQ -> Core [TH.DecQ] -> DsM (Core TH.DecQ)
1426 repInst (MkC cxt) (MkC ty) (MkC ds) = rep2 instanceDName [cxt, ty, ds]
1427
1428 repClass :: Core TH.CxtQ -> Core TH.Name -> Core [TH.TyVarBndr] 
1429          -> Core [TH.FunDep] -> Core [TH.DecQ] 
1430          -> DsM (Core TH.DecQ)
1431 repClass (MkC cxt) (MkC cls) (MkC tvs) (MkC fds) (MkC ds) 
1432   = rep2 classDName [cxt, cls, tvs, fds, ds]
1433
1434 repPragInl :: Core TH.Name -> Core TH.InlineSpecQ -> DsM (Core TH.DecQ)
1435 repPragInl (MkC nm) (MkC ispec) = rep2 pragInlDName [nm, ispec]
1436
1437 repPragSpec :: Core TH.Name -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1438 repPragSpec (MkC nm) (MkC ty) = rep2 pragSpecDName [nm, ty]
1439
1440 repPragSpecInl :: Core TH.Name -> Core TH.TypeQ -> Core TH.InlineSpecQ 
1441                -> DsM (Core TH.DecQ)
1442 repPragSpecInl (MkC nm) (MkC ty) (MkC ispec) 
1443   = rep2 pragSpecInlDName [nm, ty, ispec]
1444
1445 repFamilyNoKind :: Core TH.FamFlavour -> Core TH.Name -> Core [TH.TyVarBndr] 
1446                 -> DsM (Core TH.DecQ)
1447 repFamilyNoKind (MkC flav) (MkC nm) (MkC tvs)
1448     = rep2 familyNoKindDName [flav, nm, tvs]
1449
1450 repFamilyKind :: Core TH.FamFlavour -> Core TH.Name -> Core [TH.TyVarBndr] 
1451               -> Core TH.Kind
1452               -> DsM (Core TH.DecQ)
1453 repFamilyKind (MkC flav) (MkC nm) (MkC tvs) (MkC ki)
1454     = rep2 familyKindDName [flav, nm, tvs, ki]
1455
1456 repInlineSpecNoPhase :: Core Bool -> Core Bool -> DsM (Core TH.InlineSpecQ)
1457 repInlineSpecNoPhase (MkC inline) (MkC conlike) 
1458   = rep2 inlineSpecNoPhaseName [inline, conlike]
1459
1460 repInlineSpecPhase :: Core Bool -> Core Bool -> Core Bool -> Core Int
1461                    -> DsM (Core TH.InlineSpecQ)
1462 repInlineSpecPhase (MkC inline) (MkC conlike) (MkC beforeFrom) (MkC phase)
1463   = rep2 inlineSpecPhaseName [inline, conlike, beforeFrom, phase]
1464
1465 repFunDep :: Core [TH.Name] -> Core [TH.Name] -> DsM (Core TH.FunDep)
1466 repFunDep (MkC xs) (MkC ys) = rep2 funDepName [xs, ys]
1467
1468 repProto :: Core TH.Name -> Core TH.TypeQ -> DsM (Core TH.DecQ)
1469 repProto (MkC s) (MkC ty) = rep2 sigDName [s, ty]
1470
1471 repCtxt :: Core [TH.PredQ] -> DsM (Core TH.CxtQ)
1472 repCtxt (MkC tys) = rep2 cxtName [tys]
1473
1474 repClassP :: Core TH.Name -> Core [TH.TypeQ] -> DsM (Core TH.PredQ)
1475 repClassP (MkC cla) (MkC tys) = rep2 classPName [cla, tys]
1476
1477 repEqualP :: Core TH.TypeQ -> Core TH.TypeQ -> DsM (Core TH.PredQ)
1478 repEqualP (MkC ty1) (MkC ty2) = rep2 equalPName [ty1, ty2]
1479
1480 repConstr :: Core TH.Name -> HsConDeclDetails Name
1481           -> DsM (Core TH.ConQ)
1482 repConstr con (PrefixCon ps)
1483     = do arg_tys  <- mapM repBangTy ps
1484          arg_tys1 <- coreList strictTypeQTyConName arg_tys
1485          rep2 normalCName [unC con, unC arg_tys1]
1486 repConstr con (RecCon ips)
1487     = do arg_vs   <- mapM lookupLOcc (map cd_fld_name ips)
1488          arg_tys  <- mapM repBangTy (map cd_fld_type ips)
1489          arg_vtys <- zipWithM (\x y -> rep2 varStrictTypeName [unC x, unC y])
1490                               arg_vs arg_tys
1491          arg_vtys' <- coreList varStrictTypeQTyConName arg_vtys
1492          rep2 recCName [unC con, unC arg_vtys']
1493 repConstr con (InfixCon st1 st2)
1494     = do arg1 <- repBangTy st1
1495          arg2 <- repBangTy st2
1496          rep2 infixCName [unC arg1, unC con, unC arg2]
1497
1498 ------------ Types -------------------
1499
1500 repTForall :: Core [TH.TyVarBndr] -> Core TH.CxtQ -> Core TH.TypeQ 
1501            -> DsM (Core TH.TypeQ)
1502 repTForall (MkC tvars) (MkC ctxt) (MkC ty)
1503     = rep2 forallTName [tvars, ctxt, ty]
1504
1505 repTvar :: Core TH.Name -> DsM (Core TH.TypeQ)
1506 repTvar (MkC s) = rep2 varTName [s]
1507
1508 repTapp :: Core TH.TypeQ -> Core TH.TypeQ -> DsM (Core TH.TypeQ)
1509 repTapp (MkC t1) (MkC t2) = rep2 appTName [t1, t2]
1510
1511 repTapps :: Core TH.TypeQ -> [Core TH.TypeQ] -> DsM (Core TH.TypeQ)
1512 repTapps f []     = return f
1513 repTapps f (t:ts) = do { f1 <- repTapp f t; repTapps f1 ts }
1514
1515 repTSig :: Core TH.TypeQ -> Core TH.Kind -> DsM (Core TH.TypeQ)
1516 repTSig (MkC ty) (MkC ki) = rep2 sigTName [ty, ki]
1517
1518 --------- Type constructors --------------
1519
1520 repNamedTyCon :: Core TH.Name -> DsM (Core TH.TypeQ)
1521 repNamedTyCon (MkC s) = rep2 conTName [s]
1522
1523 repTupleTyCon :: Int -> DsM (Core TH.TypeQ)
1524 -- Note: not Core Int; it's easier to be direct here
1525 repTupleTyCon i = rep2 tupleTName [mkIntExprInt i]
1526
1527 repUnboxedTupleTyCon :: Int -> DsM (Core TH.TypeQ)
1528 -- Note: not Core Int; it's easier to be direct here
1529 repUnboxedTupleTyCon i = rep2 unboxedTupleTName [mkIntExprInt i]
1530
1531 repArrowTyCon :: DsM (Core TH.TypeQ)
1532 repArrowTyCon = rep2 arrowTName []
1533
1534 repListTyCon :: DsM (Core TH.TypeQ)
1535 repListTyCon = rep2 listTName []
1536
1537 ------------ Kinds -------------------
1538
1539 repPlainTV :: Core TH.Name -> DsM (Core TH.TyVarBndr)
1540 repPlainTV (MkC nm) = rep2 plainTVName [nm]
1541
1542 repKindedTV :: Core TH.Name -> Core TH.Kind -> DsM (Core TH.TyVarBndr)
1543 repKindedTV (MkC nm) (MkC ki) = rep2 kindedTVName [nm, ki]
1544
1545 repStarK :: DsM (Core TH.Kind)
1546 repStarK = rep2 starKName []
1547
1548 repArrowK :: Core TH.Kind -> Core TH.Kind -> DsM (Core TH.Kind)
1549 repArrowK (MkC ki1) (MkC ki2) = rep2 arrowKName [ki1, ki2]
1550
1551 ----------------------------------------------------------
1552 --              Literals
1553
1554 repLiteral :: HsLit -> DsM (Core TH.Lit)
1555 repLiteral lit 
1556   = do lit' <- case lit of
1557                    HsIntPrim i    -> mk_integer i
1558                    HsWordPrim w   -> mk_integer w
1559                    HsInt i        -> mk_integer i
1560                    HsFloatPrim r  -> mk_rational r
1561                    HsDoublePrim r -> mk_rational r
1562                    _ -> return lit
1563        lit_expr <- dsLit lit'
1564        case mb_lit_name of
1565           Just lit_name -> rep2 lit_name [lit_expr]
1566           Nothing -> notHandled "Exotic literal" (ppr lit)
1567   where
1568     mb_lit_name = case lit of
1569                  HsInteger _ _  -> Just integerLName
1570                  HsInt     _    -> Just integerLName
1571                  HsIntPrim _    -> Just intPrimLName
1572                  HsWordPrim _   -> Just wordPrimLName
1573                  HsFloatPrim _  -> Just floatPrimLName
1574                  HsDoublePrim _ -> Just doublePrimLName
1575                  HsChar _       -> Just charLName
1576                  HsString _     -> Just stringLName
1577                  HsRat _ _      -> Just rationalLName
1578                  _              -> Nothing
1579
1580 mk_integer :: Integer -> DsM HsLit
1581 mk_integer  i = do integer_ty <- lookupType integerTyConName
1582                    return $ HsInteger i integer_ty
1583 mk_rational :: FractionalLit -> DsM HsLit
1584 mk_rational r = do rat_ty <- lookupType rationalTyConName
1585                    return $ HsRat r rat_ty
1586 mk_string :: FastString -> DsM HsLit
1587 mk_string s = return $ HsString s
1588
1589 repOverloadedLiteral :: HsOverLit Name -> DsM (Core TH.Lit)
1590 repOverloadedLiteral (OverLit { ol_val = val})
1591   = do { lit <- mk_lit val; repLiteral lit }
1592         -- The type Rational will be in the environment, becuase 
1593         -- the smart constructor 'TH.Syntax.rationalL' uses it in its type,
1594         -- and rationalL is sucked in when any TH stuff is used
1595
1596 mk_lit :: OverLitVal -> DsM HsLit
1597 mk_lit (HsIntegral i)   = mk_integer  i
1598 mk_lit (HsFractional f) = mk_rational f
1599 mk_lit (HsIsString s)   = mk_string   s
1600               
1601 --------------- Miscellaneous -------------------
1602
1603 repGensym :: Core String -> DsM (Core (TH.Q TH.Name))
1604 repGensym (MkC lit_str) = rep2 newNameName [lit_str]
1605
1606 repBindQ :: Type -> Type        -- a and b
1607          -> Core (TH.Q a) -> Core (a -> TH.Q b) -> DsM (Core (TH.Q b))
1608 repBindQ ty_a ty_b (MkC x) (MkC y) 
1609   = rep2 bindQName [Type ty_a, Type ty_b, x, y] 
1610
1611 repSequenceQ :: Type -> Core [TH.Q a] -> DsM (Core (TH.Q [a]))
1612 repSequenceQ ty_a (MkC list)
1613   = rep2 sequenceQName [Type ty_a, list]
1614
1615 ------------ Lists and Tuples -------------------
1616 -- turn a list of patterns into a single pattern matching a list
1617
1618 coreList :: Name        -- Of the TyCon of the element type
1619          -> [Core a] -> DsM (Core [a])
1620 coreList tc_name es 
1621   = do { elt_ty <- lookupType tc_name; return (coreList' elt_ty es) }
1622
1623 coreList' :: Type       -- The element type
1624           -> [Core a] -> Core [a]
1625 coreList' elt_ty es = MkC (mkListExpr elt_ty (map unC es ))
1626
1627 nonEmptyCoreList :: [Core a] -> Core [a]
1628   -- The list must be non-empty so we can get the element type
1629   -- Otherwise use coreList
1630 nonEmptyCoreList []           = panic "coreList: empty argument"
1631 nonEmptyCoreList xs@(MkC x:_) = MkC (mkListExpr (exprType x) (map unC xs))
1632
1633 coreStringLit :: String -> DsM (Core String)
1634 coreStringLit s = do { z <- mkStringExpr s; return(MkC z) }
1635
1636 ------------ Bool, Literals & Variables -------------------
1637
1638 coreBool :: Bool -> Core Bool
1639 coreBool False = MkC $ mkConApp falseDataCon []
1640 coreBool True  = MkC $ mkConApp trueDataCon  []
1641
1642 coreIntLit :: Int -> DsM (Core Int)
1643 coreIntLit i = return (MkC (mkIntExprInt i))
1644
1645 coreVar :: Id -> Core TH.Name   -- The Id has type Name
1646 coreVar id = MkC (Var id)
1647
1648 ----------------- Failure -----------------------
1649 notHandled :: String -> SDoc -> DsM a
1650 notHandled what doc = failWithDs msg
1651   where
1652     msg = hang (text what <+> ptext (sLit "not (yet) handled by Template Haskell")) 
1653              2 doc
1654
1655
1656 -- %************************************************************************
1657 -- %*                                                                   *
1658 --              The known-key names for Template Haskell
1659 -- %*                                                                   *
1660 -- %************************************************************************
1661
1662 -- To add a name, do three things
1663 -- 
1664 --  1) Allocate a key
1665 --  2) Make a "Name"
1666 --  3) Add the name to knownKeyNames
1667
1668 templateHaskellNames :: [Name]
1669 -- The names that are implicitly mentioned by ``bracket''
1670 -- Should stay in sync with the import list of DsMeta
1671
1672 templateHaskellNames = [
1673     returnQName, bindQName, sequenceQName, newNameName, liftName,
1674     mkNameName, mkNameG_vName, mkNameG_dName, mkNameG_tcName, mkNameLName, 
1675     liftStringName,
1676  
1677     -- Lit
1678     charLName, stringLName, integerLName, intPrimLName, wordPrimLName,
1679     floatPrimLName, doublePrimLName, rationalLName, 
1680     -- Pat
1681     litPName, varPName, tupPName, unboxedTupPName,
1682     conPName, tildePName, bangPName, infixPName,
1683     asPName, wildPName, recPName, listPName, sigPName, viewPName,
1684     -- FieldPat
1685     fieldPatName,
1686     -- Match
1687     matchName,
1688     -- Clause
1689     clauseName,
1690     -- Exp
1691     varEName, conEName, litEName, appEName, infixEName,
1692     infixAppName, sectionLName, sectionRName, lamEName,
1693     tupEName, unboxedTupEName,
1694     condEName, letEName, caseEName, doEName, compEName,
1695     fromEName, fromThenEName, fromToEName, fromThenToEName,
1696     listEName, sigEName, recConEName, recUpdEName,
1697     -- FieldExp
1698     fieldExpName,
1699     -- Body
1700     guardedBName, normalBName,
1701     -- Guard
1702     normalGEName, patGEName,
1703     -- Stmt
1704     bindSName, letSName, noBindSName, parSName,
1705     -- Dec
1706     funDName, valDName, dataDName, newtypeDName, tySynDName,
1707     classDName, instanceDName, sigDName, forImpDName, 
1708     pragInlDName, pragSpecDName, pragSpecInlDName,
1709     familyNoKindDName, familyKindDName, dataInstDName, newtypeInstDName,
1710     tySynInstDName, 
1711     -- Cxt
1712     cxtName,
1713     -- Pred
1714     classPName, equalPName,
1715     -- Strict
1716     isStrictName, notStrictName,
1717     -- Con
1718     normalCName, recCName, infixCName, forallCName,
1719     -- StrictType
1720     strictTypeName,
1721     -- VarStrictType
1722     varStrictTypeName,
1723     -- Type
1724     forallTName, varTName, conTName, appTName,
1725     tupleTName, unboxedTupleTName, arrowTName, listTName, sigTName,
1726     -- TyVarBndr
1727     plainTVName, kindedTVName,
1728     -- Kind
1729     starKName, arrowKName,
1730     -- Callconv
1731     cCallName, stdCallName,
1732     -- Safety
1733     unsafeName,
1734     safeName,
1735     threadsafeName,
1736     interruptibleName,
1737     -- InlineSpec
1738     inlineSpecNoPhaseName, inlineSpecPhaseName,
1739     -- FunDep
1740     funDepName,
1741     -- FamFlavour
1742     typeFamName, dataFamName,
1743
1744     -- And the tycons
1745     qTyConName, nameTyConName, patTyConName, fieldPatTyConName, matchQTyConName,
1746     clauseQTyConName, expQTyConName, fieldExpTyConName, predTyConName,
1747     stmtQTyConName, decQTyConName, conQTyConName, strictTypeQTyConName,
1748     varStrictTypeQTyConName, typeQTyConName, expTyConName, decTyConName,
1749     typeTyConName, tyVarBndrTyConName, matchTyConName, clauseTyConName,
1750     patQTyConName, fieldPatQTyConName, fieldExpQTyConName, funDepTyConName,
1751     predQTyConName, decsQTyConName, 
1752
1753     -- Quasiquoting
1754     quoteDecName, quoteTypeName, quoteExpName, quotePatName]
1755
1756 thSyn, thLib, qqLib :: Module
1757 thSyn = mkTHModule (fsLit "Language.Haskell.TH.Syntax")
1758 thLib = mkTHModule (fsLit "Language.Haskell.TH.Lib")
1759 qqLib = mkTHModule (fsLit "Language.Haskell.TH.Quote")
1760
1761 mkTHModule :: FastString -> Module
1762 mkTHModule m = mkModule thPackageId (mkModuleNameFS m)
1763
1764 libFun, libTc, thFun, thTc, qqFun :: FastString -> Unique -> Name
1765 libFun = mk_known_key_name OccName.varName thLib
1766 libTc  = mk_known_key_name OccName.tcName  thLib
1767 thFun  = mk_known_key_name OccName.varName thSyn
1768 thTc   = mk_known_key_name OccName.tcName  thSyn
1769 qqFun  = mk_known_key_name OccName.varName qqLib
1770
1771 -------------------- TH.Syntax -----------------------
1772 qTyConName, nameTyConName, fieldExpTyConName, patTyConName,
1773     fieldPatTyConName, expTyConName, decTyConName, typeTyConName,
1774     tyVarBndrTyConName, matchTyConName, clauseTyConName, funDepTyConName,
1775     predTyConName :: Name 
1776 qTyConName        = thTc (fsLit "Q")            qTyConKey
1777 nameTyConName     = thTc (fsLit "Name")         nameTyConKey
1778 fieldExpTyConName = thTc (fsLit "FieldExp")     fieldExpTyConKey
1779 patTyConName      = thTc (fsLit "Pat")          patTyConKey
1780 fieldPatTyConName = thTc (fsLit "FieldPat")     fieldPatTyConKey
1781 expTyConName      = thTc (fsLit "Exp")          expTyConKey
1782 decTyConName      = thTc (fsLit "Dec")          decTyConKey
1783 typeTyConName     = thTc (fsLit "Type")         typeTyConKey
1784 tyVarBndrTyConName= thTc (fsLit "TyVarBndr")    tyVarBndrTyConKey
1785 matchTyConName    = thTc (fsLit "Match")        matchTyConKey
1786 clauseTyConName   = thTc (fsLit "Clause")       clauseTyConKey
1787 funDepTyConName   = thTc (fsLit "FunDep")       funDepTyConKey
1788 predTyConName     = thTc (fsLit "Pred")         predTyConKey
1789
1790 returnQName, bindQName, sequenceQName, newNameName, liftName,
1791     mkNameName, mkNameG_vName, mkNameG_dName, mkNameG_tcName,
1792     mkNameLName, liftStringName :: Name
1793 returnQName    = thFun (fsLit "returnQ")   returnQIdKey
1794 bindQName      = thFun (fsLit "bindQ")     bindQIdKey
1795 sequenceQName  = thFun (fsLit "sequenceQ") sequenceQIdKey
1796 newNameName    = thFun (fsLit "newName")   newNameIdKey
1797 liftName       = thFun (fsLit "lift")      liftIdKey
1798 liftStringName = thFun (fsLit "liftString")  liftStringIdKey
1799 mkNameName     = thFun (fsLit "mkName")     mkNameIdKey
1800 mkNameG_vName  = thFun (fsLit "mkNameG_v")  mkNameG_vIdKey
1801 mkNameG_dName  = thFun (fsLit "mkNameG_d")  mkNameG_dIdKey
1802 mkNameG_tcName = thFun (fsLit "mkNameG_tc") mkNameG_tcIdKey
1803 mkNameLName    = thFun (fsLit "mkNameL")    mkNameLIdKey
1804
1805
1806 -------------------- TH.Lib -----------------------
1807 -- data Lit = ...
1808 charLName, stringLName, integerLName, intPrimLName, wordPrimLName,
1809     floatPrimLName, doublePrimLName, rationalLName :: Name
1810 charLName       = libFun (fsLit "charL")       charLIdKey
1811 stringLName     = libFun (fsLit "stringL")     stringLIdKey
1812 integerLName    = libFun (fsLit "integerL")    integerLIdKey
1813 intPrimLName    = libFun (fsLit "intPrimL")    intPrimLIdKey
1814 wordPrimLName   = libFun (fsLit "wordPrimL")   wordPrimLIdKey
1815 floatPrimLName  = libFun (fsLit "floatPrimL")  floatPrimLIdKey
1816 doublePrimLName = libFun (fsLit "doublePrimL") doublePrimLIdKey
1817 rationalLName   = libFun (fsLit "rationalL")     rationalLIdKey
1818
1819 -- data Pat = ...
1820 litPName, varPName, tupPName, unboxedTupPName, conPName, infixPName, tildePName, bangPName,
1821     asPName, wildPName, recPName, listPName, sigPName, viewPName :: Name
1822 litPName   = libFun (fsLit "litP")   litPIdKey
1823 varPName   = libFun (fsLit "varP")   varPIdKey
1824 tupPName   = libFun (fsLit "tupP")   tupPIdKey
1825 unboxedTupPName = libFun (fsLit "unboxedTupP") unboxedTupPIdKey
1826 conPName   = libFun (fsLit "conP")   conPIdKey
1827 infixPName = libFun (fsLit "infixP") infixPIdKey
1828 tildePName = libFun (fsLit "tildeP") tildePIdKey
1829 bangPName  = libFun (fsLit "bangP")  bangPIdKey
1830 asPName    = libFun (fsLit "asP")    asPIdKey
1831 wildPName  = libFun (fsLit "wildP")  wildPIdKey
1832 recPName   = libFun (fsLit "recP")   recPIdKey
1833 listPName  = libFun (fsLit "listP")  listPIdKey
1834 sigPName   = libFun (fsLit "sigP")   sigPIdKey
1835 viewPName  = libFun (fsLit "viewP")  viewPIdKey
1836
1837 -- type FieldPat = ...
1838 fieldPatName :: Name
1839 fieldPatName = libFun (fsLit "fieldPat") fieldPatIdKey
1840
1841 -- data Match = ...
1842 matchName :: Name
1843 matchName = libFun (fsLit "match") matchIdKey
1844
1845 -- data Clause = ...
1846 clauseName :: Name
1847 clauseName = libFun (fsLit "clause") clauseIdKey
1848
1849 -- data Exp = ...
1850 varEName, conEName, litEName, appEName, infixEName, infixAppName,
1851     sectionLName, sectionRName, lamEName, tupEName, unboxedTupEName, condEName,
1852     letEName, caseEName, doEName, compEName :: Name
1853 varEName        = libFun (fsLit "varE")        varEIdKey
1854 conEName        = libFun (fsLit "conE")        conEIdKey
1855 litEName        = libFun (fsLit "litE")        litEIdKey
1856 appEName        = libFun (fsLit "appE")        appEIdKey
1857 infixEName      = libFun (fsLit "infixE")      infixEIdKey
1858 infixAppName    = libFun (fsLit "infixApp")    infixAppIdKey
1859 sectionLName    = libFun (fsLit "sectionL")    sectionLIdKey
1860 sectionRName    = libFun (fsLit "sectionR")    sectionRIdKey
1861 lamEName        = libFun (fsLit "lamE")        lamEIdKey
1862 tupEName        = libFun (fsLit "tupE")        tupEIdKey
1863 unboxedTupEName = libFun (fsLit "unboxedTupE") unboxedTupEIdKey
1864 condEName       = libFun (fsLit "condE")       condEIdKey
1865 letEName        = libFun (fsLit "letE")        letEIdKey
1866 caseEName       = libFun (fsLit "caseE")       caseEIdKey
1867 doEName         = libFun (fsLit "doE")         doEIdKey
1868 compEName       = libFun (fsLit "compE")       compEIdKey
1869 -- ArithSeq skips a level
1870 fromEName, fromThenEName, fromToEName, fromThenToEName :: Name
1871 fromEName       = libFun (fsLit "fromE")       fromEIdKey
1872 fromThenEName   = libFun (fsLit "fromThenE")   fromThenEIdKey
1873 fromToEName     = libFun (fsLit "fromToE")     fromToEIdKey
1874 fromThenToEName = libFun (fsLit "fromThenToE") fromThenToEIdKey
1875 -- end ArithSeq
1876 listEName, sigEName, recConEName, recUpdEName :: Name
1877 listEName       = libFun (fsLit "listE")       listEIdKey
1878 sigEName        = libFun (fsLit "sigE")        sigEIdKey
1879 recConEName     = libFun (fsLit "recConE")     recConEIdKey
1880 recUpdEName     = libFun (fsLit "recUpdE")     recUpdEIdKey
1881
1882 -- type FieldExp = ...
1883 fieldExpName :: Name
1884 fieldExpName = libFun (fsLit "fieldExp") fieldExpIdKey
1885
1886 -- data Body = ...
1887 guardedBName, normalBName :: Name
1888 guardedBName = libFun (fsLit "guardedB") guardedBIdKey
1889 normalBName  = libFun (fsLit "normalB")  normalBIdKey
1890
1891 -- data Guard = ...
1892 normalGEName, patGEName :: Name
1893 normalGEName = libFun (fsLit "normalGE") normalGEIdKey
1894 patGEName    = libFun (fsLit "patGE")    patGEIdKey
1895
1896 -- data Stmt = ...
1897 bindSName, letSName, noBindSName, parSName :: Name
1898 bindSName   = libFun (fsLit "bindS")   bindSIdKey
1899 letSName    = libFun (fsLit "letS")    letSIdKey
1900 noBindSName = libFun (fsLit "noBindS") noBindSIdKey
1901 parSName    = libFun (fsLit "parS")    parSIdKey
1902
1903 -- data Dec = ...
1904 funDName, valDName, dataDName, newtypeDName, tySynDName, classDName,
1905     instanceDName, sigDName, forImpDName, pragInlDName, pragSpecDName,
1906     pragSpecInlDName, familyNoKindDName, familyKindDName, dataInstDName,
1907     newtypeInstDName, tySynInstDName :: Name
1908 funDName         = libFun (fsLit "funD")         funDIdKey
1909 valDName         = libFun (fsLit "valD")         valDIdKey
1910 dataDName        = libFun (fsLit "dataD")        dataDIdKey
1911 newtypeDName     = libFun (fsLit "newtypeD")     newtypeDIdKey
1912 tySynDName       = libFun (fsLit "tySynD")       tySynDIdKey
1913 classDName       = libFun (fsLit "classD")       classDIdKey
1914 instanceDName    = libFun (fsLit "instanceD")    instanceDIdKey
1915 sigDName         = libFun (fsLit "sigD")         sigDIdKey
1916 forImpDName      = libFun (fsLit "forImpD")      forImpDIdKey
1917 pragInlDName     = libFun (fsLit "pragInlD")     pragInlDIdKey
1918 pragSpecDName    = libFun (fsLit "pragSpecD")    pragSpecDIdKey
1919 pragSpecInlDName = libFun (fsLit "pragSpecInlD") pragSpecInlDIdKey
1920 familyNoKindDName= libFun (fsLit "familyNoKindD")familyNoKindDIdKey
1921 familyKindDName  = libFun (fsLit "familyKindD")  familyKindDIdKey
1922 dataInstDName    = libFun (fsLit "dataInstD")    dataInstDIdKey
1923 newtypeInstDName = libFun (fsLit "newtypeInstD") newtypeInstDIdKey
1924 tySynInstDName   = libFun (fsLit "tySynInstD")   tySynInstDIdKey
1925
1926 -- type Ctxt = ...
1927 cxtName :: Name
1928 cxtName = libFun (fsLit "cxt") cxtIdKey
1929
1930 -- data Pred = ...
1931 classPName, equalPName :: Name
1932 classPName = libFun (fsLit "classP") classPIdKey
1933 equalPName = libFun (fsLit "equalP") equalPIdKey
1934
1935 -- data Strict = ...
1936 isStrictName, notStrictName :: Name
1937 isStrictName      = libFun  (fsLit "isStrict")      isStrictKey
1938 notStrictName     = libFun  (fsLit "notStrict")     notStrictKey
1939
1940 -- data Con = ...
1941 normalCName, recCName, infixCName, forallCName :: Name
1942 normalCName = libFun (fsLit "normalC") normalCIdKey
1943 recCName    = libFun (fsLit "recC")    recCIdKey
1944 infixCName  = libFun (fsLit "infixC")  infixCIdKey
1945 forallCName  = libFun (fsLit "forallC")  forallCIdKey
1946
1947 -- type StrictType = ...
1948 strictTypeName :: Name
1949 strictTypeName    = libFun  (fsLit "strictType")    strictTKey
1950
1951 -- type VarStrictType = ...
1952 varStrictTypeName :: Name
1953 varStrictTypeName = libFun  (fsLit "varStrictType") varStrictTKey
1954
1955 -- data Type = ...
1956 forallTName, varTName, conTName, tupleTName, unboxedTupleTName, arrowTName,
1957     listTName, appTName, sigTName :: Name
1958 forallTName = libFun (fsLit "forallT") forallTIdKey
1959 varTName    = libFun (fsLit "varT")    varTIdKey
1960 conTName    = libFun (fsLit "conT")    conTIdKey
1961 tupleTName  = libFun (fsLit "tupleT")  tupleTIdKey
1962 unboxedTupleTName = libFun (fsLit "unboxedTupleT")  unboxedTupleTIdKey
1963 arrowTName  = libFun (fsLit "arrowT")  arrowTIdKey
1964 listTName   = libFun (fsLit "listT")   listTIdKey
1965 appTName    = libFun (fsLit "appT")    appTIdKey
1966 sigTName    = libFun (fsLit "sigT")    sigTIdKey
1967
1968 -- data TyVarBndr = ...
1969 plainTVName, kindedTVName :: Name
1970 plainTVName  = libFun (fsLit "plainTV")  plainTVIdKey
1971 kindedTVName = libFun (fsLit "kindedTV") kindedTVIdKey
1972
1973 -- data Kind = ...
1974 starKName, arrowKName :: Name
1975 starKName  = libFun (fsLit "starK")   starKIdKey
1976 arrowKName = libFun (fsLit "arrowK")  arrowKIdKey
1977
1978 -- data Callconv = ...
1979 cCallName, stdCallName :: Name
1980 cCallName = libFun (fsLit "cCall") cCallIdKey
1981 stdCallName = libFun (fsLit "stdCall") stdCallIdKey
1982
1983 -- data Safety = ...
1984 unsafeName, safeName, threadsafeName, interruptibleName :: Name
1985 unsafeName     = libFun (fsLit "unsafe") unsafeIdKey
1986 safeName       = libFun (fsLit "safe") safeIdKey
1987 threadsafeName = libFun (fsLit "threadsafe") threadsafeIdKey
1988 interruptibleName = libFun (fsLit "interruptible") interruptibleIdKey
1989
1990 -- data InlineSpec = ...
1991 inlineSpecNoPhaseName, inlineSpecPhaseName :: Name
1992 inlineSpecNoPhaseName = libFun (fsLit "inlineSpecNoPhase") inlineSpecNoPhaseIdKey
1993 inlineSpecPhaseName   = libFun (fsLit "inlineSpecPhase")   inlineSpecPhaseIdKey
1994
1995 -- data FunDep = ...
1996 funDepName :: Name
1997 funDepName     = libFun (fsLit "funDep") funDepIdKey
1998
1999 -- data FamFlavour = ...
2000 typeFamName, dataFamName :: Name
2001 typeFamName = libFun (fsLit "typeFam") typeFamIdKey
2002 dataFamName = libFun (fsLit "dataFam") dataFamIdKey
2003
2004 matchQTyConName, clauseQTyConName, expQTyConName, stmtQTyConName,
2005     decQTyConName, conQTyConName, strictTypeQTyConName,
2006     varStrictTypeQTyConName, typeQTyConName, fieldExpQTyConName,
2007     patQTyConName, fieldPatQTyConName, predQTyConName, decsQTyConName :: Name
2008 matchQTyConName         = libTc (fsLit "MatchQ")        matchQTyConKey
2009 clauseQTyConName        = libTc (fsLit "ClauseQ")       clauseQTyConKey
2010 expQTyConName           = libTc (fsLit "ExpQ")          expQTyConKey
2011 stmtQTyConName          = libTc (fsLit "StmtQ")         stmtQTyConKey
2012 decQTyConName           = libTc (fsLit "DecQ")          decQTyConKey
2013 decsQTyConName          = libTc (fsLit "DecsQ")          decsQTyConKey  -- Q [Dec]
2014 conQTyConName           = libTc (fsLit "ConQ")           conQTyConKey
2015 strictTypeQTyConName    = libTc (fsLit "StrictTypeQ")    strictTypeQTyConKey
2016 varStrictTypeQTyConName = libTc (fsLit "VarStrictTypeQ") varStrictTypeQTyConKey
2017 typeQTyConName          = libTc (fsLit "TypeQ")          typeQTyConKey
2018 fieldExpQTyConName      = libTc (fsLit "FieldExpQ")      fieldExpQTyConKey
2019 patQTyConName           = libTc (fsLit "PatQ")           patQTyConKey
2020 fieldPatQTyConName      = libTc (fsLit "FieldPatQ")      fieldPatQTyConKey
2021 predQTyConName          = libTc (fsLit "PredQ")          predQTyConKey
2022
2023 -- quasiquoting
2024 quoteExpName, quotePatName, quoteDecName, quoteTypeName :: Name
2025 quoteExpName        = qqFun (fsLit "quoteExp")  quoteExpKey
2026 quotePatName        = qqFun (fsLit "quotePat")  quotePatKey
2027 quoteDecName        = qqFun (fsLit "quoteDec")  quoteDecKey
2028 quoteTypeName       = qqFun (fsLit "quoteType") quoteTypeKey
2029
2030 -- TyConUniques available: 200-299
2031 -- Check in PrelNames if you want to change this
2032
2033 expTyConKey, matchTyConKey, clauseTyConKey, qTyConKey, expQTyConKey,
2034     decQTyConKey, patTyConKey, matchQTyConKey, clauseQTyConKey,
2035     stmtQTyConKey, conQTyConKey, typeQTyConKey, typeTyConKey, tyVarBndrTyConKey,
2036     decTyConKey, varStrictTypeQTyConKey, strictTypeQTyConKey,
2037     fieldExpTyConKey, fieldPatTyConKey, nameTyConKey, patQTyConKey,
2038     fieldPatQTyConKey, fieldExpQTyConKey, funDepTyConKey, predTyConKey,
2039     predQTyConKey, decsQTyConKey :: Unique
2040 expTyConKey             = mkPreludeTyConUnique 200
2041 matchTyConKey           = mkPreludeTyConUnique 201
2042 clauseTyConKey          = mkPreludeTyConUnique 202
2043 qTyConKey               = mkPreludeTyConUnique 203
2044 expQTyConKey            = mkPreludeTyConUnique 204
2045 decQTyConKey            = mkPreludeTyConUnique 205
2046 patTyConKey             = mkPreludeTyConUnique 206
2047 matchQTyConKey          = mkPreludeTyConUnique 207
2048 clauseQTyConKey         = mkPreludeTyConUnique 208
2049 stmtQTyConKey           = mkPreludeTyConUnique 209
2050 conQTyConKey            = mkPreludeTyConUnique 210
2051 typeQTyConKey           = mkPreludeTyConUnique 211
2052 typeTyConKey            = mkPreludeTyConUnique 212
2053 decTyConKey             = mkPreludeTyConUnique 213
2054 varStrictTypeQTyConKey  = mkPreludeTyConUnique 214
2055 strictTypeQTyConKey     = mkPreludeTyConUnique 215
2056 fieldExpTyConKey        = mkPreludeTyConUnique 216
2057 fieldPatTyConKey        = mkPreludeTyConUnique 217
2058 nameTyConKey            = mkPreludeTyConUnique 218
2059 patQTyConKey            = mkPreludeTyConUnique 219
2060 fieldPatQTyConKey       = mkPreludeTyConUnique 220
2061 fieldExpQTyConKey       = mkPreludeTyConUnique 221
2062 funDepTyConKey          = mkPreludeTyConUnique 222
2063 predTyConKey            = mkPreludeTyConUnique 223
2064 predQTyConKey           = mkPreludeTyConUnique 224
2065 tyVarBndrTyConKey       = mkPreludeTyConUnique 225
2066 decsQTyConKey           = mkPreludeTyConUnique 226
2067
2068 -- IdUniques available: 200-399
2069 -- If you want to change this, make sure you check in PrelNames
2070
2071 returnQIdKey, bindQIdKey, sequenceQIdKey, liftIdKey, newNameIdKey,
2072     mkNameIdKey, mkNameG_vIdKey, mkNameG_dIdKey, mkNameG_tcIdKey,
2073     mkNameLIdKey :: Unique
2074 returnQIdKey        = mkPreludeMiscIdUnique 200
2075 bindQIdKey          = mkPreludeMiscIdUnique 201
2076 sequenceQIdKey      = mkPreludeMiscIdUnique 202
2077 liftIdKey           = mkPreludeMiscIdUnique 203
2078 newNameIdKey         = mkPreludeMiscIdUnique 204
2079 mkNameIdKey          = mkPreludeMiscIdUnique 205
2080 mkNameG_vIdKey       = mkPreludeMiscIdUnique 206
2081 mkNameG_dIdKey       = mkPreludeMiscIdUnique 207
2082 mkNameG_tcIdKey      = mkPreludeMiscIdUnique 208
2083 mkNameLIdKey         = mkPreludeMiscIdUnique 209
2084
2085
2086 -- data Lit = ...
2087 charLIdKey, stringLIdKey, integerLIdKey, intPrimLIdKey, wordPrimLIdKey,
2088     floatPrimLIdKey, doublePrimLIdKey, rationalLIdKey :: Unique
2089 charLIdKey        = mkPreludeMiscIdUnique 220
2090 stringLIdKey      = mkPreludeMiscIdUnique 221
2091 integerLIdKey     = mkPreludeMiscIdUnique 222
2092 intPrimLIdKey     = mkPreludeMiscIdUnique 223
2093 wordPrimLIdKey    = mkPreludeMiscIdUnique 224
2094 floatPrimLIdKey   = mkPreludeMiscIdUnique 225
2095 doublePrimLIdKey  = mkPreludeMiscIdUnique 226
2096 rationalLIdKey    = mkPreludeMiscIdUnique 227
2097
2098 liftStringIdKey :: Unique
2099 liftStringIdKey     = mkPreludeMiscIdUnique 228
2100
2101 -- data Pat = ...
2102 litPIdKey, varPIdKey, tupPIdKey, unboxedTupPIdKey, conPIdKey, infixPIdKey, tildePIdKey, bangPIdKey,
2103     asPIdKey, wildPIdKey, recPIdKey, listPIdKey, sigPIdKey, viewPIdKey :: Unique
2104 litPIdKey         = mkPreludeMiscIdUnique 240
2105 varPIdKey         = mkPreludeMiscIdUnique 241
2106 tupPIdKey         = mkPreludeMiscIdUnique 242
2107 unboxedTupPIdKey  = mkPreludeMiscIdUnique 243
2108 conPIdKey         = mkPreludeMiscIdUnique 244
2109 infixPIdKey       = mkPreludeMiscIdUnique 245
2110 tildePIdKey       = mkPreludeMiscIdUnique 246
2111 bangPIdKey        = mkPreludeMiscIdUnique 247
2112 asPIdKey          = mkPreludeMiscIdUnique 248
2113 wildPIdKey        = mkPreludeMiscIdUnique 249
2114 recPIdKey         = mkPreludeMiscIdUnique 250
2115 listPIdKey        = mkPreludeMiscIdUnique 251
2116 sigPIdKey         = mkPreludeMiscIdUnique 252
2117 viewPIdKey        = mkPreludeMiscIdUnique 253
2118
2119 -- type FieldPat = ...
2120 fieldPatIdKey :: Unique
2121 fieldPatIdKey       = mkPreludeMiscIdUnique 260
2122
2123 -- data Match = ...
2124 matchIdKey :: Unique
2125 matchIdKey          = mkPreludeMiscIdUnique 261
2126
2127 -- data Clause = ...
2128 clauseIdKey :: Unique
2129 clauseIdKey         = mkPreludeMiscIdUnique 262
2130
2131
2132 -- data Exp = ...
2133 varEIdKey, conEIdKey, litEIdKey, appEIdKey, infixEIdKey, infixAppIdKey,
2134     sectionLIdKey, sectionRIdKey, lamEIdKey, tupEIdKey, unboxedTupEIdKey,
2135     condEIdKey,
2136     letEIdKey, caseEIdKey, doEIdKey, compEIdKey,
2137     fromEIdKey, fromThenEIdKey, fromToEIdKey, fromThenToEIdKey,
2138     listEIdKey, sigEIdKey, recConEIdKey, recUpdEIdKey :: Unique
2139 varEIdKey         = mkPreludeMiscIdUnique 270
2140 conEIdKey         = mkPreludeMiscIdUnique 271
2141 litEIdKey         = mkPreludeMiscIdUnique 272
2142 appEIdKey         = mkPreludeMiscIdUnique 273
2143 infixEIdKey       = mkPreludeMiscIdUnique 274
2144 infixAppIdKey     = mkPreludeMiscIdUnique 275
2145 sectionLIdKey     = mkPreludeMiscIdUnique 276
2146 sectionRIdKey     = mkPreludeMiscIdUnique 277
2147 lamEIdKey         = mkPreludeMiscIdUnique 278
2148 tupEIdKey         = mkPreludeMiscIdUnique 279
2149 unboxedTupEIdKey  = mkPreludeMiscIdUnique 280
2150 condEIdKey        = mkPreludeMiscIdUnique 281
2151 letEIdKey         = mkPreludeMiscIdUnique 282
2152 caseEIdKey        = mkPreludeMiscIdUnique 283
2153 doEIdKey          = mkPreludeMiscIdUnique 284
2154 compEIdKey        = mkPreludeMiscIdUnique 285
2155 fromEIdKey        = mkPreludeMiscIdUnique 286
2156 fromThenEIdKey    = mkPreludeMiscIdUnique 287
2157 fromToEIdKey      = mkPreludeMiscIdUnique 288
2158 fromThenToEIdKey  = mkPreludeMiscIdUnique 289
2159 listEIdKey        = mkPreludeMiscIdUnique 290
2160 sigEIdKey         = mkPreludeMiscIdUnique 291
2161 recConEIdKey      = mkPreludeMiscIdUnique 292
2162 recUpdEIdKey      = mkPreludeMiscIdUnique 293
2163
2164 -- type FieldExp = ...
2165 fieldExpIdKey :: Unique
2166 fieldExpIdKey       = mkPreludeMiscIdUnique 310
2167
2168 -- data Body = ...
2169 guardedBIdKey, normalBIdKey :: Unique
2170 guardedBIdKey     = mkPreludeMiscIdUnique 311
2171 normalBIdKey      = mkPreludeMiscIdUnique 312
2172
2173 -- data Guard = ...
2174 normalGEIdKey, patGEIdKey :: Unique
2175 normalGEIdKey     = mkPreludeMiscIdUnique 313
2176 patGEIdKey        = mkPreludeMiscIdUnique 314
2177
2178 -- data Stmt = ...
2179 bindSIdKey, letSIdKey, noBindSIdKey, parSIdKey :: Unique
2180 bindSIdKey       = mkPreludeMiscIdUnique 320
2181 letSIdKey        = mkPreludeMiscIdUnique 321
2182 noBindSIdKey     = mkPreludeMiscIdUnique 322
2183 parSIdKey        = mkPreludeMiscIdUnique 323
2184
2185 -- data Dec = ...
2186 funDIdKey, valDIdKey, dataDIdKey, newtypeDIdKey, tySynDIdKey,
2187     classDIdKey, instanceDIdKey, sigDIdKey, forImpDIdKey, pragInlDIdKey,
2188     pragSpecDIdKey, pragSpecInlDIdKey, familyNoKindDIdKey, familyKindDIdKey,
2189     dataInstDIdKey, newtypeInstDIdKey, tySynInstDIdKey :: Unique 
2190 funDIdKey          = mkPreludeMiscIdUnique 330
2191 valDIdKey          = mkPreludeMiscIdUnique 331
2192 dataDIdKey         = mkPreludeMiscIdUnique 332
2193 newtypeDIdKey      = mkPreludeMiscIdUnique 333
2194 tySynDIdKey        = mkPreludeMiscIdUnique 334
2195 classDIdKey        = mkPreludeMiscIdUnique 335
2196 instanceDIdKey     = mkPreludeMiscIdUnique 336
2197 sigDIdKey          = mkPreludeMiscIdUnique 337
2198 forImpDIdKey       = mkPreludeMiscIdUnique 338
2199 pragInlDIdKey      = mkPreludeMiscIdUnique 339
2200 pragSpecDIdKey     = mkPreludeMiscIdUnique 340
2201 pragSpecInlDIdKey  = mkPreludeMiscIdUnique 341
2202 familyNoKindDIdKey = mkPreludeMiscIdUnique 342
2203 familyKindDIdKey   = mkPreludeMiscIdUnique 343
2204 dataInstDIdKey     = mkPreludeMiscIdUnique 344
2205 newtypeInstDIdKey  = mkPreludeMiscIdUnique 345
2206 tySynInstDIdKey    = mkPreludeMiscIdUnique 346
2207
2208 -- type Cxt = ...
2209 cxtIdKey :: Unique
2210 cxtIdKey            = mkPreludeMiscIdUnique 360
2211
2212 -- data Pred = ...
2213 classPIdKey, equalPIdKey :: Unique
2214 classPIdKey         = mkPreludeMiscIdUnique 361
2215 equalPIdKey         = mkPreludeMiscIdUnique 362
2216
2217 -- data Strict = ...
2218 isStrictKey, notStrictKey :: Unique
2219 isStrictKey         = mkPreludeMiscIdUnique 363
2220 notStrictKey        = mkPreludeMiscIdUnique 364
2221
2222 -- data Con = ...
2223 normalCIdKey, recCIdKey, infixCIdKey, forallCIdKey :: Unique
2224 normalCIdKey      = mkPreludeMiscIdUnique 370
2225 recCIdKey         = mkPreludeMiscIdUnique 371
2226 infixCIdKey       = mkPreludeMiscIdUnique 372
2227 forallCIdKey      = mkPreludeMiscIdUnique 373
2228
2229 -- type StrictType = ...
2230 strictTKey :: Unique
2231 strictTKey        = mkPreludeMiscIdUnique 374
2232
2233 -- type VarStrictType = ...
2234 varStrictTKey :: Unique
2235 varStrictTKey     = mkPreludeMiscIdUnique 375
2236
2237 -- data Type = ...
2238 forallTIdKey, varTIdKey, conTIdKey, tupleTIdKey, unboxedTupleTIdKey, arrowTIdKey,
2239     listTIdKey, appTIdKey, sigTIdKey :: Unique
2240 forallTIdKey       = mkPreludeMiscIdUnique 380
2241 varTIdKey          = mkPreludeMiscIdUnique 381
2242 conTIdKey          = mkPreludeMiscIdUnique 382
2243 tupleTIdKey        = mkPreludeMiscIdUnique 383
2244 unboxedTupleTIdKey = mkPreludeMiscIdUnique 384
2245 arrowTIdKey        = mkPreludeMiscIdUnique 385
2246 listTIdKey         = mkPreludeMiscIdUnique 386
2247 appTIdKey          = mkPreludeMiscIdUnique 387
2248 sigTIdKey          = mkPreludeMiscIdUnique 388
2249
2250 -- data TyVarBndr = ...
2251 plainTVIdKey, kindedTVIdKey :: Unique
2252 plainTVIdKey      = mkPreludeMiscIdUnique 390
2253 kindedTVIdKey     = mkPreludeMiscIdUnique 391
2254
2255 -- data Kind = ...
2256 starKIdKey, arrowKIdKey :: Unique
2257 starKIdKey        = mkPreludeMiscIdUnique 392
2258 arrowKIdKey       = mkPreludeMiscIdUnique 393
2259
2260 -- data Callconv = ...
2261 cCallIdKey, stdCallIdKey :: Unique
2262 cCallIdKey      = mkPreludeMiscIdUnique 394
2263 stdCallIdKey    = mkPreludeMiscIdUnique 395
2264
2265 -- data Safety = ...
2266 unsafeIdKey, safeIdKey, threadsafeIdKey, interruptibleIdKey :: Unique
2267 unsafeIdKey        = mkPreludeMiscIdUnique 400
2268 safeIdKey          = mkPreludeMiscIdUnique 401
2269 threadsafeIdKey    = mkPreludeMiscIdUnique 402
2270 interruptibleIdKey = mkPreludeMiscIdUnique 403
2271
2272 -- data InlineSpec =
2273 inlineSpecNoPhaseIdKey, inlineSpecPhaseIdKey :: Unique
2274 inlineSpecNoPhaseIdKey = mkPreludeMiscIdUnique 404
2275 inlineSpecPhaseIdKey   = mkPreludeMiscIdUnique 405
2276
2277 -- data FunDep = ...
2278 funDepIdKey :: Unique
2279 funDepIdKey = mkPreludeMiscIdUnique 406
2280
2281 -- data FamFlavour = ...
2282 typeFamIdKey, dataFamIdKey :: Unique
2283 typeFamIdKey = mkPreludeMiscIdUnique 407
2284 dataFamIdKey = mkPreludeMiscIdUnique 408
2285
2286 -- quasiquoting
2287 quoteExpKey, quotePatKey, quoteDecKey, quoteTypeKey :: Unique
2288 quoteExpKey  = mkPreludeMiscIdUnique 410
2289 quotePatKey  = mkPreludeMiscIdUnique 411
2290 quoteDecKey  = mkPreludeMiscIdUnique 412
2291 quoteTypeKey = mkPreludeMiscIdUnique 413