{-# LANGUAGE CPP #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}
module RnSplice (
        rnTopSpliceDecls,
        rnSpliceType, rnSpliceExpr, rnSplicePat, rnSpliceDecl,
        rnBracket,
        checkThLocalName
        , traceSplice, SpliceInfo(..)
  ) where
#include "HsVersions.h"
import GhcPrelude
import Name
import NameSet
import HsSyn
import RdrName
import TcRnMonad
import RnEnv
import RnUtils          ( HsDocContext(..), newLocalBndrRn )
import RnUnbound        ( isUnboundName )
import RnSource         ( rnSrcDecls, findSplice )
import RnPat            ( rnPat )
import BasicTypes       ( TopLevelFlag, isTopLevel, SourceText(..) )
import Outputable
import Module
import SrcLoc
import RnTypes          ( rnLHsType )
import Control.Monad    ( unless, when )
import {-# SOURCE #-} RnExpr   ( rnLExpr )
import TcEnv            ( checkWellStaged )
import THNames          ( liftName )
import DynFlags
import FastString
import ErrUtils         ( dumpIfSet_dyn_printer )
import TcEnv            ( tcMetaTy )
import Hooks
import THNames          ( quoteExpName, quotePatName, quoteDecName, quoteTypeName
                        , decsQTyConName, expQTyConName, patQTyConName, typeQTyConName, )
import {-# SOURCE #-} TcExpr   ( tcPolyExpr )
import {-# SOURCE #-} TcSplice
    ( runMetaD
    , runMetaE
    , runMetaP
    , runMetaT
    , tcTopSpliceExpr
    )
import TcHsSyn
import GHCi.RemoteTypes ( ForeignRef )
import qualified Language.Haskell.TH as TH (Q)
import qualified GHC.LanguageExtensions as LangExt
rnBracket :: HsExpr GhcPs -> HsBracket GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnBracket :: HsExpr GhcPs -> HsBracket GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnBracket e :: HsExpr GhcPs
e br_body :: HsBracket GhcPs
br_body
  = MsgDoc
-> RnM (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt (HsBracket GhcPs -> MsgDoc
quotationCtxtDoc HsBracket GhcPs
br_body) (RnM (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars))
-> RnM (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
    do { 
         Bool
thQuotesEnabled <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.TemplateHaskellQuotes
       ; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
thQuotesEnabled (IOEnv (Env TcGblEnv TcLclEnv) ()
 -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$
           MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a. MsgDoc -> TcRn a
failWith ( [MsgDoc] -> MsgDoc
vcat
                      [ String -> MsgDoc
text "Syntax error on" MsgDoc -> MsgDoc -> MsgDoc
<+> HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
e
                      , String -> MsgDoc
text ("Perhaps you intended to use TemplateHaskell"
                              String -> String -> String
forall a. [a] -> [a] -> [a]
++ " or TemplateHaskellQuotes") ] )
         
       ; ThStage
cur_stage <- TcM ThStage
getStage
       ; case ThStage
cur_stage of
           { Splice Typed   -> Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTc (HsBracket GhcPs -> Bool
forall id. HsBracket id -> Bool
isTypedBracket HsBracket GhcPs
br_body)
                                       MsgDoc
illegalUntypedBracket
           ; Splice Untyped -> Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTc (Bool -> Bool
not (HsBracket GhcPs -> Bool
forall id. HsBracket id -> Bool
isTypedBracket HsBracket GhcPs
br_body))
                                       MsgDoc
illegalTypedBracket
           ; RunSplice _    ->
               
               String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnBracket: Renaming bracket when running a splice"
                        (HsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsExpr GhcPs
e)
           ; Comp           -> () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
           ; Brack {}       -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a. MsgDoc -> TcRn a
failWithTc MsgDoc
illegalBracket
           }
         
       ; IOEnv (Env TcGblEnv TcLclEnv) ()
recordThUse
       ; case HsBracket GhcPs -> Bool
forall id. HsBracket id -> Bool
isTypedBracket HsBracket GhcPs
br_body of
            True  -> do { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "Renaming typed TH bracket" MsgDoc
empty
                        ; (body' :: HsBracket GhcRn
body', fvs_e :: FreeVars
fvs_e) <-
                          ThStage
-> TcM (HsBracket GhcRn, FreeVars)
-> TcM (HsBracket GhcRn, FreeVars)
forall a. ThStage -> TcM a -> TcM a
setStage (ThStage -> PendingStuff -> ThStage
Brack ThStage
cur_stage PendingStuff
RnPendingTyped) (TcM (HsBracket GhcRn, FreeVars)
 -> TcM (HsBracket GhcRn, FreeVars))
-> TcM (HsBracket GhcRn, FreeVars)
-> TcM (HsBracket GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                                   ThStage -> HsBracket GhcPs -> TcM (HsBracket GhcRn, FreeVars)
rn_bracket ThStage
cur_stage HsBracket GhcPs
br_body
                        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XBracket GhcRn -> HsBracket GhcRn -> HsExpr GhcRn
forall p. XBracket p -> HsBracket p -> HsExpr p
HsBracket XBracket GhcRn
NoExt
noExt HsBracket GhcRn
body', FreeVars
fvs_e) }
            False -> do { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "Renaming untyped TH bracket" MsgDoc
empty
                        ; IORef [PendingRnSplice]
ps_var <- [PendingRnSplice]
-> IOEnv (Env TcGblEnv TcLclEnv) (IORef [PendingRnSplice])
forall a env. a -> IOEnv env (IORef a)
newMutVar []
                        ; (body' :: HsBracket GhcRn
body', fvs_e :: FreeVars
fvs_e) <-
                          ThStage
-> TcM (HsBracket GhcRn, FreeVars)
-> TcM (HsBracket GhcRn, FreeVars)
forall a. ThStage -> TcM a -> TcM a
setStage (ThStage -> PendingStuff -> ThStage
Brack ThStage
cur_stage (IORef [PendingRnSplice] -> PendingStuff
RnPendingUntyped IORef [PendingRnSplice]
ps_var)) (TcM (HsBracket GhcRn, FreeVars)
 -> TcM (HsBracket GhcRn, FreeVars))
-> TcM (HsBracket GhcRn, FreeVars)
-> TcM (HsBracket GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                                   ThStage -> HsBracket GhcPs -> TcM (HsBracket GhcRn, FreeVars)
rn_bracket ThStage
cur_stage HsBracket GhcPs
br_body
                        ; [PendingRnSplice]
pendings <- IORef [PendingRnSplice]
-> IOEnv (Env TcGblEnv TcLclEnv) [PendingRnSplice]
forall a env. IORef a -> IOEnv env a
readMutVar IORef [PendingRnSplice]
ps_var
                        ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XRnBracketOut GhcRn
-> HsBracket GhcRn -> [PendingRnSplice] -> HsExpr GhcRn
forall p.
XRnBracketOut p -> HsBracket GhcRn -> [PendingRnSplice] -> HsExpr p
HsRnBracketOut XRnBracketOut GhcRn
NoExt
noExt HsBracket GhcRn
body' [PendingRnSplice]
pendings, FreeVars
fvs_e) }
       }
rn_bracket :: ThStage -> HsBracket GhcPs -> RnM (HsBracket GhcRn, FreeVars)
rn_bracket :: ThStage -> HsBracket GhcPs -> TcM (HsBracket GhcRn, FreeVars)
rn_bracket outer_stage :: ThStage
outer_stage br :: HsBracket GhcPs
br@(VarBr x :: XVarBr GhcPs
x flg :: Bool
flg rdr_name :: IdP GhcPs
rdr_name)
  = do { Name
name <- RdrName -> RnM Name
lookupOccRn RdrName
IdP GhcPs
rdr_name
       ; Module
this_mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
getModule
       ; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
flg Bool -> Bool -> Bool
&& Module -> Name -> Bool
nameIsLocalOrFrom Module
this_mod Name
name) (IOEnv (Env TcGblEnv TcLclEnv) ()
 -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$
             
                 do { Maybe (TopLevelFlag, ThLevel)
mb_bind_lvl <- Name -> RnM (Maybe (TopLevelFlag, ThLevel))
lookupLocalOccThLvl_maybe Name
name
                    ; case Maybe (TopLevelFlag, ThLevel)
mb_bind_lvl of
                        { Nothing -> () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()      
                                                    
                        ; Just (top_lvl :: TopLevelFlag
top_lvl, bind_lvl :: ThLevel
bind_lvl)  
                             | TopLevelFlag -> Bool
isTopLevel TopLevelFlag
top_lvl
                             -> Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Name -> Bool
isExternalName Name
name) (Name -> IOEnv (Env TcGblEnv TcLclEnv) ()
keepAlive Name
name)
                             | Bool
otherwise
                             -> do { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rn_bracket VarBr"
                                      (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name MsgDoc -> MsgDoc -> MsgDoc
<+> ThLevel -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ThLevel
bind_lvl
                                                MsgDoc -> MsgDoc -> MsgDoc
<+> ThStage -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ThStage
outer_stage)
                                   ; Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTc (ThStage -> ThLevel
thLevel ThStage
outer_stage ThLevel -> ThLevel -> ThLevel
forall a. Num a => a -> a -> a
+ 1 ThLevel -> ThLevel -> Bool
forall a. Eq a => a -> a -> Bool
== ThLevel
bind_lvl)
                                             (HsBracket GhcPs -> MsgDoc
quotedNameStageErr HsBracket GhcPs
br) }
                        }
                    }
       ; (HsBracket GhcRn, FreeVars) -> TcM (HsBracket GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XVarBr GhcRn -> Bool -> IdP GhcRn -> HsBracket GhcRn
forall p. XVarBr p -> Bool -> IdP p -> HsBracket p
VarBr XVarBr GhcPs
XVarBr GhcRn
x Bool
flg Name
IdP GhcRn
name, Name -> FreeVars
unitFV Name
name) }
rn_bracket _ (ExpBr x :: XExpBr GhcPs
x e :: LHsExpr GhcPs
e) = do { (e' :: LHsExpr GhcRn
e', fvs :: FreeVars
fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
e
                            ; (HsBracket GhcRn, FreeVars) -> TcM (HsBracket GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XExpBr GhcRn -> LHsExpr GhcRn -> HsBracket GhcRn
forall p. XExpBr p -> LHsExpr p -> HsBracket p
ExpBr XExpBr GhcPs
XExpBr GhcRn
x LHsExpr GhcRn
e', FreeVars
fvs) }
rn_bracket _ (PatBr x :: XPatBr GhcPs
x p :: LPat GhcPs
p)
  = HsMatchContext Name
-> LPat GhcPs
-> (LPat GhcRn -> TcM (HsBracket GhcRn, FreeVars))
-> TcM (HsBracket GhcRn, FreeVars)
forall a.
HsMatchContext Name
-> LPat GhcPs
-> (LPat GhcRn -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnPat HsMatchContext Name
forall id. HsMatchContext id
ThPatQuote LPat GhcPs
p ((LPat GhcRn -> TcM (HsBracket GhcRn, FreeVars))
 -> TcM (HsBracket GhcRn, FreeVars))
-> (LPat GhcRn -> TcM (HsBracket GhcRn, FreeVars))
-> TcM (HsBracket GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ p' :: LPat GhcRn
p' -> (HsBracket GhcRn, FreeVars) -> TcM (HsBracket GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XPatBr GhcRn -> LPat GhcRn -> HsBracket GhcRn
forall p. XPatBr p -> LPat p -> HsBracket p
PatBr XPatBr GhcPs
XPatBr GhcRn
x LPat GhcRn
p', FreeVars
emptyFVs)
rn_bracket _ (TypBr x :: XTypBr GhcPs
x t :: LHsType GhcPs
t) = do { (t' :: LHsType GhcRn
t', fvs :: FreeVars
fvs) <- HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnLHsType HsDocContext
TypBrCtx LHsType GhcPs
t
                              ; (HsBracket GhcRn, FreeVars) -> TcM (HsBracket GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XTypBr GhcRn -> LHsType GhcRn -> HsBracket GhcRn
forall p. XTypBr p -> LHsType p -> HsBracket p
TypBr XTypBr GhcPs
XTypBr GhcRn
x LHsType GhcRn
t', FreeVars
fvs) }
rn_bracket _ (DecBrL x :: XDecBrL GhcPs
x decls :: [LHsDecl GhcPs]
decls)
  = do { HsGroup GhcPs
group <- [LHsDecl GhcPs] -> RnM (HsGroup GhcPs)
groupDecls [LHsDecl GhcPs]
decls
       ; TcGblEnv
gbl_env  <- TcRnIf TcGblEnv TcLclEnv TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
       ; let new_gbl_env :: TcGblEnv
new_gbl_env = TcGblEnv
gbl_env { tcg_dus :: DefUses
tcg_dus = DefUses
emptyDUs }
                          
                          
       ; (tcg_env :: TcGblEnv
tcg_env, group' :: HsGroup GhcRn
group') <- TcGblEnv
-> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, HsGroup GhcRn)
-> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, HsGroup GhcRn)
forall gbl lcl a. gbl -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setGblEnv TcGblEnv
new_gbl_env (TcRnIf TcGblEnv TcLclEnv (TcGblEnv, HsGroup GhcRn)
 -> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, HsGroup GhcRn))
-> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, HsGroup GhcRn)
-> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, HsGroup GhcRn)
forall a b. (a -> b) -> a -> b
$
                              HsGroup GhcPs -> TcRnIf TcGblEnv TcLclEnv (TcGblEnv, HsGroup GhcRn)
rnSrcDecls HsGroup GhcPs
group
              
        ; String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rn_bracket dec" (DefUses -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (TcGblEnv -> DefUses
tcg_dus TcGblEnv
tcg_env) MsgDoc -> MsgDoc -> MsgDoc
$$
                   FreeVars -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr (DefUses -> FreeVars
duUses (TcGblEnv -> DefUses
tcg_dus TcGblEnv
tcg_env)))
        ; (HsBracket GhcRn, FreeVars) -> TcM (HsBracket GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XDecBrG GhcRn -> HsGroup GhcRn -> HsBracket GhcRn
forall p. XDecBrG p -> HsGroup p -> HsBracket p
DecBrG XDecBrG GhcRn
XDecBrL GhcPs
x HsGroup GhcRn
group', DefUses -> FreeVars
duUses (TcGblEnv -> DefUses
tcg_dus TcGblEnv
tcg_env)) }
  where
    groupDecls :: [LHsDecl GhcPs] -> RnM (HsGroup GhcPs)
    groupDecls :: [LHsDecl GhcPs] -> RnM (HsGroup GhcPs)
groupDecls decls :: [LHsDecl GhcPs]
decls
      = do { (group :: HsGroup GhcPs
group, mb_splice :: Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs])
mb_splice) <- [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
findSplice [LHsDecl GhcPs]
decls
           ; case Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs])
mb_splice of
           { Nothing -> HsGroup GhcPs -> RnM (HsGroup GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return HsGroup GhcPs
group
           ; Just (splice :: SpliceDecl GhcPs
splice, rest :: [LHsDecl GhcPs]
rest) ->
               do { HsGroup GhcPs
group' <- [LHsDecl GhcPs] -> RnM (HsGroup GhcPs)
groupDecls [LHsDecl GhcPs]
rest
                  ; let group'' :: HsGroup GhcPs
group'' = HsGroup GhcPs -> HsGroup GhcPs -> HsGroup GhcPs
forall (p :: Pass).
HsGroup (GhcPass p) -> HsGroup (GhcPass p) -> HsGroup (GhcPass p)
appendGroups HsGroup GhcPs
group HsGroup GhcPs
group'
                  ; HsGroup GhcPs -> RnM (HsGroup GhcPs)
forall (m :: * -> *) a. Monad m => a -> m a
return HsGroup GhcPs
group'' { hs_splcds :: [LSpliceDecl GhcPs]
hs_splcds = SrcSpanLess (LSpliceDecl GhcPs) -> LSpliceDecl GhcPs
forall a. HasSrcSpan a => SrcSpanLess a -> a
noLoc SrcSpanLess (LSpliceDecl GhcPs)
SpliceDecl GhcPs
splice LSpliceDecl GhcPs -> [LSpliceDecl GhcPs] -> [LSpliceDecl GhcPs]
forall a. a -> [a] -> [a]
: HsGroup GhcPs -> [LSpliceDecl GhcPs]
forall p. HsGroup p -> [LSpliceDecl p]
hs_splcds HsGroup GhcPs
group' }
                  }
           }}
rn_bracket _ (DecBrG {}) = String -> TcM (HsBracket GhcRn, FreeVars)
forall a. String -> a
panic "rn_bracket: unexpected DecBrG"
rn_bracket _ (TExpBr x :: XTExpBr GhcPs
x e :: LHsExpr GhcPs
e) = do { (e' :: LHsExpr GhcRn
e', fvs :: FreeVars
fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
e
                               ; (HsBracket GhcRn, FreeVars) -> TcM (HsBracket GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XTExpBr GhcRn -> LHsExpr GhcRn -> HsBracket GhcRn
forall p. XTExpBr p -> LHsExpr p -> HsBracket p
TExpBr XTExpBr GhcPs
XTExpBr GhcRn
x LHsExpr GhcRn
e', FreeVars
fvs) }
rn_bracket _ (XBracket {}) = String -> TcM (HsBracket GhcRn, FreeVars)
forall a. String -> a
panic "rn_bracket: unexpected XBracket"
quotationCtxtDoc :: HsBracket GhcPs -> SDoc
quotationCtxtDoc :: HsBracket GhcPs -> MsgDoc
quotationCtxtDoc br_body :: HsBracket GhcPs
br_body
  = MsgDoc -> ThLevel -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text "In the Template Haskell quotation")
         2 (HsBracket GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsBracket GhcPs
br_body)
illegalBracket :: SDoc
illegalBracket :: MsgDoc
illegalBracket =
    String -> MsgDoc
text "Template Haskell brackets cannot be nested" MsgDoc -> MsgDoc -> MsgDoc
<+>
    String -> MsgDoc
text "(without intervening splices)"
illegalTypedBracket :: SDoc
illegalTypedBracket :: MsgDoc
illegalTypedBracket =
    String -> MsgDoc
text "Typed brackets may only appear in typed splices."
illegalUntypedBracket :: SDoc
illegalUntypedBracket :: MsgDoc
illegalUntypedBracket =
    String -> MsgDoc
text "Untyped brackets may only appear in untyped splices."
quotedNameStageErr :: HsBracket GhcPs -> SDoc
quotedNameStageErr :: HsBracket GhcPs -> MsgDoc
quotedNameStageErr br :: HsBracket GhcPs
br
  = [MsgDoc] -> MsgDoc
sep [ String -> MsgDoc
text "Stage error: the non-top-level quoted name" MsgDoc -> MsgDoc -> MsgDoc
<+> HsBracket GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsBracket GhcPs
br
        , String -> MsgDoc
text "must be used at the same stage at which it is bound" ]
rnSpliceGen :: (HsSplice GhcRn -> RnM (a, FreeVars))
                                            
            -> (HsSplice GhcRn -> (PendingRnSplice, a))
                                            
            -> HsSplice GhcPs
            -> RnM (a, FreeVars)
rnSpliceGen :: (HsSplice GhcRn -> RnM (a, FreeVars))
-> (HsSplice GhcRn -> (PendingRnSplice, a))
-> HsSplice GhcPs
-> RnM (a, FreeVars)
rnSpliceGen run_splice :: HsSplice GhcRn -> RnM (a, FreeVars)
run_splice pend_splice :: HsSplice GhcRn -> (PendingRnSplice, a)
pend_splice splice :: HsSplice GhcPs
splice
  = MsgDoc -> RnM (a, FreeVars) -> RnM (a, FreeVars)
forall a. MsgDoc -> TcM a -> TcM a
addErrCtxt (HsSplice GhcPs -> MsgDoc
spliceCtxt HsSplice GhcPs
splice) (RnM (a, FreeVars) -> RnM (a, FreeVars))
-> RnM (a, FreeVars) -> RnM (a, FreeVars)
forall a b. (a -> b) -> a -> b
$ do
    { ThStage
stage <- TcM ThStage
getStage
    ; case ThStage
stage of
        Brack pop_stage :: ThStage
pop_stage RnPendingTyped
          -> do { Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTc Bool
is_typed_splice MsgDoc
illegalUntypedSplice
                ; (splice' :: HsSplice GhcRn
splice', fvs :: FreeVars
fvs) <- ThStage
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a. ThStage -> TcM a -> TcM a
setStage ThStage
pop_stage (TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars))
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                                    HsSplice GhcPs -> TcM (HsSplice GhcRn, FreeVars)
rnSplice HsSplice GhcPs
splice
                ; let (_pending_splice :: PendingRnSplice
_pending_splice, result :: a
result) = HsSplice GhcRn -> (PendingRnSplice, a)
pend_splice HsSplice GhcRn
splice'
                ; (a, FreeVars) -> RnM (a, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
result, FreeVars
fvs) }
        Brack pop_stage :: ThStage
pop_stage (RnPendingUntyped ps_var :: IORef [PendingRnSplice]
ps_var)
          -> do { Bool -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTc (Bool -> Bool
not Bool
is_typed_splice) MsgDoc
illegalTypedSplice
                ; (splice' :: HsSplice GhcRn
splice', fvs :: FreeVars
fvs) <- ThStage
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a. ThStage -> TcM a -> TcM a
setStage ThStage
pop_stage (TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars))
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                                    HsSplice GhcPs -> TcM (HsSplice GhcRn, FreeVars)
rnSplice HsSplice GhcPs
splice
                ; let (pending_splice :: PendingRnSplice
pending_splice, result :: a
result) = HsSplice GhcRn -> (PendingRnSplice, a)
pend_splice HsSplice GhcRn
splice'
                ; [PendingRnSplice]
ps <- IORef [PendingRnSplice]
-> IOEnv (Env TcGblEnv TcLclEnv) [PendingRnSplice]
forall a env. IORef a -> IOEnv env a
readMutVar IORef [PendingRnSplice]
ps_var
                ; IORef [PendingRnSplice]
-> [PendingRnSplice] -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a env. IORef a -> a -> IOEnv env ()
writeMutVar IORef [PendingRnSplice]
ps_var (PendingRnSplice
pending_splice PendingRnSplice -> [PendingRnSplice] -> [PendingRnSplice]
forall a. a -> [a] -> [a]
: [PendingRnSplice]
ps)
                ; (a, FreeVars) -> RnM (a, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
result, FreeVars
fvs) }
        _ ->  do { (splice' :: HsSplice GhcRn
splice', fvs1 :: FreeVars
fvs1) <- TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall r. TcM r -> TcM r
checkNoErrs (TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars))
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                                      ThStage
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a. ThStage -> TcM a -> TcM a
setStage (SpliceType -> ThStage
Splice SpliceType
splice_type) (TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars))
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                                      HsSplice GhcPs -> TcM (HsSplice GhcRn, FreeVars)
rnSplice HsSplice GhcPs
splice
                   
                   
                   
                 ; (result :: a
result, fvs2 :: FreeVars
fvs2) <- HsSplice GhcRn -> RnM (a, FreeVars)
run_splice HsSplice GhcRn
splice'
                 ; (a, FreeVars) -> RnM (a, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
result, FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2) } }
   where
     is_typed_splice :: Bool
is_typed_splice = HsSplice GhcPs -> Bool
forall id. HsSplice id -> Bool
isTypedSplice HsSplice GhcPs
splice
     splice_type :: SpliceType
splice_type = if Bool
is_typed_splice
                   then SpliceType
Typed
                   else SpliceType
Untyped
runRnSplice :: UntypedSpliceFlavour
            -> (LHsExpr GhcTc -> TcRn res)
            -> (res -> SDoc)    
                                
            -> HsSplice GhcRn   
            -> TcRn (res, [ForeignRef (TH.Q ())])
runRnSplice :: UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn res)
-> (res -> MsgDoc)
-> HsSplice GhcRn
-> TcRn (res, [ForeignRef (Q ())])
runRnSplice flavour :: UntypedSpliceFlavour
flavour run_meta :: LHsExpr GhcTc -> TcRn res
run_meta ppr_res :: res -> MsgDoc
ppr_res splice :: HsSplice GhcRn
splice
  = do { HsSplice GhcRn
splice' <- (Hooks -> Maybe (HsSplice GhcRn -> RnM (HsSplice GhcRn)))
-> (HsSplice GhcRn -> RnM (HsSplice GhcRn))
-> IOEnv
     (Env TcGblEnv TcLclEnv) (HsSplice GhcRn -> RnM (HsSplice GhcRn))
forall (f :: * -> *) a.
(Functor f, HasDynFlags f) =>
(Hooks -> Maybe a) -> a -> f a
getHooked Hooks -> Maybe (HsSplice GhcRn -> RnM (HsSplice GhcRn))
runRnSpliceHook HsSplice GhcRn -> RnM (HsSplice GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return IOEnv
  (Env TcGblEnv TcLclEnv) (HsSplice GhcRn -> RnM (HsSplice GhcRn))
-> ((HsSplice GhcRn -> RnM (HsSplice GhcRn))
    -> RnM (HsSplice GhcRn))
-> RnM (HsSplice GhcRn)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ((HsSplice GhcRn -> RnM (HsSplice GhcRn))
-> HsSplice GhcRn -> RnM (HsSplice GhcRn)
forall a b. (a -> b) -> a -> b
$ HsSplice GhcRn
splice)
       ; let the_expr :: LHsExpr GhcRn
the_expr = case HsSplice GhcRn
splice' of
                HsUntypedSplice _ _ _ e :: LHsExpr GhcRn
e   ->  LHsExpr GhcRn
e
                HsQuasiQuote _ _ q :: IdP GhcRn
q qs :: SrcSpan
qs str :: FastString
str -> UntypedSpliceFlavour
-> Name -> SrcSpan -> FastString -> LHsExpr GhcRn
mkQuasiQuoteExpr UntypedSpliceFlavour
flavour Name
IdP GhcRn
q SrcSpan
qs FastString
str
                HsTypedSplice {}          -> String -> MsgDoc -> LHsExpr GhcRn
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "runRnSplice" (HsSplice GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
splice)
                HsSpliced {}              -> String -> MsgDoc -> LHsExpr GhcRn
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "runRnSplice" (HsSplice GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
splice)
                HsSplicedT {}             -> String -> MsgDoc -> LHsExpr GhcRn
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "runRnSplice" (HsSplice GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
splice)
                XSplice {}                -> String -> MsgDoc -> LHsExpr GhcRn
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "runRnSplice" (HsSplice GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
splice)
             
       ; Type
meta_exp_ty   <- Name -> TcM Type
tcMetaTy Name
meta_ty_name
       ; LHsExpr GhcTc
zonked_q_expr <- LHsExpr GhcTc -> TcM (LHsExpr GhcTc)
zonkTopLExpr (LHsExpr GhcTc -> TcM (LHsExpr GhcTc))
-> TcM (LHsExpr GhcTc) -> TcM (LHsExpr GhcTc)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
                            SpliceType -> TcM (LHsExpr GhcTc) -> TcM (LHsExpr GhcTc)
tcTopSpliceExpr SpliceType
Untyped
                              (LHsExpr GhcRn -> Type -> TcM (LHsExpr GhcTc)
tcPolyExpr LHsExpr GhcRn
the_expr Type
meta_exp_ty)
             
       ; TcRef [ForeignRef (Q ())]
mod_finalizers_ref <- [ForeignRef (Q ())]
-> TcRnIf TcGblEnv TcLclEnv (TcRef [ForeignRef (Q ())])
forall a gbl lcl. a -> TcRnIf gbl lcl (TcRef a)
newTcRef []
       ; res
result <- ThStage -> TcRn res -> TcRn res
forall a. ThStage -> TcM a -> TcM a
setStage (TcRef [ForeignRef (Q ())] -> ThStage
RunSplice TcRef [ForeignRef (Q ())]
mod_finalizers_ref) (TcRn res -> TcRn res) -> TcRn res -> TcRn res
forall a b. (a -> b) -> a -> b
$
                     LHsExpr GhcTc -> TcRn res
run_meta LHsExpr GhcTc
zonked_q_expr
       ; [ForeignRef (Q ())]
mod_finalizers <- TcRef [ForeignRef (Q ())]
-> TcRnIf TcGblEnv TcLclEnv [ForeignRef (Q ())]
forall a gbl lcl. TcRef a -> TcRnIf gbl lcl a
readTcRef TcRef [ForeignRef (Q ())]
mod_finalizers_ref
       ; SpliceInfo -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceSplice (SpliceInfo :: String -> Maybe (LHsExpr GhcRn) -> Bool -> MsgDoc -> SpliceInfo
SpliceInfo { spliceDescription :: String
spliceDescription = String
what
                                 , spliceIsDecl :: Bool
spliceIsDecl      = Bool
is_decl
                                 , spliceSource :: Maybe (LHsExpr GhcRn)
spliceSource      = LHsExpr GhcRn -> Maybe (LHsExpr GhcRn)
forall a. a -> Maybe a
Just LHsExpr GhcRn
the_expr
                                 , spliceGenerated :: MsgDoc
spliceGenerated   = res -> MsgDoc
ppr_res res
result })
       ; (res, [ForeignRef (Q ())]) -> TcRn (res, [ForeignRef (Q ())])
forall (m :: * -> *) a. Monad m => a -> m a
return (res
result, [ForeignRef (Q ())]
mod_finalizers) }
  where
    meta_ty_name :: Name
meta_ty_name = case UntypedSpliceFlavour
flavour of
                       UntypedExpSplice  -> Name
expQTyConName
                       UntypedPatSplice  -> Name
patQTyConName
                       UntypedTypeSplice -> Name
typeQTyConName
                       UntypedDeclSplice -> Name
decsQTyConName
    what :: String
what = case UntypedSpliceFlavour
flavour of
                  UntypedExpSplice  -> "expression"
                  UntypedPatSplice  -> "pattern"
                  UntypedTypeSplice -> "type"
                  UntypedDeclSplice -> "declarations"
    is_decl :: Bool
is_decl = case UntypedSpliceFlavour
flavour of
                 UntypedDeclSplice -> Bool
True
                 _                 -> Bool
False
makePending :: UntypedSpliceFlavour
            -> HsSplice GhcRn
            -> PendingRnSplice
makePending :: UntypedSpliceFlavour -> HsSplice GhcRn -> PendingRnSplice
makePending flavour :: UntypedSpliceFlavour
flavour (HsUntypedSplice _ _ n :: IdP GhcRn
n e :: LHsExpr GhcRn
e)
  = UntypedSpliceFlavour -> Name -> LHsExpr GhcRn -> PendingRnSplice
PendingRnSplice UntypedSpliceFlavour
flavour Name
IdP GhcRn
n LHsExpr GhcRn
e
makePending flavour :: UntypedSpliceFlavour
flavour (HsQuasiQuote _ n :: IdP GhcRn
n quoter :: IdP GhcRn
quoter q_span :: SrcSpan
q_span quote :: FastString
quote)
  = UntypedSpliceFlavour -> Name -> LHsExpr GhcRn -> PendingRnSplice
PendingRnSplice UntypedSpliceFlavour
flavour Name
IdP GhcRn
n (UntypedSpliceFlavour
-> Name -> SrcSpan -> FastString -> LHsExpr GhcRn
mkQuasiQuoteExpr UntypedSpliceFlavour
flavour Name
IdP GhcRn
quoter SrcSpan
q_span FastString
quote)
makePending _ splice :: HsSplice GhcRn
splice@(HsTypedSplice {})
  = String -> MsgDoc -> PendingRnSplice
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "makePending" (HsSplice GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
splice)
makePending _ splice :: HsSplice GhcRn
splice@(HsSpliced {})
  = String -> MsgDoc -> PendingRnSplice
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "makePending" (HsSplice GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
splice)
makePending _ splice :: HsSplice GhcRn
splice@(HsSplicedT {})
  = String -> MsgDoc -> PendingRnSplice
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "makePending" (HsSplice GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
splice)
makePending _ splice :: HsSplice GhcRn
splice@(XSplice {})
  = String -> MsgDoc -> PendingRnSplice
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "makePending" (HsSplice GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
splice)
mkQuasiQuoteExpr :: UntypedSpliceFlavour -> Name -> SrcSpan -> FastString
                 -> LHsExpr GhcRn
mkQuasiQuoteExpr :: UntypedSpliceFlavour
-> Name -> SrcSpan -> FastString -> LHsExpr GhcRn
mkQuasiQuoteExpr flavour :: UntypedSpliceFlavour
flavour quoter :: Name
quoter q_span :: SrcSpan
q_span quote :: FastString
quote
  = SrcSpan -> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
q_span (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn)
-> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a b. (a -> b) -> a -> b
$ XApp GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp GhcRn
NoExt
noExt (SrcSpan -> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
q_span
              (SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn)
-> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a b. (a -> b) -> a -> b
$ XApp GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XApp p -> LHsExpr p -> LHsExpr p -> HsExpr p
HsApp XApp GhcRn
NoExt
noExt (SrcSpan -> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
q_span (XVar GhcRn -> Located (IdP GhcRn) -> HsExpr GhcRn
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar GhcRn
NoExt
noExt (SrcSpan -> SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
q_span Name
SrcSpanLess (Located Name)
quote_selector)))
                            LHsExpr GhcRn
quoterExpr)
                     LHsExpr GhcRn
quoteExpr
  where
    quoterExpr :: LHsExpr GhcRn
quoterExpr = SrcSpan -> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
q_span (HsExpr GhcRn -> LHsExpr GhcRn) -> HsExpr GhcRn -> LHsExpr GhcRn
forall a b. (a -> b) -> a -> b
$! XVar GhcRn -> Located (IdP GhcRn) -> HsExpr GhcRn
forall p. XVar p -> Located (IdP p) -> HsExpr p
HsVar XVar GhcRn
NoExt
noExt (Located Name -> HsExpr GhcRn) -> Located Name -> HsExpr GhcRn
forall a b. (a -> b) -> a -> b
$! (SrcSpan -> SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
q_span Name
SrcSpanLess (Located Name)
quoter)
    quoteExpr :: LHsExpr GhcRn
quoteExpr  = SrcSpan -> SrcSpanLess (LHsExpr GhcRn) -> LHsExpr GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
q_span (HsExpr GhcRn -> LHsExpr GhcRn) -> HsExpr GhcRn -> LHsExpr GhcRn
forall a b. (a -> b) -> a -> b
$! XLitE GhcRn -> HsLit GhcRn -> HsExpr GhcRn
forall p. XLitE p -> HsLit p -> HsExpr p
HsLit XLitE GhcRn
NoExt
noExt (HsLit GhcRn -> HsExpr GhcRn) -> HsLit GhcRn -> HsExpr GhcRn
forall a b. (a -> b) -> a -> b
$! XHsString GhcRn -> FastString -> HsLit GhcRn
forall x. XHsString x -> FastString -> HsLit x
HsString SourceText
XHsString GhcRn
NoSourceText FastString
quote
    quote_selector :: Name
quote_selector = case UntypedSpliceFlavour
flavour of
                       UntypedExpSplice  -> Name
quoteExpName
                       UntypedPatSplice  -> Name
quotePatName
                       UntypedTypeSplice -> Name
quoteTypeName
                       UntypedDeclSplice -> Name
quoteDecName
rnSplice :: HsSplice GhcPs -> RnM (HsSplice GhcRn, FreeVars)
rnSplice :: HsSplice GhcPs -> TcM (HsSplice GhcRn, FreeVars)
rnSplice (HsTypedSplice x :: XTypedSplice GhcPs
x hasParen :: SpliceDecoration
hasParen splice_name :: IdP GhcPs
splice_name expr :: LHsExpr GhcPs
expr)
  = do  { LHsExpr GhcPs -> String -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a. a -> String -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTH LHsExpr GhcPs
expr "Template Haskell typed splice"
        ; SrcSpan
loc  <- TcRn SrcSpan
getSrcSpanM
        ; Name
n' <- Located RdrName -> RnM Name
newLocalBndrRn (SrcSpan -> SrcSpanLess (Located RdrName) -> Located RdrName
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc SrcSpanLess (Located RdrName)
IdP GhcPs
splice_name)
        ; (expr' :: LHsExpr GhcRn
expr', fvs :: FreeVars
fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
        ; (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XTypedSplice GhcRn
-> SpliceDecoration -> IdP GhcRn -> LHsExpr GhcRn -> HsSplice GhcRn
forall id.
XTypedSplice id
-> SpliceDecoration -> IdP id -> LHsExpr id -> HsSplice id
HsTypedSplice XTypedSplice GhcPs
XTypedSplice GhcRn
x SpliceDecoration
hasParen Name
IdP GhcRn
n' LHsExpr GhcRn
expr', FreeVars
fvs) }
rnSplice (HsUntypedSplice x :: XUntypedSplice GhcPs
x hasParen :: SpliceDecoration
hasParen splice_name :: IdP GhcPs
splice_name expr :: LHsExpr GhcPs
expr)
  = do  { LHsExpr GhcPs -> String -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a. a -> String -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTH LHsExpr GhcPs
expr "Template Haskell untyped splice"
        ; SrcSpan
loc  <- TcRn SrcSpan
getSrcSpanM
        ; Name
n' <- Located RdrName -> RnM Name
newLocalBndrRn (SrcSpan -> SrcSpanLess (Located RdrName) -> Located RdrName
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc SrcSpanLess (Located RdrName)
IdP GhcPs
splice_name)
        ; (expr' :: LHsExpr GhcRn
expr', fvs :: FreeVars
fvs) <- LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
expr
        ; (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XUntypedSplice GhcRn
-> SpliceDecoration -> IdP GhcRn -> LHsExpr GhcRn -> HsSplice GhcRn
forall id.
XUntypedSplice id
-> SpliceDecoration -> IdP id -> LHsExpr id -> HsSplice id
HsUntypedSplice XUntypedSplice GhcPs
XUntypedSplice GhcRn
x SpliceDecoration
hasParen Name
IdP GhcRn
n' LHsExpr GhcRn
expr', FreeVars
fvs) }
rnSplice (HsQuasiQuote x :: XQuasiQuote GhcPs
x splice_name :: IdP GhcPs
splice_name quoter :: IdP GhcPs
quoter q_loc :: SrcSpan
q_loc quote :: FastString
quote)
  = do  { RdrName -> String -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a. a -> String -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkTH RdrName
IdP GhcPs
quoter "Template Haskell quasi-quote"
        ; SrcSpan
loc  <- TcRn SrcSpan
getSrcSpanM
        ; Name
splice_name' <- Located RdrName -> RnM Name
newLocalBndrRn (SrcSpan -> SrcSpanLess (Located RdrName) -> Located RdrName
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc SrcSpanLess (Located RdrName)
IdP GhcPs
splice_name)
          
        ; Name
quoter' <- RdrName -> RnM Name
lookupOccRn RdrName
IdP GhcPs
quoter
        ; Module
this_mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
forall (m :: * -> *). HasModule m => m Module
getModule
        ; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Module -> Name -> Bool
nameIsLocalOrFrom Module
this_mod Name
quoter') (IOEnv (Env TcGblEnv TcLclEnv) ()
 -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$
          Name -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkThLocalName Name
quoter'
        ; (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XQuasiQuote GhcRn
-> IdP GhcRn
-> IdP GhcRn
-> SrcSpan
-> FastString
-> HsSplice GhcRn
forall id.
XQuasiQuote id
-> IdP id -> IdP id -> SrcSpan -> FastString -> HsSplice id
HsQuasiQuote XQuasiQuote GhcPs
XQuasiQuote GhcRn
x Name
IdP GhcRn
splice_name' Name
IdP GhcRn
quoter' SrcSpan
q_loc FastString
quote
                                                             , Name -> FreeVars
unitFV Name
quoter') }
rnSplice splice :: HsSplice GhcPs
splice@(HsSpliced {}) = String -> MsgDoc -> TcM (HsSplice GhcRn, FreeVars)
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnSplice" (HsSplice GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcPs
splice)
rnSplice splice :: HsSplice GhcPs
splice@(HsSplicedT {}) = String -> MsgDoc -> TcM (HsSplice GhcRn, FreeVars)
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnSplice" (HsSplice GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcPs
splice)
rnSplice splice :: HsSplice GhcPs
splice@(XSplice {})   = String -> MsgDoc -> TcM (HsSplice GhcRn, FreeVars)
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnSplice" (HsSplice GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcPs
splice)
rnSpliceExpr :: HsSplice GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSpliceExpr :: HsSplice GhcPs -> RnM (HsExpr GhcRn, FreeVars)
rnSpliceExpr splice :: HsSplice GhcPs
splice
  = (HsSplice GhcRn -> RnM (HsExpr GhcRn, FreeVars))
-> (HsSplice GhcRn -> (PendingRnSplice, HsExpr GhcRn))
-> HsSplice GhcPs
-> RnM (HsExpr GhcRn, FreeVars)
forall a.
(HsSplice GhcRn -> RnM (a, FreeVars))
-> (HsSplice GhcRn -> (PendingRnSplice, a))
-> HsSplice GhcPs
-> RnM (a, FreeVars)
rnSpliceGen HsSplice GhcRn -> RnM (HsExpr GhcRn, FreeVars)
run_expr_splice HsSplice GhcRn -> (PendingRnSplice, HsExpr GhcRn)
pend_expr_splice HsSplice GhcPs
splice
  where
    pend_expr_splice :: HsSplice GhcRn -> (PendingRnSplice, HsExpr GhcRn)
    pend_expr_splice :: HsSplice GhcRn -> (PendingRnSplice, HsExpr GhcRn)
pend_expr_splice rn_splice :: HsSplice GhcRn
rn_splice
        = (UntypedSpliceFlavour -> HsSplice GhcRn -> PendingRnSplice
makePending UntypedSpliceFlavour
UntypedExpSplice HsSplice GhcRn
rn_splice, XSpliceE GhcRn -> HsSplice GhcRn -> HsExpr GhcRn
forall p. XSpliceE p -> HsSplice p -> HsExpr p
HsSpliceE XSpliceE GhcRn
NoExt
noExt HsSplice GhcRn
rn_splice)
    run_expr_splice :: HsSplice GhcRn -> RnM (HsExpr GhcRn, FreeVars)
    run_expr_splice :: HsSplice GhcRn -> RnM (HsExpr GhcRn, FreeVars)
run_expr_splice rn_splice :: HsSplice GhcRn
rn_splice
      | HsSplice GhcRn -> Bool
forall id. HsSplice id -> Bool
isTypedSplice HsSplice GhcRn
rn_splice   
      = do {  
             String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rnSpliceExpr: typed expression splice" MsgDoc
empty
           ; LocalRdrEnv
lcl_rdr <- RnM LocalRdrEnv
getLocalRdrEnv
           ; GlobalRdrEnv
gbl_rdr <- TcRn GlobalRdrEnv
getGlobalRdrEnv
           ; let gbl_names :: FreeVars
gbl_names = [Name] -> FreeVars
mkNameSet [GlobalRdrElt -> Name
gre_name GlobalRdrElt
gre | GlobalRdrElt
gre <- GlobalRdrEnv -> [GlobalRdrElt]
globalRdrEnvElts GlobalRdrEnv
gbl_rdr
                                                     , GlobalRdrElt -> Bool
isLocalGRE GlobalRdrElt
gre]
                 lcl_names :: FreeVars
lcl_names = [Name] -> FreeVars
mkNameSet (LocalRdrEnv -> [Name]
localRdrEnvElts LocalRdrEnv
lcl_rdr)
           ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return (XSpliceE GhcRn -> HsSplice GhcRn -> HsExpr GhcRn
forall p. XSpliceE p -> HsSplice p -> HsExpr p
HsSpliceE XSpliceE GhcRn
NoExt
noExt HsSplice GhcRn
rn_splice, FreeVars
lcl_names FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
gbl_names) }
      | Bool
otherwise  
      = do { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rnSpliceExpr: untyped expression splice" MsgDoc
empty
           ; (rn_expr :: LHsExpr GhcPs
rn_expr, mod_finalizers :: [ForeignRef (Q ())]
mod_finalizers) <-
                UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn (LHsExpr GhcPs))
-> (LHsExpr GhcPs -> MsgDoc)
-> HsSplice GhcRn
-> TcRn (LHsExpr GhcPs, [ForeignRef (Q ())])
forall res.
UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn res)
-> (res -> MsgDoc)
-> HsSplice GhcRn
-> TcRn (res, [ForeignRef (Q ())])
runRnSplice UntypedSpliceFlavour
UntypedExpSplice LHsExpr GhcTc -> TcRn (LHsExpr GhcPs)
runMetaE LHsExpr GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
rn_splice
           ; (lexpr3 :: LHsExpr GhcRn
lexpr3, fvs :: FreeVars
fvs) <- RnM (LHsExpr GhcRn, FreeVars) -> RnM (LHsExpr GhcRn, FreeVars)
forall r. TcM r -> TcM r
checkNoErrs (LHsExpr GhcPs -> RnM (LHsExpr GhcRn, FreeVars)
rnLExpr LHsExpr GhcPs
rn_expr)
             
           ; (HsExpr GhcRn, FreeVars) -> RnM (HsExpr GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( XPar GhcRn -> LHsExpr GhcRn -> HsExpr GhcRn
forall p. XPar p -> LHsExpr p -> HsExpr p
HsPar XPar GhcRn
NoExt
noExt (LHsExpr GhcRn -> HsExpr GhcRn) -> LHsExpr GhcRn -> HsExpr GhcRn
forall a b. (a -> b) -> a -> b
$ XSpliceE GhcRn -> HsSplice GhcRn -> HsExpr GhcRn
forall p. XSpliceE p -> HsSplice p -> HsExpr p
HsSpliceE XSpliceE GhcRn
NoExt
noExt
                            (HsSplice GhcRn -> HsExpr GhcRn)
-> (HsExpr GhcRn -> HsSplice GhcRn) -> HsExpr GhcRn -> HsExpr GhcRn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XSpliced GhcRn
-> ThModFinalizers -> HsSplicedThing GhcRn -> HsSplice GhcRn
forall id.
XSpliced id -> ThModFinalizers -> HsSplicedThing id -> HsSplice id
HsSpliced XSpliced GhcRn
NoExt
noExt ([ForeignRef (Q ())] -> ThModFinalizers
ThModFinalizers [ForeignRef (Q ())]
mod_finalizers)
                            (HsSplicedThing GhcRn -> HsSplice GhcRn)
-> (HsExpr GhcRn -> HsSplicedThing GhcRn)
-> HsExpr GhcRn
-> HsSplice GhcRn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsExpr GhcRn -> HsSplicedThing GhcRn
forall id. HsExpr id -> HsSplicedThing id
HsSplicedExpr (HsExpr GhcRn -> HsExpr GhcRn) -> LHsExpr GhcRn -> LHsExpr GhcRn
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                            LHsExpr GhcRn
lexpr3
                    , FreeVars
fvs)
           }
rnSpliceType :: HsSplice GhcPs -> RnM (HsType GhcRn, FreeVars)
rnSpliceType :: HsSplice GhcPs -> RnM (HsType GhcRn, FreeVars)
rnSpliceType splice :: HsSplice GhcPs
splice
  = (HsSplice GhcRn -> RnM (HsType GhcRn, FreeVars))
-> (HsSplice GhcRn -> (PendingRnSplice, HsType GhcRn))
-> HsSplice GhcPs
-> RnM (HsType GhcRn, FreeVars)
forall a.
(HsSplice GhcRn -> RnM (a, FreeVars))
-> (HsSplice GhcRn -> (PendingRnSplice, a))
-> HsSplice GhcPs
-> RnM (a, FreeVars)
rnSpliceGen HsSplice GhcRn -> RnM (HsType GhcRn, FreeVars)
run_type_splice HsSplice GhcRn -> (PendingRnSplice, HsType GhcRn)
pend_type_splice HsSplice GhcPs
splice
  where
    pend_type_splice :: HsSplice GhcRn -> (PendingRnSplice, HsType GhcRn)
pend_type_splice rn_splice :: HsSplice GhcRn
rn_splice
       = ( UntypedSpliceFlavour -> HsSplice GhcRn -> PendingRnSplice
makePending UntypedSpliceFlavour
UntypedTypeSplice HsSplice GhcRn
rn_splice
         , XSpliceTy GhcRn -> HsSplice GhcRn -> HsType GhcRn
forall pass. XSpliceTy pass -> HsSplice pass -> HsType pass
HsSpliceTy XSpliceTy GhcRn
NoExt
noExt HsSplice GhcRn
rn_splice)
    run_type_splice :: HsSplice GhcRn -> RnM (HsType GhcRn, FreeVars)
run_type_splice rn_splice :: HsSplice GhcRn
rn_splice
      = do { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rnSpliceType: untyped type splice" MsgDoc
empty
           ; (hs_ty2 :: LHsType GhcPs
hs_ty2, mod_finalizers :: [ForeignRef (Q ())]
mod_finalizers) <-
                UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn (LHsType GhcPs))
-> (LHsType GhcPs -> MsgDoc)
-> HsSplice GhcRn
-> TcRn (LHsType GhcPs, [ForeignRef (Q ())])
forall res.
UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn res)
-> (res -> MsgDoc)
-> HsSplice GhcRn
-> TcRn (res, [ForeignRef (Q ())])
runRnSplice UntypedSpliceFlavour
UntypedTypeSplice LHsExpr GhcTc -> TcRn (LHsType GhcPs)
runMetaT LHsType GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
rn_splice
           ; (hs_ty3 :: LHsType GhcRn
hs_ty3, fvs :: FreeVars
fvs) <- do { let doc :: HsDocContext
doc = LHsType GhcPs -> HsDocContext
SpliceTypeCtx LHsType GhcPs
hs_ty2
                                 ; RnM (LHsType GhcRn, FreeVars) -> RnM (LHsType GhcRn, FreeVars)
forall r. TcM r -> TcM r
checkNoErrs (RnM (LHsType GhcRn, FreeVars) -> RnM (LHsType GhcRn, FreeVars))
-> RnM (LHsType GhcRn, FreeVars) -> RnM (LHsType GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$ HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnLHsType HsDocContext
doc LHsType GhcPs
hs_ty2 }
                                    
             
           ; (HsType GhcRn, FreeVars) -> RnM (HsType GhcRn, FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( XParTy GhcRn -> LHsType GhcRn -> HsType GhcRn
forall pass. XParTy pass -> LHsType pass -> HsType pass
HsParTy XParTy GhcRn
NoExt
noExt (LHsType GhcRn -> HsType GhcRn) -> LHsType GhcRn -> HsType GhcRn
forall a b. (a -> b) -> a -> b
$ XSpliceTy GhcRn -> HsSplice GhcRn -> HsType GhcRn
forall pass. XSpliceTy pass -> HsSplice pass -> HsType pass
HsSpliceTy XSpliceTy GhcRn
NoExt
noExt
                              (HsSplice GhcRn -> HsType GhcRn)
-> (HsType GhcRn -> HsSplice GhcRn) -> HsType GhcRn -> HsType GhcRn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XSpliced GhcRn
-> ThModFinalizers -> HsSplicedThing GhcRn -> HsSplice GhcRn
forall id.
XSpliced id -> ThModFinalizers -> HsSplicedThing id -> HsSplice id
HsSpliced XSpliced GhcRn
NoExt
noExt ([ForeignRef (Q ())] -> ThModFinalizers
ThModFinalizers [ForeignRef (Q ())]
mod_finalizers)
                              (HsSplicedThing GhcRn -> HsSplice GhcRn)
-> (HsType GhcRn -> HsSplicedThing GhcRn)
-> HsType GhcRn
-> HsSplice GhcRn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsType GhcRn -> HsSplicedThing GhcRn
forall id. HsType id -> HsSplicedThing id
HsSplicedTy (HsType GhcRn -> HsType GhcRn) -> LHsType GhcRn -> LHsType GhcRn
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                              LHsType GhcRn
hs_ty3
                    , FreeVars
fvs
                    ) }
              
              
rnSplicePat :: HsSplice GhcPs -> RnM ( Either (Pat GhcPs) (Pat GhcRn)
                                       , FreeVars)
rnSplicePat :: HsSplice GhcPs -> RnM (Either (LPat GhcPs) (LPat GhcRn), FreeVars)
rnSplicePat splice :: HsSplice GhcPs
splice
  = (HsSplice GhcRn
 -> RnM (Either (LPat GhcPs) (LPat GhcRn), FreeVars))
-> (HsSplice GhcRn
    -> (PendingRnSplice, Either (LPat GhcPs) (LPat GhcRn)))
-> HsSplice GhcPs
-> RnM (Either (LPat GhcPs) (LPat GhcRn), FreeVars)
forall a.
(HsSplice GhcRn -> RnM (a, FreeVars))
-> (HsSplice GhcRn -> (PendingRnSplice, a))
-> HsSplice GhcPs
-> RnM (a, FreeVars)
rnSpliceGen HsSplice GhcRn -> RnM (Either (LPat GhcPs) (LPat GhcRn), FreeVars)
run_pat_splice HsSplice GhcRn
-> (PendingRnSplice, Either (LPat GhcPs) (LPat GhcRn))
forall b.
HsSplice GhcRn -> (PendingRnSplice, Either b (LPat GhcRn))
pend_pat_splice HsSplice GhcPs
splice
  where
    pend_pat_splice :: HsSplice GhcRn ->
                       (PendingRnSplice, Either b (Pat GhcRn))
    pend_pat_splice :: HsSplice GhcRn -> (PendingRnSplice, Either b (LPat GhcRn))
pend_pat_splice rn_splice :: HsSplice GhcRn
rn_splice
      = (UntypedSpliceFlavour -> HsSplice GhcRn -> PendingRnSplice
makePending UntypedSpliceFlavour
UntypedPatSplice HsSplice GhcRn
rn_splice
        , LPat GhcRn -> Either b (LPat GhcRn)
forall a b. b -> Either a b
Right (XSplicePat GhcRn -> HsSplice GhcRn -> LPat GhcRn
forall p. XSplicePat p -> HsSplice p -> Pat p
SplicePat XSplicePat GhcRn
NoExt
noExt HsSplice GhcRn
rn_splice))
    run_pat_splice :: HsSplice GhcRn ->
                      RnM (Either (Pat GhcPs) (Pat GhcRn), FreeVars)
    run_pat_splice :: HsSplice GhcRn -> RnM (Either (LPat GhcPs) (LPat GhcRn), FreeVars)
run_pat_splice rn_splice :: HsSplice GhcRn
rn_splice
      = do { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rnSplicePat: untyped pattern splice" MsgDoc
empty
           ; (pat :: LPat GhcPs
pat, mod_finalizers :: [ForeignRef (Q ())]
mod_finalizers) <-
                UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn (LPat GhcPs))
-> (LPat GhcPs -> MsgDoc)
-> HsSplice GhcRn
-> TcRn (LPat GhcPs, [ForeignRef (Q ())])
forall res.
UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn res)
-> (res -> MsgDoc)
-> HsSplice GhcRn
-> TcRn (res, [ForeignRef (Q ())])
runRnSplice UntypedSpliceFlavour
UntypedPatSplice LHsExpr GhcTc -> TcRn (LPat GhcPs)
runMetaP LPat GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcRn
rn_splice
             
           ; (Either (LPat GhcPs) (LPat GhcRn), FreeVars)
-> RnM (Either (LPat GhcPs) (LPat GhcRn), FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ( LPat GhcPs -> Either (LPat GhcPs) (LPat GhcRn)
forall a b. a -> Either a b
Left (LPat GhcPs -> Either (LPat GhcPs) (LPat GhcRn))
-> LPat GhcPs -> Either (LPat GhcPs) (LPat GhcRn)
forall a b. (a -> b) -> a -> b
$ XParPat GhcPs -> LPat GhcPs -> LPat GhcPs
forall p. XParPat p -> Pat p -> Pat p
ParPat XParPat GhcPs
NoExt
noExt (LPat GhcPs -> LPat GhcPs) -> LPat GhcPs -> LPat GhcPs
forall a b. (a -> b) -> a -> b
$ ((XSplicePat GhcPs -> HsSplice GhcPs -> LPat GhcPs
forall p. XSplicePat p -> HsSplice p -> Pat p
SplicePat XSplicePat GhcPs
NoExt
noExt)
                              (HsSplice GhcPs -> LPat GhcPs)
-> (LPat GhcPs -> HsSplice GhcPs) -> LPat GhcPs -> LPat GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XSpliced GhcPs
-> ThModFinalizers -> HsSplicedThing GhcPs -> HsSplice GhcPs
forall id.
XSpliced id -> ThModFinalizers -> HsSplicedThing id -> HsSplice id
HsSpliced XSpliced GhcPs
NoExt
noExt ([ForeignRef (Q ())] -> ThModFinalizers
ThModFinalizers [ForeignRef (Q ())]
mod_finalizers)
                              (HsSplicedThing GhcPs -> HsSplice GhcPs)
-> (LPat GhcPs -> HsSplicedThing GhcPs)
-> LPat GhcPs
-> HsSplice GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LPat GhcPs -> HsSplicedThing GhcPs
forall id. Pat id -> HsSplicedThing id
HsSplicedPat)  (SrcSpanLess (LPat GhcPs) -> SrcSpanLess (LPat GhcPs))
-> LPat GhcPs -> LPat GhcPs
forall a b.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> SrcSpanLess b) -> a -> b
`onHasSrcSpan`
                              LPat GhcPs
pat
                    , FreeVars
emptyFVs
                    ) }
              
              
rnSpliceDecl :: SpliceDecl GhcPs -> RnM (SpliceDecl GhcRn, FreeVars)
rnSpliceDecl :: SpliceDecl GhcPs -> RnM (SpliceDecl GhcRn, FreeVars)
rnSpliceDecl (SpliceDecl _ (Located (HsSplice GhcPs)
-> Located (SrcSpanLess (Located (HsSplice GhcPs)))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L loc :: SrcSpan
loc splice :: SrcSpanLess (Located (HsSplice GhcPs))
splice) flg :: SpliceExplicitFlag
flg)
  = (HsSplice GhcRn -> RnM (SpliceDecl GhcRn, FreeVars))
-> (HsSplice GhcRn -> (PendingRnSplice, SpliceDecl GhcRn))
-> HsSplice GhcPs
-> RnM (SpliceDecl GhcRn, FreeVars)
forall a.
(HsSplice GhcRn -> RnM (a, FreeVars))
-> (HsSplice GhcRn -> (PendingRnSplice, a))
-> HsSplice GhcPs
-> RnM (a, FreeVars)
rnSpliceGen HsSplice GhcRn -> RnM (SpliceDecl GhcRn, FreeVars)
forall a a. Outputable a => a -> a
run_decl_splice HsSplice GhcRn -> (PendingRnSplice, SpliceDecl GhcRn)
pend_decl_splice SrcSpanLess (Located (HsSplice GhcPs))
HsSplice GhcPs
splice
  where
    pend_decl_splice :: HsSplice GhcRn -> (PendingRnSplice, SpliceDecl GhcRn)
pend_decl_splice rn_splice :: HsSplice GhcRn
rn_splice
       = ( UntypedSpliceFlavour -> HsSplice GhcRn -> PendingRnSplice
makePending UntypedSpliceFlavour
UntypedDeclSplice HsSplice GhcRn
rn_splice
         , XSpliceDecl GhcRn
-> Located (HsSplice GhcRn)
-> SpliceExplicitFlag
-> SpliceDecl GhcRn
forall p.
XSpliceDecl p
-> Located (HsSplice p) -> SpliceExplicitFlag -> SpliceDecl p
SpliceDecl XSpliceDecl GhcRn
NoExt
noExt (SrcSpan
-> SrcSpanLess (Located (HsSplice GhcRn))
-> Located (HsSplice GhcRn)
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc SrcSpanLess (Located (HsSplice GhcRn))
HsSplice GhcRn
rn_splice) SpliceExplicitFlag
flg)
    run_decl_splice :: a -> a
run_decl_splice rn_splice :: a
rn_splice = String -> MsgDoc -> a
forall a. HasCallStack => String -> MsgDoc -> a
pprPanic "rnSpliceDecl" (a -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr a
rn_splice)
rnSpliceDecl (XSpliceDecl _) = String -> RnM (SpliceDecl GhcRn, FreeVars)
forall a. String -> a
panic "rnSpliceDecl"
rnTopSpliceDecls :: HsSplice GhcPs -> RnM ([LHsDecl GhcPs], FreeVars)
rnTopSpliceDecls :: HsSplice GhcPs -> RnM ([LHsDecl GhcPs], FreeVars)
rnTopSpliceDecls splice :: HsSplice GhcPs
splice
   = do  { (rn_splice :: HsSplice GhcRn
rn_splice, fvs :: FreeVars
fvs) <- TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall r. TcM r -> TcM r
checkNoErrs (TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars))
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                               ThStage
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a. ThStage -> TcM a -> TcM a
setStage (SpliceType -> ThStage
Splice SpliceType
Untyped) (TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars))
-> TcM (HsSplice GhcRn, FreeVars) -> TcM (HsSplice GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
                               HsSplice GhcPs -> TcM (HsSplice GhcRn, FreeVars)
rnSplice HsSplice GhcPs
splice
           
           
           
           
           
           
           
           
           
         ; String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "rnTopSpliceDecls: untyped declaration splice" MsgDoc
empty
         ; (decls :: [LHsDecl GhcPs]
decls, mod_finalizers :: [ForeignRef (Q ())]
mod_finalizers) <- TcM ([LHsDecl GhcPs], [ForeignRef (Q ())])
-> TcM ([LHsDecl GhcPs], [ForeignRef (Q ())])
forall r. TcM r -> TcM r
checkNoErrs (TcM ([LHsDecl GhcPs], [ForeignRef (Q ())])
 -> TcM ([LHsDecl GhcPs], [ForeignRef (Q ())]))
-> TcM ([LHsDecl GhcPs], [ForeignRef (Q ())])
-> TcM ([LHsDecl GhcPs], [ForeignRef (Q ())])
forall a b. (a -> b) -> a -> b
$
               UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn [LHsDecl GhcPs])
-> ([LHsDecl GhcPs] -> MsgDoc)
-> HsSplice GhcRn
-> TcM ([LHsDecl GhcPs], [ForeignRef (Q ())])
forall res.
UntypedSpliceFlavour
-> (LHsExpr GhcTc -> TcRn res)
-> (res -> MsgDoc)
-> HsSplice GhcRn
-> TcRn (res, [ForeignRef (Q ())])
runRnSplice UntypedSpliceFlavour
UntypedDeclSplice LHsExpr GhcTc -> TcRn [LHsDecl GhcPs]
runMetaD [LHsDecl GhcPs] -> MsgDoc
ppr_decls HsSplice GhcRn
rn_splice
         ; [ForeignRef (Q ())] -> IOEnv (Env TcGblEnv TcLclEnv) ()
add_mod_finalizers_now [ForeignRef (Q ())]
mod_finalizers
         ; ([LHsDecl GhcPs], FreeVars) -> RnM ([LHsDecl GhcPs], FreeVars)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LHsDecl GhcPs]
decls,FreeVars
fvs) }
   where
     ppr_decls :: [LHsDecl GhcPs] -> SDoc
     ppr_decls :: [LHsDecl GhcPs] -> MsgDoc
ppr_decls ds :: [LHsDecl GhcPs]
ds = [MsgDoc] -> MsgDoc
vcat ((LHsDecl GhcPs -> MsgDoc) -> [LHsDecl GhcPs] -> [MsgDoc]
forall a b. (a -> b) -> [a] -> [b]
map LHsDecl GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr [LHsDecl GhcPs]
ds)
     
     
     
     
     
     
     
     add_mod_finalizers_now :: [ForeignRef (TH.Q ())] -> TcRn ()
     add_mod_finalizers_now :: [ForeignRef (Q ())] -> IOEnv (Env TcGblEnv TcLclEnv) ()
add_mod_finalizers_now []             = () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
     add_mod_finalizers_now mod_finalizers :: [ForeignRef (Q ())]
mod_finalizers = do
       TcRef [(TcLclEnv, ThModFinalizers)]
th_modfinalizers_var <- (TcGblEnv -> TcRef [(TcLclEnv, ThModFinalizers)])
-> TcRnIf TcGblEnv TcLclEnv TcGblEnv
-> IOEnv
     (Env TcGblEnv TcLclEnv) (TcRef [(TcLclEnv, ThModFinalizers)])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TcGblEnv -> TcRef [(TcLclEnv, ThModFinalizers)]
tcg_th_modfinalizers TcRnIf TcGblEnv TcLclEnv TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv
       TcLclEnv
env <- TcRnIf TcGblEnv TcLclEnv TcLclEnv
forall gbl lcl. TcRnIf gbl lcl lcl
getLclEnv
       TcRef [(TcLclEnv, ThModFinalizers)]
-> ([(TcLclEnv, ThModFinalizers)] -> [(TcLclEnv, ThModFinalizers)])
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a gbl lcl. TcRef a -> (a -> a) -> TcRnIf gbl lcl ()
updTcRef TcRef [(TcLclEnv, ThModFinalizers)]
th_modfinalizers_var (([(TcLclEnv, ThModFinalizers)] -> [(TcLclEnv, ThModFinalizers)])
 -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> ([(TcLclEnv, ThModFinalizers)] -> [(TcLclEnv, ThModFinalizers)])
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$ \fins :: [(TcLclEnv, ThModFinalizers)]
fins ->
         (TcLclEnv
env, [ForeignRef (Q ())] -> ThModFinalizers
ThModFinalizers [ForeignRef (Q ())]
mod_finalizers) (TcLclEnv, ThModFinalizers)
-> [(TcLclEnv, ThModFinalizers)] -> [(TcLclEnv, ThModFinalizers)]
forall a. a -> [a] -> [a]
: [(TcLclEnv, ThModFinalizers)]
fins
spliceCtxt :: HsSplice GhcPs -> SDoc
spliceCtxt :: HsSplice GhcPs -> MsgDoc
spliceCtxt splice :: HsSplice GhcPs
splice
  = MsgDoc -> ThLevel -> MsgDoc -> MsgDoc
hang (String -> MsgDoc
text "In the" MsgDoc -> MsgDoc -> MsgDoc
<+> MsgDoc
what) 2 (HsSplice GhcPs -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr HsSplice GhcPs
splice)
  where
    what :: MsgDoc
what = case HsSplice GhcPs
splice of
             HsUntypedSplice {} -> String -> MsgDoc
text "untyped splice:"
             HsTypedSplice   {} -> String -> MsgDoc
text "typed splice:"
             HsQuasiQuote    {} -> String -> MsgDoc
text "quasi-quotation:"
             HsSpliced       {} -> String -> MsgDoc
text "spliced expression:"
             HsSplicedT      {} -> String -> MsgDoc
text "spliced expression:"
             XSplice         {} -> String -> MsgDoc
text "spliced expression:"
data SpliceInfo
  = SpliceInfo
    { SpliceInfo -> String
spliceDescription  :: String
    , SpliceInfo -> Maybe (LHsExpr GhcRn)
spliceSource       :: Maybe (LHsExpr GhcRn) 
                                                  
    , SpliceInfo -> Bool
spliceIsDecl       :: Bool    
                                    
    , SpliceInfo -> MsgDoc
spliceGenerated    :: SDoc
    }
        
        
        
        
        
traceSplice :: SpliceInfo -> TcM ()
traceSplice :: SpliceInfo -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceSplice (SpliceInfo { spliceDescription :: SpliceInfo -> String
spliceDescription = String
sd, spliceSource :: SpliceInfo -> Maybe (LHsExpr GhcRn)
spliceSource = Maybe (LHsExpr GhcRn)
mb_src
                        , spliceGenerated :: SpliceInfo -> MsgDoc
spliceGenerated = MsgDoc
gen, spliceIsDecl :: SpliceInfo -> Bool
spliceIsDecl = Bool
is_decl })
  = do { SrcSpan
loc <- case Maybe (LHsExpr GhcRn)
mb_src of
                   Nothing           -> TcRn SrcSpan
getSrcSpanM
                   Just (LHsExpr GhcRn -> Located (SrcSpanLess (LHsExpr GhcRn))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L loc :: SrcSpan
loc _) -> SrcSpan -> TcRn SrcSpan
forall (m :: * -> *) a. Monad m => a -> m a
return SrcSpan
loc
       ; DumpFlag -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceOptTcRn DumpFlag
Opt_D_dump_splices (SrcSpan -> MsgDoc
spliceDebugDoc SrcSpan
loc)
       ; Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
is_decl (IOEnv (Env TcGblEnv TcLclEnv) ()
 -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$  
         do { DynFlags
dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
            ; IO () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> IOEnv (Env TcGblEnv TcLclEnv) ())
-> IO () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a b. (a -> b) -> a -> b
$ PrintUnqualified -> DynFlags -> DumpFlag -> MsgDoc -> IO ()
dumpIfSet_dyn_printer PrintUnqualified
alwaysQualify DynFlags
dflags DumpFlag
Opt_D_th_dec_file
                                             (SrcSpan -> MsgDoc
spliceCodeDoc SrcSpan
loc) } }
  where
    
    spliceDebugDoc :: SrcSpan -> SDoc
    spliceDebugDoc :: SrcSpan -> MsgDoc
spliceDebugDoc loc :: SrcSpan
loc
      = let code :: [MsgDoc]
code = case Maybe (LHsExpr GhcRn)
mb_src of
                     Nothing -> [MsgDoc]
ending
                     Just e :: LHsExpr GhcRn
e  -> ThLevel -> MsgDoc -> MsgDoc
nest 2 (LHsExpr GhcRn -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr LHsExpr GhcRn
e) MsgDoc -> [MsgDoc] -> [MsgDoc]
forall a. a -> [a] -> [a]
: [MsgDoc]
ending
            ending :: [MsgDoc]
ending = [ String -> MsgDoc
text "======>", ThLevel -> MsgDoc -> MsgDoc
nest 2 MsgDoc
gen ]
        in  MsgDoc -> ThLevel -> MsgDoc -> MsgDoc
hang (SrcSpan -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr SrcSpan
loc MsgDoc -> MsgDoc -> MsgDoc
<> MsgDoc
colon MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text "Splicing" MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
sd)
               2 ([MsgDoc] -> MsgDoc
sep [MsgDoc]
code)
    
    spliceCodeDoc :: SrcSpan -> SDoc
    spliceCodeDoc :: SrcSpan -> MsgDoc
spliceCodeDoc loc :: SrcSpan
loc
      = [MsgDoc] -> MsgDoc
vcat [ String -> MsgDoc
text "--" MsgDoc -> MsgDoc -> MsgDoc
<+> SrcSpan -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr SrcSpan
loc MsgDoc -> MsgDoc -> MsgDoc
<> MsgDoc
colon MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text "Splicing" MsgDoc -> MsgDoc -> MsgDoc
<+> String -> MsgDoc
text String
sd
             , MsgDoc
gen ]
illegalTypedSplice :: SDoc
illegalTypedSplice :: MsgDoc
illegalTypedSplice = String -> MsgDoc
text "Typed splices may not appear in untyped brackets"
illegalUntypedSplice :: SDoc
illegalUntypedSplice :: MsgDoc
illegalUntypedSplice = String -> MsgDoc
text "Untyped splices may not appear in typed brackets"
checkThLocalName :: Name -> RnM ()
checkThLocalName :: Name -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkThLocalName name :: Name
name
  | Name -> Bool
isUnboundName Name
name   
  = () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()            
  | Bool
otherwise
  = do  { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "checkThLocalName" (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name)
        ; Maybe (TopLevelFlag, ThLevel, ThStage)
mb_local_use <- Name -> TcRn (Maybe (TopLevelFlag, ThLevel, ThStage))
getStageAndBindLevel Name
name
        ; case Maybe (TopLevelFlag, ThLevel, ThStage)
mb_local_use of {
             Nothing -> () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
return () ;  
             Just (top_lvl :: TopLevelFlag
top_lvl, bind_lvl :: ThLevel
bind_lvl, use_stage :: ThStage
use_stage) ->
    do  { let use_lvl :: ThLevel
use_lvl = ThStage -> ThLevel
thLevel ThStage
use_stage
        ; MsgDoc -> ThLevel -> ThLevel -> IOEnv (Env TcGblEnv TcLclEnv) ()
checkWellStaged (MsgDoc -> MsgDoc
quotes (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name)) ThLevel
bind_lvl ThLevel
use_lvl
        ; String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "checkThLocalName" (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name MsgDoc -> MsgDoc -> MsgDoc
<+> ThLevel -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ThLevel
bind_lvl
                                               MsgDoc -> MsgDoc -> MsgDoc
<+> ThStage -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ThStage
use_stage
                                               MsgDoc -> MsgDoc -> MsgDoc
<+> ThLevel -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr ThLevel
use_lvl)
        ; TopLevelFlag
-> ThLevel
-> ThStage
-> ThLevel
-> Name
-> IOEnv (Env TcGblEnv TcLclEnv) ()
checkCrossStageLifting TopLevelFlag
top_lvl ThLevel
bind_lvl ThStage
use_stage ThLevel
use_lvl Name
name } } }
checkCrossStageLifting :: TopLevelFlag -> ThLevel -> ThStage -> ThLevel
                       -> Name -> TcM ()
checkCrossStageLifting :: TopLevelFlag
-> ThLevel
-> ThStage
-> ThLevel
-> Name
-> IOEnv (Env TcGblEnv TcLclEnv) ()
checkCrossStageLifting top_lvl :: TopLevelFlag
top_lvl bind_lvl :: ThLevel
bind_lvl use_stage :: ThStage
use_stage use_lvl :: ThLevel
use_lvl name :: Name
name
  | Brack _ (RnPendingUntyped ps_var :: IORef [PendingRnSplice]
ps_var) <- ThStage
use_stage   
  , ThLevel
use_lvl ThLevel -> ThLevel -> Bool
forall a. Ord a => a -> a -> Bool
> ThLevel
bind_lvl                               
  = TopLevelFlag
-> Name
-> IORef [PendingRnSplice]
-> IOEnv (Env TcGblEnv TcLclEnv) ()
check_cross_stage_lifting TopLevelFlag
top_lvl Name
name IORef [PendingRnSplice]
ps_var
  | Bool
otherwise
  = () -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
check_cross_stage_lifting :: TopLevelFlag -> Name -> TcRef [PendingRnSplice] -> TcM ()
check_cross_stage_lifting :: TopLevelFlag
-> Name
-> IORef [PendingRnSplice]
-> IOEnv (Env TcGblEnv TcLclEnv) ()
check_cross_stage_lifting top_lvl :: TopLevelFlag
top_lvl name :: Name
name ps_var :: IORef [PendingRnSplice]
ps_var
  | TopLevelFlag -> Bool
isTopLevel TopLevelFlag
top_lvl
        
        
        
        
        
        
        
  = Bool
-> IOEnv (Env TcGblEnv TcLclEnv) ()
-> IOEnv (Env TcGblEnv TcLclEnv) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Name -> Bool
isExternalName Name
name) (Name -> IOEnv (Env TcGblEnv TcLclEnv) ()
keepAlive Name
name)
    
  | Bool
otherwise
  =     
        
        
        
        
        
        
        
        
    do  { String -> MsgDoc -> IOEnv (Env TcGblEnv TcLclEnv) ()
traceRn "checkCrossStageLifting" (Name -> MsgDoc
forall a. Outputable a => a -> MsgDoc
ppr Name
name)
          
        ; let lift_expr :: LHsExpr GhcRn
lift_expr   = LHsExpr GhcRn -> LHsExpr GhcRn -> LHsExpr GhcRn
forall (id :: Pass).
LHsExpr (GhcPass id)
-> LHsExpr (GhcPass id) -> LHsExpr (GhcPass id)
nlHsApp (IdP GhcRn -> LHsExpr GhcRn
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar Name
IdP GhcRn
liftName) (IdP GhcRn -> LHsExpr GhcRn
forall (id :: Pass). IdP (GhcPass id) -> LHsExpr (GhcPass id)
nlHsVar Name
IdP GhcRn
name)
              pend_splice :: PendingRnSplice
pend_splice = UntypedSpliceFlavour -> Name -> LHsExpr GhcRn -> PendingRnSplice
PendingRnSplice UntypedSpliceFlavour
UntypedExpSplice Name
name LHsExpr GhcRn
lift_expr
          
        ; [PendingRnSplice]
ps <- IORef [PendingRnSplice]
-> IOEnv (Env TcGblEnv TcLclEnv) [PendingRnSplice]
forall a env. IORef a -> IOEnv env a
readMutVar IORef [PendingRnSplice]
ps_var
        ; IORef [PendingRnSplice]
-> [PendingRnSplice] -> IOEnv (Env TcGblEnv TcLclEnv) ()
forall a env. IORef a -> a -> IOEnv env ()
writeMutVar IORef [PendingRnSplice]
ps_var (PendingRnSplice
pend_splice PendingRnSplice -> [PendingRnSplice] -> [PendingRnSplice]
forall a. a -> [a] -> [a]
: [PendingRnSplice]
ps) }