d114efb3aae5a003570bef0f1327abf78f56c1e5
[ghc-hetmet.git] / compiler / typecheck / TcSplice.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5
6 TcSplice: Template Haskell splices
7
8
9 \begin{code}
10 {-# OPTIONS -fno-warn-unused-imports -fno-warn-unused-binds #-}
11 -- The above warning supression flag is a temporary kludge.
12 -- While working on this module you are encouraged to remove it and fix
13 -- any warnings in the module. See
14 --     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
15 -- for details
16
17 module TcSplice( kcSpliceType, tcSpliceExpr, tcSpliceDecls, tcBracket,
18                  lookupThName_maybe,
19                  runQuasiQuoteExpr, runQuasiQuotePat, 
20                  runQuasiQuoteDecl, runQuasiQuoteType,
21                  runAnnotation ) where
22
23 #include "HsVersions.h"
24
25 import HscMain
26 import TcRnDriver
27         -- These imports are the reason that TcSplice 
28         -- is very high up the module hierarchy
29
30 import HsSyn
31 import Convert
32 import RnExpr
33 import RnEnv
34 import RdrName
35 import RnTypes
36 import TcPat
37 import TcExpr
38 import TcHsSyn
39 import TcSimplify
40 import TcUnify
41 import TcType
42 import TcEnv
43 import TcMType
44 import TcHsType
45 import TcIface
46 import TypeRep
47 import Name
48 import NameEnv
49 import NameSet
50 import PrelNames
51 import HscTypes
52 import OccName
53 import Var
54 import Module
55 import Annotations
56 import TcRnMonad
57 import Class
58 import Inst
59 import TyCon
60 import DataCon
61 import Id
62 import IdInfo
63 import TysWiredIn
64 import DsMeta
65 import DsExpr
66 import DsMonad hiding (Splice)
67 import Serialized
68 import ErrUtils
69 import SrcLoc
70 import Outputable
71 import Unique
72 import Data.Maybe
73 import BasicTypes
74 import Panic
75 import FastString
76 import Exception
77 import Control.Monad    ( when )
78
79 import qualified Language.Haskell.TH as TH
80 -- THSyntax gives access to internal functions and data types
81 import qualified Language.Haskell.TH.Syntax as TH
82
83 #ifdef GHCI
84 -- Because GHC.Desugar might not be in the base library of the bootstrapping compiler
85 import GHC.Desugar      ( AnnotationWrapper(..) )
86 #endif
87
88 import GHC.Exts         ( unsafeCoerce#, Int#, Int(..) )
89 import System.IO.Error
90 \end{code}
91
92 Note [How top-level splices are handled]
93 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
94 Top-level splices (those not inside a [| .. |] quotation bracket) are handled
95 very straightforwardly:
96
97   1. tcTopSpliceExpr: typecheck the body e of the splice $(e)
98
99   2. runMetaT: desugar, compile, run it, and convert result back to
100      HsSyn RdrName (of the appropriate flavour, eg HsType RdrName,
101      HsExpr RdrName etc)
102
103   3. treat the result as if that's what you saw in the first place
104      e.g for HsType, rename and kind-check
105          for HsExpr, rename and type-check
106
107      (The last step is different for decls, becuase they can *only* be 
108       top-level: we return the result of step 2.)
109
110 Note [How brackets and nested splices are handled]
111 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
112 Nested splices (those inside a [| .. |] quotation bracket), are treated
113 quite differently. 
114
115   * After typechecking, the bracket [| |] carries
116
117      a) A mutable list of PendingSplice
118           type PendingSplice = (Name, LHsExpr Id)
119
120      b) The quoted expression e, *renamed*: (HsExpr Name)
121           The expression e has been typechecked, but the result of
122           that typechecking is discarded.  
123
124   * The brakcet is desugared by DsMeta.dsBracket.  It 
125
126       a) Extends the ds_meta environment with the PendingSplices
127          attached to the bracket
128
129       b) Converts the quoted (HsExpr Name) to a CoreExpr that, when
130          run, will produce a suitable TH expression/type/decl.  This
131          is why we leave the *renamed* expression attached to the bracket:
132          the quoted expression should not be decorated with all the goop
133          added by the type checker
134
135   * Each splice carries a unique Name, called a "splice point", thus
136     ${n}(e).  The name is initialised to an (Unqual "splice") when the
137     splice is created; the renamer gives it a unique.
138
139   * When the type checker type-checks a nested splice ${n}(e), it 
140         - typechecks e
141         - adds the typechecked expression (of type (HsExpr Id))
142           as a pending splice to the enclosing bracket
143         - returns something non-committal
144     Eg for [| f ${n}(g x) |], the typechecker 
145         - attaches the typechecked term (g x) to the pending splices for n
146           in the outer bracket
147         - returns a non-committal type \alpha.
148         Remember that the bracket discards the typechecked term altogether
149
150   * When DsMeta (used to desugar the body of the bracket) comes across
151     a splice, it looks up the splice's Name, n, in the ds_meta envt,
152     to find an (HsExpr Id) that should be substituted for the splice;
153     it just desugars it to get a CoreExpr (DsMeta.repSplice).
154
155 Example: 
156     Source:       f = [| Just $(g 3) |]
157       The [| |] part is a HsBracket
158
159     Typechecked:  f = [| Just ${s7}(g 3) |]{s7 = g Int 3}
160       The [| |] part is a HsBracketOut, containing *renamed* 
161         (not typechecked) expression
162       The "s7" is the "splice point"; the (g Int 3) part 
163         is a typechecked expression
164
165     Desugared:    f = do { s7 <- g Int 3
166                          ; return (ConE "Data.Maybe.Just" s7) }
167
168
169 Note [Template Haskell state diagram]
170 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
171 Here are the ThStages, s, their corresponding level numbers
172 (the result of (thLevel s)), and their state transitions.  
173
174       -----------     $      ------------   $
175       |  Comp   | ---------> |  Splice  | -----|
176       |   1     |            |    0     | <----|
177       -----------            ------------
178         ^     |                ^      |
179       $ |     | [||]         $ |      | [||]
180         |     v                |      v
181    --------------          ----------------
182    | Brack Comp |          | Brack Splice |
183    |     2      |          |      1       |
184    --------------          ----------------
185
186 * Normal top-level declarations start in state Comp 
187        (which has level 1).
188   Annotations start in state Splice, since they are
189        treated very like a splice (only without a '$')
190
191 * Code compiled in state Splice (and only such code) 
192   will be *run at compile time*, with the result replacing
193   the splice
194
195 * The original paper used level -1 instead of 0, etc.
196
197 * The original paper did not allow a splice within a 
198   splice, but there is no reason not to. This is the 
199   $ transition in the top right.
200
201 Note [Template Haskell levels]
202 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
203 * Imported things are impLevel (= 0)
204
205 * In GHCi, variables bound by a previous command are treated
206   as impLevel, because we have bytecode for them.
207
208 * Variables are bound at the "current level"
209
210 * The current level starts off at outerLevel (= 1)
211
212 * The level is decremented by splicing $(..)
213                incremented by brackets [| |]
214                incremented by name-quoting 'f
215
216 When a variable is used, we compare 
217         bind:  binding level, and
218         use:   current level at usage site
219
220   Generally
221         bind > use      Always error (bound later than used)
222                         [| \x -> $(f x) |]
223                         
224         bind = use      Always OK (bound same stage as used)
225                         [| \x -> $(f [| x |]) |]
226
227         bind < use      Inside brackets, it depends
228                         Inside splice, OK
229                         Inside neither, OK
230
231   For (bind < use) inside brackets, there are three cases:
232     - Imported things   OK      f = [| map |]
233     - Top-level things  OK      g = [| f |]
234     - Non-top-level     Only if there is a liftable instance
235                                 h = \(x:Int) -> [| x |]
236
237 See Note [What is a top-level Id?]
238
239 Note [Quoting names]
240 ~~~~~~~~~~~~~~~~~~~~
241 A quoted name 'n is a bit like a quoted expression [| n |], except that we 
242 have no cross-stage lifting (c.f. TcExpr.thBrackId).  So, after incrementing
243 the use-level to account for the brackets, the cases are:
244
245         bind > use                      Error
246         bind = use                      OK
247         bind < use      
248                 Imported things         OK
249                 Top-level things        OK
250                 Non-top-level           Error
251
252 See Note [What is a top-level Id?] in TcEnv.  Examples:
253
254   f 'map        -- OK; also for top-level defns of this module
255
256   \x. f 'x      -- Not ok (whereas \x. f [| x |] might have been ok, by
257                 --                               cross-stage lifting
258
259   \y. [| \x. $(f 'y) |] -- Not ok (same reason)
260
261   [| \x. $(f 'x) |]     -- OK
262
263
264 Note [What is a top-level Id?]
265 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
266 In the level-control criteria above, we need to know what a "top level Id" is.
267 There are three kinds:
268   * Imported from another module                (GlobalId, ExternalName)
269   * Bound at the top level of this module       (ExternalName)
270   * In GHCi, bound by a previous stmt           (GlobalId)
271 It's strange that there is no one criterion tht picks out all three, but that's
272 how it is right now.  (The obvious thing is to give an ExternalName to GHCi Ids 
273 bound in an earlier Stmt, but what module would you choose?  See 
274 Note [Interactively-bound Ids in GHCi] in TcRnDriver.)
275
276 The predicate we use is TcEnv.thTopLevelId.
277
278
279 %************************************************************************
280 %*                                                                      *
281 \subsection{Main interface + stubs for the non-GHCI case
282 %*                                                                      *
283 %************************************************************************
284
285 \begin{code}
286 tcBracket     :: HsBracket Name -> BoxyRhoType -> TcM (LHsExpr TcId)
287 tcSpliceDecls :: LHsExpr Name -> TcM [LHsDecl RdrName]
288 tcSpliceExpr  :: HsSplice Name -> BoxyRhoType -> TcM (HsExpr TcId)
289 kcSpliceType  :: HsSplice Name -> FreeVars -> TcM (HsType Name, TcKind)
290         -- None of these functions add constraints to the LIE
291
292 lookupThName_maybe :: TH.Name -> TcM (Maybe Name)
293
294 runQuasiQuoteExpr :: HsQuasiQuote RdrName -> RnM (LHsExpr RdrName)
295 runQuasiQuotePat  :: HsQuasiQuote RdrName -> RnM (LPat RdrName)
296 runQuasiQuoteType :: HsQuasiQuote RdrName -> RnM (LHsType RdrName)
297 runQuasiQuoteDecl :: HsQuasiQuote RdrName -> RnM [LHsDecl RdrName]
298
299 runAnnotation     :: CoreAnnTarget -> LHsExpr Name -> TcM Annotation
300
301 #ifndef GHCI
302 tcBracket     x _ = pprPanic "Cant do tcBracket without GHCi"     (ppr x)
303 tcSpliceExpr  e   = pprPanic "Cant do tcSpliceExpr without GHCi"  (ppr e)
304 tcSpliceDecls x   = pprPanic "Cant do tcSpliceDecls without GHCi" (ppr x)
305 kcSpliceType  x fvs = pprPanic "Cant do kcSpliceType without GHCi"  (ppr x)
306
307 lookupThName_maybe n = pprPanic "Cant do lookupThName_maybe without GHCi" (ppr n)
308
309 runQuasiQuoteExpr q = pprPanic "Cant do runQuasiQuoteExpr without GHCi" (ppr q)
310 runQuasiQuotePat  q = pprPanic "Cant do runQuasiQuotePat without GHCi" (ppr q)
311 runQuasiQuoteType q = pprPanic "Cant do runQuasiQuoteType without GHCi" (ppr q)
312 runQuasiQuoteDecl q = pprPanic "Cant do runQuasiQuoteDecl without GHCi" (ppr q)
313 runAnnotation   _ q = pprPanic "Cant do runAnnotation without GHCi" (ppr q)
314 #else
315 \end{code}
316
317 %************************************************************************
318 %*                                                                      *
319 \subsection{Quoting an expression}
320 %*                                                                      *
321 %************************************************************************
322
323
324 \begin{code}
325 -- See Note [How brackets and nested splices are handled]
326 tcBracket brack res_ty 
327   = addErrCtxt (hang (ptext (sLit "In the Template Haskell quotation"))
328                    2 (ppr brack)) $
329     do {        -- Check for nested brackets
330          cur_stage <- getStage
331        ; checkTc (not (isBrackStage cur_stage)) illegalBracket 
332
333         -- Brackets are desugared to code that mentions the TH package
334        ; recordThUse
335
336         -- Typecheck expr to make sure it is valid,
337         -- but throw away the results.  We'll type check
338         -- it again when we actually use it.
339        ; pending_splices <- newMutVar []
340        ; lie_var <- getLIEVar
341
342        ; (meta_ty, lie) <- setStage (Brack cur_stage pending_splices lie_var)
343                                     (getLIE (tc_bracket cur_stage brack))
344        ; tcSimplifyBracket lie
345
346         -- Make the expected type have the right shape
347        ; _ <- boxyUnify meta_ty res_ty
348
349         -- Return the original expression, not the type-decorated one
350        ; pendings <- readMutVar pending_splices
351        ; return (noLoc (HsBracketOut brack pendings)) }
352
353 tc_bracket :: ThStage -> HsBracket Name -> TcM TcType
354 tc_bracket outer_stage (VarBr name)     -- Note [Quoting names]
355   = do  { thing <- tcLookup name
356         ; case thing of
357             AGlobal _ -> return ()
358             ATcId { tct_level = bind_lvl, tct_id = id }
359                 | thTopLevelId id       -- C.f TcExpr.checkCrossStageLifting
360                 -> keepAliveTc id               
361                 | otherwise
362                 -> do { checkTc (thLevel outer_stage + 1 == bind_lvl)
363                                 (quotedNameStageErr name) }
364             _ -> pprPanic "th_bracket" (ppr name)
365
366         ; tcMetaTy nameTyConName        -- Result type is Var (not Q-monadic)
367         }
368
369 tc_bracket _ (ExpBr expr) 
370   = do  { any_ty <- newFlexiTyVarTy liftedTypeKind
371         ; _ <- tcMonoExprNC expr any_ty  -- NC for no context; tcBracket does that
372         ; tcMetaTy expQTyConName }
373         -- Result type is ExpQ (= Q Exp)
374
375 tc_bracket _ (TypBr typ) 
376   = do  { _ <- tcHsSigTypeNC ThBrackCtxt typ
377         ; tcMetaTy typeQTyConName }
378         -- Result type is Type (= Q Typ)
379
380 tc_bracket _ (DecBrG decls)
381   = do  { _ <- tcTopSrcDecls emptyModDetails decls
382                -- Typecheck the declarations, dicarding the result
383                -- We'll get all that stuff later, when we splice it in
384         ; tcMetaTy decsQTyConName } -- Result type is Q [Dec]
385
386 tc_bracket _ (PatBr pat)
387   = do  { any_ty <- newFlexiTyVarTy liftedTypeKind
388         ; _ <- tcPat ThPatQuote pat any_ty unitTy $ \_ ->
389                return ()
390         ; tcMetaTy patQTyConName }
391         -- Result type is PatQ (= Q Pat)
392
393 tc_bracket _ (DecBrL _)
394   = panic "tc_bracket: Unexpected DecBrL"
395
396 quotedNameStageErr :: Name -> SDoc
397 quotedNameStageErr v 
398   = sep [ ptext (sLit "Stage error: the non-top-level quoted name") <+> ppr (VarBr v)
399         , ptext (sLit "must be used at the same stage at which is is bound")]
400 \end{code}
401
402
403 %************************************************************************
404 %*                                                                      *
405 \subsection{Splicing an expression}
406 %*                                                                      *
407 %************************************************************************
408
409 \begin{code}
410 tcSpliceExpr (HsSplice name expr) res_ty
411   = setSrcSpan (getLoc expr)    $ do
412     { stage <- getStage
413     ; case stage of {
414         Splice -> tcTopSplice expr res_ty ;
415         Comp   -> tcTopSplice expr res_ty ;
416
417         Brack pop_stage ps_var lie_var -> do
418
419         -- See Note [How brackets and nested splices are handled]
420         -- A splice inside brackets
421         -- NB: ignore res_ty, apart from zapping it to a mono-type
422         -- e.g.   [| reverse $(h 4) |]
423         -- Here (h 4) :: Q Exp
424         -- but $(h 4) :: forall a.a     i.e. anything!
425
426      { _ <- unBox res_ty
427      ; meta_exp_ty <- tcMetaTy expQTyConName
428      ; expr' <- setStage pop_stage $
429                 setLIEVar lie_var    $
430                 tcMonoExpr expr meta_exp_ty
431
432         -- Write the pending splice into the bucket
433      ; ps <- readMutVar ps_var
434      ; writeMutVar ps_var ((name,expr') : ps)
435
436      ; return (panic "tcSpliceExpr")    -- The returned expression is ignored
437      }}}
438
439 tcTopSplice :: LHsExpr Name -> BoxyRhoType -> TcM (HsExpr Id)
440 -- Note [How top-level splices are handled]
441 tcTopSplice expr res_ty
442   = do { meta_exp_ty <- tcMetaTy expQTyConName
443
444         -- Typecheck the expression
445        ; zonked_q_expr <- tcTopSpliceExpr (tcMonoExpr expr meta_exp_ty)
446
447         -- Run the expression
448        ; expr2 <- runMetaE zonked_q_expr
449        ; showSplice "expression" expr (ppr expr2)
450
451         -- Rename it, but bale out if there are errors
452         -- otherwise the type checker just gives more spurious errors
453        ; addErrCtxt (spliceResultDoc expr) $ do 
454        { (exp3, _fvs) <- checkNoErrs (rnLExpr expr2)
455
456        ; exp4 <- tcMonoExpr exp3 res_ty 
457        ; return (unLoc exp4) } }
458
459 spliceResultDoc :: LHsExpr Name -> SDoc
460 spliceResultDoc expr
461   = sep [ ptext (sLit "In the result of the splice:")
462         , nest 2 (char '$' <> pprParendExpr expr)
463         , ptext (sLit "To see what the splice expanded to, use -ddump-splices")]
464
465 -------------------
466 tcTopSpliceExpr :: TcM (LHsExpr Id) -> TcM (LHsExpr Id)
467 -- Note [How top-level splices are handled]
468 -- Type check an expression that is the body of a top-level splice
469 --   (the caller will compile and run it)
470 -- Note that set the level to Splice, regardless of the original level,
471 -- before typechecking the expression.  For example:
472 --      f x = $( ...$(g 3) ... )
473 -- The recursive call to tcMonoExpr will simply expand the 
474 -- inner escape before dealing with the outer one
475
476 tcTopSpliceExpr tc_action
477   = checkNoErrs $  -- checkNoErrs: must not try to run the thing
478                    -- if the type checker fails!
479     setStage Splice $ 
480     do {    -- Typecheck the expression
481          (expr', lie) <- getLIE tc_action
482         
483         -- Solve the constraints
484         ; const_binds <- tcSimplifyTop lie
485         
486           -- Zonk it and tie the knot of dictionary bindings
487        ; zonkTopLExpr (mkHsDictLet const_binds expr') }
488 \end{code}
489
490
491 %************************************************************************
492 %*                                                                      *
493                 Splicing a type
494 %*                                                                      *
495 %************************************************************************
496
497 Very like splicing an expression, but we don't yet share code.
498
499 \begin{code}
500 kcSpliceType splice@(HsSplice name hs_expr) fvs
501   = setSrcSpan (getLoc hs_expr) $ do    
502     { stage <- getStage
503     ; case stage of {
504         Splice -> kcTopSpliceType hs_expr ;
505         Comp   -> kcTopSpliceType hs_expr ;
506
507         Brack pop_level ps_var lie_var -> do
508            -- See Note [How brackets and nested splices are handled]
509            -- A splice inside brackets
510     { meta_ty <- tcMetaTy typeQTyConName
511     ; expr' <- setStage pop_level $
512                setLIEVar lie_var $
513                tcMonoExpr hs_expr meta_ty
514
515         -- Write the pending splice into the bucket
516     ; ps <- readMutVar ps_var
517     ; writeMutVar ps_var ((name,expr') : ps)
518
519     -- e.g.   [| f (g :: Int -> $(h 4)) |]
520     -- Here (h 4) :: Q Type
521     -- but $(h 4) :: a  i.e. any type, of any kind
522
523     ; kind <- newKindVar
524     ; return (HsSpliceTy splice fvs kind, kind) 
525     }}}
526
527 kcTopSpliceType :: LHsExpr Name -> TcM (HsType Name, TcKind)
528 -- Note [How top-level splices are handled]
529 kcTopSpliceType expr
530   = do  { meta_ty <- tcMetaTy typeQTyConName
531
532         -- Typecheck the expression
533         ; zonked_q_expr <- tcTopSpliceExpr (tcMonoExpr expr meta_ty)
534
535         -- Run the expression
536         ; hs_ty2 <- runMetaT zonked_q_expr
537         ; showSplice "type" expr (ppr hs_ty2)
538   
539         -- Rename it, but bale out if there are errors
540         -- otherwise the type checker just gives more spurious errors
541         ; addErrCtxt (spliceResultDoc expr) $ do 
542         { let doc = ptext (sLit "In the spliced type") <+> ppr hs_ty2
543         ; hs_ty3 <- checkNoErrs (rnLHsType doc hs_ty2)
544         ; (ty4, kind) <- kcLHsType hs_ty3
545         ; return (unLoc ty4, kind) }}
546 \end{code}
547
548 %************************************************************************
549 %*                                                                      *
550 \subsection{Splicing an expression}
551 %*                                                                      *
552 %************************************************************************
553
554 \begin{code}
555 -- Note [How top-level splices are handled]
556 -- Always at top level
557 -- Type sig at top of file:
558 --      tcSpliceDecls :: LHsExpr Name -> TcM [LHsDecl RdrName]
559 tcSpliceDecls expr
560   = do  { list_q <- tcMetaTy decsQTyConName     -- Q [Dec]
561         ; zonked_q_expr <- tcTopSpliceExpr (tcMonoExpr expr list_q)
562
563                 -- Run the expression
564         ; decls <- runMetaD zonked_q_expr
565         ; showSplice "declarations" expr 
566                      (ppr (getLoc expr) $$ (vcat (map ppr decls)))
567
568         ; return decls }
569 \end{code}
570
571
572 %************************************************************************
573 %*                                                                      *
574         Annotations
575 %*                                                                      *
576 %************************************************************************
577
578 \begin{code}
579 runAnnotation target expr = do
580     -- Find the classes we want instances for in order to call toAnnotationWrapper
581     loc <- getSrcSpanM
582     data_class <- tcLookupClass dataClassName
583     to_annotation_wrapper_id <- tcLookupId toAnnotationWrapperName
584     
585     -- Check the instances we require live in another module (we want to execute it..)
586     -- and check identifiers live in other modules using TH stage checks. tcSimplifyStagedExpr
587     -- also resolves the LIE constraints to detect e.g. instance ambiguity
588     zonked_wrapped_expr' <- tcTopSpliceExpr $ 
589            do { (expr', expr_ty) <- tcInferRhoNC expr
590                 -- We manually wrap the typechecked expression in a call to toAnnotationWrapper
591                 -- By instantiating the call >here< it gets registered in the 
592                 -- LIE consulted by tcTopSpliceExpr
593                 -- and hence ensures the appropriate dictionary is bound by const_binds
594               ; wrapper <- instCall AnnOrigin [expr_ty] [mkClassPred data_class [expr_ty]]
595               ; let specialised_to_annotation_wrapper_expr  
596                       = L loc (HsWrap wrapper (HsVar to_annotation_wrapper_id))
597               ; return (L loc (HsApp specialised_to_annotation_wrapper_expr expr')) }
598
599     -- Run the appropriately wrapped expression to get the value of
600     -- the annotation and its dictionaries. The return value is of
601     -- type AnnotationWrapper by construction, so this conversion is
602     -- safe
603     flip runMetaAW zonked_wrapped_expr' $ \annotation_wrapper ->
604         case annotation_wrapper of
605             AnnotationWrapper value | let serialized = toSerialized serializeWithData value ->
606                 -- Got the value and dictionaries: build the serialized value and 
607                 -- call it a day. We ensure that we seq the entire serialized value 
608                 -- in order that any errors in the user-written code for the
609                 -- annotation are exposed at this point.  This is also why we are 
610                 -- doing all this stuff inside the context of runMeta: it has the 
611                 -- facilities to deal with user error in a meta-level expression
612                 seqSerialized serialized `seq` Annotation { 
613                     ann_target = target,
614                     ann_value = serialized
615                 }
616 \end{code}
617
618
619 %************************************************************************
620 %*                                                                      *
621         Quasi-quoting
622 %*                                                                      *
623 %************************************************************************
624
625 Note [Quasi-quote overview]
626 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
627 The GHC "quasi-quote" extension is described by Geoff Mainland's paper
628 "Why it's nice to be quoted: quasiquoting for Haskell" (Haskell
629 Workshop 2007).
630
631 Briefly, one writes
632         [p| stuff |]
633 and the arbitrary string "stuff" gets parsed by the parser 'p', whose
634 type should be Language.Haskell.TH.Quote.QuasiQuoter.  'p' must be
635 defined in another module, because we are going to run it here.  It's
636 a bit like a TH splice:
637         $(p "stuff")
638
639 However, you can do this in patterns as well as terms.  Becuase of this,
640 the splice is run by the *renamer* rather than the type checker.
641
642 %************************************************************************
643 %*                                                                      *
644 \subsubsection{Quasiquotation}
645 %*                                                                      *
646 %************************************************************************
647
648 See Note [Quasi-quote overview] in TcSplice.
649
650 \begin{code}
651 runQuasiQuote :: Outputable hs_syn
652               => HsQuasiQuote RdrName   -- Contains term of type QuasiQuoter, and the String
653               -> Name                   -- Of type QuasiQuoter -> String -> Q th_syn
654               -> Name                   -- Name of th_syn type  
655               -> MetaOps th_syn hs_syn 
656               -> RnM hs_syn
657 runQuasiQuote (HsQuasiQuote quoter q_span quote) quote_selector meta_ty meta_ops
658   = do  { quoter' <- lookupOccRn quoter
659                 -- We use lookupOcc rather than lookupGlobalOcc because in the
660                 -- erroneous case of \x -> [x| ...|] we get a better error message
661                 -- (stage restriction rather than out of scope).
662
663         ; when (isUnboundName quoter') failM 
664                 -- If 'quoter' is not in scope, proceed no further
665                 -- The error message was generated by lookupOccRn, but it then
666                 -- succeeds with an "unbound name", which makes the subsequent 
667                 -- attempt to run the quote fail in a confusing way
668
669           -- Check that the quoter is not locally defined, otherwise the TH
670           -- machinery will not be able to run the quasiquote.
671         ; this_mod <- getModule
672         ; let is_local = nameIsLocalOrFrom this_mod quoter'
673         ; checkTc (not is_local) (quoteStageError quoter')
674
675         ; traceTc (text "runQQ" <+> ppr quoter <+> ppr is_local)
676
677           -- Build the expression 
678         ; let quoterExpr = L q_span $! HsVar $! quoter'
679         ; let quoteExpr = L q_span $! HsLit $! HsString quote
680         ; let expr = L q_span $
681                      HsApp (L q_span $
682                             HsApp (L q_span (HsVar quote_selector)) quoterExpr) quoteExpr
683         ; meta_exp_ty <- tcMetaTy meta_ty
684
685         -- Typecheck the expression
686         ; zonked_q_expr <- tcTopSpliceExpr (tcMonoExpr expr meta_exp_ty)
687
688         -- Run the expression
689         ; result <- runMetaQ meta_ops zonked_q_expr
690         ; showSplice (mt_desc meta_ops) quoteExpr (ppr result)
691
692         ; return result }
693
694 runQuasiQuoteExpr qq = runQuasiQuote qq quoteExpName  expQTyConName  exprMetaOps
695 runQuasiQuotePat  qq = runQuasiQuote qq quotePatName  patQTyConName  patMetaOps
696 runQuasiQuoteType qq = runQuasiQuote qq quoteTypeName typeQTyConName typeMetaOps
697 runQuasiQuoteDecl qq = runQuasiQuote qq quoteDecName  decsQTyConName declMetaOps
698
699 quoteStageError :: Name -> SDoc
700 quoteStageError quoter
701   = sep [ptext (sLit "GHC stage restriction:") <+> ppr quoter,
702          nest 2 (ptext (sLit "is used in a quasiquote, and must be imported, not defined locally"))]
703 \end{code}
704
705
706 %************************************************************************
707 %*                                                                      *
708 \subsection{Running an expression}
709 %*                                                                      *
710 %************************************************************************
711
712 \begin{code}
713 data MetaOps th_syn hs_syn
714   = MT { mt_desc :: String             -- Type of beast (expression, type etc)
715        , mt_show :: th_syn -> String   -- How to show the th_syn thing
716        , mt_cvt  :: SrcSpan -> th_syn -> Either Message hs_syn
717                                        -- How to convert to hs_syn
718     }
719
720 exprMetaOps :: MetaOps TH.Exp (LHsExpr RdrName)
721 exprMetaOps = MT { mt_desc = "expression", mt_show = TH.pprint, mt_cvt = convertToHsExpr }
722
723 patMetaOps :: MetaOps TH.Pat (LPat RdrName)
724 patMetaOps = MT { mt_desc = "pattern", mt_show = TH.pprint, mt_cvt = convertToPat }
725
726 typeMetaOps :: MetaOps TH.Type (LHsType RdrName)
727 typeMetaOps = MT { mt_desc = "type", mt_show = TH.pprint, mt_cvt = convertToHsType }
728
729 declMetaOps :: MetaOps [TH.Dec] [LHsDecl RdrName]
730 declMetaOps = MT { mt_desc = "declarations", mt_show = TH.pprint, mt_cvt = convertToHsDecls }
731
732 ----------------
733 runMetaAW :: Outputable output
734           => (AnnotationWrapper -> output)
735           -> LHsExpr Id         -- Of type AnnotationWrapper
736           -> TcM output
737 runMetaAW k = runMeta False (\_ -> return . Right . k)
738     -- We turn off showing the code in meta-level exceptions because doing so exposes
739     -- the toAnnotationWrapper function that we slap around the users code
740
741 -----------------
742 runMetaQ :: Outputable hs_syn 
743          => MetaOps th_syn hs_syn
744          -> LHsExpr Id
745          -> TcM hs_syn
746 runMetaQ (MT { mt_show = show_th, mt_cvt = cvt }) expr
747   = runMeta True run_and_cvt expr
748   where
749     run_and_cvt expr_span hval
750        = do { th_result <- TH.runQ hval
751             ; traceTc (text "Got TH result:" <+> text (show_th th_result))
752             ; return (cvt expr_span th_result) }
753
754 runMetaE :: LHsExpr Id          -- Of type (Q Exp)
755          -> TcM (LHsExpr RdrName)
756 runMetaE = runMetaQ exprMetaOps
757
758 runMetaT :: LHsExpr Id          -- Of type (Q Type)
759          -> TcM (LHsType RdrName)       
760 runMetaT = runMetaQ typeMetaOps
761
762 runMetaD :: LHsExpr Id          -- Of type Q [Dec]
763          -> TcM [LHsDecl RdrName]
764 runMetaD = runMetaQ declMetaOps
765
766 ---------------
767 runMeta :: (Outputable hs_syn)
768         => Bool                 -- Whether code should be printed in the exception message
769         -> (SrcSpan -> x -> TcM (Either Message hs_syn))        -- How to run x 
770         -> LHsExpr Id           -- Of type x; typically x = Q TH.Exp, or something like that
771         -> TcM hs_syn           -- Of type t
772 runMeta show_code run_and_convert expr
773   = do  { traceTc (text "About to run" <+> ppr expr)
774
775         -- Desugar
776         ; ds_expr <- initDsTc (dsLExpr expr)
777         -- Compile and link it; might fail if linking fails
778         ; hsc_env <- getTopEnv
779         ; src_span <- getSrcSpanM
780         ; either_hval <- tryM $ liftIO $
781                          HscMain.compileExpr hsc_env src_span ds_expr
782         ; case either_hval of {
783             Left exn   -> failWithTc (mk_msg "compile and link" exn) ;
784             Right hval -> do
785
786         {       -- Coerce it to Q t, and run it
787
788                 -- Running might fail if it throws an exception of any kind (hence tryAllM)
789                 -- including, say, a pattern-match exception in the code we are running
790                 --
791                 -- We also do the TH -> HS syntax conversion inside the same
792                 -- exception-cacthing thing so that if there are any lurking 
793                 -- exceptions in the data structure returned by hval, we'll
794                 -- encounter them inside the try
795                 --
796                 -- See Note [Exceptions in TH] 
797           let expr_span = getLoc expr
798         ; either_tval <- tryAllM $
799                          setSrcSpan expr_span $ -- Set the span so that qLocation can
800                                                 -- see where this splice is
801              do { mb_result <- run_and_convert expr_span (unsafeCoerce# hval)
802                 ; case mb_result of
803                     Left err     -> failWithTc err
804                     Right result -> do { traceTc (ptext (sLit "Got HsSyn result:") <+> ppr result) 
805                                        ; return $! result } }
806
807         ; case either_tval of
808             Right v -> return v
809             Left se -> case fromException se of
810                          Just IOEnvFailure -> failM -- Error already in Tc monad
811                          _ -> failWithTc (mk_msg "run" se)      -- Exception
812         }}}
813   where
814     mk_msg s exn = vcat [text "Exception when trying to" <+> text s <+> text "compile-time code:",
815                          nest 2 (text (Panic.showException exn)),
816                          if show_code then nest 2 (text "Code:" <+> ppr expr) else empty]
817 \end{code}
818
819 Note [Exceptions in TH]
820 ~~~~~~~~~~~~~~~~~~~~~~~
821 Supppose we have something like this 
822         $( f 4 )
823 where
824         f :: Int -> Q [Dec]
825         f n | n>3       = fail "Too many declarations"
826             | otherwise = ...
827
828 The 'fail' is a user-generated failure, and should be displayed as a
829 perfectly ordinary compiler error message, not a panic or anything
830 like that.  Here's how it's processed:
831
832   * 'fail' is the monad fail.  The monad instance for Q in TH.Syntax
833     effectively transforms (fail s) to 
834         qReport True s >> fail
835     where 'qReport' comes from the Quasi class and fail from its monad
836     superclass.
837
838   * The TcM monad is an instance of Quasi (see TcSplice), and it implements
839     (qReport True s) by using addErr to add an error message to the bag of errors.
840     The 'fail' in TcM raises an IOEnvFailure exception
841
842   * So, when running a splice, we catch all exceptions; then for 
843         - an IOEnvFailure exception, we assume the error is already 
844                 in the error-bag (above)
845         - other errors, we add an error to the bag
846     and then fail
847
848
849 To call runQ in the Tc monad, we need to make TcM an instance of Quasi:
850
851 \begin{code}
852 instance TH.Quasi (IOEnv (Env TcGblEnv TcLclEnv)) where
853   qNewName s = do { u <- newUnique 
854                   ; let i = getKey u
855                   ; return (TH.mkNameU s i) }
856
857   qReport True msg  = addErr (text msg)
858   qReport False msg = addReport (text msg) empty
859
860   qLocation = do { m <- getModule
861                  ; l <- getSrcSpanM
862                  ; return (TH.Loc { TH.loc_filename = unpackFS (srcSpanFile l)
863                                   , TH.loc_module   = moduleNameString (moduleName m)
864                                   , TH.loc_package  = packageIdString (modulePackageId m)
865                                   , TH.loc_start = (srcSpanStartLine l, srcSpanStartCol l)
866                                   , TH.loc_end = (srcSpanEndLine   l, srcSpanEndCol   l) }) }
867                 
868   qReify v = reify v
869
870         -- For qRecover, discard error messages if 
871         -- the recovery action is chosen.  Otherwise
872         -- we'll only fail higher up.  c.f. tryTcLIE_
873   qRecover recover main = do { (msgs, mb_res) <- tryTcErrs main
874                              ; case mb_res of
875                                  Just val -> do { addMessages msgs      -- There might be warnings
876                                                 ; return val }
877                                  Nothing  -> recover                    -- Discard all msgs
878                           }
879
880   qRunIO io = liftIO io
881 \end{code}
882
883
884 %************************************************************************
885 %*                                                                      *
886 \subsection{Errors and contexts}
887 %*                                                                      *
888 %************************************************************************
889
890 \begin{code}
891 showSplice :: String -> LHsExpr Name -> SDoc -> TcM ()
892 -- Note that 'before' is *renamed* but not *typechecked*
893 -- Reason (a) less typechecking crap
894 --        (b) data constructors after type checking have been
895 --            changed to their *wrappers*, and that makes them
896 --            print always fully qualified
897 showSplice what before after
898   = do { loc <- getSrcSpanM
899        ; traceSplice (vcat [ppr loc <> colon <+> text "Splicing" <+> text what, 
900                             nest 2 (sep [nest 2 (ppr before),
901                                          text "======>",
902                                          nest 2 after])]) }
903
904 illegalBracket :: SDoc
905 illegalBracket = ptext (sLit "Template Haskell brackets cannot be nested (without intervening splices)")
906 #endif  /* GHCI */
907 \end{code}
908
909
910 %************************************************************************
911 %*                                                                      *
912                         Reification
913 %*                                                                      *
914 %************************************************************************
915
916
917 \begin{code}
918 reify :: TH.Name -> TcM TH.Info
919 reify th_name
920   = do  { name <- lookupThName th_name
921         ; thing <- tcLookupTh name
922                 -- ToDo: this tcLookup could fail, which would give a
923                 --       rather unhelpful error message
924         ; traceIf (text "reify" <+> text (show th_name) <+> brackets (ppr_ns th_name) <+> ppr name)
925         ; reifyThing thing
926     }
927   where
928     ppr_ns (TH.Name _ (TH.NameG TH.DataName _pkg _mod)) = text "data"
929     ppr_ns (TH.Name _ (TH.NameG TH.TcClsName _pkg _mod)) = text "tc"
930     ppr_ns (TH.Name _ (TH.NameG TH.VarName _pkg _mod)) = text "var"
931     ppr_ns _ = panic "reify/ppr_ns"
932
933 lookupThName :: TH.Name -> TcM Name
934 lookupThName th_name = do
935     mb_name <- lookupThName_maybe th_name
936     case mb_name of
937         Nothing   -> failWithTc (notInScope th_name)
938         Just name -> return name
939
940 lookupThName_maybe th_name
941   =  do { names <- mapMaybeM lookup (thRdrNameGuesses th_name)
942           -- Pick the first that works
943           -- E.g. reify (mkName "A") will pick the class A in preference to the data constructor A
944         ; return (listToMaybe names) }  
945   where
946     lookup rdr_name
947         = do {  -- Repeat much of lookupOccRn, becase we want
948                 -- to report errors in a TH-relevant way
949              ; rdr_env <- getLocalRdrEnv
950              ; case lookupLocalRdrEnv rdr_env rdr_name of
951                  Just name -> return (Just name)
952                  Nothing   -> lookupGlobalOccRn_maybe rdr_name }
953
954 tcLookupTh :: Name -> TcM TcTyThing
955 -- This is a specialised version of TcEnv.tcLookup; specialised mainly in that
956 -- it gives a reify-related error message on failure, whereas in the normal
957 -- tcLookup, failure is a bug.
958 tcLookupTh name
959   = do  { (gbl_env, lcl_env) <- getEnvs
960         ; case lookupNameEnv (tcl_env lcl_env) name of {
961                 Just thing -> return thing;
962                 Nothing    -> do
963         { if nameIsLocalOrFrom (tcg_mod gbl_env) name
964           then  -- It's defined in this module
965               case lookupNameEnv (tcg_type_env gbl_env) name of
966                 Just thing -> return (AGlobal thing)
967                 Nothing    -> failWithTc (notInEnv name)
968          
969           else do               -- It's imported
970         { (eps,hpt) <- getEpsAndHpt
971         ; dflags <- getDOpts
972         ; case lookupType dflags hpt (eps_PTE eps) name of 
973             Just thing -> return (AGlobal thing)
974             Nothing    -> do { thing <- tcImportDecl name
975                              ; return (AGlobal thing) }
976                 -- Imported names should always be findable; 
977                 -- if not, we fail hard in tcImportDecl
978     }}}}
979
980 notInScope :: TH.Name -> SDoc
981 notInScope th_name = quotes (text (TH.pprint th_name)) <+> 
982                      ptext (sLit "is not in scope at a reify")
983         -- Ugh! Rather an indirect way to display the name
984
985 notInEnv :: Name -> SDoc
986 notInEnv name = quotes (ppr name) <+> 
987                      ptext (sLit "is not in the type environment at a reify")
988
989 ------------------------------
990 reifyThing :: TcTyThing -> TcM TH.Info
991 -- The only reason this is monadic is for error reporting,
992 -- which in turn is mainly for the case when TH can't express
993 -- some random GHC extension
994
995 reifyThing (AGlobal (AnId id))
996   = do  { ty <- reifyType (idType id)
997         ; fix <- reifyFixity (idName id)
998         ; let v = reifyName id
999         ; case idDetails id of
1000             ClassOpId cls -> return (TH.ClassOpI v ty (reifyName cls) fix)
1001             _             -> return (TH.VarI     v ty Nothing fix)
1002     }
1003
1004 reifyThing (AGlobal (ATyCon tc))  = reifyTyCon tc
1005 reifyThing (AGlobal (AClass cls)) = reifyClass cls
1006 reifyThing (AGlobal (ADataCon dc))
1007   = do  { let name = dataConName dc
1008         ; ty <- reifyType (idType (dataConWrapId dc))
1009         ; fix <- reifyFixity name
1010         ; return (TH.DataConI (reifyName name) ty 
1011                               (reifyName (dataConOrigTyCon dc)) fix) 
1012         }
1013
1014 reifyThing (ATcId {tct_id = id, tct_type = ty}) 
1015   = do  { ty1 <- zonkTcType ty  -- Make use of all the info we have, even
1016                                 -- though it may be incomplete
1017         ; ty2 <- reifyType ty1
1018         ; fix <- reifyFixity (idName id)
1019         ; return (TH.VarI (reifyName id) ty2 Nothing fix) }
1020
1021 reifyThing (ATyVar tv ty) 
1022   = do  { ty1 <- zonkTcType ty
1023         ; ty2 <- reifyType ty1
1024         ; return (TH.TyVarI (reifyName tv) ty2) }
1025
1026 reifyThing (AThing {}) = panic "reifyThing AThing"
1027
1028 ------------------------------
1029 reifyTyCon :: TyCon -> TcM TH.Info
1030 reifyTyCon tc
1031   | isFunTyCon tc  
1032   = return (TH.PrimTyConI (reifyName tc) 2                False)
1033   | isPrimTyCon tc 
1034   = return (TH.PrimTyConI (reifyName tc) (tyConArity tc) (isUnLiftedTyCon tc))
1035   | isOpenTyCon tc
1036   = let flavour = reifyFamFlavour tc
1037         tvs     = tyConTyVars tc
1038         kind    = tyConKind tc
1039         kind'
1040           | isLiftedTypeKind kind = Nothing
1041           | otherwise             = Just $ reifyKind kind
1042     in
1043     return (TH.TyConI $
1044               TH.FamilyD flavour (reifyName tc) (reifyTyVars tvs) kind')
1045   | isSynTyCon tc
1046   = do { let (tvs, rhs) = synTyConDefn tc 
1047        ; rhs' <- reifyType rhs
1048        ; return (TH.TyConI $ 
1049                    TH.TySynD (reifyName tc) (reifyTyVars tvs) rhs') 
1050        }
1051
1052 reifyTyCon tc
1053   = do  { cxt <- reifyCxt (tyConStupidTheta tc)
1054         ; let tvs = tyConTyVars tc
1055         ; cons <- mapM (reifyDataCon (mkTyVarTys tvs)) (tyConDataCons tc)
1056         ; let name = reifyName tc
1057               r_tvs  = reifyTyVars tvs
1058               deriv = []        -- Don't know about deriving
1059               decl | isNewTyCon tc = TH.NewtypeD cxt name r_tvs (head cons) deriv
1060                    | otherwise     = TH.DataD    cxt name r_tvs cons        deriv
1061         ; return (TH.TyConI decl) }
1062
1063 reifyDataCon :: [Type] -> DataCon -> TcM TH.Con
1064 reifyDataCon tys dc
1065   | isVanillaDataCon dc
1066   = do  { arg_tys <- reifyTypes (dataConInstOrigArgTys dc tys)
1067         ; let stricts = map reifyStrict (dataConStrictMarks dc)
1068               fields  = dataConFieldLabels dc
1069               name    = reifyName dc
1070               [a1,a2] = arg_tys
1071               [s1,s2] = stricts
1072         ; ASSERT( length arg_tys == length stricts )
1073           if not (null fields) then
1074              return (TH.RecC name (zip3 (map reifyName fields) stricts arg_tys))
1075           else
1076           if dataConIsInfix dc then
1077              ASSERT( length arg_tys == 2 )
1078              return (TH.InfixC (s1,a1) name (s2,a2))
1079           else
1080              return (TH.NormalC name (stricts `zip` arg_tys)) }
1081   | otherwise
1082   = failWithTc (ptext (sLit "Can't reify a GADT data constructor:") 
1083                 <+> quotes (ppr dc))
1084
1085 ------------------------------
1086 reifyClass :: Class -> TcM TH.Info
1087 reifyClass cls 
1088   = do  { cxt <- reifyCxt theta
1089         ; ops <- mapM reify_op op_stuff
1090         ; return (TH.ClassI $ TH.ClassD cxt (reifyName cls) (reifyTyVars tvs) fds' ops) }
1091   where
1092     (tvs, fds, theta, _, _, op_stuff) = classExtraBigSig cls
1093     fds' = map reifyFunDep fds
1094     reify_op (op, _) = do { ty <- reifyType (idType op)
1095                           ; return (TH.SigD (reifyName op) ty) }
1096
1097 ------------------------------
1098 reifyType :: TypeRep.Type -> TcM TH.Type
1099 reifyType ty@(ForAllTy _ _)        = reify_for_all ty
1100 reifyType ty@(PredTy {} `FunTy` _) = reify_for_all ty           -- Types like ((?x::Int) => Char -> Char)
1101 reifyType (TyVarTy tv)      = return (TH.VarT (reifyName tv))
1102 reifyType (TyConApp tc tys) = reify_tc_app (reifyName tc) tys   -- Do not expand type synonyms here
1103 reifyType (AppTy t1 t2)     = do { [r1,r2] <- reifyTypes [t1,t2] ; return (r1 `TH.AppT` r2) }
1104 reifyType (FunTy t1 t2)     = do { [r1,r2] <- reifyTypes [t1,t2] ; return (TH.ArrowT `TH.AppT` r1 `TH.AppT` r2) }
1105 reifyType ty@(PredTy {})    = pprPanic "reifyType PredTy" (ppr ty)
1106
1107 reify_for_all :: TypeRep.Type -> TcM TH.Type
1108 reify_for_all ty
1109   = do { cxt' <- reifyCxt cxt; 
1110        ; tau' <- reifyType tau 
1111        ; return (TH.ForallT (reifyTyVars tvs) cxt' tau') }
1112   where
1113     (tvs, cxt, tau) = tcSplitSigmaTy ty   
1114                                 
1115 reifyTypes :: [Type] -> TcM [TH.Type]
1116 reifyTypes = mapM reifyType
1117
1118 reifyKind :: Kind -> TH.Kind
1119 reifyKind  ki
1120   = let (kis, ki') = splitKindFunTys ki
1121         kis_rep    = map reifyKind kis
1122         ki'_rep    = reifyNonArrowKind ki'
1123     in
1124     foldr TH.ArrowK ki'_rep kis_rep
1125   where
1126     reifyNonArrowKind k | isLiftedTypeKind k = TH.StarK
1127                         | otherwise          = pprPanic "Exotic form of kind" 
1128                                                         (ppr k)
1129
1130 reifyCxt :: [PredType] -> TcM [TH.Pred]
1131 reifyCxt   = mapM reifyPred
1132
1133 reifyFunDep :: ([TyVar], [TyVar]) -> TH.FunDep
1134 reifyFunDep (xs, ys) = TH.FunDep (map reifyName xs) (map reifyName ys)
1135
1136 reifyFamFlavour :: TyCon -> TH.FamFlavour
1137 reifyFamFlavour tc | isOpenSynTyCon tc = TH.TypeFam
1138                    | isOpenTyCon    tc = TH.DataFam
1139                    | otherwise         
1140                    = panic "TcSplice.reifyFamFlavour: not a type family"
1141
1142 reifyTyVars :: [TyVar] -> [TH.TyVarBndr]
1143 reifyTyVars = map reifyTyVar
1144   where
1145     reifyTyVar tv | isLiftedTypeKind kind = TH.PlainTV  name
1146                   | otherwise             = TH.KindedTV name (reifyKind kind)
1147       where
1148         kind = tyVarKind tv
1149         name = reifyName tv
1150
1151 reify_tc_app :: TH.Name -> [TypeRep.Type] -> TcM TH.Type
1152 reify_tc_app tc tys = do { tys' <- reifyTypes tys 
1153                          ; return (foldl TH.AppT (TH.ConT tc) tys') }
1154
1155 reifyPred :: TypeRep.PredType -> TcM TH.Pred
1156 reifyPred (ClassP cls tys) 
1157   = do { tys' <- reifyTypes tys 
1158        ; return $ TH.ClassP (reifyName cls) tys'
1159        }
1160 reifyPred p@(IParam _ _)   = noTH (sLit "implicit parameters") (ppr p)
1161 reifyPred (EqPred ty1 ty2) 
1162   = do { ty1' <- reifyType ty1
1163        ; ty2' <- reifyType ty2
1164        ; return $ TH.EqualP ty1' ty2'
1165        }
1166
1167
1168 ------------------------------
1169 reifyName :: NamedThing n => n -> TH.Name
1170 reifyName thing
1171   | isExternalName name = mk_varg pkg_str mod_str occ_str
1172   | otherwise           = TH.mkNameU occ_str (getKey (getUnique name))
1173         -- Many of the things we reify have local bindings, and 
1174         -- NameL's aren't supposed to appear in binding positions, so
1175         -- we use NameU.  When/if we start to reify nested things, that
1176         -- have free variables, we may need to generate NameL's for them.
1177   where
1178     name    = getName thing
1179     mod     = ASSERT( isExternalName name ) nameModule name
1180     pkg_str = packageIdString (modulePackageId mod)
1181     mod_str = moduleNameString (moduleName mod)
1182     occ_str = occNameString occ
1183     occ     = nameOccName name
1184     mk_varg | OccName.isDataOcc occ = TH.mkNameG_d
1185             | OccName.isVarOcc  occ = TH.mkNameG_v
1186             | OccName.isTcOcc   occ = TH.mkNameG_tc
1187             | otherwise             = pprPanic "reifyName" (ppr name)
1188
1189 ------------------------------
1190 reifyFixity :: Name -> TcM TH.Fixity
1191 reifyFixity name
1192   = do  { fix <- lookupFixityRn name
1193         ; return (conv_fix fix) }
1194     where
1195       conv_fix (BasicTypes.Fixity i d) = TH.Fixity i (conv_dir d)
1196       conv_dir BasicTypes.InfixR = TH.InfixR
1197       conv_dir BasicTypes.InfixL = TH.InfixL
1198       conv_dir BasicTypes.InfixN = TH.InfixN
1199
1200 reifyStrict :: BasicTypes.StrictnessMark -> TH.Strict
1201 reifyStrict MarkedStrict    = TH.IsStrict
1202 reifyStrict MarkedUnboxed   = TH.IsStrict
1203 reifyStrict NotMarkedStrict = TH.NotStrict
1204
1205 ------------------------------
1206 noTH :: LitString -> SDoc -> TcM a
1207 noTH s d = failWithTc (hsep [ptext (sLit "Can't represent") <+> ptext s <+> 
1208                                 ptext (sLit "in Template Haskell:"),
1209                              nest 2 d])
1210 \end{code}