From a9abb4614a6b56cf78639c8bf6d92ef380861d65 Mon Sep 17 00:00:00 2001 From: Geoffrey Mainland Date: Thu, 16 May 2013 17:18:22 +0100 Subject: [PATCH] Add support for pattern splices. --- compiler/deSugar/Check.lhs | 2 + compiler/deSugar/DsArrows.lhs | 1 + compiler/deSugar/DsMeta.hs | 2 + compiler/deSugar/Match.lhs | 1 + compiler/hsSyn/HsExpr.lhs | 10 +++++ compiler/hsSyn/HsExpr.lhs-boot | 1 + compiler/hsSyn/HsPat.lhs | 13 +++++-- compiler/hsSyn/HsUtils.lhs | 1 + compiler/parser/RdrHsSyn.lhs | 1 + compiler/rename/RnPat.lhs | 12 +++++- compiler/rename/RnSplice.lhs | 56 ++++++++++++++++++++++++++-- compiler/rename/RnSplice.lhs-boot | 1 + compiler/typecheck/TcHsSyn.lhs | 3 ++ compiler/typecheck/TcSplice.lhs | 56 +++++++++++++++++++++++++++- compiler/typecheck/TcSplice.lhs-boot | 1 + 15 files changed, 153 insertions(+), 8 deletions(-) diff --git a/compiler/deSugar/Check.lhs b/compiler/deSugar/Check.lhs index 081960466fce..7a4ba5c29086 100644 --- a/compiler/deSugar/Check.lhs +++ b/compiler/deSugar/Check.lhs @@ -152,6 +152,7 @@ untidy b (L loc p) = L loc (untidy' b p) untidy' _ (BangPat {}) = panic "Check.untidy: BangPat" untidy' _ (ConPatOut {}) = panic "Check.untidy: ConPatOut" untidy' _ (ViewPat {}) = panic "Check.untidy: ViewPat" + untidy' _ (SplicePat {}) = panic "Check.untidy: SplicePat" untidy' _ (QuasiQuotePat {}) = panic "Check.untidy: QuasiQuotePat" untidy' _ (NPat {}) = panic "Check.untidy: NPat" untidy' _ (NPlusKPat {}) = panic "Check.untidy: NPlusKPat" @@ -713,6 +714,7 @@ tidy_pat (NPat lit mb_neg eq) = tidyNPat tidy_lit_pat lit mb_neg eq tidy_pat (LitPat lit) = tidy_lit_pat lit tidy_pat (ConPatIn {}) = panic "Check.tidy_pat: ConPatIn" +tidy_pat (SplicePat {}) = panic "Check.tidy_pat: SplicePat" tidy_pat (QuasiQuotePat {}) = panic "Check.tidy_pat: QuasiQuotePat" tidy_pat (SigPatIn {}) = panic "Check.tidy_pat: SigPatIn" diff --git a/compiler/deSugar/DsArrows.lhs b/compiler/deSugar/DsArrows.lhs index b825acb83615..e776293f4a1c 100644 --- a/compiler/deSugar/DsArrows.lhs +++ b/compiler/deSugar/DsArrows.lhs @@ -1171,6 +1171,7 @@ collectl (L _ pat) bndrs go (SigPatOut pat _) = collectl pat bndrs go (CoPat _ pat _) = collectl (noLoc pat) bndrs go (ViewPat _ pat _) = collectl pat bndrs + go p@(SplicePat {}) = pprPanic "collectl/go" (ppr p) go p@(QuasiQuotePat {}) = pprPanic "collectl/go" (ppr p) collectEvBinders :: TcEvBinds -> [Id] diff --git a/compiler/deSugar/DsMeta.hs b/compiler/deSugar/DsMeta.hs index 053451d0d11c..7810cea23833 100644 --- a/compiler/deSugar/DsMeta.hs +++ b/compiler/deSugar/DsMeta.hs @@ -1285,6 +1285,8 @@ repP p@(SigPatIn {}) = notHandled "Type signatures in patterns" (ppr p) -- repPsig :: Core TH.PatQ -> Core TH.TypeQ -> DsM (Core TH.PatQ) -- repPsig (MkC p) (MkC t) = rep2 sigPName [p, t] +repP (SplicePat splice) = repSplice splice + repP other = notHandled "Exotic pattern" (ppr other) ---------------------------------------------------------- diff --git a/compiler/deSugar/Match.lhs b/compiler/deSugar/Match.lhs index 3b36441b57f3..5621a11f7033 100644 --- a/compiler/deSugar/Match.lhs +++ b/compiler/deSugar/Match.lhs @@ -97,6 +97,7 @@ matchCheck_really dflags ctx@(DsMatchContext hs_ctx _) vars ty qs incomplete_flag RecUpd = wopt Opt_WarnIncompletePatternsRecUpd dflags + incomplete_flag ThPatSplice = False incomplete_flag ThPatQuote = False incomplete_flag (StmtCtxt {}) = False -- Don't warn about incomplete patterns -- in list comprehensions, pattern guards diff --git a/compiler/hsSyn/HsExpr.lhs b/compiler/hsSyn/HsExpr.lhs index c19f19658ca5..423a09fd8ffb 100644 --- a/compiler/hsSyn/HsExpr.lhs +++ b/compiler/hsSyn/HsExpr.lhs @@ -337,6 +337,7 @@ tupArgPresent (Missing {}) = False -- See Note [Pending Splices] data PendingSplice = PendingRnExpSplice Name (LHsExpr Name) + | PendingRnPatSplice Name (LHsExpr Name) | PendingRnTypeSplice Name (LHsExpr Name) | PendingRnCrossStageSplice Name | PendingTcSplice Name (LHsExpr Id) @@ -356,6 +357,10 @@ splices generated by the renamer: [|$(f x) + 2|] + * Pending pattern splices (PendingRnPatSplice), e.g., + + [|\ $(f x) -> x|] + * Pending type splices (PendingRnTypeSplice), e.g., [|f :: $(g x)|] @@ -1413,6 +1418,7 @@ thTyBrackets pp_body = ptext (sLit "[||") <+> pp_body <+> ptext (sLit "||]") instance Outputable PendingSplice where ppr (PendingRnExpSplice name expr) = ppr (name, expr) + ppr (PendingRnPatSplice name expr) = ppr (name, expr) ppr (PendingRnTypeSplice name expr) = ppr (name, expr) ppr (PendingRnCrossStageSplice name) = ppr name ppr (PendingTcSplice name expr) = ppr (name, expr) @@ -1472,6 +1478,7 @@ data HsMatchContext id -- Context of a Match | StmtCtxt (HsStmtContext id) -- Pattern of a do-stmt, list comprehension, -- pattern guard, etc + | ThPatSplice -- A Template Haskell pattern splice | ThPatQuote -- A Template Haskell pattern quotation [p| (a,b) |] deriving (Data, Typeable) @@ -1518,6 +1525,7 @@ matchSeparator ProcExpr = ptext (sLit "->") matchSeparator PatBindRhs = ptext (sLit "=") matchSeparator (StmtCtxt _) = ptext (sLit "<-") matchSeparator RecUpd = panic "unused" +matchSeparator ThPatSplice = panic "unused" matchSeparator ThPatQuote = panic "unused" \end{code} @@ -1537,6 +1545,7 @@ pprMatchContextNoun (FunRhs fun _) = ptext (sLit "equation for") pprMatchContextNoun CaseAlt = ptext (sLit "case alternative") pprMatchContextNoun IfAlt = ptext (sLit "multi-way if alternative") pprMatchContextNoun RecUpd = ptext (sLit "record-update construct") +pprMatchContextNoun ThPatSplice = ptext (sLit "Template Haskell pattern splice") pprMatchContextNoun ThPatQuote = ptext (sLit "Template Haskell pattern quotation") pprMatchContextNoun PatBindRhs = ptext (sLit "pattern binding") pprMatchContextNoun LambdaExpr = ptext (sLit "lambda abstraction") @@ -1589,6 +1598,7 @@ matchContextErrString PatBindRhs = ptext (sLit "pattern binding" matchContextErrString RecUpd = ptext (sLit "record update") matchContextErrString LambdaExpr = ptext (sLit "lambda") matchContextErrString ProcExpr = ptext (sLit "proc") +matchContextErrString ThPatSplice = panic "matchContextErrString" -- Not used at runtime matchContextErrString ThPatQuote = panic "matchContextErrString" -- Not used at runtime matchContextErrString (StmtCtxt (ParStmtCtxt c)) = matchContextErrString (StmtCtxt c) matchContextErrString (StmtCtxt (TransStmtCtxt c)) = matchContextErrString (StmtCtxt c) diff --git a/compiler/hsSyn/HsExpr.lhs-boot b/compiler/hsSyn/HsExpr.lhs-boot index 7cddf2f810c7..a2ef6528b823 100644 --- a/compiler/hsSyn/HsExpr.lhs-boot +++ b/compiler/hsSyn/HsExpr.lhs-boot @@ -33,6 +33,7 @@ instance Data i => Data (HsCmd i) instance (Data i, Data body) => Data (MatchGroup i body) instance (Data i, Data body) => Data (GRHSs i body) +instance OutputableBndr id => Outputable (HsSplice id) instance OutputableBndr id => Outputable (HsExpr id) instance OutputableBndr id => Outputable (HsCmd id) diff --git a/compiler/hsSyn/HsPat.lhs b/compiler/hsSyn/HsPat.lhs index 181b765ebaf4..463d55e0ff76 100644 --- a/compiler/hsSyn/HsPat.lhs +++ b/compiler/hsSyn/HsPat.lhs @@ -23,7 +23,7 @@ module HsPat ( pprParendLPat ) where -import {-# SOURCE #-} HsExpr (SyntaxExpr, LHsExpr, pprLExpr) +import {-# SOURCE #-} HsExpr (SyntaxExpr, LHsExpr, HsSplice, pprLExpr) -- friends: import HsBinds @@ -114,6 +114,9 @@ data Pat id -- (= the argument type of the view function) -- for hsPatType. + ------------ Pattern splices --------------- + | SplicePat (HsSplice id) + ------------ Quasiquoted patterns --------------- -- See Note [Quasi-quote overview] in TcSplice | QuasiQuotePat (HsQuasiQuote id) @@ -268,6 +271,7 @@ pprPat (LitPat s) = ppr s pprPat (NPat l Nothing _) = ppr l pprPat (NPat l (Just _) _) = char '-' <> ppr l pprPat (NPlusKPat n k _ _) = hcat [ppr n, char '+', ppr k] +pprPat (SplicePat splice) = ppr splice pprPat (QuasiQuotePat qq) = ppr qq pprPat (CoPat co pat _) = pprHsWrapper (ppr pat) co pprPat (SigPatIn pat ty) = ppr pat <+> dcolon <+> ppr ty @@ -419,13 +423,16 @@ isIrrefutableHsPat pat go1 (NPat {}) = False go1 (NPlusKPat {}) = False - go1 (QuasiQuotePat {}) = urk pat -- Gotten rid of by renamer, before - -- isIrrefutablePat is called + -- Both should be gotten rid of by renamer before + -- isIrrefutablePat is called + go1 (SplicePat {}) = urk pat + go1 (QuasiQuotePat {}) = urk pat urk pat = pprPanic "isIrrefutableHsPat:" (ppr pat) hsPatNeedsParens :: Pat a -> Bool hsPatNeedsParens (NPlusKPat {}) = True +hsPatNeedsParens (SplicePat {}) = False hsPatNeedsParens (QuasiQuotePat {}) = True hsPatNeedsParens (ConPatIn _ ds) = conPatNeedsParens ds hsPatNeedsParens p@(ConPatOut {}) = conPatNeedsParens (pat_args p) diff --git a/compiler/hsSyn/HsUtils.lhs b/compiler/hsSyn/HsUtils.lhs index c11df346e194..5e4a3e77ec15 100644 --- a/compiler/hsSyn/HsUtils.lhs +++ b/compiler/hsSyn/HsUtils.lhs @@ -588,6 +588,7 @@ collect_lpat (L _ pat) bndrs go (SigPatIn pat _) = collect_lpat pat bndrs go (SigPatOut pat _) = collect_lpat pat bndrs + go (SplicePat _) = bndrs go (QuasiQuotePat _) = bndrs go (CoPat _ pat _) = go pat \end{code} diff --git a/compiler/parser/RdrHsSyn.lhs b/compiler/parser/RdrHsSyn.lhs index 78807426899b..145894b5fd19 100644 --- a/compiler/parser/RdrHsSyn.lhs +++ b/compiler/parser/RdrHsSyn.lhs @@ -632,6 +632,7 @@ checkAPat msg loc e0 = do RecordCon c _ (HsRecFields fs dd) -> do fs <- mapM (checkPatField msg) fs return (ConPatIn c (RecCon (HsRecFields fs dd))) + HsSpliceE s -> return (SplicePat s) HsQuasiQuoteE q -> return (QuasiQuotePat q) _ -> patFail msg loc e0 diff --git a/compiler/rename/RnPat.lhs b/compiler/rename/RnPat.lhs index 205dde196993..20fb4f65d127 100644 --- a/compiler/rename/RnPat.lhs +++ b/compiler/rename/RnPat.lhs @@ -19,7 +19,7 @@ free variables. {-# LANGUAGE ScopedTypeVariables #-} module RnPat (-- main entry points - rnPat, rnPats, rnBindPat, + rnPat, rnPats, rnBindPat, rnPatAndThen, NameMaker, applyNameMaker, -- a utility for making names: localRecNameMaker, topRecNameMaker, -- sometimes we want to make local names, @@ -27,6 +27,9 @@ module RnPat (-- main entry points rnHsRecFields1, HsRecFieldContext(..), + -- CpsRn monad + CpsRn, liftCps, + -- Literals rnLit, rnOverLit, @@ -38,6 +41,7 @@ module RnPat (-- main entry points import {-# SOURCE #-} RnExpr ( rnLExpr ) #ifdef GHCI +import {-# SOURCE #-} RnSplice ( rnSplicePat ) import {-# SOURCE #-} TcSplice ( runQuasiQuotePat ) #endif /* GHCI */ @@ -411,9 +415,15 @@ rnPatAndThen mk (TuplePat pats boxed _) ; return (TuplePat pats' boxed placeHolderType) } #ifndef GHCI +rnPatAndThen _ p@(SplicePat {}) + = pprPanic "Can't do SplicePat without GHCi" (ppr p) rnPatAndThen _ p@(QuasiQuotePat {}) = pprPanic "Can't do QuasiQuotePat without GHCi" (ppr p) #else +rnPatAndThen _ (SplicePat splice) + = do { -- XXX How to deal with free variables? + (pat, _) <- liftCps $ rnSplicePat splice + ; return pat } rnPatAndThen mk (QuasiQuotePat qq) = do { pat <- liftCps $ runQuasiQuotePat qq ; L _ pat' <- rnLPatAndThen mk pat diff --git a/compiler/rename/RnSplice.lhs b/compiler/rename/RnSplice.lhs index 98f39e1ffa0e..895edd94bc02 100644 --- a/compiler/rename/RnSplice.lhs +++ b/compiler/rename/RnSplice.lhs @@ -1,6 +1,6 @@ \begin{code} module RnSplice ( - rnSpliceType, rnSpliceExpr, + rnSpliceType, rnSpliceExpr, rnSplicePat, rnBracket, checkTH, checkThLocalName ) where @@ -16,7 +16,7 @@ import TcRnMonad #ifdef GHCI import Control.Monad ( unless, when ) import DynFlags -import DsMeta ( expQTyConName, typeQTyConName ) +import DsMeta ( expQTyConName, patQTyConName, typeQTyConName ) import LoadIface ( loadInterfaceForName ) import Module import RnEnv @@ -28,7 +28,7 @@ import TcEnv ( checkWellStaged, tcLookup, tcMetaTy, thTopLevelId ) import {-# SOURCE #-} RnExpr ( rnLExpr ) import {-# SOURCE #-} TcExpr ( tcMonoExpr ) -import {-# SOURCE #-} TcSplice ( runMetaE, runMetaT, tcTopSpliceExpr ) +import {-# SOURCE #-} TcSplice ( runMetaE, runMetaP, runMetaT, tcTopSpliceExpr ) #endif \end{code} @@ -43,6 +43,9 @@ rnSpliceType e _ = failTH e "splice" rnSpliceExpr :: HsSplice RdrName -> RnM (HsExpr Name, FreeVars) rnSpliceExpr e = failTH e "splice" +rnSplicePat :: HsSplice RdrName -> RnM (Pat Name, FreeVars) +rnSplicePat e = failTH e "splice" + failTH :: Outputable a => a -> String -> RnM b failTH e what -- Raise an error in a stage-1 compiler = failWithTc (vcat [ptext (sLit "Template Haskell") <+> text what <+> @@ -209,6 +212,53 @@ rnSpliceExpr splice@(HsSplice isTypedSplice _ expr) } \end{code} +\begin{code} +rnSplicePat :: HsSplice RdrName -> RnM (Pat Name, FreeVars) +rnSplicePat (HsSplice True _ _) + = panic "rnSplicePat: encountered typed pattern splice" + +rnSplicePat splice@(HsSplice False _ expr) + = addErrCtxt (exprCtxt (HsSpliceE splice)) $ + setSrcSpan (getLoc expr) $ do + { stage <- getStage + ; case stage of + { Brack isTypedBrack pop_stage ps_var _ -> + do { checkTc (not isTypedBrack) illegalUntypedSplice + + ; (splice'@(HsSplice _ name expr'), fvs) <- setStage pop_stage $ + rnSplice splice + + ; ps <- readMutVar ps_var + ; writeMutVar ps_var (PendingRnPatSplice name expr' : ps) + + ; return (SplicePat splice', fvs) + } + ; _ -> + do { (HsSplice _ _ expr', fvs) <- addErrCtxt (spliceResultDoc expr) $ + setStage (Splice False) $ + rnSplice splice + + -- The splice must have type Pat + ; meta_exp_ty <- tcMetaTy patQTyConName + + -- Typecheck the expression + ; zonked_q_expr <- tcTopSpliceExpr False $ + tcMonoExpr expr' meta_exp_ty + + -- Run the expression + ; pat <- runMetaP zonked_q_expr + ; showSplice "pattern" expr' (ppr pat) + + ; (pat', _) <- addErrCtxt (spliceResultDoc expr) $ + checkNoErrs $ + rnPat ThPatSplice pat $ \pat' -> return (pat', emptyFVs) + + ; return (unLoc pat', fvs) + } + } + } +\end{code} + %************************************************************************ %* * Template Haskell brackets diff --git a/compiler/rename/RnSplice.lhs-boot b/compiler/rename/RnSplice.lhs-boot index dbb876cee141..40700bd3ca6d 100644 --- a/compiler/rename/RnSplice.lhs-boot +++ b/compiler/rename/RnSplice.lhs-boot @@ -13,6 +13,7 @@ rnBracket :: HsExpr RdrName -> HsBracket RdrName -> RnM (HsExpr Name, FreeVars) rnSpliceType :: HsSplice RdrName -> PostTcKind -> RnM (HsType Name, FreeVars) rnSpliceExpr :: HsSplice RdrName -> RnM (HsExpr Name, FreeVars) +rnSplicePat :: HsSplice RdrName -> RnM (Pat Name, FreeVars) checkTH :: Outputable a => a -> String -> RnM () \end{code} diff --git a/compiler/typecheck/TcHsSyn.lhs b/compiler/typecheck/TcHsSyn.lhs index 8854e9b31445..c2af1733df99 100644 --- a/compiler/typecheck/TcHsSyn.lhs +++ b/compiler/typecheck/TcHsSyn.lhs @@ -563,6 +563,9 @@ zonkExpr env (HsBracketOut body bs) zonk_b (PendingRnExpSplice _ e) = pprPanic "zonkExpr: PendingRnExpSplice" (ppr e) + zonk_b (PendingRnPatSplice _ e) + = pprPanic "zonkExpr: PendingRnPatSplice" (ppr e) + zonk_b (PendingRnCrossStageSplice n) = pprPanic "zonkExpr: PendingRnCrossStageSplice" (ppr n) diff --git a/compiler/typecheck/TcSplice.lhs b/compiler/typecheck/TcSplice.lhs index b52f3ce79d36..85017b5d5815 100644 --- a/compiler/typecheck/TcSplice.lhs +++ b/compiler/typecheck/TcSplice.lhs @@ -14,7 +14,7 @@ module TcSplice( tcSpliceType, tcSpliceExpr, tcSpliceDecls, tcBracket, runQuasiQuoteExpr, runQuasiQuotePat, runQuasiQuoteDecl, runQuasiQuoteType, runAnnotation, - runMetaE,runMetaT, runMetaD ) where + runMetaE, runMetaP, runMetaT, runMetaD ) where #include "HsVersions.h" @@ -287,6 +287,7 @@ The predicate we use is TcEnv.thTopLevelId. tcBracket :: HsBracket Name -> [PendingSplice] -> TcRhoType -> TcM (HsExpr TcId) tcSpliceDecls :: LHsExpr Name -> TcM [LHsDecl RdrName] tcSpliceExpr :: HsSplice Name -> TcRhoType -> TcM (HsExpr TcId) +tcSplicePat :: HsSplice Name -> TcRhoType -> TcM (HsExpr TcId) tcSpliceType :: HsSplice Name -> FreeVars -> TcM (TcType, TcKind) -- None of these functions add constraints to the LIE @@ -302,6 +303,7 @@ runAnnotation :: CoreAnnTarget -> LHsExpr Name -> TcM Annotation #ifndef GHCI tcBracket x _ _ = pprPanic "Cant do tcBracket without GHCi" (ppr x) tcSpliceExpr e = pprPanic "Cant do tcSpliceExpr without GHCi" (ppr e) +tcSplicePat e = pprPanic "Cant do tcSplicePat without GHCi" (ppr e) tcSpliceDecls x = pprPanic "Cant do tcSpliceDecls without GHCi" (ppr x) tcSpliceType x fvs = pprPanic "Cant do kcSpliceType without GHCi" (ppr x) @@ -393,6 +395,12 @@ tcPendingSplice (PendingRnExpSplice n expr) ; return () } +tcPendingSplice (PendingRnPatSplice n expr) + = do { res_ty <- newFlexiTyVarTy openTypeKind + ; _ <- tcSplicePat (HsSplice False n expr) res_ty + ; return () + } + tcPendingSplice (PendingRnCrossStageSplice n) = do { res_ty <- newFlexiTyVarTy openTypeKind ; _ <- tcCheckId n res_ty @@ -492,7 +500,49 @@ tcTopSplice expr res_ty -- checkNoErrs: see Note [Renamer errors] ; exp4 <- tcMonoExpr exp3 res_ty ; return (unLoc exp4) } } +\end{code} + + +%************************************************************************ +%* * +\subsection{Splicing a pattern} +%* * +%************************************************************************ + +\begin{code} +tcSplicePat splice@(HsSplice True _ _) _ + = pprPanic "tcSplicePat: encountered typed pattern splice" (ppr splice) + +tcSplicePat splice@(HsSplice False name expr) _ + = addErrCtxt (spliceCtxtDoc splice) $ + setSrcSpan (getLoc expr) $ do + { stage <- getStage + ; case stage of + { Splice {} -> pprPanic "tcSplicePat: encountered unexpanded top-level untyped splice" (ppr splice) + ; Comp -> pprPanic "tcSplicePat: encountered unexpanded top-level untyped splice" (ppr splice) + ; Brack isTypedBrack pop_stage ps_var lie_var -> do + + { checkTc (not isTypedBrack) illegalUntypedSplice + + ; meta_exp_ty <- tcMetaTy patQTyConName + ; expr' <- setStage pop_stage $ + setConstraintVar lie_var $ + tcMonoExpr expr meta_exp_ty + ; ps <- readMutVar ps_var + ; writeMutVar ps_var (PendingTcSplice name expr' : ps) + + -- The returned expression is ignored + ; return (panic "tcSplicePat") + }}} +\end{code} + +%************************************************************************ +%* * +\subsection{Error messages} +%* * +%************************************************************************ +\begin{code} quotationCtxtDoc :: HsBracket Name -> SDoc quotationCtxtDoc br_body = hang (ptext (sLit "In the Template Haskell quotation")) @@ -819,6 +869,10 @@ runMetaE :: LHsExpr Id -- Of type (Q Exp) -> TcM (LHsExpr RdrName) runMetaE = runMetaQ exprMetaOps +runMetaP :: LHsExpr Id -- Of type (Q Pat) + -> TcM (LPat RdrName) +runMetaP = runMetaQ patMetaOps + runMetaT :: LHsExpr Id -- Of type (Q Type) -> TcM (LHsType RdrName) runMetaT = runMetaQ typeMetaOps diff --git a/compiler/typecheck/TcSplice.lhs-boot b/compiler/typecheck/TcSplice.lhs-boot index bf9515664f33..1b871256977f 100644 --- a/compiler/typecheck/TcSplice.lhs-boot +++ b/compiler/typecheck/TcSplice.lhs-boot @@ -36,6 +36,7 @@ runQuasiQuotePat :: HsQuasiQuote RdrName -> TcM (LPat RdrName) runAnnotation :: CoreAnnTarget -> LHsExpr Name -> TcM Annotation runMetaE :: LHsExpr Id -> TcM (LHsExpr RdrName) +runMetaP :: LHsExpr Id -> TcM (LPat RdrName) runMetaT :: LHsExpr Id -> TcM (LHsType RdrName) runMetaD :: LHsExpr Id -> TcM [LHsDecl RdrName] \end{code}