Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1941

ghc-ghc-devel-6.12.3-5.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>typecheck/TcSplice.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%

TcSplice: Template Haskell splices


\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>{-# OPTIONS -fno-warn-unused-imports -fno-warn-unused-binds #-}</span>
<a name="line-2"></a><span class='hs-comment'>-- The above warning supression flag is a temporary kludge.</span>
<a name="line-3"></a><span class='hs-comment'>-- While working on this module you are encouraged to remove it and fix</span>
<a name="line-4"></a><span class='hs-comment'>-- any warnings in the module. See</span>
<a name="line-5"></a><span class='hs-comment'>--     <a href="http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings">http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings</a></span>
<a name="line-6"></a><span class='hs-comment'>-- for details</span>
<a name="line-7"></a>
<a name="line-8"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>TcSplice</span><span class='hs-layout'>(</span> <span class='hs-varid'>kcSpliceType</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcSpliceExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcSpliceDecls</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcBracket</span><span class='hs-layout'>,</span>
<a name="line-9"></a>                 <span class='hs-varid'>lookupThName_maybe</span><span class='hs-layout'>,</span>
<a name="line-10"></a>                 <span class='hs-varid'>runQuasiQuoteExpr</span><span class='hs-layout'>,</span> <span class='hs-varid'>runQuasiQuotePat</span><span class='hs-layout'>,</span> <span class='hs-varid'>runAnnotation</span> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HscMain</span>
<a name="line-15"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcRnDriver</span>
<a name="line-16"></a>	<span class='hs-comment'>-- These imports are the reason that TcSplice </span>
<a name="line-17"></a>	<span class='hs-comment'>-- is very high up the module hierarchy</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HsSyn</span>
<a name="line-20"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Convert</span>
<a name="line-21"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnExpr</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnEnv</span>
<a name="line-23"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RdrName</span>
<a name="line-24"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnTypes</span>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcExpr</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcHsSyn</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcSimplify</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcUnify</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcType</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcEnv</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcMType</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcHsType</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcIface</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TypeRep</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameEnv</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HscTypes</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>OccName</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Module</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Annotations</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcRnMonad</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Inst</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Id</span>
<a name="line-49"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>IdInfo</span>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysWiredIn</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DsMeta</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DsExpr</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DsMonad</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-conid'>Splice</span><span class='hs-layout'>)</span>
<a name="line-54"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Serialized</span>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ErrUtils</span>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Unique</span>
<a name="line-59"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-61"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Panic</span>
<a name="line-62"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Exception</span>
<a name="line-64"></a>
<a name="line-65"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>TH</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>TH</span>
<a name="line-66"></a><span class='hs-comment'>-- THSyntax gives access to internal functions and data types</span>
<a name="line-67"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Syntax</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>TH</span>
<a name="line-68"></a>
<a name="line-69"></a><span class='hs-cpp'>#ifdef GHCI</span>
<a name="line-70"></a><span class='hs-comment'>-- Because GHC.Desugar might not be in the base library of the bootstrapping compiler</span>
<a name="line-71"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Desugar</span>      <span class='hs-layout'>(</span> <span class='hs-conid'>AnnotationWrapper</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-72"></a><span class='hs-cpp'>#endif</span>
<a name="line-73"></a>
<a name="line-74"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>GHC</span><span class='hs-varop'>.</span><span class='hs-conid'>Exts</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>unsafeCoerce</span><span class='hs-cpp'>#</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-cpp'>#</span><span class='hs-layout'>,</span> <span class='hs-conid'>Int</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-75"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Error</span>
</pre>\end{code}

Note [How top-level splices are handled]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Top-level splices (those not inside a [| .. |] quotation bracket) are handled
very straightforwardly:

  1. tcTopSpliceExpr: typecheck the body e of the splice $(e)

  2. runMetaT: desugar, compile, run it, and convert result back to
     HsSyn RdrName (of the appropriate flavour, eg HsType RdrName,
     HsExpr RdrName etc)

  3. treat the result as if that's what you saw in the first place
     e.g for HsType, rename and kind-check
         for HsExpr, rename and type-check

     (The last step is different for decls, becuase they can *only* be 
      top-level: we return the result of step 2.)

Note [How brackets and nested splices are handled]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Nested splices (those inside a [| .. |] quotation bracket), are treated
quite differently. 

  * After typechecking, the bracket [| |] carries

     a) A mutable list of PendingSplice
          type PendingSplice = (Name, LHsExpr Id)

     b) The quoted expression e, *renamed*: (HsExpr Name)
          The expression e has been typechecked, but the result of
	  that typechecking is discarded.  

  * The brakcet is desugared by DsMeta.dsBracket.  It 

      a) Extends the ds_meta environment with the PendingSplices
         attached to the bracket

      b) Converts the quoted (HsExpr Name) to a CoreExpr that, when
         run, will produce a suitable TH expression/type/decl.  This
	 is why we leave the *renamed* expression attached to the bracket:
         the quoted expression should not be decorated with all the goop
         added by the type checker

  * Each splice carries a unique Name, called a "splice point", thus
    ${n}(e).  The name is initialised to an (Unqual "splice") when the
    splice is created; the renamer gives it a unique.

  * When the type checker type-checks a nested splice ${n}(e), it 
	- typechecks e
	- adds the typechecked expression (of type (HsExpr Id))
	  as a pending splice to the enclosing bracket
	- returns something non-committal
    Eg for [| f ${n}(g x) |], the typechecker 
	- attaches the typechecked term (g x) to the pending splices for n
	  in the outer bracket
        - returns a non-committal type \alpha.
	Remember that the bracket discards the typechecked term altogether

  * When DsMeta (used to desugar the body of the bracket) comes across
    a splice, it looks up the splice's Name, n, in the ds_meta envt,
    to find an (HsExpr Id) that should be substituted for the splice;
    it just desugars it to get a CoreExpr (DsMeta.repSplice).

Example: 
    Source:	  f = [| Just $(g 3) |]
      The [| |] part is a HsBracket

    Typechecked:  f = [| Just ${s7}(g 3) |]{s7 = g Int 3}
      The [| |] part is a HsBracketOut, containing *renamed* 
	(not typechecked) expression
      The "s7" is the "splice point"; the (g Int 3) part 
	is a typechecked expression

    Desugared:	  f = do { s7 <- g Int 3
		         ; return (ConE "Data.Maybe.Just" s7) }


Note [Template Haskell state diagram]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Here are the ThStages, s, their corresponding level numbers
(the result of (thLevel s)), and their state transitions.  

      -----------     $	     ------------   $
      |  Comp   | ---------> |  Splice  | -----|
      |   1     |    	     |    0     | <----|
      -----------     	     ------------
        ^     |       	       ^      |
      $ |     | [||]  	     $ |      | [||]
        |     v       	       |      v
   --------------     	   ----------------
   | Brack Comp |     	   | Brack Splice |
   |     2      |     	   |      1       |
   --------------     	   ----------------

* Normal top-level declarations start in state Comp 
       (which has level 1).
  Annotations start in state Splice, since they are
       treated very like a splice (only without a '$')

* Code compiled in state Splice (and only such code) 
  will be *run at compile time*, with the result replacing
  the splice

* The original paper used level -1 instead of 0, etc.

* The original paper did not allow a splice within a 
  splice, but there is no reason not to. This is the 
  $ transition in the top right.

Note [Template Haskell levels]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Imported things are impLevel (= 0)

* In GHCi, variables bound by a previous command are treated
  as impLevel, because we have bytecode for them.

* Variables are bound at the "current level"

* The current level starts off at outerLevel (= 1)

* The level is decremented by splicing $(..)
	       incremented by brackets [| |]
	       incremented by name-quoting 'f

When a variable is used, we compare 
	bind:  binding level, and
	use:   current level at usage site

  Generally
	bind > use	Always error (bound later than used)
			[| \x -> $(f x) |]
			
	bind = use	Always OK (bound same stage as used)
			[| \x -> $(f [| x |]) |]

	bind < use	Inside brackets, it depends
			Inside splice, OK
			Inside neither, OK

  For (bind < use) inside brackets, there are three cases:
    - Imported things	OK	f = [| map |]
    - Top-level things	OK	g = [| f |]
    - Non-top-level 	Only if there is a liftable instance
				h = \(x:Int) -> [| x |]

See Note [What is a top-level Id?]

Note [Quoting names]
~~~~~~~~~~~~~~~~~~~~
A quoted name 'n is a bit like a quoted expression [| n |], except that we 
have no cross-stage lifting (c.f. TcExpr.thBrackId).  So, after incrementing
the use-level to account for the brackets, the cases are:

	bind > use			Error
	bind = use			OK
	bind < use	
		Imported things		OK
		Top-level things	OK
		Non-top-level		Error

See Note [What is a top-level Id?] in TcEnv.  Examples:

  f 'map	-- OK; also for top-level defns of this module

  \x. f 'x	-- Not ok (whereas \x. f [| x |] might have been ok, by
		--				 cross-stage lifting

  \y. [| \x. $(f 'y) |]	-- Not ok (same reason)

  [| \x. $(f 'x) |]	-- OK


Note [What is a top-level Id?]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In the level-control criteria above, we need to know what a "top level Id" is.
There are three kinds:
  * Imported from another module		(GlobalId, ExternalName)
  * Bound at the top level of this module	(ExternalName)
  * In GHCi, bound by a previous stmt		(GlobalId)
It's strange that there is no one criterion tht picks out all three, but that's
how it is right now.  (The obvious thing is to give an ExternalName to GHCi Ids 
bound in an earlier Stmt, but what module would you choose?  See 
Note [Interactively-bound Ids in GHCi] in TcRnDriver.)

The predicate we use is TcEnv.thTopLevelId.


%************************************************************************
%*									*
\subsection{Main interface + stubs for the non-GHCI case
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcBracket"></a><span class='hs-definition'>tcBracket</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsBracket</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BoxyRhoType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>TcId</span><span class='hs-layout'>)</span>
<a name="line-2"></a><a name="tcSpliceDecls"></a><span class='hs-definition'>tcSpliceDecls</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span>
<a name="line-3"></a><a name="tcSpliceExpr"></a><span class='hs-definition'>tcSpliceExpr</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsSplice</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BoxyRhoType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsExpr</span> <span class='hs-conid'>TcId</span><span class='hs-layout'>)</span>
<a name="line-4"></a><a name="kcSpliceType"></a><span class='hs-definition'>kcSpliceType</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsSplice</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>
<a name="line-5"></a>	<span class='hs-comment'>-- None of these functions add constraints to the LIE</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="lookupThName_maybe"></a><span class='hs-definition'>lookupThName_maybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="runQuasiQuoteExpr"></a><span class='hs-definition'>runQuasiQuoteExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsQuasiQuote</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span>
<a name="line-10"></a><a name="runQuasiQuotePat"></a><span class='hs-definition'>runQuasiQuotePat</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsQuasiQuote</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LPat</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span>
<a name="line-11"></a><a name="runAnnotation"></a><span class='hs-definition'>runAnnotation</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreAnnTarget</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Annotation</span>
<a name="line-12"></a>
<a name="line-13"></a><span class='hs-cpp'>#ifndef GHCI</span>
<a name="line-14"></a><span class='hs-definition'>tcBracket</span>     <span class='hs-varid'>x</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Cant do tcBracket without GHCi"</span>     <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-15"></a><span class='hs-definition'>tcSpliceExpr</span>  <span class='hs-varid'>e</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Cant do tcSpliceExpr without GHCi"</span>  <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-16"></a><span class='hs-definition'>tcSpliceDecls</span> <span class='hs-varid'>x</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Cant do tcSpliceDecls without GHCi"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-17"></a><span class='hs-definition'>kcSpliceType</span>  <span class='hs-varid'>x</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Cant do kcSpliceType without GHCi"</span>  <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-definition'>lookupThName_maybe</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Cant do lookupThName_maybe without GHCi"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-definition'>runQuasiQuoteExpr</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Cant do runQuasiQuoteExpr without GHCi"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-definition'>runQuasiQuotePat</span>  <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Cant do runQuasiQuotePat without GHCi"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-definition'>runAnnotation</span>   <span class='hs-keyword'>_</span> <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Cant do runAnnotation without GHCi"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>q</span><span class='hs-layout'>)</span>
<a name="line-24"></a><span class='hs-cpp'>#else</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Quoting an expression}
%*									*
%************************************************************************


\begin{code}
<pre><a name="line-1"></a><a name="tcBracket"></a><span class='hs-comment'>-- See Note [How brackets and nested splices are handled]</span>
<a name="line-2"></a><span class='hs-definition'>tcBracket</span> <span class='hs-varid'>brack</span> <span class='hs-varid'>res_ty</span> 
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addErrCtxt</span> <span class='hs-layout'>(</span><span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"In the Template Haskell quotation"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-4"></a>                   <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>brack</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-5"></a>    <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> 	<span class='hs-comment'>-- Check for nested brackets</span>
<a name="line-6"></a>         <span class='hs-varid'>cur_stage</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getStage</span>
<a name="line-7"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isBrackStage</span> <span class='hs-varid'>cur_stage</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>illegalBracket</span> 
<a name="line-8"></a>
<a name="line-9"></a>	<span class='hs-comment'>-- Brackets are desugared to code that mentions the TH package</span>
<a name="line-10"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>recordThUse</span>
<a name="line-11"></a>
<a name="line-12"></a>   	<span class='hs-comment'>-- Typecheck expr to make sure it is valid,</span>
<a name="line-13"></a>	<span class='hs-comment'>-- but throw away the results.  We'll type check</span>
<a name="line-14"></a>	<span class='hs-comment'>-- it again when we actually use it.</span>
<a name="line-15"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>pending_splices</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newMutVar</span> <span class='hs-conid'>[]</span>
<a name="line-16"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>lie_var</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLIEVar</span>
<a name="line-17"></a>
<a name="line-18"></a>       <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>meta_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>lie</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>setStage</span> <span class='hs-layout'>(</span><span class='hs-conid'>Brack</span> <span class='hs-varid'>cur_stage</span> <span class='hs-varid'>pending_splices</span> <span class='hs-varid'>lie_var</span><span class='hs-layout'>)</span>
<a name="line-19"></a>                                    <span class='hs-layout'>(</span><span class='hs-varid'>getLIE</span> <span class='hs-layout'>(</span><span class='hs-varid'>tc_bracket</span> <span class='hs-varid'>cur_stage</span> <span class='hs-varid'>brack</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-20"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>tcSimplifyBracket</span> <span class='hs-varid'>lie</span>
<a name="line-21"></a>
<a name="line-22"></a>	<span class='hs-comment'>-- Make the expected type have the right shape</span>
<a name="line-23"></a>       <span class='hs-layout'>;</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>boxyUnify</span> <span class='hs-varid'>meta_ty</span> <span class='hs-varid'>res_ty</span>
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-comment'>-- Return the original expression, not the type-decorated one</span>
<a name="line-26"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>pendings</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readMutVar</span> <span class='hs-varid'>pending_splices</span>
<a name="line-27"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsBracketOut</span> <span class='hs-varid'>brack</span> <span class='hs-varid'>pendings</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="tc_bracket"></a><span class='hs-definition'>tc_bracket</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ThStage</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsBracket</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TcType</span>
<a name="line-30"></a><span class='hs-definition'>tc_bracket</span> <span class='hs-varid'>outer_stage</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarBr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> 	<span class='hs-comment'>-- Note [Quoting names]</span>
<a name="line-31"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookup</span> <span class='hs-varid'>name</span>
<a name="line-32"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>thing</span> <span class='hs-keyword'>of</span>
<a name="line-33"></a>    	    <span class='hs-conid'>AGlobal</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-34"></a>    	    <span class='hs-conid'>ATcId</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tct_level</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bind_lvl</span><span class='hs-layout'>,</span> <span class='hs-varid'>tct_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span> <span class='hs-layout'>}</span>
<a name="line-35"></a>		<span class='hs-keyglyph'>|</span> <span class='hs-varid'>thTopLevelId</span> <span class='hs-varid'>id</span>	<span class='hs-comment'>-- C.f TcExpr.checkCrossStageLifting</span>
<a name="line-36"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>keepAliveTc</span> <span class='hs-varid'>id</span> 	 	
<a name="line-37"></a>		<span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-38"></a>		<span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>thLevel</span> <span class='hs-varid'>outer_stage</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span> <span class='hs-varop'>==</span> <span class='hs-varid'>bind_lvl</span><span class='hs-layout'>)</span>
<a name="line-39"></a>				<span class='hs-layout'>(</span><span class='hs-varid'>quotedNameStageErr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-40"></a>	    <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"th_bracket"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-41"></a>
<a name="line-42"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>nameTyConName</span> 	<span class='hs-comment'>-- Result type is Var (not Q-monadic)</span>
<a name="line-43"></a>	<span class='hs-layout'>}</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-definition'>tc_bracket</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>ExpBr</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> 
<a name="line-46"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>any_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newFlexiTyVarTy</span> <span class='hs-varid'>liftedTypeKind</span>
<a name="line-47"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMonoExprNC</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>any_ty</span>  <span class='hs-comment'>-- NC for no context; tcBracket does that</span>
<a name="line-48"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>expQTyConName</span> <span class='hs-layout'>}</span>
<a name="line-49"></a>	<span class='hs-comment'>-- Result type is Expr (= Q Exp)</span>
<a name="line-50"></a>
<a name="line-51"></a><span class='hs-definition'>tc_bracket</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>TypBr</span> <span class='hs-varid'>typ</span><span class='hs-layout'>)</span> 
<a name="line-52"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcHsSigTypeNC</span> <span class='hs-conid'>ThBrackCtxt</span> <span class='hs-varid'>typ</span>
<a name="line-53"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>typeQTyConName</span> <span class='hs-layout'>}</span>
<a name="line-54"></a>	<span class='hs-comment'>-- Result type is Type (= Q Typ)</span>
<a name="line-55"></a>
<a name="line-56"></a><span class='hs-definition'>tc_bracket</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>DecBr</span> <span class='hs-varid'>decls</span><span class='hs-layout'>)</span>
<a name="line-57"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcTopSrcDecls</span> <span class='hs-varid'>emptyModDetails</span> <span class='hs-varid'>decls</span>
<a name="line-58"></a>	<span class='hs-comment'>-- Typecheck the declarations, dicarding the result</span>
<a name="line-59"></a>	<span class='hs-comment'>-- We'll get all that stuff later, when we splice it in</span>
<a name="line-60"></a>
<a name="line-61"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>decl_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>decTyConName</span>
<a name="line-62"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>q_ty</span>    <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>qTyConName</span>
<a name="line-63"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkAppTy</span> <span class='hs-varid'>q_ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkListTy</span> <span class='hs-varid'>decl_ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-64"></a>	<span class='hs-comment'>-- Result type is Q [Dec]</span>
<a name="line-65"></a>    <span class='hs-layout'>}</span>
<a name="line-66"></a>
<a name="line-67"></a><span class='hs-definition'>tc_bracket</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>PatBr</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>
<a name="line-68"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Tempate Haskell pattern brackets are not supported yet"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-69"></a>
<a name="line-70"></a><a name="quotedNameStageErr"></a><span class='hs-definition'>quotedNameStageErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-71"></a><span class='hs-definition'>quotedNameStageErr</span> <span class='hs-varid'>v</span> 
<a name="line-72"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Stage error: the non-top-level quoted name"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>VarBr</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-73"></a>	<span class='hs-layout'>,</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"must be used at the same stage at which is is bound"</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Splicing an expression}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcSpliceExpr"></a><span class='hs-definition'>tcSpliceExpr</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsSplice</span> <span class='hs-varid'>name</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> <span class='hs-varid'>res_ty</span>
<a name="line-2"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-layout'>(</span><span class='hs-varid'>getLoc</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> 	<span class='hs-varop'>$</span> <span class='hs-keyword'>do</span>
<a name="line-3"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>stage</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getStage</span>
<a name="line-4"></a>    <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>stage</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-5"></a>	<span class='hs-conid'>Splice</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tcTopSplice</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>res_ty</span> <span class='hs-layout'>;</span>
<a name="line-6"></a>	<span class='hs-conid'>Comp</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>tcTopSplice</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>res_ty</span> <span class='hs-layout'>;</span>
<a name="line-7"></a>
<a name="line-8"></a>	<span class='hs-conid'>Brack</span> <span class='hs-varid'>pop_stage</span> <span class='hs-varid'>ps_var</span> <span class='hs-varid'>lie_var</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-9"></a>
<a name="line-10"></a>        <span class='hs-comment'>-- See Note [How brackets and nested splices are handled]</span>
<a name="line-11"></a>	<span class='hs-comment'>-- A splice inside brackets</span>
<a name="line-12"></a>  	<span class='hs-comment'>-- NB: ignore res_ty, apart from zapping it to a mono-type</span>
<a name="line-13"></a>	<span class='hs-comment'>-- e.g.   [| reverse $(h 4) |]</span>
<a name="line-14"></a>	<span class='hs-comment'>-- Here (h 4) :: Q Exp</span>
<a name="line-15"></a>	<span class='hs-comment'>-- but $(h 4) :: forall a.a 	i.e. anything!</span>
<a name="line-16"></a>
<a name="line-17"></a>     <span class='hs-layout'>{</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unBox</span> <span class='hs-varid'>res_ty</span>
<a name="line-18"></a>     <span class='hs-layout'>;</span> <span class='hs-varid'>meta_exp_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>expQTyConName</span>
<a name="line-19"></a>     <span class='hs-layout'>;</span> <span class='hs-varid'>expr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>setStage</span> <span class='hs-varid'>pop_stage</span> <span class='hs-varop'>$</span>
<a name="line-20"></a>                <span class='hs-varid'>setLIEVar</span> <span class='hs-varid'>lie_var</span>    <span class='hs-varop'>$</span>
<a name="line-21"></a>                <span class='hs-varid'>tcMonoExpr</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>meta_exp_ty</span>
<a name="line-22"></a>
<a name="line-23"></a>	<span class='hs-comment'>-- Write the pending splice into the bucket</span>
<a name="line-24"></a>     <span class='hs-layout'>;</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readMutVar</span> <span class='hs-varid'>ps_var</span>
<a name="line-25"></a>     <span class='hs-layout'>;</span> <span class='hs-varid'>writeMutVar</span> <span class='hs-varid'>ps_var</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span><span class='hs-varid'>expr'</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>
<a name="line-26"></a>
<a name="line-27"></a>     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>panic</span> <span class='hs-str'>"tcSpliceExpr"</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- The returned expression is ignored</span>
<a name="line-28"></a>     <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="tcTopSplice"></a><span class='hs-definition'>tcTopSplice</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BoxyRhoType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsExpr</span> <span class='hs-conid'>Id</span><span class='hs-layout'>)</span>
<a name="line-31"></a><span class='hs-comment'>-- Note [How top-level splices are handled]</span>
<a name="line-32"></a><span class='hs-definition'>tcTopSplice</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>res_ty</span>
<a name="line-33"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>meta_exp_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>expQTyConName</span>
<a name="line-34"></a>
<a name="line-35"></a>        <span class='hs-comment'>-- Typecheck the expression</span>
<a name="line-36"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>zonked_q_expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcTopSpliceExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcMonoExpr</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>meta_exp_ty</span><span class='hs-layout'>)</span>
<a name="line-37"></a>
<a name="line-38"></a>        <span class='hs-comment'>-- Run the expression</span>
<a name="line-39"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"About to run"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>zonked_q_expr</span><span class='hs-layout'>)</span>
<a name="line-40"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>expr2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runMetaE</span> <span class='hs-varid'>convertToHsExpr</span> <span class='hs-varid'>zonked_q_expr</span>
<a name="line-41"></a>
<a name="line-42"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Got result"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>expr2</span><span class='hs-layout'>)</span>
<a name="line-43"></a>
<a name="line-44"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>showSplice</span> <span class='hs-str'>"expression"</span> <span class='hs-varid'>expr</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>expr2</span><span class='hs-layout'>)</span>
<a name="line-45"></a>
<a name="line-46"></a>        <span class='hs-comment'>-- Rename it, but bale out if there are errors</span>
<a name="line-47"></a>        <span class='hs-comment'>-- otherwise the type checker just gives more spurious errors</span>
<a name="line-48"></a>       <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>exp3</span><span class='hs-layout'>,</span> <span class='hs-sel'>_fvs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>checkNoErrs</span> <span class='hs-layout'>(</span><span class='hs-varid'>rnLExpr</span> <span class='hs-varid'>expr2</span><span class='hs-layout'>)</span>
<a name="line-49"></a>
<a name="line-50"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>exp4</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMonoExpr</span> <span class='hs-varid'>exp3</span> <span class='hs-varid'>res_ty</span>
<a name="line-51"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>exp4</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-52"></a>
<a name="line-53"></a><a name="tcTopSpliceExpr"></a><span class='hs-comment'>-------------------</span>
<a name="line-54"></a><span class='hs-definition'>tcTopSpliceExpr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span><span class='hs-layout'>)</span>
<a name="line-55"></a><span class='hs-comment'>-- Note [How top-level splices are handled]</span>
<a name="line-56"></a><span class='hs-comment'>-- Type check an expression that is the body of a top-level splice</span>
<a name="line-57"></a><span class='hs-comment'>--   (the caller will compile and run it)</span>
<a name="line-58"></a><span class='hs-comment'>-- Note that set the level to Splice, regardless of the original level,</span>
<a name="line-59"></a><span class='hs-comment'>-- before typechecking the expression.  For example:</span>
<a name="line-60"></a><span class='hs-comment'>--	f x = $( ...$(g 3) ... )</span>
<a name="line-61"></a><span class='hs-comment'>-- The recursive call to tcMonoExpr will simply expand the </span>
<a name="line-62"></a><span class='hs-comment'>-- inner escape before dealing with the outer one</span>
<a name="line-63"></a>
<a name="line-64"></a><span class='hs-definition'>tcTopSpliceExpr</span> <span class='hs-varid'>tc_action</span>
<a name="line-65"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>checkNoErrs</span> <span class='hs-varop'>$</span>  <span class='hs-comment'>-- checkNoErrs: must not try to run the thing</span>
<a name="line-66"></a>                   <span class='hs-comment'>-- if the type checker fails!</span>
<a name="line-67"></a>    <span class='hs-varid'>setStage</span> <span class='hs-conid'>Splice</span> <span class='hs-varop'>$</span> 
<a name="line-68"></a>    <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>    <span class='hs-comment'>-- Typecheck the expression</span>
<a name="line-69"></a>         <span class='hs-layout'>(</span><span class='hs-varid'>expr'</span><span class='hs-layout'>,</span> <span class='hs-varid'>lie</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLIE</span> <span class='hs-varid'>tc_action</span>
<a name="line-70"></a>        
<a name="line-71"></a>	<span class='hs-comment'>-- Solve the constraints</span>
<a name="line-72"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>const_binds</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcSimplifyTop</span> <span class='hs-varid'>lie</span>
<a name="line-73"></a>	
<a name="line-74"></a>          <span class='hs-comment'>-- Zonk it and tie the knot of dictionary bindings</span>
<a name="line-75"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>zonkTopLExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkHsDictLet</span> <span class='hs-varid'>const_binds</span> <span class='hs-varid'>expr'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code}


%************************************************************************
%*									*
		Splicing a type
%*									*
%************************************************************************

Very like splicing an expression, but we don't yet share code.

\begin{code}
<pre><a name="line-1"></a><a name="kcSpliceType"></a><span class='hs-definition'>kcSpliceType</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsSplice</span> <span class='hs-varid'>name</span> <span class='hs-varid'>hs_expr</span><span class='hs-layout'>)</span>
<a name="line-2"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-layout'>(</span><span class='hs-varid'>getLoc</span> <span class='hs-varid'>hs_expr</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-keyword'>do</span> 	
<a name="line-3"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>stage</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getStage</span>
<a name="line-4"></a>    <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>stage</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-5"></a>        <span class='hs-conid'>Splice</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>kcTopSpliceType</span> <span class='hs-varid'>hs_expr</span> <span class='hs-layout'>;</span>
<a name="line-6"></a>    	<span class='hs-conid'>Comp</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>kcTopSpliceType</span> <span class='hs-varid'>hs_expr</span> <span class='hs-layout'>;</span>
<a name="line-7"></a>
<a name="line-8"></a>    	<span class='hs-conid'>Brack</span> <span class='hs-varid'>pop_level</span> <span class='hs-varid'>ps_var</span> <span class='hs-varid'>lie_var</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-9"></a>	   <span class='hs-comment'>-- See Note [How brackets and nested splices are handled]</span>
<a name="line-10"></a>	   <span class='hs-comment'>-- A splice inside brackets</span>
<a name="line-11"></a>    <span class='hs-layout'>{</span> <span class='hs-varid'>meta_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>typeQTyConName</span>
<a name="line-12"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>expr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>setStage</span> <span class='hs-varid'>pop_level</span> <span class='hs-varop'>$</span>
<a name="line-13"></a>    	       <span class='hs-varid'>setLIEVar</span> <span class='hs-varid'>lie_var</span> <span class='hs-varop'>$</span>
<a name="line-14"></a>    	       <span class='hs-varid'>tcMonoExpr</span> <span class='hs-varid'>hs_expr</span> <span class='hs-varid'>meta_ty</span>
<a name="line-15"></a>
<a name="line-16"></a>    	<span class='hs-comment'>-- Write the pending splice into the bucket</span>
<a name="line-17"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>ps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readMutVar</span> <span class='hs-varid'>ps_var</span>
<a name="line-18"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>writeMutVar</span> <span class='hs-varid'>ps_var</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>name</span><span class='hs-layout'>,</span><span class='hs-varid'>expr'</span><span class='hs-layout'>)</span> <span class='hs-conop'>:</span> <span class='hs-varid'>ps</span><span class='hs-layout'>)</span>
<a name="line-19"></a>
<a name="line-20"></a>    <span class='hs-comment'>-- e.g.   [| f (g :: Int -&gt; $(h 4)) |]</span>
<a name="line-21"></a>    <span class='hs-comment'>-- Here (h 4) :: Q Type</span>
<a name="line-22"></a>    <span class='hs-comment'>-- but $(h 4) :: a 	i.e. any type, of any kind</span>
<a name="line-23"></a>
<a name="line-24"></a>    <span class='hs-comment'>-- We return a HsSpliceTyOut, which serves to convey the kind to </span>
<a name="line-25"></a>    <span class='hs-comment'>-- the ensuing TcHsType.dsHsType, which makes up a non-committal</span>
<a name="line-26"></a>    <span class='hs-comment'>-- type variable of a suitable kind</span>
<a name="line-27"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newKindVar</span>
<a name="line-28"></a>    <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsSpliceTyOut</span> <span class='hs-varid'>kind</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>	
<a name="line-29"></a>    <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="kcTopSpliceType"></a><span class='hs-definition'>kcTopSpliceType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>
<a name="line-32"></a><span class='hs-comment'>-- Note [How top-level splices are handled]</span>
<a name="line-33"></a><span class='hs-definition'>kcTopSpliceType</span> <span class='hs-varid'>expr</span>
<a name="line-34"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>meta_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>typeQTyConName</span>
<a name="line-35"></a>
<a name="line-36"></a>	<span class='hs-comment'>-- Typecheck the expression</span>
<a name="line-37"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>zonked_q_expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcTopSpliceExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcMonoExpr</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>meta_ty</span><span class='hs-layout'>)</span>
<a name="line-38"></a>
<a name="line-39"></a>	<span class='hs-comment'>-- Run the expression</span>
<a name="line-40"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"About to run"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>zonked_q_expr</span><span class='hs-layout'>)</span>
<a name="line-41"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>hs_ty2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runMetaT</span> <span class='hs-varid'>convertToHsType</span> <span class='hs-varid'>zonked_q_expr</span>
<a name="line-42"></a>  
<a name="line-43"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Got result"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>hs_ty2</span><span class='hs-layout'>)</span>
<a name="line-44"></a>
<a name="line-45"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>showSplice</span> <span class='hs-str'>"type"</span> <span class='hs-varid'>expr</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>hs_ty2</span><span class='hs-layout'>)</span>
<a name="line-46"></a>
<a name="line-47"></a>	<span class='hs-comment'>-- Rename it, but bale out if there are errors</span>
<a name="line-48"></a>	<span class='hs-comment'>-- otherwise the type checker just gives more spurious errors</span>
<a name="line-49"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"In the spliced type"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>hs_ty2</span>
<a name="line-50"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>hs_ty3</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>checkNoErrs</span> <span class='hs-layout'>(</span><span class='hs-varid'>rnLHsType</span> <span class='hs-varid'>doc</span> <span class='hs-varid'>hs_ty2</span><span class='hs-layout'>)</span>
<a name="line-51"></a>
<a name="line-52"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty4</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcLHsType</span> <span class='hs-varid'>hs_ty3</span>
<a name="line-53"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>ty4</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Splicing an expression}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcSpliceDecls"></a><span class='hs-comment'>-- Note [How top-level splices are handled]</span>
<a name="line-2"></a><span class='hs-comment'>-- Always at top level</span>
<a name="line-3"></a><span class='hs-comment'>-- Type sig at top of file:</span>
<a name="line-4"></a><span class='hs-comment'>-- 	tcSpliceDecls :: LHsExpr Name -&gt; TcM [LHsDecl RdrName]</span>
<a name="line-5"></a><span class='hs-definition'>tcSpliceDecls</span> <span class='hs-varid'>expr</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>meta_dec_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>decTyConName</span>
<a name="line-7"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>meta_q_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>qTyConName</span>
<a name="line-8"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>list_q</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkAppTy</span> <span class='hs-varid'>meta_q_ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkListTy</span> <span class='hs-varid'>meta_dec_ty</span><span class='hs-layout'>)</span>
<a name="line-9"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>zonked_q_expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcTopSpliceExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcMonoExpr</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>list_q</span><span class='hs-layout'>)</span>
<a name="line-10"></a>
<a name="line-11"></a>		<span class='hs-comment'>-- Run the expression</span>
<a name="line-12"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"About to run"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>zonked_q_expr</span><span class='hs-layout'>)</span>
<a name="line-13"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>decls</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runMetaD</span> <span class='hs-varid'>convertToHsDecls</span> <span class='hs-varid'>zonked_q_expr</span>
<a name="line-14"></a>
<a name="line-15"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Got result"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>decls</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-16"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>showSplice</span> <span class='hs-str'>"declarations"</span>
<a name="line-17"></a>	  	     <span class='hs-varid'>expr</span> 
<a name="line-18"></a>		     <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>getLoc</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> <span class='hs-varop'>$$</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>decls</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-19"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>decls</span> <span class='hs-layout'>}</span>
</pre>\end{code}


%************************************************************************
%*									*
	Annotations
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="runAnnotation"></a><span class='hs-definition'>runAnnotation</span> <span class='hs-varid'>target</span> <span class='hs-varid'>expr</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-2"></a>    <span class='hs-comment'>-- Find the classes we want instances for in order to call toAnnotationWrapper</span>
<a name="line-3"></a>    <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSrcSpanM</span>
<a name="line-4"></a>    <span class='hs-varid'>data_class</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupClass</span> <span class='hs-varid'>dataClassName</span>
<a name="line-5"></a>    <span class='hs-varid'>to_annotation_wrapper_id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupId</span> <span class='hs-varid'>toAnnotationWrapperName</span>
<a name="line-6"></a>    
<a name="line-7"></a>    <span class='hs-comment'>-- Check the instances we require live in another module (we want to execute it..)</span>
<a name="line-8"></a>    <span class='hs-comment'>-- and check identifiers live in other modules using TH stage checks. tcSimplifyStagedExpr</span>
<a name="line-9"></a>    <span class='hs-comment'>-- also resolves the LIE constraints to detect e.g. instance ambiguity</span>
<a name="line-10"></a>    <span class='hs-varid'>zonked_wrapped_expr'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcTopSpliceExpr</span> <span class='hs-varop'>$</span> 
<a name="line-11"></a>           <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>expr'</span><span class='hs-layout'>,</span> <span class='hs-varid'>expr_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcInferRhoNC</span> <span class='hs-varid'>expr</span>
<a name="line-12"></a>		<span class='hs-comment'>-- We manually wrap the typechecked expression in a call to toAnnotationWrapper</span>
<a name="line-13"></a>                <span class='hs-comment'>-- By instantiating the call &gt;here&lt; it gets registered in the </span>
<a name="line-14"></a>		<span class='hs-comment'>-- LIE consulted by tcTopSpliceExpr</span>
<a name="line-15"></a>                <span class='hs-comment'>-- and hence ensures the appropriate dictionary is bound by const_binds</span>
<a name="line-16"></a>              <span class='hs-layout'>;</span> <span class='hs-varid'>wrapper</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>instCall</span> <span class='hs-conid'>AnnOrigin</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>expr_ty</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mkClassPred</span> <span class='hs-varid'>data_class</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>expr_ty</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-17"></a>              <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>specialised_to_annotation_wrapper_expr</span>  
<a name="line-18"></a>                      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsWrap</span> <span class='hs-varid'>wrapper</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsVar</span> <span class='hs-varid'>to_annotation_wrapper_id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-19"></a>              <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsApp</span> <span class='hs-varid'>specialised_to_annotation_wrapper_expr</span> <span class='hs-varid'>expr'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-20"></a>
<a name="line-21"></a>    <span class='hs-comment'>-- Run the appropriately wrapped expression to get the value of</span>
<a name="line-22"></a>    <span class='hs-comment'>-- the annotation and its dictionaries. The return value is of</span>
<a name="line-23"></a>    <span class='hs-comment'>-- type AnnotationWrapper by construction, so this conversion is</span>
<a name="line-24"></a>    <span class='hs-comment'>-- safe</span>
<a name="line-25"></a>    <span class='hs-varid'>flip</span> <span class='hs-varid'>runMetaAW</span> <span class='hs-varid'>zonked_wrapped_expr'</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>annotation_wrapper</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-26"></a>        <span class='hs-keyword'>case</span> <span class='hs-varid'>annotation_wrapper</span> <span class='hs-keyword'>of</span>
<a name="line-27"></a>            <span class='hs-conid'>AnnotationWrapper</span> <span class='hs-varid'>value</span> <span class='hs-keyglyph'>|</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>serialized</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toSerialized</span> <span class='hs-varid'>serializeWithData</span> <span class='hs-varid'>value</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-28"></a>                <span class='hs-comment'>-- Got the value and dictionaries: build the serialized value and </span>
<a name="line-29"></a>		<span class='hs-comment'>-- call it a day. We ensure that we seq the entire serialized value </span>
<a name="line-30"></a>		<span class='hs-comment'>-- in order that any errors in the user-written code for the</span>
<a name="line-31"></a>                <span class='hs-comment'>-- annotation are exposed at this point.  This is also why we are </span>
<a name="line-32"></a>		<span class='hs-comment'>-- doing all this stuff inside the context of runMeta: it has the </span>
<a name="line-33"></a>		<span class='hs-comment'>-- facilities to deal with user error in a meta-level expression</span>
<a name="line-34"></a>                <span class='hs-varid'>seqSerialized</span> <span class='hs-varid'>serialized</span> <span class='hs-varop'>`seq`</span> <span class='hs-conid'>Annotation</span> <span class='hs-layout'>{</span> 
<a name="line-35"></a>                    <span class='hs-varid'>ann_target</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>target</span><span class='hs-layout'>,</span>
<a name="line-36"></a>                    <span class='hs-varid'>ann_value</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>serialized</span>
<a name="line-37"></a>                <span class='hs-layout'>}</span>
</pre>\end{code}


%************************************************************************
%*									*
	Quasi-quoting
%*									*
%************************************************************************

Note [Quasi-quote overview]
~~~~~~~~~~~~~~~~~~~~~~~~~~~
The GHC "quasi-quote" extension is described by Geoff Mainland's paper
"Why it's nice to be quoted: quasiquoting for Haskell" (Haskell
Workshop 2007).

Briefly, one writes
	[:p| stuff |]
and the arbitrary string "stuff" gets parsed by the parser 'p', whose
type should be Language.Haskell.TH.Quote.QuasiQuoter.  'p' must be
defined in another module, because we are going to run it here.  It's
a bit like a TH splice:
	$(p "stuff")

However, you can do this in patterns as well as terms.  Becuase of this,
the splice is run by the *renamer* rather than the type checker.

\begin{code}
<pre><a name="line-1"></a><a name="runQuasiQuote"></a><span class='hs-definition'>runQuasiQuote</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>hs_syn</span>
<a name="line-2"></a>              <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>HsQuasiQuote</span> <span class='hs-conid'>Name</span>	<span class='hs-comment'>-- Contains term of type QuasiQuoter, and the String</span>
<a name="line-3"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span>			<span class='hs-comment'>-- Of type QuasiQuoter -&gt; String -&gt; Q th_syn</span>
<a name="line-4"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>			<span class='hs-comment'>-- Documentation string only</span>
<a name="line-5"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span>			<span class='hs-comment'>-- Name of th_syn type  </span>
<a name="line-6"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>th_syn</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-varid'>hs_syn</span><span class='hs-layout'>)</span>
<a name="line-7"></a>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>hs_syn</span>
<a name="line-8"></a><span class='hs-definition'>runQuasiQuote</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsQuasiQuote</span> <span class='hs-sel'>_name</span> <span class='hs-varid'>quoter</span> <span class='hs-varid'>q_span</span> <span class='hs-varid'>quote</span><span class='hs-layout'>)</span> <span class='hs-varid'>quote_selector</span> <span class='hs-varid'>desc</span> <span class='hs-varid'>meta_ty</span> <span class='hs-varid'>convert</span>
<a name="line-9"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-comment'>-- Check that the quoter is not locally defined, otherwise the TH</span>
<a name="line-10"></a>          <span class='hs-comment'>-- machinery will not be able to run the quasiquote.</span>
<a name="line-11"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>this_mod</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getModule</span>
<a name="line-12"></a>        <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>is_local</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>nameModule_maybe</span> <span class='hs-varid'>quoter</span> <span class='hs-keyword'>of</span>
<a name="line-13"></a>                           <span class='hs-conid'>Just</span> <span class='hs-varid'>mod</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>mod</span> <span class='hs-varop'>==</span> <span class='hs-varid'>this_mod</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-14"></a>                                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-15"></a>                           <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-16"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"runQQ"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>quoter</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>is_local</span><span class='hs-layout'>)</span>
<a name="line-17"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>not</span> <span class='hs-varid'>is_local</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>quoteStageError</span> <span class='hs-varid'>quoter</span><span class='hs-layout'>)</span>
<a name="line-18"></a>
<a name="line-19"></a>	  <span class='hs-comment'>-- Build the expression </span>
<a name="line-20"></a>      	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>quoterExpr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varid'>q_span</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>HsVar</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>quoter</span>
<a name="line-21"></a>      	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>quoteExpr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varid'>q_span</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>HsLit</span> <span class='hs-varop'>$!</span> <span class='hs-conid'>HsString</span> <span class='hs-varid'>quote</span>
<a name="line-22"></a>      	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>expr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>L</span> <span class='hs-varid'>q_span</span> <span class='hs-varop'>$</span>
<a name="line-23"></a>      	             <span class='hs-conid'>HsApp</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>q_span</span> <span class='hs-varop'>$</span>
<a name="line-24"></a>      	                    <span class='hs-conid'>HsApp</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>q_span</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsVar</span> <span class='hs-varid'>quote_selector</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>quoterExpr</span><span class='hs-layout'>)</span> <span class='hs-varid'>quoteExpr</span>
<a name="line-25"></a>      	<span class='hs-layout'>;</span> <span class='hs-varid'>meta_exp_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcMetaTy</span> <span class='hs-varid'>meta_ty</span>
<a name="line-26"></a>
<a name="line-27"></a>      	<span class='hs-comment'>-- Typecheck the expression</span>
<a name="line-28"></a>      	<span class='hs-layout'>;</span> <span class='hs-varid'>zonked_q_expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcTopSpliceExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcMonoExpr</span> <span class='hs-varid'>expr</span> <span class='hs-varid'>meta_exp_ty</span><span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a>      	<span class='hs-comment'>-- Run the expression</span>
<a name="line-31"></a>      	<span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"About to run"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>zonked_q_expr</span><span class='hs-layout'>)</span>
<a name="line-32"></a>      	<span class='hs-layout'>;</span> <span class='hs-varid'>result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>runMetaQ</span> <span class='hs-varid'>convert</span> <span class='hs-varid'>zonked_q_expr</span>
<a name="line-33"></a>      	<span class='hs-layout'>;</span> <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Got result"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>result</span><span class='hs-layout'>)</span>
<a name="line-34"></a>      	<span class='hs-layout'>;</span> <span class='hs-varid'>showSplice</span> <span class='hs-varid'>desc</span> <span class='hs-varid'>quoteExpr</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>result</span><span class='hs-layout'>)</span>
<a name="line-35"></a>      	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>result</span>
<a name="line-36"></a>      	<span class='hs-layout'>}</span>
<a name="line-37"></a>
<a name="line-38"></a><a name="runQuasiQuoteExpr"></a><span class='hs-definition'>runQuasiQuoteExpr</span> <span class='hs-varid'>quasiquote</span>
<a name="line-39"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runQuasiQuote</span> <span class='hs-varid'>quasiquote</span> <span class='hs-varid'>quoteExpName</span> <span class='hs-str'>"expression"</span> <span class='hs-varid'>expQTyConName</span> <span class='hs-varid'>convertToHsExpr</span>
<a name="line-40"></a>
<a name="line-41"></a><a name="runQuasiQuotePat"></a><span class='hs-definition'>runQuasiQuotePat</span> <span class='hs-varid'>quasiquote</span>
<a name="line-42"></a>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runQuasiQuote</span> <span class='hs-varid'>quasiquote</span> <span class='hs-varid'>quotePatName</span> <span class='hs-str'>"pattern"</span> <span class='hs-varid'>patQTyConName</span> <span class='hs-varid'>convertToPat</span>
<a name="line-43"></a>
<a name="line-44"></a><a name="quoteStageError"></a><span class='hs-definition'>quoteStageError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-45"></a><span class='hs-definition'>quoteStageError</span> <span class='hs-varid'>quoter</span>
<a name="line-46"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"GHC stage restriction:"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>quoter</span><span class='hs-layout'>,</span>
<a name="line-47"></a>         <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is used in a quasiquote, and must be imported, not defined locally"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Running an expression}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="runMetaAW"></a><span class='hs-definition'>runMetaAW</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnnotationWrapper</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>output</span><span class='hs-layout'>)</span>
<a name="line-2"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span>         <span class='hs-comment'>-- Of type AnnotationWrapper</span>
<a name="line-3"></a>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>output</span>
<a name="line-4"></a><span class='hs-definition'>runMetaAW</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runMeta</span> <span class='hs-conid'>False</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Right</span> <span class='hs-varop'>.</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-5"></a>    <span class='hs-comment'>-- We turn off showing the code in meta-level exceptions because doing so exposes</span>
<a name="line-6"></a>    <span class='hs-comment'>-- the toAnnotationWrapper function that we slap around the users code</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="runQThen"></a><span class='hs-definition'>runQThen</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>input</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-varid'>output</span><span class='hs-layout'>)</span>
<a name="line-9"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SrcSpan</span>
<a name="line-10"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Q</span> <span class='hs-varid'>input</span>
<a name="line-11"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-varid'>output</span><span class='hs-layout'>)</span>
<a name="line-12"></a><span class='hs-definition'>runQThen</span> <span class='hs-varid'>f</span> <span class='hs-varid'>expr_span</span> <span class='hs-varid'>what</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>runQ</span> <span class='hs-varid'>what</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>f</span> <span class='hs-varid'>expr_span</span><span class='hs-layout'>)</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="runMetaQ"></a><span class='hs-definition'>runMetaQ</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>input</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-varid'>output</span><span class='hs-layout'>)</span>
<a name="line-15"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span>
<a name="line-16"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>output</span>
<a name="line-17"></a><span class='hs-definition'>runMetaQ</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runMeta</span> <span class='hs-conid'>True</span> <span class='hs-varop'>.</span> <span class='hs-varid'>runQThen</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="runMetaE"></a><span class='hs-definition'>runMetaE</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Exp</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-20"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span> 		<span class='hs-comment'>-- Of type (Q Exp)</span>
<a name="line-21"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-definition'>runMetaE</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runMetaQ</span>
<a name="line-23"></a>
<a name="line-24"></a><a name="runMetaP"></a><span class='hs-definition'>runMetaP</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Pat</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-25"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span>          <span class='hs-comment'>-- Of type (Q Pat)</span>
<a name="line-26"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Pat</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span>
<a name="line-27"></a><span class='hs-definition'>runMetaP</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runMetaQ</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="runMetaT"></a><span class='hs-definition'>runMetaT</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-30"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span> 		<span class='hs-comment'>-- Of type (Q Type)</span>
<a name="line-31"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span>	
<a name="line-32"></a><span class='hs-definition'>runMetaT</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runMetaQ</span>
<a name="line-33"></a>
<a name="line-34"></a><a name="runMetaD"></a><span class='hs-definition'>runMetaD</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Dec</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-35"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span> 		<span class='hs-comment'>-- Of type Q [Dec]</span>
<a name="line-36"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-keyglyph'>]</span>
<a name="line-37"></a><span class='hs-definition'>runMetaD</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>runMetaQ</span>
<a name="line-38"></a>
<a name="line-39"></a><a name="runMeta"></a><span class='hs-definition'>runMeta</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>                 <span class='hs-comment'>-- Whether code should be printed in the exception message</span>
<a name="line-40"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>SrcSpan</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>input</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>Message</span> <span class='hs-varid'>output</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-41"></a>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Id</span> 		<span class='hs-comment'>-- Of type X</span>
<a name="line-42"></a>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>output</span>		<span class='hs-comment'>-- Of type t</span>
<a name="line-43"></a><span class='hs-definition'>runMeta</span> <span class='hs-varid'>show_code</span> <span class='hs-varid'>run_and_convert</span> <span class='hs-varid'>expr</span>
<a name="line-44"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> 	<span class='hs-comment'>-- Desugar</span>
<a name="line-45"></a>	  <span class='hs-varid'>ds_expr</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>initDsTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>dsLExpr</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span>
<a name="line-46"></a>	<span class='hs-comment'>-- Compile and link it; might fail if linking fails</span>
<a name="line-47"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getTopEnv</span>
<a name="line-48"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>src_span</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSrcSpanM</span>
<a name="line-49"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>either_hval</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tryM</span> <span class='hs-varop'>$</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span>
<a name="line-50"></a>			 <span class='hs-conid'>HscMain</span><span class='hs-varop'>.</span><span class='hs-varid'>compileExpr</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varid'>src_span</span> <span class='hs-varid'>ds_expr</span>
<a name="line-51"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>either_hval</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-52"></a>	    <span class='hs-conid'>Left</span> <span class='hs-varid'>exn</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>mk_msg</span> <span class='hs-str'>"compile and link"</span> <span class='hs-varid'>exn</span><span class='hs-layout'>)</span> <span class='hs-layout'>;</span>
<a name="line-53"></a>	    <span class='hs-conid'>Right</span> <span class='hs-varid'>hval</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-54"></a>
<a name="line-55"></a>	<span class='hs-layout'>{</span> 	<span class='hs-comment'>-- Coerce it to Q t, and run it</span>
<a name="line-56"></a>
<a name="line-57"></a>		<span class='hs-comment'>-- Running might fail if it throws an exception of any kind (hence tryAllM)</span>
<a name="line-58"></a>		<span class='hs-comment'>-- including, say, a pattern-match exception in the code we are running</span>
<a name="line-59"></a>		<span class='hs-comment'>--</span>
<a name="line-60"></a>		<span class='hs-comment'>-- We also do the TH -&gt; HS syntax conversion inside the same</span>
<a name="line-61"></a>		<span class='hs-comment'>-- exception-cacthing thing so that if there are any lurking </span>
<a name="line-62"></a>		<span class='hs-comment'>-- exceptions in the data structure returned by hval, we'll</span>
<a name="line-63"></a>		<span class='hs-comment'>-- encounter them inside the try</span>
<a name="line-64"></a>		<span class='hs-comment'>--</span>
<a name="line-65"></a>		<span class='hs-comment'>-- See Note [Exceptions in TH] </span>
<a name="line-66"></a>	  <span class='hs-keyword'>let</span> <span class='hs-varid'>expr_span</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getLoc</span> <span class='hs-varid'>expr</span>
<a name="line-67"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>either_tval</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tryAllM</span> <span class='hs-varop'>$</span>
<a name="line-68"></a>            		 <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>expr_span</span> <span class='hs-varop'>$</span>	<span class='hs-comment'>-- Set the span so that qLocation can</span>
<a name="line-69"></a>						<span class='hs-comment'>-- see where this splice is</span>
<a name="line-70"></a>	     <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>mb_result</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>run_and_convert</span> <span class='hs-varid'>expr_span</span> <span class='hs-layout'>(</span><span class='hs-varid'>unsafeCoerce</span><span class='hs-cpp'>#</span> <span class='hs-varid'>hval</span><span class='hs-layout'>)</span>
<a name="line-71"></a>		<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_result</span> <span class='hs-keyword'>of</span>
<a name="line-72"></a>		    <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-varid'>err</span>
<a name="line-73"></a>		    <span class='hs-conid'>Right</span> <span class='hs-varid'>result</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>result</span> <span class='hs-layout'>}</span>
<a name="line-74"></a>
<a name="line-75"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>either_tval</span> <span class='hs-keyword'>of</span>
<a name="line-76"></a>	    <span class='hs-conid'>Right</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>v</span>
<a name="line-77"></a>	    <span class='hs-conid'>Left</span> <span class='hs-varid'>se</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-78"></a>                    <span class='hs-keyword'>case</span> <span class='hs-varid'>fromException</span> <span class='hs-varid'>se</span> <span class='hs-keyword'>of</span>
<a name="line-79"></a>                    <span class='hs-conid'>Just</span> <span class='hs-conid'>IOEnvFailure</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-80"></a>                        <span class='hs-varid'>failM</span> <span class='hs-comment'>-- Error already in Tc monad</span>
<a name="line-81"></a>                    <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>mk_msg</span> <span class='hs-str'>"run"</span> <span class='hs-varid'>se</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- Exception</span>
<a name="line-82"></a>        <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-83"></a>  <span class='hs-keyword'>where</span>
<a name="line-84"></a>    <span class='hs-varid'>mk_msg</span> <span class='hs-varid'>s</span> <span class='hs-varid'>exn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"Exception when trying to"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-varid'>s</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"compile-time code:"</span><span class='hs-layout'>,</span>
<a name="line-85"></a>			 <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-conid'>Panic</span><span class='hs-varop'>.</span><span class='hs-varid'>showException</span> <span class='hs-varid'>exn</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-86"></a>			 <span class='hs-keyword'>if</span> <span class='hs-varid'>show_code</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Code:"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>expr</span><span class='hs-layout'>)</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>empty</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

Note [Exceptions in TH]
~~~~~~~~~~~~~~~~~~~~~~~
Supppose we have something like this 
	$( f 4 )
where
	f :: Int -> Q [Dec]
	f n | n>3       = fail "Too many declarations"
	    | otherwise = ...

The 'fail' is a user-generated failure, and should be displayed as a
perfectly ordinary compiler error message, not a panic or anything
like that.  Here's how it's processed:

  * 'fail' is the monad fail.  The monad instance for Q in TH.Syntax
    effectively transforms (fail s) to 
	qReport True s >> fail
    where 'qReport' comes from the Quasi class and fail from its monad
    superclass.

  * The TcM monad is an instance of Quasi (see TcSplice), and it implements
    (qReport True s) by using addErr to add an error message to the bag of errors.
    The 'fail' in TcM raises an IOEnvFailure exception

  * So, when running a splice, we catch all exceptions; then for 
	- an IOEnvFailure exception, we assume the error is already 
		in the error-bag (above)
	- other errors, we add an error to the bag
    and then fail


To call runQ in the Tc monad, we need to make TcM an instance of Quasi:

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Quasi</span> <span class='hs-layout'>(</span><span class='hs-conid'>IOEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>Env</span> <span class='hs-conid'>TcGblEnv</span> <span class='hs-conid'>TcLclEnv</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-2"></a>  <span class='hs-varid'>qNewName</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>u</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUnique</span> 
<a name="line-3"></a>		  <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>i</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getKey</span> <span class='hs-varid'>u</span>
<a name="line-4"></a>		  <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>mkNameU</span> <span class='hs-varid'>s</span> <span class='hs-varid'>i</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-5"></a>
<a name="line-6"></a>  <span class='hs-varid'>qReport</span> <span class='hs-conid'>True</span> <span class='hs-varid'>msg</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addErr</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span>
<a name="line-7"></a>  <span class='hs-varid'>qReport</span> <span class='hs-conid'>False</span> <span class='hs-varid'>msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addReport</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span> <span class='hs-varid'>empty</span>
<a name="line-8"></a>
<a name="line-9"></a>  <span class='hs-varid'>qLocation</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getModule</span>
<a name="line-10"></a>		 <span class='hs-layout'>;</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSrcSpanM</span>
<a name="line-11"></a>		 <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Loc</span> <span class='hs-layout'>{</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>loc_filename</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unpackFS</span> <span class='hs-layout'>(</span><span class='hs-varid'>srcSpanFile</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-12"></a>				  <span class='hs-layout'>,</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>loc_module</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>moduleNameString</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-13"></a>				  <span class='hs-layout'>,</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>loc_package</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>packageIdString</span> <span class='hs-layout'>(</span><span class='hs-varid'>modulePackageId</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-14"></a>				  <span class='hs-layout'>,</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>loc_start</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>srcSpanStartLine</span> <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>srcSpanStartCol</span> <span class='hs-varid'>l</span><span class='hs-layout'>)</span>
<a name="line-15"></a>				  <span class='hs-layout'>,</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>loc_end</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>srcSpanEndLine</span>   <span class='hs-varid'>l</span><span class='hs-layout'>,</span> <span class='hs-varid'>srcSpanEndCol</span>   <span class='hs-varid'>l</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-16"></a>		
<a name="line-17"></a>  <span class='hs-varid'>qReify</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reify</span> <span class='hs-varid'>v</span>
<a name="line-18"></a>
<a name="line-19"></a>	<span class='hs-comment'>-- For qRecover, discard error messages if </span>
<a name="line-20"></a>	<span class='hs-comment'>-- the recovery action is chosen.  Otherwise</span>
<a name="line-21"></a>	<span class='hs-comment'>-- we'll only fail higher up.  c.f. tryTcLIE_</span>
<a name="line-22"></a>  <span class='hs-varid'>qRecover</span> <span class='hs-varid'>recover</span> <span class='hs-varid'>main</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>msgs</span><span class='hs-layout'>,</span> <span class='hs-varid'>mb_res</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tryTcErrs</span> <span class='hs-varid'>main</span>
<a name="line-23"></a>			     <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_res</span> <span class='hs-keyword'>of</span>
<a name="line-24"></a>		  	         <span class='hs-conid'>Just</span> <span class='hs-varid'>val</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>addMessages</span> <span class='hs-varid'>msgs</span>	<span class='hs-comment'>-- There might be warnings</span>
<a name="line-25"></a>				   	        <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>val</span> <span class='hs-layout'>}</span>
<a name="line-26"></a>		  	         <span class='hs-conid'>Nothing</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>recover</span>			<span class='hs-comment'>-- Discard all msgs</span>
<a name="line-27"></a>			  <span class='hs-layout'>}</span>
<a name="line-28"></a>
<a name="line-29"></a>  <span class='hs-varid'>qRunIO</span> <span class='hs-varid'>io</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftIO</span> <span class='hs-varid'>io</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Errors and contexts}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="showSplice"></a><span class='hs-definition'>showSplice</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsExpr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>()</span>
<a name="line-2"></a><span class='hs-comment'>-- Note that 'before' is *renamed* but not *typechecked*</span>
<a name="line-3"></a><span class='hs-comment'>-- Reason (a) less typechecking crap</span>
<a name="line-4"></a><span class='hs-comment'>--        (b) data constructors after type checking have been</span>
<a name="line-5"></a><span class='hs-comment'>--	      changed to their *wrappers*, and that makes them</span>
<a name="line-6"></a><span class='hs-comment'>--	      print always fully qualified</span>
<a name="line-7"></a><span class='hs-definition'>showSplice</span> <span class='hs-varid'>what</span> <span class='hs-varid'>before</span> <span class='hs-varid'>after</span>
<a name="line-8"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>loc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSrcSpanM</span>
<a name="line-9"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>traceSplice</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>loc</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>colon</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"Splicing"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-varid'>what</span><span class='hs-layout'>,</span> 
<a name="line-10"></a>		            <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>before</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-11"></a>				         <span class='hs-varid'>text</span> <span class='hs-str'>"======&gt;"</span><span class='hs-layout'>,</span>
<a name="line-12"></a>				         <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-varid'>after</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="illegalBracket"></a><span class='hs-definition'>illegalBracket</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span>
<a name="line-15"></a><span class='hs-definition'>illegalBracket</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Template Haskell brackets cannot be nested (without intervening splices)"</span><span class='hs-layout'>)</span>
<a name="line-16"></a><span class='hs-cpp'>#endif 	/* GHCI */</span>
</pre>\end{code}


%************************************************************************
%*									*
			Reification
%*									*
%************************************************************************


\begin{code}
<pre><a name="line-1"></a><a name="reify"></a><span class='hs-definition'>reify</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Info</span>
<a name="line-2"></a><span class='hs-definition'>reify</span> <span class='hs-varid'>th_name</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupThName</span> <span class='hs-varid'>th_name</span>
<a name="line-4"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupTh</span> <span class='hs-varid'>name</span>
<a name="line-5"></a>		<span class='hs-comment'>-- ToDo: this tcLookup could fail, which would give a</span>
<a name="line-6"></a>		<span class='hs-comment'>-- 	 rather unhelpful error message</span>
<a name="line-7"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>traceIf</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"reify"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>th_name</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>brackets</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr_ns</span> <span class='hs-varid'>th_name</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-8"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>reifyThing</span> <span class='hs-varid'>thing</span>
<a name="line-9"></a>    <span class='hs-layout'>}</span>
<a name="line-10"></a>  <span class='hs-keyword'>where</span>
<a name="line-11"></a>    <span class='hs-varid'>ppr_ns</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>NameG</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>DataName</span> <span class='hs-sel'>_pkg</span> <span class='hs-sel'>_mod</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"data"</span>
<a name="line-12"></a>    <span class='hs-varid'>ppr_ns</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>NameG</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>TcClsName</span> <span class='hs-sel'>_pkg</span> <span class='hs-sel'>_mod</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"tc"</span>
<a name="line-13"></a>    <span class='hs-varid'>ppr_ns</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>NameG</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>VarName</span> <span class='hs-sel'>_pkg</span> <span class='hs-sel'>_mod</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"var"</span>
<a name="line-14"></a>    <span class='hs-varid'>ppr_ns</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"reify/ppr_ns"</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="lookupThName"></a><span class='hs-definition'>lookupThName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Name</span>
<a name="line-17"></a><span class='hs-definition'>lookupThName</span> <span class='hs-varid'>th_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-18"></a>    <span class='hs-varid'>mb_name</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupThName_maybe</span> <span class='hs-varid'>th_name</span>
<a name="line-19"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_name</span> <span class='hs-keyword'>of</span>
<a name="line-20"></a>        <span class='hs-conid'>Nothing</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>notInScope</span> <span class='hs-varid'>th_name</span><span class='hs-layout'>)</span>
<a name="line-21"></a>        <span class='hs-conid'>Just</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>name</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="lookupThName_maybe"></a><span class='hs-definition'>lookupThName_maybe</span> <span class='hs-varid'>th_name</span>
<a name="line-24"></a>  <span class='hs-keyglyph'>=</span>  <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>names</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapMaybeM</span> <span class='hs-varid'>lookup</span> <span class='hs-layout'>(</span><span class='hs-varid'>thRdrNameGuesses</span> <span class='hs-varid'>th_name</span><span class='hs-layout'>)</span>
<a name="line-25"></a>          <span class='hs-comment'>-- Pick the first that works</span>
<a name="line-26"></a>	  <span class='hs-comment'>-- E.g. reify (mkName "A") will pick the class A in preference to the data constructor A</span>
<a name="line-27"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>listToMaybe</span> <span class='hs-varid'>names</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>	
<a name="line-28"></a>  <span class='hs-keyword'>where</span>
<a name="line-29"></a>    <span class='hs-varid'>lookup</span> <span class='hs-varid'>rdr_name</span>
<a name="line-30"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> 	<span class='hs-comment'>-- Repeat much of lookupOccRn, becase we want</span>
<a name="line-31"></a>		<span class='hs-comment'>-- to report errors in a TH-relevant way</span>
<a name="line-32"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>rdr_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getLocalRdrEnv</span>
<a name="line-33"></a>  	     <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupLocalRdrEnv</span> <span class='hs-varid'>rdr_env</span> <span class='hs-varid'>rdr_name</span> <span class='hs-keyword'>of</span>
<a name="line-34"></a>		 <span class='hs-conid'>Just</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-35"></a>	         <span class='hs-conid'>Nothing</span>   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>lookupGlobalOccRn_maybe</span> <span class='hs-varid'>rdr_name</span> <span class='hs-layout'>}</span>
<a name="line-36"></a>
<a name="line-37"></a><a name="tcLookupTh"></a><span class='hs-definition'>tcLookupTh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TcTyThing</span>
<a name="line-38"></a><span class='hs-comment'>-- This is a specialised version of TcEnv.tcLookup; specialised mainly in that</span>
<a name="line-39"></a><span class='hs-comment'>-- it gives a reify-related error message on failure, whereas in the normal</span>
<a name="line-40"></a><span class='hs-comment'>-- tcLookup, failure is a bug.</span>
<a name="line-41"></a><span class='hs-definition'>tcLookupTh</span> <span class='hs-varid'>name</span>
<a name="line-42"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>gbl_env</span><span class='hs-layout'>,</span> <span class='hs-varid'>lcl_env</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getEnvs</span>
<a name="line-43"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupNameEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcl_env</span> <span class='hs-varid'>lcl_env</span><span class='hs-layout'>)</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>of</span> <span class='hs-layout'>{</span>
<a name="line-44"></a>		<span class='hs-conid'>Just</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>thing</span><span class='hs-layout'>;</span>
<a name="line-45"></a>		<span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-46"></a>	<span class='hs-layout'>{</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>nameIsLocalOrFrom</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcg_mod</span> <span class='hs-varid'>gbl_env</span><span class='hs-layout'>)</span> <span class='hs-varid'>name</span>
<a name="line-47"></a>	  <span class='hs-keyword'>then</span>	<span class='hs-comment'>-- It's defined in this module</span>
<a name="line-48"></a>	      <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupNameEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcg_type_env</span> <span class='hs-varid'>gbl_env</span><span class='hs-layout'>)</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>of</span>
<a name="line-49"></a>		<span class='hs-conid'>Just</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>AGlobal</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span>
<a name="line-50"></a>		<span class='hs-conid'>Nothing</span>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>notInEnv</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-51"></a>	 
<a name="line-52"></a>	  <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> 		<span class='hs-comment'>-- It's imported</span>
<a name="line-53"></a>	<span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>eps</span><span class='hs-layout'>,</span><span class='hs-varid'>hpt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getEpsAndHpt</span>
<a name="line-54"></a>        <span class='hs-layout'>;</span> <span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getDOpts</span>
<a name="line-55"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupType</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>hpt</span> <span class='hs-layout'>(</span><span class='hs-varid'>eps_PTE</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span> <span class='hs-varid'>name</span> <span class='hs-keyword'>of</span> 
<a name="line-56"></a>	    <span class='hs-conid'>Just</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>AGlobal</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span>
<a name="line-57"></a>	    <span class='hs-conid'>Nothing</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcImportDecl</span> <span class='hs-varid'>name</span>
<a name="line-58"></a>			     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>AGlobal</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-59"></a>		<span class='hs-comment'>-- Imported names should always be findable; </span>
<a name="line-60"></a>		<span class='hs-comment'>-- if not, we fail hard in tcImportDecl</span>
<a name="line-61"></a>    <span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="notInScope"></a><span class='hs-definition'>notInScope</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-64"></a><span class='hs-definition'>notInScope</span> <span class='hs-varid'>th_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>pprint</span> <span class='hs-varid'>th_name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-65"></a>		     <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is not in scope at a reify"</span><span class='hs-layout'>)</span>
<a name="line-66"></a>	<span class='hs-comment'>-- Ugh! Rather an indirect way to display the name</span>
<a name="line-67"></a>
<a name="line-68"></a><a name="notInEnv"></a><span class='hs-definition'>notInEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-69"></a><span class='hs-definition'>notInEnv</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-70"></a>		     <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is not in the type environment at a reify"</span><span class='hs-layout'>)</span>
<a name="line-71"></a>
<a name="line-72"></a><a name="reifyThing"></a><span class='hs-comment'>------------------------------</span>
<a name="line-73"></a><span class='hs-definition'>reifyThing</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcTyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Info</span>
<a name="line-74"></a><span class='hs-comment'>-- The only reason this is monadic is for error reporting,</span>
<a name="line-75"></a><span class='hs-comment'>-- which in turn is mainly for the case when TH can't express</span>
<a name="line-76"></a><span class='hs-comment'>-- some random GHC extension</span>
<a name="line-77"></a>
<a name="line-78"></a><span class='hs-definition'>reifyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>AGlobal</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnId</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-79"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-80"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>fix</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyFixity</span> <span class='hs-layout'>(</span><span class='hs-varid'>idName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-81"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyName</span> <span class='hs-varid'>id</span>
<a name="line-82"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>idDetails</span> <span class='hs-varid'>id</span> <span class='hs-keyword'>of</span>
<a name="line-83"></a>	    <span class='hs-conid'>ClassOpId</span> <span class='hs-varid'>cls</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>ClassOpI</span> <span class='hs-varid'>v</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span> <span class='hs-varid'>fix</span><span class='hs-layout'>)</span>
<a name="line-84"></a>	    <span class='hs-keyword'>_</span>                <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>VarI</span>     <span class='hs-varid'>v</span> <span class='hs-varid'>ty</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>fix</span><span class='hs-layout'>)</span>
<a name="line-85"></a>    <span class='hs-layout'>}</span>
<a name="line-86"></a>
<a name="line-87"></a><span class='hs-definition'>reifyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>AGlobal</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyTyCon</span> <span class='hs-varid'>tc</span>
<a name="line-88"></a><span class='hs-definition'>reifyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>AGlobal</span> <span class='hs-layout'>(</span><span class='hs-conid'>AClass</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyClass</span> <span class='hs-varid'>cls</span>
<a name="line-89"></a><span class='hs-definition'>reifyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>AGlobal</span> <span class='hs-layout'>(</span><span class='hs-conid'>ADataCon</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-90"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dataConName</span> <span class='hs-varid'>dc</span>
<a name="line-91"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-layout'>(</span><span class='hs-varid'>dataConWrapId</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-92"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>fix</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyFixity</span> <span class='hs-varid'>name</span>
<a name="line-93"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>DataConI</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span> 
<a name="line-94"></a>                              <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-layout'>(</span><span class='hs-varid'>dataConOrigTyCon</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>fix</span><span class='hs-layout'>)</span> 
<a name="line-95"></a>        <span class='hs-layout'>}</span>
<a name="line-96"></a>
<a name="line-97"></a><span class='hs-definition'>reifyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATcId</span> <span class='hs-layout'>{</span><span class='hs-varid'>tct_id</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-varid'>tct_type</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> 
<a name="line-98"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>ty1</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcType</span> <span class='hs-varid'>ty</span>	<span class='hs-comment'>-- Make use of all the info we have, even</span>
<a name="line-99"></a>				<span class='hs-comment'>-- though it may be incomplete</span>
<a name="line-100"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-varid'>ty1</span>
<a name="line-101"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>fix</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyFixity</span> <span class='hs-layout'>(</span><span class='hs-varid'>idName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>
<a name="line-102"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>VarI</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty2</span> <span class='hs-conid'>Nothing</span> <span class='hs-varid'>fix</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-103"></a>
<a name="line-104"></a><span class='hs-definition'>reifyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyVar</span> <span class='hs-varid'>tv</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> 
<a name="line-105"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>ty1</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcType</span> <span class='hs-varid'>ty</span>
<a name="line-106"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-varid'>ty1</span>
<a name="line-107"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>TyVarI</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>tv</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-108"></a>
<a name="line-109"></a><span class='hs-definition'>reifyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>AThing</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"reifyThing AThing"</span>
<a name="line-110"></a>
<a name="line-111"></a><a name="reifyTyCon"></a><span class='hs-comment'>------------------------------</span>
<a name="line-112"></a><span class='hs-definition'>reifyTyCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Info</span>
<a name="line-113"></a><span class='hs-definition'>reifyTyCon</span> <span class='hs-varid'>tc</span>
<a name="line-114"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isFunTyCon</span> <span class='hs-varid'>tc</span>  
<a name="line-115"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>PrimTyConI</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-num'>2</span> 		  <span class='hs-conid'>False</span><span class='hs-layout'>)</span>
<a name="line-116"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isPrimTyCon</span> <span class='hs-varid'>tc</span> 
<a name="line-117"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>PrimTyConI</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConArity</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>isUnLiftedTyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-118"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isOpenTyCon</span> <span class='hs-varid'>tc</span>
<a name="line-119"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>flavour</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyFamFlavour</span> <span class='hs-varid'>tc</span>
<a name="line-120"></a>        <span class='hs-varid'>tvs</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyConTyVars</span> <span class='hs-varid'>tc</span>
<a name="line-121"></a>        <span class='hs-varid'>kind</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyConKind</span> <span class='hs-varid'>tc</span>
<a name="line-122"></a>        <span class='hs-varid'>kind'</span>
<a name="line-123"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isLiftedTypeKind</span> <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-124"></a>          <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>             <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Just</span> <span class='hs-varop'>$</span> <span class='hs-varid'>reifyKind</span> <span class='hs-varid'>kind</span>
<a name="line-125"></a>    <span class='hs-keyword'>in</span>
<a name="line-126"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>TyConI</span> <span class='hs-varop'>$</span>
<a name="line-127"></a>              <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>FamilyD</span> <span class='hs-varid'>flavour</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyTyVars</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>)</span> <span class='hs-varid'>kind'</span><span class='hs-layout'>)</span>
<a name="line-128"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isSynTyCon</span> <span class='hs-varid'>tc</span>
<a name="line-129"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>rhs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>synTyConDefn</span> <span class='hs-varid'>tc</span> 
<a name="line-130"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>rhs'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-varid'>rhs</span>
<a name="line-131"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>TyConI</span> <span class='hs-varop'>$</span> 
<a name="line-132"></a>		   <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>TySynD</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyTyVars</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>)</span> <span class='hs-varid'>rhs'</span><span class='hs-layout'>)</span> 
<a name="line-133"></a>       <span class='hs-layout'>}</span>
<a name="line-134"></a>
<a name="line-135"></a><span class='hs-definition'>reifyTyCon</span> <span class='hs-varid'>tc</span>
<a name="line-136"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>cxt</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyCxt</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConStupidTheta</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span>
<a name="line-137"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyConTyVars</span> <span class='hs-varid'>tc</span>
<a name="line-138"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>cons</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyDataCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVarTys</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span>
<a name="line-139"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyName</span> <span class='hs-varid'>tc</span>
<a name="line-140"></a>	      <span class='hs-varid'>r_tvs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyTyVars</span> <span class='hs-varid'>tvs</span>
<a name="line-141"></a>	      <span class='hs-varid'>deriv</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>	<span class='hs-comment'>-- Don't know about deriving</span>
<a name="line-142"></a>	      <span class='hs-varid'>decl</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isNewTyCon</span> <span class='hs-varid'>tc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>NewtypeD</span> <span class='hs-varid'>cxt</span> <span class='hs-varid'>name</span> <span class='hs-varid'>r_tvs</span> <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-varid'>cons</span><span class='hs-layout'>)</span> <span class='hs-varid'>deriv</span>
<a name="line-143"></a>		   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>DataD</span>    <span class='hs-varid'>cxt</span> <span class='hs-varid'>name</span> <span class='hs-varid'>r_tvs</span> <span class='hs-varid'>cons</span> 	    <span class='hs-varid'>deriv</span>
<a name="line-144"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>TyConI</span> <span class='hs-varid'>decl</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-145"></a>
<a name="line-146"></a><a name="reifyDataCon"></a><span class='hs-definition'>reifyDataCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DataCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Con</span>
<a name="line-147"></a><span class='hs-definition'>reifyDataCon</span> <span class='hs-varid'>tys</span> <span class='hs-varid'>dc</span>
<a name="line-148"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isVanillaDataCon</span> <span class='hs-varid'>dc</span>
<a name="line-149"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> 	<span class='hs-layout'>{</span> <span class='hs-varid'>arg_tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyTypes</span> <span class='hs-layout'>(</span><span class='hs-varid'>dataConInstOrigArgTys</span> <span class='hs-varid'>dc</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-150"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>stricts</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>reifyStrict</span> <span class='hs-layout'>(</span><span class='hs-varid'>dataConStrictMarks</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span>
<a name="line-151"></a>	      <span class='hs-varid'>fields</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dataConFieldLabels</span> <span class='hs-varid'>dc</span>
<a name="line-152"></a>	      <span class='hs-varid'>name</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyName</span> <span class='hs-varid'>dc</span>
<a name="line-153"></a>	      <span class='hs-keyglyph'>[</span><span class='hs-varid'>a1</span><span class='hs-layout'>,</span><span class='hs-varid'>a2</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>arg_tys</span>
<a name="line-154"></a>	      <span class='hs-keyglyph'>[</span><span class='hs-varid'>s1</span><span class='hs-layout'>,</span><span class='hs-varid'>s2</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>stricts</span>
<a name="line-155"></a>	<span class='hs-layout'>;</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>length</span> <span class='hs-varid'>arg_tys</span> <span class='hs-varop'>==</span> <span class='hs-varid'>length</span> <span class='hs-varid'>stricts</span> <span class='hs-layout'>)</span>
<a name="line-156"></a>          <span class='hs-keyword'>if</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>fields</span><span class='hs-layout'>)</span> <span class='hs-keyword'>then</span>
<a name="line-157"></a>	     <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>RecC</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>zip3</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>reifyName</span> <span class='hs-varid'>fields</span><span class='hs-layout'>)</span> <span class='hs-varid'>stricts</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-158"></a>	  <span class='hs-keyword'>else</span>
<a name="line-159"></a>	  <span class='hs-keyword'>if</span> <span class='hs-varid'>dataConIsInfix</span> <span class='hs-varid'>dc</span> <span class='hs-keyword'>then</span>
<a name="line-160"></a>	     <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>length</span> <span class='hs-varid'>arg_tys</span> <span class='hs-varop'>==</span> <span class='hs-num'>2</span> <span class='hs-layout'>)</span>
<a name="line-161"></a>	     <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>InfixC</span> <span class='hs-layout'>(</span><span class='hs-varid'>s1</span><span class='hs-layout'>,</span><span class='hs-varid'>a1</span><span class='hs-layout'>)</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>s2</span><span class='hs-layout'>,</span><span class='hs-varid'>a2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-162"></a>	  <span class='hs-keyword'>else</span>
<a name="line-163"></a>	     <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>NormalC</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>stricts</span> <span class='hs-varop'>`zip`</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-164"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-165"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Can't reify a GADT data constructor:"</span><span class='hs-layout'>)</span> 
<a name="line-166"></a>		<span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-167"></a>
<a name="line-168"></a><a name="reifyClass"></a><span class='hs-comment'>------------------------------</span>
<a name="line-169"></a><span class='hs-definition'>reifyClass</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Class</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Info</span>
<a name="line-170"></a><span class='hs-definition'>reifyClass</span> <span class='hs-varid'>cls</span> 
<a name="line-171"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>cxt</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyCxt</span> <span class='hs-varid'>theta</span>
<a name="line-172"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ops</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>reify_op</span> <span class='hs-varid'>op_stuff</span>
<a name="line-173"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>ClassI</span> <span class='hs-varop'>$</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>ClassD</span> <span class='hs-varid'>cxt</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyTyVars</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>)</span> <span class='hs-varid'>fds'</span> <span class='hs-varid'>ops</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-174"></a>  <span class='hs-keyword'>where</span>
<a name="line-175"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>fds</span><span class='hs-layout'>,</span> <span class='hs-varid'>theta</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>op_stuff</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>classExtraBigSig</span> <span class='hs-varid'>cls</span>
<a name="line-176"></a>    <span class='hs-varid'>fds'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>reifyFunDep</span> <span class='hs-varid'>fds</span>
<a name="line-177"></a>    <span class='hs-varid'>reify_op</span> <span class='hs-layout'>(</span><span class='hs-varid'>op</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>op</span><span class='hs-layout'>)</span>
<a name="line-178"></a>			  <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>SigD</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>op</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-179"></a>
<a name="line-180"></a><a name="reifyType"></a><span class='hs-comment'>------------------------------</span>
<a name="line-181"></a><span class='hs-definition'>reifyType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeRep</span><span class='hs-varop'>.</span><span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Type</span>
<a name="line-182"></a><span class='hs-definition'>reifyType</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>ForAllTy</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reify_for_all</span> <span class='hs-varid'>ty</span>
<a name="line-183"></a><span class='hs-definition'>reifyType</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PredTy</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span> <span class='hs-varop'>`FunTy`</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reify_for_all</span> <span class='hs-varid'>ty</span>	        <span class='hs-comment'>-- Types like ((?x::Int) =&gt; Char -&gt; Char)</span>
<a name="line-184"></a><span class='hs-definition'>reifyType</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyVarTy</span> <span class='hs-varid'>tv</span><span class='hs-layout'>)</span>	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>VarT</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>tv</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-185"></a><span class='hs-definition'>reifyType</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyConApp</span> <span class='hs-varid'>tc</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reify_tc_app</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys</span>   <span class='hs-comment'>-- Do not expand type synonyms here</span>
<a name="line-186"></a><span class='hs-definition'>reifyType</span> <span class='hs-layout'>(</span><span class='hs-conid'>AppTy</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r1</span><span class='hs-layout'>,</span><span class='hs-varid'>r2</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyTypes</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>t1</span><span class='hs-layout'>,</span><span class='hs-varid'>t2</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>r1</span> <span class='hs-varop'>`</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>AppT</span><span class='hs-varop'>`</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-187"></a><span class='hs-definition'>reifyType</span> <span class='hs-layout'>(</span><span class='hs-conid'>FunTy</span> <span class='hs-varid'>t1</span> <span class='hs-varid'>t2</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>r1</span><span class='hs-layout'>,</span><span class='hs-varid'>r2</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyTypes</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>t1</span><span class='hs-layout'>,</span><span class='hs-varid'>t2</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>ArrowT</span> <span class='hs-varop'>`</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>AppT</span><span class='hs-varop'>`</span> <span class='hs-varid'>r1</span> <span class='hs-varop'>`</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>AppT</span><span class='hs-varop'>`</span> <span class='hs-varid'>r2</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-188"></a><span class='hs-definition'>reifyType</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>PredTy</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"reifyType PredTy"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-189"></a>
<a name="line-190"></a><a name="reify_for_all"></a><span class='hs-definition'>reify_for_all</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeRep</span><span class='hs-varop'>.</span><span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Type</span>
<a name="line-191"></a><span class='hs-definition'>reify_for_all</span> <span class='hs-varid'>ty</span>
<a name="line-192"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cxt'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyCxt</span> <span class='hs-varid'>cxt</span><span class='hs-layout'>;</span> 
<a name="line-193"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>tau'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-varid'>tau</span> 
<a name="line-194"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>ForallT</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyTyVars</span> <span class='hs-varid'>tvs</span><span class='hs-layout'>)</span> <span class='hs-varid'>cxt'</span> <span class='hs-varid'>tau'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-195"></a>  <span class='hs-keyword'>where</span>
<a name="line-196"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>cxt</span><span class='hs-layout'>,</span> <span class='hs-varid'>tau</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcSplitSigmaTy</span> <span class='hs-varid'>ty</span>   
<a name="line-197"></a>				
<a name="line-198"></a><a name="reifyTypes"></a><span class='hs-definition'>reifyTypes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span>
<a name="line-199"></a><span class='hs-definition'>reifyTypes</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>reifyType</span>
<a name="line-200"></a>
<a name="line-201"></a><a name="reifyKind"></a><span class='hs-definition'>reifyKind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Kind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Kind</span>
<a name="line-202"></a><span class='hs-definition'>reifyKind</span>  <span class='hs-varid'>ki</span>
<a name="line-203"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>kis</span><span class='hs-layout'>,</span> <span class='hs-varid'>ki'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitKindFunTys</span> <span class='hs-varid'>ki</span>
<a name="line-204"></a>        <span class='hs-varid'>kis_rep</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>reifyKind</span> <span class='hs-varid'>kis</span>
<a name="line-205"></a>        <span class='hs-varid'>ki'_rep</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyNonArrowKind</span> <span class='hs-varid'>ki'</span>
<a name="line-206"></a>    <span class='hs-keyword'>in</span>
<a name="line-207"></a>    <span class='hs-varid'>foldr</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>ArrowK</span> <span class='hs-varid'>ki'_rep</span> <span class='hs-varid'>kis_rep</span>
<a name="line-208"></a>  <span class='hs-keyword'>where</span>
<a name="line-209"></a>    <span class='hs-varid'>reifyNonArrowKind</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isLiftedTypeKind</span> <span class='hs-varid'>k</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>StarK</span>
<a name="line-210"></a>                        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"Exotic form of kind"</span> 
<a name="line-211"></a>                                                        <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-212"></a>
<a name="line-213"></a><a name="reifyCxt"></a><span class='hs-definition'>reifyCxt</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PredType</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Pred</span><span class='hs-keyglyph'>]</span>
<a name="line-214"></a><span class='hs-definition'>reifyCxt</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>reifyPred</span>
<a name="line-215"></a>
<a name="line-216"></a><a name="reifyFunDep"></a><span class='hs-definition'>reifyFunDep</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>FunDep</span>
<a name="line-217"></a><span class='hs-definition'>reifyFunDep</span> <span class='hs-layout'>(</span><span class='hs-varid'>xs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>FunDep</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>reifyName</span> <span class='hs-varid'>xs</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>reifyName</span> <span class='hs-varid'>ys</span><span class='hs-layout'>)</span>
<a name="line-218"></a>
<a name="line-219"></a><a name="reifyFamFlavour"></a><span class='hs-definition'>reifyFamFlavour</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>FamFlavour</span>
<a name="line-220"></a><span class='hs-definition'>reifyFamFlavour</span> <span class='hs-varid'>tc</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isOpenSynTyCon</span> <span class='hs-varid'>tc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>TypeFam</span>
<a name="line-221"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isOpenTyCon</span>    <span class='hs-varid'>tc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>DataFam</span>
<a name="line-222"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>         
<a name="line-223"></a>                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"TcSplice.reifyFamFlavour: not a type family"</span>
<a name="line-224"></a>
<a name="line-225"></a><a name="reifyTyVars"></a><span class='hs-definition'>reifyTyVars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>TyVarBndr</span><span class='hs-keyglyph'>]</span>
<a name="line-226"></a><span class='hs-definition'>reifyTyVars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>reifyTyVar</span>
<a name="line-227"></a>  <span class='hs-keyword'>where</span>
<a name="line-228"></a>    <span class='hs-varid'>reifyTyVar</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isLiftedTypeKind</span> <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>PlainTV</span>  <span class='hs-varid'>name</span>
<a name="line-229"></a>                  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>             <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>KindedTV</span> <span class='hs-varid'>name</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyKind</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
<a name="line-230"></a>      <span class='hs-keyword'>where</span>
<a name="line-231"></a>        <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tyVarKind</span> <span class='hs-varid'>tv</span>
<a name="line-232"></a>        <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>reifyName</span> <span class='hs-varid'>tv</span>
<a name="line-233"></a>
<a name="line-234"></a><a name="reify_tc_app"></a><span class='hs-definition'>reify_tc_app</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TypeRep</span><span class='hs-varop'>.</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Type</span>
<a name="line-235"></a><span class='hs-definition'>reify_tc_app</span> <span class='hs-varid'>tc</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tys'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyTypes</span> <span class='hs-varid'>tys</span> 
<a name="line-236"></a>			 <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>foldl</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>AppT</span> <span class='hs-layout'>(</span><span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>ConT</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-237"></a>
<a name="line-238"></a><a name="reifyPred"></a><span class='hs-definition'>reifyPred</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeRep</span><span class='hs-varop'>.</span><span class='hs-conid'>PredType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Pred</span>
<a name="line-239"></a><span class='hs-definition'>reifyPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassP</span> <span class='hs-varid'>cls</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span> 
<a name="line-240"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>tys'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyTypes</span> <span class='hs-varid'>tys</span> 
<a name="line-241"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>ClassP</span> <span class='hs-layout'>(</span><span class='hs-varid'>reifyName</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys'</span>
<a name="line-242"></a>       <span class='hs-layout'>}</span>
<a name="line-243"></a><span class='hs-definition'>reifyPred</span> <span class='hs-varid'>p</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>IParam</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noTH</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"implicit parameters"</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-244"></a><span class='hs-definition'>reifyPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> 
<a name="line-245"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ty1'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-varid'>ty1</span>
<a name="line-246"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>ty2'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>reifyType</span> <span class='hs-varid'>ty2</span>
<a name="line-247"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varop'>$</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>EqualP</span> <span class='hs-varid'>ty1'</span> <span class='hs-varid'>ty2'</span>
<a name="line-248"></a>       <span class='hs-layout'>}</span>
<a name="line-249"></a>
<a name="line-250"></a>
<a name="line-251"></a><a name="reifyName"></a><span class='hs-comment'>------------------------------</span>
<a name="line-252"></a><span class='hs-definition'>reifyName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NamedThing</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span>
<a name="line-253"></a><span class='hs-definition'>reifyName</span> <span class='hs-varid'>thing</span>
<a name="line-254"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isExternalName</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mk_varg</span> <span class='hs-varid'>pkg_str</span> <span class='hs-varid'>mod_str</span> <span class='hs-varid'>occ_str</span>
<a name="line-255"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>	        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>mkNameU</span> <span class='hs-varid'>occ_str</span> <span class='hs-layout'>(</span><span class='hs-varid'>getKey</span> <span class='hs-layout'>(</span><span class='hs-varid'>getUnique</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-256"></a>	<span class='hs-comment'>-- Many of the things we reify have local bindings, and </span>
<a name="line-257"></a>	<span class='hs-comment'>-- NameL's aren't supposed to appear in binding positions, so</span>
<a name="line-258"></a>	<span class='hs-comment'>-- we use NameU.  When/if we start to reify nested things, that</span>
<a name="line-259"></a>	<span class='hs-comment'>-- have free variables, we may need to generate NameL's for them.</span>
<a name="line-260"></a>  <span class='hs-keyword'>where</span>
<a name="line-261"></a>    <span class='hs-varid'>name</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getName</span> <span class='hs-varid'>thing</span>
<a name="line-262"></a>    <span class='hs-varid'>mod</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>isExternalName</span> <span class='hs-varid'>name</span> <span class='hs-layout'>)</span> <span class='hs-varid'>nameModule</span> <span class='hs-varid'>name</span>
<a name="line-263"></a>    <span class='hs-varid'>pkg_str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>packageIdString</span> <span class='hs-layout'>(</span><span class='hs-varid'>modulePackageId</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span>
<a name="line-264"></a>    <span class='hs-varid'>mod_str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>moduleNameString</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span>
<a name="line-265"></a>    <span class='hs-varid'>occ_str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>occNameString</span> <span class='hs-varid'>occ</span>
<a name="line-266"></a>    <span class='hs-varid'>occ</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nameOccName</span> <span class='hs-varid'>name</span>
<a name="line-267"></a>    <span class='hs-varid'>mk_varg</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OccName</span><span class='hs-varop'>.</span><span class='hs-varid'>isDataOcc</span> <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>mkNameG_d</span>
<a name="line-268"></a>	    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OccName</span><span class='hs-varop'>.</span><span class='hs-varid'>isVarOcc</span>  <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>mkNameG_v</span>
<a name="line-269"></a>	    <span class='hs-keyglyph'>|</span> <span class='hs-conid'>OccName</span><span class='hs-varop'>.</span><span class='hs-varid'>isTcOcc</span>   <span class='hs-varid'>occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-varid'>mkNameG_tc</span>
<a name="line-270"></a>	    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>		    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"reifyName"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-271"></a>
<a name="line-272"></a><a name="reifyFixity"></a><span class='hs-comment'>------------------------------</span>
<a name="line-273"></a><span class='hs-definition'>reifyFixity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Fixity</span>
<a name="line-274"></a><span class='hs-definition'>reifyFixity</span> <span class='hs-varid'>name</span>
<a name="line-275"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>fix</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupFixityRn</span> <span class='hs-varid'>name</span>
<a name="line-276"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>conv_fix</span> <span class='hs-varid'>fix</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-277"></a>    <span class='hs-keyword'>where</span>
<a name="line-278"></a>      <span class='hs-varid'>conv_fix</span> <span class='hs-layout'>(</span><span class='hs-conid'>BasicTypes</span><span class='hs-varop'>.</span><span class='hs-conid'>Fixity</span> <span class='hs-varid'>i</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Fixity</span> <span class='hs-varid'>i</span> <span class='hs-layout'>(</span><span class='hs-varid'>conv_dir</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-279"></a>      <span class='hs-varid'>conv_dir</span> <span class='hs-conid'>BasicTypes</span><span class='hs-varop'>.</span><span class='hs-conid'>InfixR</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>InfixR</span>
<a name="line-280"></a>      <span class='hs-varid'>conv_dir</span> <span class='hs-conid'>BasicTypes</span><span class='hs-varop'>.</span><span class='hs-conid'>InfixL</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>InfixL</span>
<a name="line-281"></a>      <span class='hs-varid'>conv_dir</span> <span class='hs-conid'>BasicTypes</span><span class='hs-varop'>.</span><span class='hs-conid'>InfixN</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>InfixN</span>
<a name="line-282"></a>
<a name="line-283"></a><a name="reifyStrict"></a><span class='hs-definition'>reifyStrict</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BasicTypes</span><span class='hs-varop'>.</span><span class='hs-conid'>StrictnessMark</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Strict</span>
<a name="line-284"></a><span class='hs-definition'>reifyStrict</span> <span class='hs-conid'>MarkedStrict</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>IsStrict</span>
<a name="line-285"></a><span class='hs-definition'>reifyStrict</span> <span class='hs-conid'>MarkedUnboxed</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>IsStrict</span>
<a name="line-286"></a><span class='hs-definition'>reifyStrict</span> <span class='hs-conid'>NotMarkedStrict</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>NotStrict</span>
<a name="line-287"></a>
<a name="line-288"></a><a name="noTH"></a><span class='hs-comment'>------------------------------</span>
<a name="line-289"></a><span class='hs-definition'>noTH</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LitString</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span>
<a name="line-290"></a><span class='hs-definition'>noTH</span> <span class='hs-varid'>s</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Can't represent"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-varid'>s</span> <span class='hs-varop'>&lt;+&gt;</span> 
<a name="line-291"></a>				<span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"in Template Haskell:"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-292"></a>		 	     <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-varid'>d</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
</pre>\end{code}
</body>
</html>