template-haskell 2.12.0.0 → 2.13.0.0
raw patch · 8 files changed
+1035/−833 lines, 8 filesdep ~basedep ~ghc-boot-thPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, ghc-boot-th
API changes (from Hackage documentation)
- Language.Haskell.TH: DataFam :: FamFlavour
- Language.Haskell.TH: TypeFam :: FamFlavour
- Language.Haskell.TH: data FamFlavour
- Language.Haskell.TH.Lib: closedTypeFamilyKindD :: Name -> [TyVarBndr] -> Kind -> [TySynEqnQ] -> DecQ
- Language.Haskell.TH.Lib: closedTypeFamilyNoKindD :: Name -> [TyVarBndr] -> [TySynEqnQ] -> DecQ
- Language.Haskell.TH.Lib: dataFam :: FamFlavour
- Language.Haskell.TH.Lib: familyKindD :: FamFlavour -> Name -> [TyVarBndr] -> Kind -> DecQ
- Language.Haskell.TH.Lib: familyNoKindD :: FamFlavour -> Name -> [TyVarBndr] -> DecQ
- Language.Haskell.TH.Lib: typeFam :: FamFlavour
- Language.Haskell.TH.Ppr: instance Language.Haskell.TH.Ppr.Ppr Language.Haskell.TH.Syntax.FamFlavour
- Language.Haskell.TH.Syntax: DataFam :: FamFlavour
- Language.Haskell.TH.Syntax: TypeFam :: FamFlavour
- Language.Haskell.TH.Syntax: data FamFlavour
- Language.Haskell.TH.Syntax: instance Data.Data.Data Language.Haskell.TH.Syntax.FamFlavour
- Language.Haskell.TH.Syntax: instance GHC.Classes.Eq Language.Haskell.TH.Syntax.FamFlavour
- Language.Haskell.TH.Syntax: instance GHC.Classes.Ord Language.Haskell.TH.Syntax.FamFlavour
- Language.Haskell.TH.Syntax: instance GHC.Generics.Generic Language.Haskell.TH.Syntax.FamFlavour
- Language.Haskell.TH.Syntax: instance GHC.Show.Show Language.Haskell.TH.Syntax.FamFlavour
+ Language.Haskell.TH: EmptyDataDeriving :: Extension
+ Language.Haskell.TH: HexFloatLiterals :: Extension
+ Language.Haskell.TH: LabelE :: String -> Exp
+ Language.Haskell.TH.LanguageExtensions: EmptyDataDeriving :: Extension
+ Language.Haskell.TH.LanguageExtensions: HexFloatLiterals :: Extension
+ Language.Haskell.TH.Lib: labelE :: String -> ExpQ
+ Language.Haskell.TH.Lib: type FamilyResultSigQ = Q FamilyResultSig
+ Language.Haskell.TH.Lib: type KindQ = Q Kind
+ Language.Haskell.TH.Lib: type TyVarBndrQ = Q TyVarBndr
+ Language.Haskell.TH.Lib.Internal: appE :: ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: appK :: Kind -> Kind -> Kind
+ Language.Haskell.TH.Lib.Internal: appT :: TypeQ -> TypeQ -> TypeQ
+ Language.Haskell.TH.Lib.Internal: appTypeE :: ExpQ -> TypeQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: appsE :: [ExpQ] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: arithSeqE :: RangeQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: arrowK :: Kind
+ Language.Haskell.TH.Lib.Internal: arrowT :: TypeQ
+ Language.Haskell.TH.Lib.Internal: asP :: Name -> PatQ -> PatQ
+ Language.Haskell.TH.Lib.Internal: bang :: SourceUnpackednessQ -> SourceStrictnessQ -> BangQ
+ Language.Haskell.TH.Lib.Internal: bangP :: PatQ -> PatQ
+ Language.Haskell.TH.Lib.Internal: bangType :: BangQ -> TypeQ -> BangTypeQ
+ Language.Haskell.TH.Lib.Internal: bindS :: PatQ -> ExpQ -> StmtQ
+ Language.Haskell.TH.Lib.Internal: cApi :: Callconv
+ Language.Haskell.TH.Lib.Internal: cCall :: Callconv
+ Language.Haskell.TH.Lib.Internal: caseE :: ExpQ -> [MatchQ] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: charL :: Char -> Lit
+ Language.Haskell.TH.Lib.Internal: charPrimL :: Char -> Lit
+ Language.Haskell.TH.Lib.Internal: classD :: CxtQ -> Name -> [TyVarBndrQ] -> [FunDep] -> [DecQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: classP :: Name -> [Q Type] -> Q Pred
+ Language.Haskell.TH.Lib.Internal: clause :: [PatQ] -> BodyQ -> [DecQ] -> ClauseQ
+ Language.Haskell.TH.Lib.Internal: closedTypeFamilyD :: Name -> [TyVarBndrQ] -> FamilyResultSigQ -> Maybe InjectivityAnn -> [TySynEqnQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: compE :: [StmtQ] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: conE :: Name -> ExpQ
+ Language.Haskell.TH.Lib.Internal: conK :: Name -> Kind
+ Language.Haskell.TH.Lib.Internal: conP :: Name -> [PatQ] -> PatQ
+ Language.Haskell.TH.Lib.Internal: conT :: Name -> TypeQ
+ Language.Haskell.TH.Lib.Internal: condE :: ExpQ -> ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: constraintK :: KindQ
+ Language.Haskell.TH.Lib.Internal: cxt :: [PredQ] -> CxtQ
+ Language.Haskell.TH.Lib.Internal: dataD :: CxtQ -> Name -> [TyVarBndrQ] -> Maybe KindQ -> [ConQ] -> [DerivClauseQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: dataFamilyD :: Name -> [TyVarBndrQ] -> Maybe KindQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: dataInstD :: CxtQ -> Name -> [TypeQ] -> Maybe KindQ -> [ConQ] -> [DerivClauseQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: defaultSigD :: Name -> TypeQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: derivClause :: Maybe DerivStrategy -> [PredQ] -> DerivClauseQ
+ Language.Haskell.TH.Lib.Internal: doE :: [StmtQ] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: doublePrimL :: Rational -> Lit
+ Language.Haskell.TH.Lib.Internal: dyn :: String -> ExpQ
+ Language.Haskell.TH.Lib.Internal: equalP :: TypeQ -> TypeQ -> PredQ
+ Language.Haskell.TH.Lib.Internal: equalityT :: TypeQ
+ Language.Haskell.TH.Lib.Internal: explBidir :: [ClauseQ] -> PatSynDirQ
+ Language.Haskell.TH.Lib.Internal: fieldExp :: Name -> ExpQ -> Q (Name, Exp)
+ Language.Haskell.TH.Lib.Internal: fieldPat :: Name -> PatQ -> FieldPatQ
+ Language.Haskell.TH.Lib.Internal: floatPrimL :: Rational -> Lit
+ Language.Haskell.TH.Lib.Internal: forImpD :: Callconv -> Safety -> String -> Name -> TypeQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: forallC :: [TyVarBndrQ] -> CxtQ -> ConQ -> ConQ
+ Language.Haskell.TH.Lib.Internal: forallT :: [TyVarBndrQ] -> CxtQ -> TypeQ -> TypeQ
+ Language.Haskell.TH.Lib.Internal: fromE :: ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: fromR :: ExpQ -> RangeQ
+ Language.Haskell.TH.Lib.Internal: fromThenE :: ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: fromThenR :: ExpQ -> ExpQ -> RangeQ
+ Language.Haskell.TH.Lib.Internal: fromThenToE :: ExpQ -> ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: fromThenToR :: ExpQ -> ExpQ -> ExpQ -> RangeQ
+ Language.Haskell.TH.Lib.Internal: fromToE :: ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: fromToR :: ExpQ -> ExpQ -> RangeQ
+ Language.Haskell.TH.Lib.Internal: funD :: Name -> [ClauseQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: funDep :: [Name] -> [Name] -> FunDep
+ Language.Haskell.TH.Lib.Internal: gadtC :: [Name] -> [StrictTypeQ] -> TypeQ -> ConQ
+ Language.Haskell.TH.Lib.Internal: guardedB :: [Q (Guard, Exp)] -> BodyQ
+ Language.Haskell.TH.Lib.Internal: implBidir :: PatSynDirQ
+ Language.Haskell.TH.Lib.Internal: inferR :: Role
+ Language.Haskell.TH.Lib.Internal: infixApp :: ExpQ -> ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: infixC :: Q (Bang, Type) -> Name -> Q (Bang, Type) -> ConQ
+ Language.Haskell.TH.Lib.Internal: infixE :: Maybe ExpQ -> ExpQ -> Maybe ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: infixLD :: Int -> Name -> DecQ
+ Language.Haskell.TH.Lib.Internal: infixND :: Int -> Name -> DecQ
+ Language.Haskell.TH.Lib.Internal: infixP :: PatQ -> Name -> PatQ -> PatQ
+ Language.Haskell.TH.Lib.Internal: infixPatSyn :: Name -> Name -> PatSynArgsQ
+ Language.Haskell.TH.Lib.Internal: infixRD :: Int -> Name -> DecQ
+ Language.Haskell.TH.Lib.Internal: infixT :: TypeQ -> Name -> TypeQ -> TypeQ
+ Language.Haskell.TH.Lib.Internal: injectivityAnn :: Name -> [Name] -> InjectivityAnn
+ Language.Haskell.TH.Lib.Internal: instanceD :: CxtQ -> TypeQ -> [DecQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: instanceWithOverlapD :: Maybe Overlap -> CxtQ -> TypeQ -> [DecQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: intPrimL :: Integer -> Lit
+ Language.Haskell.TH.Lib.Internal: integerL :: Integer -> Lit
+ Language.Haskell.TH.Lib.Internal: interruptible :: Safety
+ Language.Haskell.TH.Lib.Internal: isStrict :: Q Strict
+ Language.Haskell.TH.Lib.Internal: javaScript :: Callconv
+ Language.Haskell.TH.Lib.Internal: kindSig :: KindQ -> FamilyResultSigQ
+ Language.Haskell.TH.Lib.Internal: kindedTV :: Name -> KindQ -> TyVarBndrQ
+ Language.Haskell.TH.Lib.Internal: labelE :: String -> ExpQ
+ Language.Haskell.TH.Lib.Internal: lam1E :: PatQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: lamCaseE :: [MatchQ] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: lamE :: [PatQ] -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: letE :: [DecQ] -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: letS :: [DecQ] -> StmtQ
+ Language.Haskell.TH.Lib.Internal: listE :: [ExpQ] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: listK :: Kind
+ Language.Haskell.TH.Lib.Internal: listP :: [PatQ] -> PatQ
+ Language.Haskell.TH.Lib.Internal: listT :: TypeQ
+ Language.Haskell.TH.Lib.Internal: litE :: Lit -> ExpQ
+ Language.Haskell.TH.Lib.Internal: litP :: Lit -> PatQ
+ Language.Haskell.TH.Lib.Internal: litT :: TyLitQ -> TypeQ
+ Language.Haskell.TH.Lib.Internal: match :: PatQ -> BodyQ -> [DecQ] -> MatchQ
+ Language.Haskell.TH.Lib.Internal: moduleAnnotation :: AnnTarget
+ Language.Haskell.TH.Lib.Internal: multiIfE :: [Q (Guard, Exp)] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: newtypeD :: CxtQ -> Name -> [TyVarBndrQ] -> Maybe KindQ -> ConQ -> [DerivClauseQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: newtypeInstD :: CxtQ -> Name -> [TypeQ] -> Maybe KindQ -> ConQ -> [DerivClauseQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: noBindS :: ExpQ -> StmtQ
+ Language.Haskell.TH.Lib.Internal: noSig :: FamilyResultSigQ
+ Language.Haskell.TH.Lib.Internal: noSourceStrictness :: SourceStrictnessQ
+ Language.Haskell.TH.Lib.Internal: noSourceUnpackedness :: SourceUnpackednessQ
+ Language.Haskell.TH.Lib.Internal: nominalR :: Role
+ Language.Haskell.TH.Lib.Internal: normalB :: ExpQ -> BodyQ
+ Language.Haskell.TH.Lib.Internal: normalC :: Name -> [BangTypeQ] -> ConQ
+ Language.Haskell.TH.Lib.Internal: normalG :: ExpQ -> GuardQ
+ Language.Haskell.TH.Lib.Internal: normalGE :: ExpQ -> ExpQ -> Q (Guard, Exp)
+ Language.Haskell.TH.Lib.Internal: notStrict :: Q Strict
+ Language.Haskell.TH.Lib.Internal: numTyLit :: Integer -> TyLitQ
+ Language.Haskell.TH.Lib.Internal: openTypeFamilyD :: Name -> [TyVarBndrQ] -> FamilyResultSigQ -> Maybe InjectivityAnn -> DecQ
+ Language.Haskell.TH.Lib.Internal: parS :: [[StmtQ]] -> StmtQ
+ Language.Haskell.TH.Lib.Internal: parensE :: ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: parensP :: PatQ -> PatQ
+ Language.Haskell.TH.Lib.Internal: parensT :: TypeQ -> TypeQ
+ Language.Haskell.TH.Lib.Internal: patG :: [StmtQ] -> GuardQ
+ Language.Haskell.TH.Lib.Internal: patGE :: [StmtQ] -> ExpQ -> Q (Guard, Exp)
+ Language.Haskell.TH.Lib.Internal: patSynD :: Name -> PatSynArgsQ -> PatSynDirQ -> PatQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: patSynSigD :: Name -> TypeQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: phantomR :: Role
+ Language.Haskell.TH.Lib.Internal: plainTV :: Name -> TyVarBndrQ
+ Language.Haskell.TH.Lib.Internal: pragAnnD :: AnnTarget -> ExpQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: pragCompleteD :: [Name] -> Maybe Name -> DecQ
+ Language.Haskell.TH.Lib.Internal: pragInlD :: Name -> Inline -> RuleMatch -> Phases -> DecQ
+ Language.Haskell.TH.Lib.Internal: pragLineD :: Int -> String -> DecQ
+ Language.Haskell.TH.Lib.Internal: pragRuleD :: String -> [RuleBndrQ] -> ExpQ -> ExpQ -> Phases -> DecQ
+ Language.Haskell.TH.Lib.Internal: pragSpecD :: Name -> TypeQ -> Phases -> DecQ
+ Language.Haskell.TH.Lib.Internal: pragSpecInlD :: Name -> TypeQ -> Inline -> Phases -> DecQ
+ Language.Haskell.TH.Lib.Internal: pragSpecInstD :: TypeQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: prefixPatSyn :: [Name] -> PatSynArgsQ
+ Language.Haskell.TH.Lib.Internal: prim :: Callconv
+ Language.Haskell.TH.Lib.Internal: promotedConsT :: TypeQ
+ Language.Haskell.TH.Lib.Internal: promotedNilT :: TypeQ
+ Language.Haskell.TH.Lib.Internal: promotedT :: Name -> TypeQ
+ Language.Haskell.TH.Lib.Internal: promotedTupleT :: Int -> TypeQ
+ Language.Haskell.TH.Lib.Internal: rationalL :: Rational -> Lit
+ Language.Haskell.TH.Lib.Internal: recC :: Name -> [VarBangTypeQ] -> ConQ
+ Language.Haskell.TH.Lib.Internal: recConE :: Name -> [Q (Name, Exp)] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: recGadtC :: [Name] -> [VarStrictTypeQ] -> TypeQ -> ConQ
+ Language.Haskell.TH.Lib.Internal: recP :: Name -> [FieldPatQ] -> PatQ
+ Language.Haskell.TH.Lib.Internal: recUpdE :: ExpQ -> [Q (Name, Exp)] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: recordPatSyn :: [Name] -> PatSynArgsQ
+ Language.Haskell.TH.Lib.Internal: representationalR :: Role
+ Language.Haskell.TH.Lib.Internal: roleAnnotD :: Name -> [Role] -> DecQ
+ Language.Haskell.TH.Lib.Internal: ruleVar :: Name -> RuleBndrQ
+ Language.Haskell.TH.Lib.Internal: safe :: Safety
+ Language.Haskell.TH.Lib.Internal: sectionL :: ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: sectionR :: ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: sigD :: Name -> TypeQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: sigE :: ExpQ -> TypeQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: sigP :: PatQ -> TypeQ -> PatQ
+ Language.Haskell.TH.Lib.Internal: sigT :: TypeQ -> KindQ -> TypeQ
+ Language.Haskell.TH.Lib.Internal: sourceLazy :: SourceStrictnessQ
+ Language.Haskell.TH.Lib.Internal: sourceNoUnpack :: SourceUnpackednessQ
+ Language.Haskell.TH.Lib.Internal: sourceStrict :: SourceStrictnessQ
+ Language.Haskell.TH.Lib.Internal: sourceUnpack :: SourceUnpackednessQ
+ Language.Haskell.TH.Lib.Internal: standaloneDerivD :: CxtQ -> TypeQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: standaloneDerivWithStrategyD :: Maybe DerivStrategy -> CxtQ -> TypeQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: starK :: KindQ
+ Language.Haskell.TH.Lib.Internal: staticE :: ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: stdCall :: Callconv
+ Language.Haskell.TH.Lib.Internal: strTyLit :: String -> TyLitQ
+ Language.Haskell.TH.Lib.Internal: strictType :: Q Strict -> TypeQ -> StrictTypeQ
+ Language.Haskell.TH.Lib.Internal: stringE :: String -> ExpQ
+ Language.Haskell.TH.Lib.Internal: stringL :: String -> Lit
+ Language.Haskell.TH.Lib.Internal: stringPrimL :: [Word8] -> Lit
+ Language.Haskell.TH.Lib.Internal: thisModule :: Q Module
+ Language.Haskell.TH.Lib.Internal: tildeP :: PatQ -> PatQ
+ Language.Haskell.TH.Lib.Internal: tupE :: [ExpQ] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: tupP :: [PatQ] -> PatQ
+ Language.Haskell.TH.Lib.Internal: tupleK :: Int -> Kind
+ Language.Haskell.TH.Lib.Internal: tupleT :: Int -> TypeQ
+ Language.Haskell.TH.Lib.Internal: tySynD :: Name -> [TyVarBndrQ] -> TypeQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: tySynEqn :: [TypeQ] -> TypeQ -> TySynEqnQ
+ Language.Haskell.TH.Lib.Internal: tySynInstD :: Name -> TySynEqnQ -> DecQ
+ Language.Haskell.TH.Lib.Internal: tyVarSig :: TyVarBndrQ -> FamilyResultSigQ
+ Language.Haskell.TH.Lib.Internal: type BangQ = Q Bang
+ Language.Haskell.TH.Lib.Internal: type BangTypeQ = Q BangType
+ Language.Haskell.TH.Lib.Internal: type BodyQ = Q Body
+ Language.Haskell.TH.Lib.Internal: type ClauseQ = Q Clause
+ Language.Haskell.TH.Lib.Internal: type ConQ = Q Con
+ Language.Haskell.TH.Lib.Internal: type CxtQ = Q Cxt
+ Language.Haskell.TH.Lib.Internal: type DecQ = Q Dec
+ Language.Haskell.TH.Lib.Internal: type DecsQ = Q [Dec]
+ Language.Haskell.TH.Lib.Internal: type DerivClauseQ = Q DerivClause
+ Language.Haskell.TH.Lib.Internal: type ExpQ = Q Exp
+ Language.Haskell.TH.Lib.Internal: type FamilyResultSigQ = Q FamilyResultSig
+ Language.Haskell.TH.Lib.Internal: type FieldExpQ = Q FieldExp
+ Language.Haskell.TH.Lib.Internal: type FieldPatQ = Q FieldPat
+ Language.Haskell.TH.Lib.Internal: type GuardQ = Q Guard
+ Language.Haskell.TH.Lib.Internal: type InfoQ = Q Info
+ Language.Haskell.TH.Lib.Internal: type InjectivityAnn = InjectivityAnn
+ Language.Haskell.TH.Lib.Internal: type KindQ = Q Kind
+ Language.Haskell.TH.Lib.Internal: type MatchQ = Q Match
+ Language.Haskell.TH.Lib.Internal: type PatQ = Q Pat
+ Language.Haskell.TH.Lib.Internal: type PatSynArgsQ = Q PatSynArgs
+ Language.Haskell.TH.Lib.Internal: type PatSynDirQ = Q PatSynDir
+ Language.Haskell.TH.Lib.Internal: type PredQ = Q Pred
+ Language.Haskell.TH.Lib.Internal: type RangeQ = Q Range
+ Language.Haskell.TH.Lib.Internal: type Role = Role
+ Language.Haskell.TH.Lib.Internal: type RuleBndrQ = Q RuleBndr
+ Language.Haskell.TH.Lib.Internal: type SourceStrictnessQ = Q SourceStrictness
+ Language.Haskell.TH.Lib.Internal: type SourceUnpackednessQ = Q SourceUnpackedness
+ Language.Haskell.TH.Lib.Internal: type StmtQ = Q Stmt
+ Language.Haskell.TH.Lib.Internal: type StrictTypeQ = Q StrictType
+ Language.Haskell.TH.Lib.Internal: type TExpQ a = Q (TExp a)
+ Language.Haskell.TH.Lib.Internal: type TyLitQ = Q TyLit
+ Language.Haskell.TH.Lib.Internal: type TySynEqnQ = Q TySynEqn
+ Language.Haskell.TH.Lib.Internal: type TyVarBndrQ = Q TyVarBndr
+ Language.Haskell.TH.Lib.Internal: type TypeQ = Q Type
+ Language.Haskell.TH.Lib.Internal: type VarBangTypeQ = Q VarBangType
+ Language.Haskell.TH.Lib.Internal: type VarStrictTypeQ = Q VarStrictType
+ Language.Haskell.TH.Lib.Internal: typeAnnotation :: Name -> AnnTarget
+ Language.Haskell.TH.Lib.Internal: typedRuleVar :: Name -> TypeQ -> RuleBndrQ
+ Language.Haskell.TH.Lib.Internal: uInfixE :: ExpQ -> ExpQ -> ExpQ -> ExpQ
+ Language.Haskell.TH.Lib.Internal: uInfixP :: PatQ -> Name -> PatQ -> PatQ
+ Language.Haskell.TH.Lib.Internal: uInfixT :: TypeQ -> Name -> TypeQ -> TypeQ
+ Language.Haskell.TH.Lib.Internal: unboundVarE :: Name -> ExpQ
+ Language.Haskell.TH.Lib.Internal: unboxedSumE :: ExpQ -> SumAlt -> SumArity -> ExpQ
+ Language.Haskell.TH.Lib.Internal: unboxedSumP :: PatQ -> SumAlt -> SumArity -> PatQ
+ Language.Haskell.TH.Lib.Internal: unboxedSumT :: SumArity -> TypeQ
+ Language.Haskell.TH.Lib.Internal: unboxedTupE :: [ExpQ] -> ExpQ
+ Language.Haskell.TH.Lib.Internal: unboxedTupP :: [PatQ] -> PatQ
+ Language.Haskell.TH.Lib.Internal: unboxedTupleT :: Int -> TypeQ
+ Language.Haskell.TH.Lib.Internal: unidir :: PatSynDirQ
+ Language.Haskell.TH.Lib.Internal: unpacked :: Q Strict
+ Language.Haskell.TH.Lib.Internal: unsafe :: Safety
+ Language.Haskell.TH.Lib.Internal: valD :: PatQ -> BodyQ -> [DecQ] -> DecQ
+ Language.Haskell.TH.Lib.Internal: valueAnnotation :: Name -> AnnTarget
+ Language.Haskell.TH.Lib.Internal: varBangType :: Name -> BangTypeQ -> VarBangTypeQ
+ Language.Haskell.TH.Lib.Internal: varE :: Name -> ExpQ
+ Language.Haskell.TH.Lib.Internal: varK :: Name -> Kind
+ Language.Haskell.TH.Lib.Internal: varP :: Name -> PatQ
+ Language.Haskell.TH.Lib.Internal: varStrictType :: Name -> StrictTypeQ -> VarStrictTypeQ
+ Language.Haskell.TH.Lib.Internal: varT :: Name -> TypeQ
+ Language.Haskell.TH.Lib.Internal: viewP :: ExpQ -> PatQ -> PatQ
+ Language.Haskell.TH.Lib.Internal: wildCardT :: TypeQ
+ Language.Haskell.TH.Lib.Internal: wildP :: PatQ
+ Language.Haskell.TH.Lib.Internal: wordPrimL :: Integer -> Lit
+ Language.Haskell.TH.Syntax: LabelE :: String -> Exp
+ Language.Haskell.TH.Syntax: addCorePlugin :: String -> Q ()
+ Language.Haskell.TH.Syntax: instance Control.Monad.IO.Class.MonadIO Language.Haskell.TH.Syntax.Q
+ Language.Haskell.TH.Syntax: qAddCorePlugin :: Quasi m => String -> m ()
- Language.Haskell.TH: data Extension :: *
+ Language.Haskell.TH: data Extension
- Language.Haskell.TH.LanguageExtensions: data Extension :: *
+ Language.Haskell.TH.LanguageExtensions: data Extension
- Language.Haskell.TH.Quote: QuasiQuoter :: (String -> Q Exp) -> (String -> Q Pat) -> (String -> Q Type) -> (String -> Q [Dec]) -> QuasiQuoter
+ Language.Haskell.TH.Quote: QuasiQuoter :: String -> Q Exp -> String -> Q Pat -> String -> Q Type -> String -> Q [Dec] -> QuasiQuoter
- Language.Haskell.TH.Syntax: Q :: (forall m. Quasi m => m a) -> Q a
+ Language.Haskell.TH.Syntax: Q :: forall m. Quasi m => m a -> Q a
- Language.Haskell.TH.Syntax: class MonadFail m => Quasi m
+ Language.Haskell.TH.Syntax: class (MonadIO m, MonadFail m) => Quasi m
- Language.Haskell.TH.Syntax: data ForeignSrcLang :: *
+ Language.Haskell.TH.Syntax: data ForeignSrcLang
Files
- Language/Haskell/TH.hs +1/−1
- Language/Haskell/TH/Lib.hs +44/−782
- Language/Haskell/TH/Lib/Internal.hs +888/−0
- Language/Haskell/TH/Ppr.hs +10/−11
- Language/Haskell/TH/PprLib.hs +1/−0
- Language/Haskell/TH/Syntax.hs +58/−26
- changelog.md +25/−1
- template-haskell.cabal +8/−12
Language/Haskell/TH.hs view
@@ -73,7 +73,7 @@ SourceUnpackedness(..), SourceStrictness(..), DecidedStrictness(..), Bang(..), Strict, Foreign(..), Callconv(..), Safety(..), Pragma(..), Inline(..), RuleMatch(..), Phases(..), RuleBndr(..), AnnTarget(..),- FunDep(..), FamFlavour(..), TySynEqn(..), TypeFamilyHead(..),+ FunDep(..), TySynEqn(..), TypeFamilyHead(..), Fixity(..), FixityDirection(..), defaultFixity, maxPrecedence, PatSynDir(..), PatSynArgs(..), -- ** Expressions
Language/Haskell/TH/Lib.hs view
@@ -1,8 +1,13 @@ -- |--- TH.Lib contains lots of useful helper functions for+-- Language.Haskell.TH.Lib contains lots of useful helper functions for -- generating and manipulating Template Haskell terms -{-# LANGUAGE CPP #-}+-- Note: this module mostly re-exports functions from+-- Language.Haskell.TH.Lib.Internal, but if a change occurs to Template+-- Haskell which requires breaking the API offered in this module, we opt to+-- copy the old definition here, and make the changes in+-- Language.Haskell.TH.Lib.Internal. This way, we can retain backwards+-- compatibility while still allowing GHC to make changes as it needs. module Language.Haskell.TH.Lib ( -- All of the exports from this module should@@ -11,11 +16,12 @@ -- * Library functions -- ** Abbreviations- InfoQ, ExpQ, TExpQ, DecQ, DecsQ, ConQ, TypeQ, TyLitQ, CxtQ, PredQ,- DerivClauseQ, MatchQ, ClauseQ, BodyQ, GuardQ, StmtQ, RangeQ,- SourceStrictnessQ, SourceUnpackednessQ, BangQ, BangTypeQ, VarBangTypeQ,- StrictTypeQ, VarStrictTypeQ, FieldExpQ, PatQ, FieldPatQ, RuleBndrQ,- TySynEqnQ, PatSynDirQ, PatSynArgsQ,+ InfoQ, ExpQ, TExpQ, DecQ, DecsQ, ConQ, TypeQ, KindQ, TyVarBndrQ,+ TyLitQ, CxtQ, PredQ, DerivClauseQ, MatchQ, ClauseQ, BodyQ, GuardQ,+ StmtQ, RangeQ, SourceStrictnessQ, SourceUnpackednessQ, BangQ,+ BangTypeQ, VarBangTypeQ, StrictTypeQ, VarStrictTypeQ, FieldExpQ, PatQ,+ FieldPatQ, RuleBndrQ, TySynEqnQ, PatSynDirQ, PatSynArgsQ,+ FamilyResultSigQ, -- ** Constructors lifted to 'Q' -- *** Literals@@ -31,7 +37,7 @@ normalB, guardedB, normalG, normalGE, patG, patGE, match, clause, -- *** Expressions- dyn, varE, unboundVarE, conE, litE, appE, appTypeE, uInfixE, parensE,+ dyn, varE, unboundVarE, labelE, conE, litE, appE, appTypeE, uInfixE, parensE, staticE, infixE, infixApp, sectionL, sectionR, lamE, lam1E, lamCaseE, tupE, unboxedTupE, unboxedSumE, condE, multiIfE, letE, caseE, appsE, listE, sigE, recConE, recUpdE, stringE, fieldExp,@@ -82,9 +88,8 @@ roleAnnotD, -- **** Type Family / Data Family dataFamilyD, openTypeFamilyD, closedTypeFamilyD, dataInstD,- familyNoKindD, familyKindD, closedTypeFamilyNoKindD, closedTypeFamilyKindD, newtypeInstD, tySynInstD,- typeFam, dataFam, tySynEqn, injectivityAnn, noSig, kindSig, tyVarSig,+ tySynEqn, injectivityAnn, noSig, kindSig, tyVarSig, -- **** Fixity infixLD, infixRD, infixND,@@ -111,355 +116,45 @@ ) where -import Language.Haskell.TH.Syntax hiding (Role, InjectivityAnn)-import qualified Language.Haskell.TH.Syntax as TH-import Control.Monad( liftM, liftM2 )-import Data.Word( Word8 )--------------------------------------------------------------- * Type synonyms-------------------------------------------------------------type InfoQ = Q Info-type PatQ = Q Pat-type FieldPatQ = Q FieldPat-type ExpQ = Q Exp-type TExpQ a = Q (TExp a)-type DecQ = Q Dec-type DecsQ = Q [Dec]-type ConQ = Q Con-type TypeQ = Q Type-type TyLitQ = Q TyLit-type CxtQ = Q Cxt-type PredQ = Q Pred-type DerivClauseQ = Q DerivClause-type MatchQ = Q Match-type ClauseQ = Q Clause-type BodyQ = Q Body-type GuardQ = Q Guard-type StmtQ = Q Stmt-type RangeQ = Q Range-type SourceStrictnessQ = Q SourceStrictness-type SourceUnpackednessQ = Q SourceUnpackedness-type BangQ = Q Bang-type BangTypeQ = Q BangType-type VarBangTypeQ = Q VarBangType-type StrictTypeQ = Q StrictType-type VarStrictTypeQ = Q VarStrictType-type FieldExpQ = Q FieldExp-type RuleBndrQ = Q RuleBndr-type TySynEqnQ = Q TySynEqn-type PatSynDirQ = Q PatSynDir-type PatSynArgsQ = Q PatSynArgs---- must be defined here for DsMeta to find it-type Role = TH.Role-type InjectivityAnn = TH.InjectivityAnn--------------------------------------------------------------- * Lowercase pattern syntax functions-------------------------------------------------------------intPrimL :: Integer -> Lit-intPrimL = IntPrimL-wordPrimL :: Integer -> Lit-wordPrimL = WordPrimL-floatPrimL :: Rational -> Lit-floatPrimL = FloatPrimL-doublePrimL :: Rational -> Lit-doublePrimL = DoublePrimL-integerL :: Integer -> Lit-integerL = IntegerL-charL :: Char -> Lit-charL = CharL-charPrimL :: Char -> Lit-charPrimL = CharPrimL-stringL :: String -> Lit-stringL = StringL-stringPrimL :: [Word8] -> Lit-stringPrimL = StringPrimL-rationalL :: Rational -> Lit-rationalL = RationalL--litP :: Lit -> PatQ-litP l = return (LitP l)--varP :: Name -> PatQ-varP v = return (VarP v)--tupP :: [PatQ] -> PatQ-tupP ps = do { ps1 <- sequence ps; return (TupP ps1)}--unboxedTupP :: [PatQ] -> PatQ-unboxedTupP ps = do { ps1 <- sequence ps; return (UnboxedTupP ps1)}--unboxedSumP :: PatQ -> SumAlt -> SumArity -> PatQ-unboxedSumP p alt arity = do { p1 <- p; return (UnboxedSumP p1 alt arity) }--conP :: Name -> [PatQ] -> PatQ-conP n ps = do ps' <- sequence ps- return (ConP n ps')-infixP :: PatQ -> Name -> PatQ -> PatQ-infixP p1 n p2 = do p1' <- p1- p2' <- p2- return (InfixP p1' n p2')-uInfixP :: PatQ -> Name -> PatQ -> PatQ-uInfixP p1 n p2 = do p1' <- p1- p2' <- p2- return (UInfixP p1' n p2')-parensP :: PatQ -> PatQ-parensP p = do p' <- p- return (ParensP p')--tildeP :: PatQ -> PatQ-tildeP p = do p' <- p- return (TildeP p')-bangP :: PatQ -> PatQ-bangP p = do p' <- p- return (BangP p')-asP :: Name -> PatQ -> PatQ-asP n p = do p' <- p- return (AsP n p')-wildP :: PatQ-wildP = return WildP-recP :: Name -> [FieldPatQ] -> PatQ-recP n fps = do fps' <- sequence fps- return (RecP n fps')-listP :: [PatQ] -> PatQ-listP ps = do ps' <- sequence ps- return (ListP ps')-sigP :: PatQ -> TypeQ -> PatQ-sigP p t = do p' <- p- t' <- t- return (SigP p' t')-viewP :: ExpQ -> PatQ -> PatQ-viewP e p = do e' <- e- p' <- p- return (ViewP e' p')--fieldPat :: Name -> PatQ -> FieldPatQ-fieldPat n p = do p' <- p- return (n, p')------------------------------------------------------------------------------------- * Stmt--bindS :: PatQ -> ExpQ -> StmtQ-bindS p e = liftM2 BindS p e--letS :: [DecQ] -> StmtQ-letS ds = do { ds1 <- sequence ds; return (LetS ds1) }--noBindS :: ExpQ -> StmtQ-noBindS e = do { e1 <- e; return (NoBindS e1) }--parS :: [[StmtQ]] -> StmtQ-parS sss = do { sss1 <- mapM sequence sss; return (ParS sss1) }------------------------------------------------------------------------------------ * Range--fromR :: ExpQ -> RangeQ-fromR x = do { a <- x; return (FromR a) }--fromThenR :: ExpQ -> ExpQ -> RangeQ-fromThenR x y = do { a <- x; b <- y; return (FromThenR a b) }--fromToR :: ExpQ -> ExpQ -> RangeQ-fromToR x y = do { a <- x; b <- y; return (FromToR a b) }--fromThenToR :: ExpQ -> ExpQ -> ExpQ -> RangeQ-fromThenToR x y z = do { a <- x; b <- y; c <- z;- return (FromThenToR a b c) }----------------------------------------------------------------------------------- * Body--normalB :: ExpQ -> BodyQ-normalB e = do { e1 <- e; return (NormalB e1) }--guardedB :: [Q (Guard,Exp)] -> BodyQ-guardedB ges = do { ges' <- sequence ges; return (GuardedB ges') }------------------------------------------------------------------------------------ * Guard--normalG :: ExpQ -> GuardQ-normalG e = do { e1 <- e; return (NormalG e1) }--normalGE :: ExpQ -> ExpQ -> Q (Guard, Exp)-normalGE g e = do { g1 <- g; e1 <- e; return (NormalG g1, e1) }--patG :: [StmtQ] -> GuardQ-patG ss = do { ss' <- sequence ss; return (PatG ss') }--patGE :: [StmtQ] -> ExpQ -> Q (Guard, Exp)-patGE ss e = do { ss' <- sequence ss;- e' <- e;- return (PatG ss', e') }------------------------------------------------------------------------------------ * Match and Clause---- | Use with 'caseE'-match :: PatQ -> BodyQ -> [DecQ] -> MatchQ-match p rhs ds = do { p' <- p;- r' <- rhs;- ds' <- sequence ds;- return (Match p' r' ds') }---- | Use with 'funD'-clause :: [PatQ] -> BodyQ -> [DecQ] -> ClauseQ-clause ps r ds = do { ps' <- sequence ps;- r' <- r;- ds' <- sequence ds;- return (Clause ps' r' ds') }--------------------------------------------------------------------------------- * Exp---- | Dynamically binding a variable (unhygenic)-dyn :: String -> ExpQ-dyn s = return (VarE (mkName s))--varE :: Name -> ExpQ-varE s = return (VarE s)--conE :: Name -> ExpQ-conE s = return (ConE s)--litE :: Lit -> ExpQ-litE c = return (LitE c)--appE :: ExpQ -> ExpQ -> ExpQ-appE x y = do { a <- x; b <- y; return (AppE a b)}--appTypeE :: ExpQ -> TypeQ -> ExpQ-appTypeE x t = do { a <- x; s <- t; return (AppTypeE a s) }--parensE :: ExpQ -> ExpQ-parensE x = do { x' <- x; return (ParensE x') }--uInfixE :: ExpQ -> ExpQ -> ExpQ -> ExpQ-uInfixE x s y = do { x' <- x; s' <- s; y' <- y;- return (UInfixE x' s' y') }--infixE :: Maybe ExpQ -> ExpQ -> Maybe ExpQ -> ExpQ-infixE (Just x) s (Just y) = do { a <- x; s' <- s; b <- y;- return (InfixE (Just a) s' (Just b))}-infixE Nothing s (Just y) = do { s' <- s; b <- y;- return (InfixE Nothing s' (Just b))}-infixE (Just x) s Nothing = do { a <- x; s' <- s;- return (InfixE (Just a) s' Nothing)}-infixE Nothing s Nothing = do { s' <- s; return (InfixE Nothing s' Nothing) }--infixApp :: ExpQ -> ExpQ -> ExpQ -> ExpQ-infixApp x y z = infixE (Just x) y (Just z)-sectionL :: ExpQ -> ExpQ -> ExpQ-sectionL x y = infixE (Just x) y Nothing-sectionR :: ExpQ -> ExpQ -> ExpQ-sectionR x y = infixE Nothing x (Just y)--lamE :: [PatQ] -> ExpQ -> ExpQ-lamE ps e = do ps' <- sequence ps- e' <- e- return (LamE ps' e')---- | Single-arg lambda-lam1E :: PatQ -> ExpQ -> ExpQ-lam1E p e = lamE [p] e--lamCaseE :: [MatchQ] -> ExpQ-lamCaseE ms = sequence ms >>= return . LamCaseE--tupE :: [ExpQ] -> ExpQ-tupE es = do { es1 <- sequence es; return (TupE es1)}--unboxedTupE :: [ExpQ] -> ExpQ-unboxedTupE es = do { es1 <- sequence es; return (UnboxedTupE es1)}--unboxedSumE :: ExpQ -> SumAlt -> SumArity -> ExpQ-unboxedSumE e alt arity = do { e1 <- e; return (UnboxedSumE e1 alt arity) }--condE :: ExpQ -> ExpQ -> ExpQ -> ExpQ-condE x y z = do { a <- x; b <- y; c <- z; return (CondE a b c)}--multiIfE :: [Q (Guard, Exp)] -> ExpQ-multiIfE alts = sequence alts >>= return . MultiIfE--letE :: [DecQ] -> ExpQ -> ExpQ-letE ds e = do { ds2 <- sequence ds; e2 <- e; return (LetE ds2 e2) }--caseE :: ExpQ -> [MatchQ] -> ExpQ-caseE e ms = do { e1 <- e; ms1 <- sequence ms; return (CaseE e1 ms1) }--doE :: [StmtQ] -> ExpQ-doE ss = do { ss1 <- sequence ss; return (DoE ss1) }--compE :: [StmtQ] -> ExpQ-compE ss = do { ss1 <- sequence ss; return (CompE ss1) }--arithSeqE :: RangeQ -> ExpQ-arithSeqE r = do { r' <- r; return (ArithSeqE r') }--listE :: [ExpQ] -> ExpQ-listE es = do { es1 <- sequence es; return (ListE es1) }--sigE :: ExpQ -> TypeQ -> ExpQ-sigE e t = do { e1 <- e; t1 <- t; return (SigE e1 t1) }--recConE :: Name -> [Q (Name,Exp)] -> ExpQ-recConE c fs = do { flds <- sequence fs; return (RecConE c flds) }--recUpdE :: ExpQ -> [Q (Name,Exp)] -> ExpQ-recUpdE e fs = do { e1 <- e; flds <- sequence fs; return (RecUpdE e1 flds) }--stringE :: String -> ExpQ-stringE = litE . stringL--fieldExp :: Name -> ExpQ -> Q (Name, Exp)-fieldExp s e = do { e' <- e; return (s,e') }---- | @staticE x = [| static x |]@-staticE :: ExpQ -> ExpQ-staticE = fmap StaticE+import Language.Haskell.TH.Lib.Internal hiding+ ( tySynD+ , dataD+ , newtypeD+ , classD+ , dataInstD+ , newtypeInstD+ , dataFamilyD+ , openTypeFamilyD+ , closedTypeFamilyD+ , forallC -unboundVarE :: Name -> ExpQ-unboundVarE s = return (UnboundVarE s)+ , forallT+ , sigT --- ** 'arithSeqE' Shortcuts-fromE :: ExpQ -> ExpQ-fromE x = do { a <- x; return (ArithSeqE (FromR a)) }+ , plainTV+ , kindedTV+ , starK+ , constraintK -fromThenE :: ExpQ -> ExpQ -> ExpQ-fromThenE x y = do { a <- x; b <- y; return (ArithSeqE (FromThenR a b)) }+ , noSig+ , kindSig+ , tyVarSig -fromToE :: ExpQ -> ExpQ -> ExpQ-fromToE x y = do { a <- x; b <- y; return (ArithSeqE (FromToR a b)) }+ , Role+ , InjectivityAnn+ )+import Language.Haskell.TH.Syntax -fromThenToE :: ExpQ -> ExpQ -> ExpQ -> ExpQ-fromThenToE x y z = do { a <- x; b <- y; c <- z;- return (ArithSeqE (FromThenToR a b c)) }+import Control.Monad (liftM2) +-- All definitions below represent the "old" API, since their definitions are+-- different in Language.Haskell.TH.Lib.Internal. Please think carefully before+-- deciding to change the APIs of the functions below, as they represent the+-- public API (as opposed to the Internal module, which has no API promises.) ------------------------------------------------------------------------------- -- * Dec -valD :: PatQ -> BodyQ -> [DecQ] -> DecQ-valD p b ds =- do { p' <- p- ; ds' <- sequence ds- ; b' <- b- ; return (ValD p' b' ds')- }--funD :: Name -> [ClauseQ] -> DecQ-funD nm cs =- do { cs1 <- sequence cs- ; return (FunD nm cs1)- }- tySynD :: Name -> [TyVarBndr] -> TypeQ -> DecQ tySynD tc tvs rhs = do { rhs1 <- rhs; return (TySynD tc tvs rhs1) } @@ -488,78 +183,6 @@ ctxt1 <- ctxt return $ ClassD ctxt1 cls tvs fds decs1 -instanceD :: CxtQ -> TypeQ -> [DecQ] -> DecQ-instanceD = instanceWithOverlapD Nothing--instanceWithOverlapD :: Maybe Overlap -> CxtQ -> TypeQ -> [DecQ] -> DecQ-instanceWithOverlapD o ctxt ty decs =- do- ctxt1 <- ctxt- decs1 <- sequence decs- ty1 <- ty- return $ InstanceD o ctxt1 ty1 decs1----sigD :: Name -> TypeQ -> DecQ-sigD fun ty = liftM (SigD fun) $ ty--forImpD :: Callconv -> Safety -> String -> Name -> TypeQ -> DecQ-forImpD cc s str n ty- = do ty' <- ty- return $ ForeignD (ImportF cc s str n ty')--infixLD :: Int -> Name -> DecQ-infixLD prec nm = return (InfixD (Fixity prec InfixL) nm)--infixRD :: Int -> Name -> DecQ-infixRD prec nm = return (InfixD (Fixity prec InfixR) nm)--infixND :: Int -> Name -> DecQ-infixND prec nm = return (InfixD (Fixity prec InfixN) nm)--pragInlD :: Name -> Inline -> RuleMatch -> Phases -> DecQ-pragInlD name inline rm phases- = return $ PragmaD $ InlineP name inline rm phases--pragSpecD :: Name -> TypeQ -> Phases -> DecQ-pragSpecD n ty phases- = do- ty1 <- ty- return $ PragmaD $ SpecialiseP n ty1 Nothing phases--pragSpecInlD :: Name -> TypeQ -> Inline -> Phases -> DecQ-pragSpecInlD n ty inline phases- = do- ty1 <- ty- return $ PragmaD $ SpecialiseP n ty1 (Just inline) phases--pragSpecInstD :: TypeQ -> DecQ-pragSpecInstD ty- = do- ty1 <- ty- return $ PragmaD $ SpecialiseInstP ty1--pragRuleD :: String -> [RuleBndrQ] -> ExpQ -> ExpQ -> Phases -> DecQ-pragRuleD n bndrs lhs rhs phases- = do- bndrs1 <- sequence bndrs- lhs1 <- lhs- rhs1 <- rhs- return $ PragmaD $ RuleP n bndrs1 lhs1 rhs1 phases--pragAnnD :: AnnTarget -> ExpQ -> DecQ-pragAnnD target expr- = do- exp1 <- expr- return $ PragmaD $ AnnP target exp1--pragLineD :: Int -> String -> DecQ-pragLineD line file = return $ PragmaD $ LineP line file--pragCompleteD :: [Name] -> Maybe Name -> DecQ-pragCompleteD cls mty = return $ PragmaD $ CompleteP cls mty- dataInstD :: CxtQ -> Name -> [TypeQ] -> Maybe Kind -> [ConQ] -> [DerivClauseQ] -> DecQ dataInstD ctxt tc tys ksig cons derivs =@@ -580,12 +203,6 @@ derivs1 <- sequence derivs return (NewtypeInstD ctxt1 tc tys1 ksig con1 derivs1) -tySynInstD :: Name -> TySynEqnQ -> DecQ-tySynInstD tc eqn =- do- eqn1 <- eqn- return (TySynInstD tc eqn1)- dataFamilyD :: Name -> [TyVarBndr] -> Maybe Kind -> DecQ dataFamilyD tc tvs kind = return $ DataFamilyD tc tvs kind@@ -601,112 +218,9 @@ do eqns1 <- sequence eqns return (ClosedTypeFamilyD (TypeFamilyHead tc tvs result injectivity) eqns1) --- These were deprecated in GHC 8.0 with a plan to remove them in 8.2. If you--- remove this check please also:--- 1. remove deprecated functions--- 2. remove CPP language extension from top of this module--- 3. remove the FamFlavour data type from Syntax module--- 4. make sure that all references to FamFlavour are gone from DsMeta,--- Convert, TcSplice (follows from 3)-#if __GLASGOW_HASKELL__ >= 804-#error Remove deprecated familyNoKindD, familyKindD, closedTypeFamilyNoKindD and closedTypeFamilyKindD-#endif--{-# DEPRECATED familyNoKindD, familyKindD- "This function will be removed in the next stable release. Use openTypeFamilyD/dataFamilyD instead." #-}-familyNoKindD :: FamFlavour -> Name -> [TyVarBndr] -> DecQ-familyNoKindD flav tc tvs =- case flav of- TypeFam -> return $ OpenTypeFamilyD (TypeFamilyHead tc tvs NoSig Nothing)- DataFam -> return $ DataFamilyD tc tvs Nothing--familyKindD :: FamFlavour -> Name -> [TyVarBndr] -> Kind -> DecQ-familyKindD flav tc tvs k =- case flav of- TypeFam ->- return $ OpenTypeFamilyD (TypeFamilyHead tc tvs (KindSig k) Nothing)- DataFam -> return $ DataFamilyD tc tvs (Just k)--{-# DEPRECATED closedTypeFamilyNoKindD, closedTypeFamilyKindD- "This function will be removed in the next stable release. Use closedTypeFamilyD instead." #-}-closedTypeFamilyNoKindD :: Name -> [TyVarBndr] -> [TySynEqnQ] -> DecQ-closedTypeFamilyNoKindD tc tvs eqns =- do eqns1 <- sequence eqns- return (ClosedTypeFamilyD (TypeFamilyHead tc tvs NoSig Nothing) eqns1)--closedTypeFamilyKindD :: Name -> [TyVarBndr] -> Kind -> [TySynEqnQ] -> DecQ-closedTypeFamilyKindD tc tvs kind eqns =- do eqns1 <- sequence eqns- return (ClosedTypeFamilyD (TypeFamilyHead tc tvs (KindSig kind) Nothing)- eqns1)--roleAnnotD :: Name -> [Role] -> DecQ-roleAnnotD name roles = return $ RoleAnnotD name roles--standaloneDerivD :: CxtQ -> TypeQ -> DecQ-standaloneDerivD = standaloneDerivWithStrategyD Nothing--standaloneDerivWithStrategyD :: Maybe DerivStrategy -> CxtQ -> TypeQ -> DecQ-standaloneDerivWithStrategyD ds ctxtq tyq =- do- ctxt <- ctxtq- ty <- tyq- return $ StandaloneDerivD ds ctxt ty--defaultSigD :: Name -> TypeQ -> DecQ-defaultSigD n tyq =- do- ty <- tyq- return $ DefaultSigD n ty---- | Pattern synonym declaration-patSynD :: Name -> PatSynArgsQ -> PatSynDirQ -> PatQ -> DecQ-patSynD name args dir pat = do- args' <- args- dir' <- dir- pat' <- pat- return (PatSynD name args' dir' pat')---- | Pattern synonym type signature-patSynSigD :: Name -> TypeQ -> DecQ-patSynSigD nm ty =- do ty' <- ty- return $ PatSynSigD nm ty'--tySynEqn :: [TypeQ] -> TypeQ -> TySynEqnQ-tySynEqn lhs rhs =- do- lhs1 <- sequence lhs- rhs1 <- rhs- return (TySynEqn lhs1 rhs1)--cxt :: [PredQ] -> CxtQ-cxt = sequence--derivClause :: Maybe DerivStrategy -> [PredQ] -> DerivClauseQ-derivClause ds p = do p' <- cxt p- return $ DerivClause ds p'--normalC :: Name -> [BangTypeQ] -> ConQ-normalC con strtys = liftM (NormalC con) $ sequence strtys--recC :: Name -> [VarBangTypeQ] -> ConQ-recC con varstrtys = liftM (RecC con) $ sequence varstrtys--infixC :: Q (Bang, Type) -> Name -> Q (Bang, Type) -> ConQ-infixC st1 con st2 = do st1' <- st1- st2' <- st2- return $ InfixC st1' con st2'- forallC :: [TyVarBndr] -> CxtQ -> ConQ -> ConQ forallC ns ctxt con = liftM2 (ForallC ns) ctxt con -gadtC :: [Name] -> [StrictTypeQ] -> TypeQ -> ConQ-gadtC cons strtys ty = liftM2 (GadtC cons) (sequence strtys) ty--recGadtC :: [Name] -> [VarStrictTypeQ] -> TypeQ -> ConQ-recGadtC cons varstrtys ty = liftM2 (RecGadtC cons) (sequence varstrtys) ty- ------------------------------------------------------------------------------- -- * Type @@ -716,145 +230,12 @@ ty1 <- ty return $ ForallT tvars ctxt1 ty1 -varT :: Name -> TypeQ-varT = return . VarT--conT :: Name -> TypeQ-conT = return . ConT--infixT :: TypeQ -> Name -> TypeQ -> TypeQ-infixT t1 n t2 = do t1' <- t1- t2' <- t2- return (InfixT t1' n t2')--uInfixT :: TypeQ -> Name -> TypeQ -> TypeQ-uInfixT t1 n t2 = do t1' <- t1- t2' <- t2- return (UInfixT t1' n t2')--parensT :: TypeQ -> TypeQ-parensT t = do t' <- t- return (ParensT t')--appT :: TypeQ -> TypeQ -> TypeQ-appT t1 t2 = do- t1' <- t1- t2' <- t2- return $ AppT t1' t2'--arrowT :: TypeQ-arrowT = return ArrowT--listT :: TypeQ-listT = return ListT--litT :: TyLitQ -> TypeQ-litT l = fmap LitT l--tupleT :: Int -> TypeQ-tupleT i = return (TupleT i)--unboxedTupleT :: Int -> TypeQ-unboxedTupleT i = return (UnboxedTupleT i)--unboxedSumT :: SumArity -> TypeQ-unboxedSumT arity = return (UnboxedSumT arity)- sigT :: TypeQ -> Kind -> TypeQ sigT t k = do t' <- t return $ SigT t' k -equalityT :: TypeQ-equalityT = return EqualityT--wildCardT :: TypeQ-wildCardT = return WildCardT--{-# DEPRECATED classP "As of template-haskell-2.10, constraint predicates (Pred) are just types (Type), in keeping with ConstraintKinds. Please use 'conT' and 'appT'." #-}-classP :: Name -> [Q Type] -> Q Pred-classP cla tys- = do- tysl <- sequence tys- return (foldl AppT (ConT cla) tysl)--{-# DEPRECATED equalP "As of template-haskell-2.10, constraint predicates (Pred) are just types (Type), in keeping with ConstraintKinds. Please see 'equalityT'." #-}-equalP :: TypeQ -> TypeQ -> PredQ-equalP tleft tright- = do- tleft1 <- tleft- tright1 <- tright- eqT <- equalityT- return (foldl AppT eqT [tleft1, tright1])--promotedT :: Name -> TypeQ-promotedT = return . PromotedT--promotedTupleT :: Int -> TypeQ-promotedTupleT i = return (PromotedTupleT i)--promotedNilT :: TypeQ-promotedNilT = return PromotedNilT--promotedConsT :: TypeQ-promotedConsT = return PromotedConsT--noSourceUnpackedness, sourceNoUnpack, sourceUnpack :: SourceUnpackednessQ-noSourceUnpackedness = return NoSourceUnpackedness-sourceNoUnpack = return SourceNoUnpack-sourceUnpack = return SourceUnpack--noSourceStrictness, sourceLazy, sourceStrict :: SourceStrictnessQ-noSourceStrictness = return NoSourceStrictness-sourceLazy = return SourceLazy-sourceStrict = return SourceStrict--{-# DEPRECATED isStrict- ["Use 'bang'. See https://ghc.haskell.org/trac/ghc/wiki/Migration/8.0. ",- "Example usage: 'bang noSourceUnpackedness sourceStrict'"] #-}-{-# DEPRECATED notStrict- ["Use 'bang'. See https://ghc.haskell.org/trac/ghc/wiki/Migration/8.0. ",- "Example usage: 'bang noSourceUnpackedness noSourceStrictness'"] #-}-{-# DEPRECATED unpacked- ["Use 'bang'. See https://ghc.haskell.org/trac/ghc/wiki/Migration/8.0. ",- "Example usage: 'bang sourceUnpack sourceStrict'"] #-}-isStrict, notStrict, unpacked :: Q Strict-isStrict = bang noSourceUnpackedness sourceStrict-notStrict = bang noSourceUnpackedness noSourceStrictness-unpacked = bang sourceUnpack sourceStrict--bang :: SourceUnpackednessQ -> SourceStrictnessQ -> BangQ-bang u s = do u' <- u- s' <- s- return (Bang u' s')--bangType :: BangQ -> TypeQ -> BangTypeQ-bangType = liftM2 (,)--varBangType :: Name -> BangTypeQ -> VarBangTypeQ-varBangType v bt = do (b, t) <- bt- return (v, b, t)--{-# DEPRECATED strictType- "As of @template-haskell-2.11.0.0@, 'StrictType' has been replaced by 'BangType'. Please use 'bangType' instead." #-}-strictType :: Q Strict -> TypeQ -> StrictTypeQ-strictType = bangType--{-# DEPRECATED varStrictType- "As of @template-haskell-2.11.0.0@, 'VarStrictType' has been replaced by 'VarBangType'. Please use 'varBangType' instead." #-}-varStrictType :: Name -> StrictTypeQ -> VarStrictTypeQ-varStrictType = varBangType---- * Type Literals--numTyLit :: Integer -> TyLitQ-numTyLit n = if n >= 0 then return (NumTyLit n)- else fail ("Negative type-level number: " ++ show n)--strTyLit :: String -> TyLitQ-strTyLit s = return (StrTyLit s)- ------------------------------------------------------------------------------- -- * Kind @@ -864,24 +245,6 @@ kindedTV :: Name -> Kind -> TyVarBndr kindedTV = KindedTV -varK :: Name -> Kind-varK = VarT--conK :: Name -> Kind-conK = ConT--tupleK :: Int -> Kind-tupleK = TupleT--arrowK :: Kind-arrowK = ArrowT--listK :: Kind-listK = ListT--appK :: Kind -> Kind -> Kind-appK = AppT- starK :: Kind starK = StarT @@ -899,104 +262,3 @@ tyVarSig :: TyVarBndr -> FamilyResultSig tyVarSig = TyVarSig------------------------------------------------------------------------------------ * Injectivity annotation--injectivityAnn :: Name -> [Name] -> InjectivityAnn-injectivityAnn = TH.InjectivityAnn------------------------------------------------------------------------------------ * Role--nominalR, representationalR, phantomR, inferR :: Role-nominalR = NominalR-representationalR = RepresentationalR-phantomR = PhantomR-inferR = InferR------------------------------------------------------------------------------------ * Callconv--cCall, stdCall, cApi, prim, javaScript :: Callconv-cCall = CCall-stdCall = StdCall-cApi = CApi-prim = Prim-javaScript = JavaScript------------------------------------------------------------------------------------ * Safety--unsafe, safe, interruptible :: Safety-unsafe = Unsafe-safe = Safe-interruptible = Interruptible------------------------------------------------------------------------------------ * FunDep--funDep :: [Name] -> [Name] -> FunDep-funDep = FunDep------------------------------------------------------------------------------------ * FamFlavour--typeFam, dataFam :: FamFlavour-typeFam = TypeFam-dataFam = DataFam------------------------------------------------------------------------------------ * RuleBndr-ruleVar :: Name -> RuleBndrQ-ruleVar = return . RuleVar--typedRuleVar :: Name -> TypeQ -> RuleBndrQ-typedRuleVar n ty = ty >>= return . TypedRuleVar n------------------------------------------------------------------------------------ * AnnTarget-valueAnnotation :: Name -> AnnTarget-valueAnnotation = ValueAnnotation--typeAnnotation :: Name -> AnnTarget-typeAnnotation = TypeAnnotation--moduleAnnotation :: AnnTarget-moduleAnnotation = ModuleAnnotation------------------------------------------------------------------------------------ * Pattern Synonyms (sub constructs)--unidir, implBidir :: PatSynDirQ-unidir = return Unidir-implBidir = return ImplBidir--explBidir :: [ClauseQ] -> PatSynDirQ-explBidir cls = do- cls' <- sequence cls- return (ExplBidir cls')--prefixPatSyn :: [Name] -> PatSynArgsQ-prefixPatSyn args = return $ PrefixPatSyn args--recordPatSyn :: [Name] -> PatSynArgsQ-recordPatSyn sels = return $ RecordPatSyn sels--infixPatSyn :: Name -> Name -> PatSynArgsQ-infixPatSyn arg1 arg2 = return $ InfixPatSyn arg1 arg2------------------------------------------------------------------- * Useful helper function--appsE :: [ExpQ] -> ExpQ-appsE [] = error "appsE []"-appsE [x] = x-appsE (x:y:zs) = appsE ( (appE x y) : zs )---- | Return the Module at the place of splicing. Can be used as an--- input for 'reifyModule'.-thisModule :: Q Module-thisModule = do- loc <- location- return $ Module (mkPkgName $ loc_package loc) (mkModName $ loc_module loc)
+ Language/Haskell/TH/Lib/Internal.hs view
@@ -0,0 +1,888 @@+-- |+-- Language.Haskell.TH.Lib.Internal exposes some additional functionality that+-- is used internally in GHC's integration with Template Haskell. This is not a+-- part of the public API, and as such, there are no API guarantees for this+-- module from version to version.++-- Why do we have both Language.Haskell.TH.Lib.Internal and+-- Language.Haskell.TH.Lib? Ultimately, it's because the functions in the+-- former (which are tailored for GHC's use) need different type signatures+-- than the ones in the latter. Syncing up the Internal type signatures would+-- involve a massive amount of breaking changes, so for the time being, we+-- relegate as many changes as we can to just the Internal module, where it+-- is safe to break things.++module Language.Haskell.TH.Lib.Internal where++import Language.Haskell.TH.Syntax hiding (Role, InjectivityAnn)+import qualified Language.Haskell.TH.Syntax as TH+import Control.Monad( liftM, liftM2 )+import Data.Word( Word8 )++----------------------------------------------------------+-- * Type synonyms+----------------------------------------------------------++type InfoQ = Q Info+type PatQ = Q Pat+type FieldPatQ = Q FieldPat+type ExpQ = Q Exp+type TExpQ a = Q (TExp a)+type DecQ = Q Dec+type DecsQ = Q [Dec]+type ConQ = Q Con+type TypeQ = Q Type+type KindQ = Q Kind+type TyVarBndrQ = Q TyVarBndr+type TyLitQ = Q TyLit+type CxtQ = Q Cxt+type PredQ = Q Pred+type DerivClauseQ = Q DerivClause+type MatchQ = Q Match+type ClauseQ = Q Clause+type BodyQ = Q Body+type GuardQ = Q Guard+type StmtQ = Q Stmt+type RangeQ = Q Range+type SourceStrictnessQ = Q SourceStrictness+type SourceUnpackednessQ = Q SourceUnpackedness+type BangQ = Q Bang+type BangTypeQ = Q BangType+type VarBangTypeQ = Q VarBangType+type StrictTypeQ = Q StrictType+type VarStrictTypeQ = Q VarStrictType+type FieldExpQ = Q FieldExp+type RuleBndrQ = Q RuleBndr+type TySynEqnQ = Q TySynEqn+type PatSynDirQ = Q PatSynDir+type PatSynArgsQ = Q PatSynArgs+type FamilyResultSigQ = Q FamilyResultSig++-- must be defined here for DsMeta to find it+type Role = TH.Role+type InjectivityAnn = TH.InjectivityAnn++----------------------------------------------------------+-- * Lowercase pattern syntax functions+----------------------------------------------------------++intPrimL :: Integer -> Lit+intPrimL = IntPrimL+wordPrimL :: Integer -> Lit+wordPrimL = WordPrimL+floatPrimL :: Rational -> Lit+floatPrimL = FloatPrimL+doublePrimL :: Rational -> Lit+doublePrimL = DoublePrimL+integerL :: Integer -> Lit+integerL = IntegerL+charL :: Char -> Lit+charL = CharL+charPrimL :: Char -> Lit+charPrimL = CharPrimL+stringL :: String -> Lit+stringL = StringL+stringPrimL :: [Word8] -> Lit+stringPrimL = StringPrimL+rationalL :: Rational -> Lit+rationalL = RationalL++litP :: Lit -> PatQ+litP l = return (LitP l)++varP :: Name -> PatQ+varP v = return (VarP v)++tupP :: [PatQ] -> PatQ+tupP ps = do { ps1 <- sequence ps; return (TupP ps1)}++unboxedTupP :: [PatQ] -> PatQ+unboxedTupP ps = do { ps1 <- sequence ps; return (UnboxedTupP ps1)}++unboxedSumP :: PatQ -> SumAlt -> SumArity -> PatQ+unboxedSumP p alt arity = do { p1 <- p; return (UnboxedSumP p1 alt arity) }++conP :: Name -> [PatQ] -> PatQ+conP n ps = do ps' <- sequence ps+ return (ConP n ps')+infixP :: PatQ -> Name -> PatQ -> PatQ+infixP p1 n p2 = do p1' <- p1+ p2' <- p2+ return (InfixP p1' n p2')+uInfixP :: PatQ -> Name -> PatQ -> PatQ+uInfixP p1 n p2 = do p1' <- p1+ p2' <- p2+ return (UInfixP p1' n p2')+parensP :: PatQ -> PatQ+parensP p = do p' <- p+ return (ParensP p')++tildeP :: PatQ -> PatQ+tildeP p = do p' <- p+ return (TildeP p')+bangP :: PatQ -> PatQ+bangP p = do p' <- p+ return (BangP p')+asP :: Name -> PatQ -> PatQ+asP n p = do p' <- p+ return (AsP n p')+wildP :: PatQ+wildP = return WildP+recP :: Name -> [FieldPatQ] -> PatQ+recP n fps = do fps' <- sequence fps+ return (RecP n fps')+listP :: [PatQ] -> PatQ+listP ps = do ps' <- sequence ps+ return (ListP ps')+sigP :: PatQ -> TypeQ -> PatQ+sigP p t = do p' <- p+ t' <- t+ return (SigP p' t')+viewP :: ExpQ -> PatQ -> PatQ+viewP e p = do e' <- e+ p' <- p+ return (ViewP e' p')++fieldPat :: Name -> PatQ -> FieldPatQ+fieldPat n p = do p' <- p+ return (n, p')+++-------------------------------------------------------------------------------+-- * Stmt++bindS :: PatQ -> ExpQ -> StmtQ+bindS p e = liftM2 BindS p e++letS :: [DecQ] -> StmtQ+letS ds = do { ds1 <- sequence ds; return (LetS ds1) }++noBindS :: ExpQ -> StmtQ+noBindS e = do { e1 <- e; return (NoBindS e1) }++parS :: [[StmtQ]] -> StmtQ+parS sss = do { sss1 <- mapM sequence sss; return (ParS sss1) }++-------------------------------------------------------------------------------+-- * Range++fromR :: ExpQ -> RangeQ+fromR x = do { a <- x; return (FromR a) }++fromThenR :: ExpQ -> ExpQ -> RangeQ+fromThenR x y = do { a <- x; b <- y; return (FromThenR a b) }++fromToR :: ExpQ -> ExpQ -> RangeQ+fromToR x y = do { a <- x; b <- y; return (FromToR a b) }++fromThenToR :: ExpQ -> ExpQ -> ExpQ -> RangeQ+fromThenToR x y z = do { a <- x; b <- y; c <- z;+ return (FromThenToR a b c) }+-------------------------------------------------------------------------------+-- * Body++normalB :: ExpQ -> BodyQ+normalB e = do { e1 <- e; return (NormalB e1) }++guardedB :: [Q (Guard,Exp)] -> BodyQ+guardedB ges = do { ges' <- sequence ges; return (GuardedB ges') }++-------------------------------------------------------------------------------+-- * Guard++normalG :: ExpQ -> GuardQ+normalG e = do { e1 <- e; return (NormalG e1) }++normalGE :: ExpQ -> ExpQ -> Q (Guard, Exp)+normalGE g e = do { g1 <- g; e1 <- e; return (NormalG g1, e1) }++patG :: [StmtQ] -> GuardQ+patG ss = do { ss' <- sequence ss; return (PatG ss') }++patGE :: [StmtQ] -> ExpQ -> Q (Guard, Exp)+patGE ss e = do { ss' <- sequence ss;+ e' <- e;+ return (PatG ss', e') }++-------------------------------------------------------------------------------+-- * Match and Clause++-- | Use with 'caseE'+match :: PatQ -> BodyQ -> [DecQ] -> MatchQ+match p rhs ds = do { p' <- p;+ r' <- rhs;+ ds' <- sequence ds;+ return (Match p' r' ds') }++-- | Use with 'funD'+clause :: [PatQ] -> BodyQ -> [DecQ] -> ClauseQ+clause ps r ds = do { ps' <- sequence ps;+ r' <- r;+ ds' <- sequence ds;+ return (Clause ps' r' ds') }+++---------------------------------------------------------------------------+-- * Exp++-- | Dynamically binding a variable (unhygenic)+dyn :: String -> ExpQ+dyn s = return (VarE (mkName s))++varE :: Name -> ExpQ+varE s = return (VarE s)++conE :: Name -> ExpQ+conE s = return (ConE s)++litE :: Lit -> ExpQ+litE c = return (LitE c)++appE :: ExpQ -> ExpQ -> ExpQ+appE x y = do { a <- x; b <- y; return (AppE a b)}++appTypeE :: ExpQ -> TypeQ -> ExpQ+appTypeE x t = do { a <- x; s <- t; return (AppTypeE a s) }++parensE :: ExpQ -> ExpQ+parensE x = do { x' <- x; return (ParensE x') }++uInfixE :: ExpQ -> ExpQ -> ExpQ -> ExpQ+uInfixE x s y = do { x' <- x; s' <- s; y' <- y;+ return (UInfixE x' s' y') }++infixE :: Maybe ExpQ -> ExpQ -> Maybe ExpQ -> ExpQ+infixE (Just x) s (Just y) = do { a <- x; s' <- s; b <- y;+ return (InfixE (Just a) s' (Just b))}+infixE Nothing s (Just y) = do { s' <- s; b <- y;+ return (InfixE Nothing s' (Just b))}+infixE (Just x) s Nothing = do { a <- x; s' <- s;+ return (InfixE (Just a) s' Nothing)}+infixE Nothing s Nothing = do { s' <- s; return (InfixE Nothing s' Nothing) }++infixApp :: ExpQ -> ExpQ -> ExpQ -> ExpQ+infixApp x y z = infixE (Just x) y (Just z)+sectionL :: ExpQ -> ExpQ -> ExpQ+sectionL x y = infixE (Just x) y Nothing+sectionR :: ExpQ -> ExpQ -> ExpQ+sectionR x y = infixE Nothing x (Just y)++lamE :: [PatQ] -> ExpQ -> ExpQ+lamE ps e = do ps' <- sequence ps+ e' <- e+ return (LamE ps' e')++-- | Single-arg lambda+lam1E :: PatQ -> ExpQ -> ExpQ+lam1E p e = lamE [p] e++lamCaseE :: [MatchQ] -> ExpQ+lamCaseE ms = sequence ms >>= return . LamCaseE++tupE :: [ExpQ] -> ExpQ+tupE es = do { es1 <- sequence es; return (TupE es1)}++unboxedTupE :: [ExpQ] -> ExpQ+unboxedTupE es = do { es1 <- sequence es; return (UnboxedTupE es1)}++unboxedSumE :: ExpQ -> SumAlt -> SumArity -> ExpQ+unboxedSumE e alt arity = do { e1 <- e; return (UnboxedSumE e1 alt arity) }++condE :: ExpQ -> ExpQ -> ExpQ -> ExpQ+condE x y z = do { a <- x; b <- y; c <- z; return (CondE a b c)}++multiIfE :: [Q (Guard, Exp)] -> ExpQ+multiIfE alts = sequence alts >>= return . MultiIfE++letE :: [DecQ] -> ExpQ -> ExpQ+letE ds e = do { ds2 <- sequence ds; e2 <- e; return (LetE ds2 e2) }++caseE :: ExpQ -> [MatchQ] -> ExpQ+caseE e ms = do { e1 <- e; ms1 <- sequence ms; return (CaseE e1 ms1) }++doE :: [StmtQ] -> ExpQ+doE ss = do { ss1 <- sequence ss; return (DoE ss1) }++compE :: [StmtQ] -> ExpQ+compE ss = do { ss1 <- sequence ss; return (CompE ss1) }++arithSeqE :: RangeQ -> ExpQ+arithSeqE r = do { r' <- r; return (ArithSeqE r') }++listE :: [ExpQ] -> ExpQ+listE es = do { es1 <- sequence es; return (ListE es1) }++sigE :: ExpQ -> TypeQ -> ExpQ+sigE e t = do { e1 <- e; t1 <- t; return (SigE e1 t1) }++recConE :: Name -> [Q (Name,Exp)] -> ExpQ+recConE c fs = do { flds <- sequence fs; return (RecConE c flds) }++recUpdE :: ExpQ -> [Q (Name,Exp)] -> ExpQ+recUpdE e fs = do { e1 <- e; flds <- sequence fs; return (RecUpdE e1 flds) }++stringE :: String -> ExpQ+stringE = litE . stringL++fieldExp :: Name -> ExpQ -> Q (Name, Exp)+fieldExp s e = do { e' <- e; return (s,e') }++-- | @staticE x = [| static x |]@+staticE :: ExpQ -> ExpQ+staticE = fmap StaticE++unboundVarE :: Name -> ExpQ+unboundVarE s = return (UnboundVarE s)++labelE :: String -> ExpQ+labelE s = return (LabelE s)++-- ** 'arithSeqE' Shortcuts+fromE :: ExpQ -> ExpQ+fromE x = do { a <- x; return (ArithSeqE (FromR a)) }++fromThenE :: ExpQ -> ExpQ -> ExpQ+fromThenE x y = do { a <- x; b <- y; return (ArithSeqE (FromThenR a b)) }++fromToE :: ExpQ -> ExpQ -> ExpQ+fromToE x y = do { a <- x; b <- y; return (ArithSeqE (FromToR a b)) }++fromThenToE :: ExpQ -> ExpQ -> ExpQ -> ExpQ+fromThenToE x y z = do { a <- x; b <- y; c <- z;+ return (ArithSeqE (FromThenToR a b c)) }+++-------------------------------------------------------------------------------+-- * Dec++valD :: PatQ -> BodyQ -> [DecQ] -> DecQ+valD p b ds =+ do { p' <- p+ ; ds' <- sequence ds+ ; b' <- b+ ; return (ValD p' b' ds')+ }++funD :: Name -> [ClauseQ] -> DecQ+funD nm cs =+ do { cs1 <- sequence cs+ ; return (FunD nm cs1)+ }++tySynD :: Name -> [TyVarBndrQ] -> TypeQ -> DecQ+tySynD tc tvs rhs =+ do { tvs1 <- sequenceA tvs+ ; rhs1 <- rhs+ ; return (TySynD tc tvs1 rhs1)+ }++dataD :: CxtQ -> Name -> [TyVarBndrQ] -> Maybe KindQ -> [ConQ]+ -> [DerivClauseQ] -> DecQ+dataD ctxt tc tvs ksig cons derivs =+ do+ ctxt1 <- ctxt+ tvs1 <- sequenceA tvs+ ksig1 <- sequenceA ksig+ cons1 <- sequence cons+ derivs1 <- sequence derivs+ return (DataD ctxt1 tc tvs1 ksig1 cons1 derivs1)++newtypeD :: CxtQ -> Name -> [TyVarBndrQ] -> Maybe KindQ -> ConQ+ -> [DerivClauseQ] -> DecQ+newtypeD ctxt tc tvs ksig con derivs =+ do+ ctxt1 <- ctxt+ tvs1 <- sequenceA tvs+ ksig1 <- sequenceA ksig+ con1 <- con+ derivs1 <- sequence derivs+ return (NewtypeD ctxt1 tc tvs1 ksig1 con1 derivs1)++classD :: CxtQ -> Name -> [TyVarBndrQ] -> [FunDep] -> [DecQ] -> DecQ+classD ctxt cls tvs fds decs =+ do+ tvs1 <- sequenceA tvs+ decs1 <- sequenceA decs+ ctxt1 <- ctxt+ return $ ClassD ctxt1 cls tvs1 fds decs1++instanceD :: CxtQ -> TypeQ -> [DecQ] -> DecQ+instanceD = instanceWithOverlapD Nothing++instanceWithOverlapD :: Maybe Overlap -> CxtQ -> TypeQ -> [DecQ] -> DecQ+instanceWithOverlapD o ctxt ty decs =+ do+ ctxt1 <- ctxt+ decs1 <- sequence decs+ ty1 <- ty+ return $ InstanceD o ctxt1 ty1 decs1++++sigD :: Name -> TypeQ -> DecQ+sigD fun ty = liftM (SigD fun) $ ty++forImpD :: Callconv -> Safety -> String -> Name -> TypeQ -> DecQ+forImpD cc s str n ty+ = do ty' <- ty+ return $ ForeignD (ImportF cc s str n ty')++infixLD :: Int -> Name -> DecQ+infixLD prec nm = return (InfixD (Fixity prec InfixL) nm)++infixRD :: Int -> Name -> DecQ+infixRD prec nm = return (InfixD (Fixity prec InfixR) nm)++infixND :: Int -> Name -> DecQ+infixND prec nm = return (InfixD (Fixity prec InfixN) nm)++pragInlD :: Name -> Inline -> RuleMatch -> Phases -> DecQ+pragInlD name inline rm phases+ = return $ PragmaD $ InlineP name inline rm phases++pragSpecD :: Name -> TypeQ -> Phases -> DecQ+pragSpecD n ty phases+ = do+ ty1 <- ty+ return $ PragmaD $ SpecialiseP n ty1 Nothing phases++pragSpecInlD :: Name -> TypeQ -> Inline -> Phases -> DecQ+pragSpecInlD n ty inline phases+ = do+ ty1 <- ty+ return $ PragmaD $ SpecialiseP n ty1 (Just inline) phases++pragSpecInstD :: TypeQ -> DecQ+pragSpecInstD ty+ = do+ ty1 <- ty+ return $ PragmaD $ SpecialiseInstP ty1++pragRuleD :: String -> [RuleBndrQ] -> ExpQ -> ExpQ -> Phases -> DecQ+pragRuleD n bndrs lhs rhs phases+ = do+ bndrs1 <- sequence bndrs+ lhs1 <- lhs+ rhs1 <- rhs+ return $ PragmaD $ RuleP n bndrs1 lhs1 rhs1 phases++pragAnnD :: AnnTarget -> ExpQ -> DecQ+pragAnnD target expr+ = do+ exp1 <- expr+ return $ PragmaD $ AnnP target exp1++pragLineD :: Int -> String -> DecQ+pragLineD line file = return $ PragmaD $ LineP line file++pragCompleteD :: [Name] -> Maybe Name -> DecQ+pragCompleteD cls mty = return $ PragmaD $ CompleteP cls mty++dataInstD :: CxtQ -> Name -> [TypeQ] -> Maybe KindQ -> [ConQ]+ -> [DerivClauseQ] -> DecQ+dataInstD ctxt tc tys ksig cons derivs =+ do+ ctxt1 <- ctxt+ tys1 <- sequenceA tys+ ksig1 <- sequenceA ksig+ cons1 <- sequenceA cons+ derivs1 <- sequenceA derivs+ return (DataInstD ctxt1 tc tys1 ksig1 cons1 derivs1)++newtypeInstD :: CxtQ -> Name -> [TypeQ] -> Maybe KindQ -> ConQ+ -> [DerivClauseQ] -> DecQ+newtypeInstD ctxt tc tys ksig con derivs =+ do+ ctxt1 <- ctxt+ tys1 <- sequenceA tys+ ksig1 <- sequenceA ksig+ con1 <- con+ derivs1 <- sequence derivs+ return (NewtypeInstD ctxt1 tc tys1 ksig1 con1 derivs1)++tySynInstD :: Name -> TySynEqnQ -> DecQ+tySynInstD tc eqn =+ do+ eqn1 <- eqn+ return (TySynInstD tc eqn1)++dataFamilyD :: Name -> [TyVarBndrQ] -> Maybe KindQ -> DecQ+dataFamilyD tc tvs kind =+ do tvs' <- sequenceA tvs+ kind' <- sequenceA kind+ return $ DataFamilyD tc tvs' kind'++openTypeFamilyD :: Name -> [TyVarBndrQ] -> FamilyResultSigQ+ -> Maybe InjectivityAnn -> DecQ+openTypeFamilyD tc tvs res inj =+ do tvs' <- sequenceA tvs+ res' <- res+ return $ OpenTypeFamilyD (TypeFamilyHead tc tvs' res' inj)++closedTypeFamilyD :: Name -> [TyVarBndrQ] -> FamilyResultSigQ+ -> Maybe InjectivityAnn -> [TySynEqnQ] -> DecQ+closedTypeFamilyD tc tvs result injectivity eqns =+ do tvs1 <- sequenceA tvs+ result1 <- result+ eqns1 <- sequenceA eqns+ return (ClosedTypeFamilyD (TypeFamilyHead tc tvs1 result1 injectivity) eqns1)++roleAnnotD :: Name -> [Role] -> DecQ+roleAnnotD name roles = return $ RoleAnnotD name roles++standaloneDerivD :: CxtQ -> TypeQ -> DecQ+standaloneDerivD = standaloneDerivWithStrategyD Nothing++standaloneDerivWithStrategyD :: Maybe DerivStrategy -> CxtQ -> TypeQ -> DecQ+standaloneDerivWithStrategyD ds ctxtq tyq =+ do+ ctxt <- ctxtq+ ty <- tyq+ return $ StandaloneDerivD ds ctxt ty++defaultSigD :: Name -> TypeQ -> DecQ+defaultSigD n tyq =+ do+ ty <- tyq+ return $ DefaultSigD n ty++-- | Pattern synonym declaration+patSynD :: Name -> PatSynArgsQ -> PatSynDirQ -> PatQ -> DecQ+patSynD name args dir pat = do+ args' <- args+ dir' <- dir+ pat' <- pat+ return (PatSynD name args' dir' pat')++-- | Pattern synonym type signature+patSynSigD :: Name -> TypeQ -> DecQ+patSynSigD nm ty =+ do ty' <- ty+ return $ PatSynSigD nm ty'++tySynEqn :: [TypeQ] -> TypeQ -> TySynEqnQ+tySynEqn lhs rhs =+ do+ lhs1 <- sequence lhs+ rhs1 <- rhs+ return (TySynEqn lhs1 rhs1)++cxt :: [PredQ] -> CxtQ+cxt = sequence++derivClause :: Maybe DerivStrategy -> [PredQ] -> DerivClauseQ+derivClause ds p = do p' <- cxt p+ return $ DerivClause ds p'++normalC :: Name -> [BangTypeQ] -> ConQ+normalC con strtys = liftM (NormalC con) $ sequence strtys++recC :: Name -> [VarBangTypeQ] -> ConQ+recC con varstrtys = liftM (RecC con) $ sequence varstrtys++infixC :: Q (Bang, Type) -> Name -> Q (Bang, Type) -> ConQ+infixC st1 con st2 = do st1' <- st1+ st2' <- st2+ return $ InfixC st1' con st2'++forallC :: [TyVarBndrQ] -> CxtQ -> ConQ -> ConQ+forallC ns ctxt con = do+ ns' <- sequenceA ns+ ctxt' <- ctxt+ con' <- con+ pure $ ForallC ns' ctxt' con'++gadtC :: [Name] -> [StrictTypeQ] -> TypeQ -> ConQ+gadtC cons strtys ty = liftM2 (GadtC cons) (sequence strtys) ty++recGadtC :: [Name] -> [VarStrictTypeQ] -> TypeQ -> ConQ+recGadtC cons varstrtys ty = liftM2 (RecGadtC cons) (sequence varstrtys) ty++-------------------------------------------------------------------------------+-- * Type++forallT :: [TyVarBndrQ] -> CxtQ -> TypeQ -> TypeQ+forallT tvars ctxt ty = do+ tvars1 <- sequenceA tvars+ ctxt1 <- ctxt+ ty1 <- ty+ return $ ForallT tvars1 ctxt1 ty1++varT :: Name -> TypeQ+varT = return . VarT++conT :: Name -> TypeQ+conT = return . ConT++infixT :: TypeQ -> Name -> TypeQ -> TypeQ+infixT t1 n t2 = do t1' <- t1+ t2' <- t2+ return (InfixT t1' n t2')++uInfixT :: TypeQ -> Name -> TypeQ -> TypeQ+uInfixT t1 n t2 = do t1' <- t1+ t2' <- t2+ return (UInfixT t1' n t2')++parensT :: TypeQ -> TypeQ+parensT t = do t' <- t+ return (ParensT t')++appT :: TypeQ -> TypeQ -> TypeQ+appT t1 t2 = do+ t1' <- t1+ t2' <- t2+ return $ AppT t1' t2'++arrowT :: TypeQ+arrowT = return ArrowT++listT :: TypeQ+listT = return ListT++litT :: TyLitQ -> TypeQ+litT l = fmap LitT l++tupleT :: Int -> TypeQ+tupleT i = return (TupleT i)++unboxedTupleT :: Int -> TypeQ+unboxedTupleT i = return (UnboxedTupleT i)++unboxedSumT :: SumArity -> TypeQ+unboxedSumT arity = return (UnboxedSumT arity)++sigT :: TypeQ -> KindQ -> TypeQ+sigT t k+ = do+ t' <- t+ k' <- k+ return $ SigT t' k'++equalityT :: TypeQ+equalityT = return EqualityT++wildCardT :: TypeQ+wildCardT = return WildCardT++{-# DEPRECATED classP "As of template-haskell-2.10, constraint predicates (Pred) are just types (Type), in keeping with ConstraintKinds. Please use 'conT' and 'appT'." #-}+classP :: Name -> [Q Type] -> Q Pred+classP cla tys+ = do+ tysl <- sequence tys+ return (foldl AppT (ConT cla) tysl)++{-# DEPRECATED equalP "As of template-haskell-2.10, constraint predicates (Pred) are just types (Type), in keeping with ConstraintKinds. Please see 'equalityT'." #-}+equalP :: TypeQ -> TypeQ -> PredQ+equalP tleft tright+ = do+ tleft1 <- tleft+ tright1 <- tright+ eqT <- equalityT+ return (foldl AppT eqT [tleft1, tright1])++promotedT :: Name -> TypeQ+promotedT = return . PromotedT++promotedTupleT :: Int -> TypeQ+promotedTupleT i = return (PromotedTupleT i)++promotedNilT :: TypeQ+promotedNilT = return PromotedNilT++promotedConsT :: TypeQ+promotedConsT = return PromotedConsT++noSourceUnpackedness, sourceNoUnpack, sourceUnpack :: SourceUnpackednessQ+noSourceUnpackedness = return NoSourceUnpackedness+sourceNoUnpack = return SourceNoUnpack+sourceUnpack = return SourceUnpack++noSourceStrictness, sourceLazy, sourceStrict :: SourceStrictnessQ+noSourceStrictness = return NoSourceStrictness+sourceLazy = return SourceLazy+sourceStrict = return SourceStrict++{-# DEPRECATED isStrict+ ["Use 'bang'. See https://ghc.haskell.org/trac/ghc/wiki/Migration/8.0. ",+ "Example usage: 'bang noSourceUnpackedness sourceStrict'"] #-}+{-# DEPRECATED notStrict+ ["Use 'bang'. See https://ghc.haskell.org/trac/ghc/wiki/Migration/8.0. ",+ "Example usage: 'bang noSourceUnpackedness noSourceStrictness'"] #-}+{-# DEPRECATED unpacked+ ["Use 'bang'. See https://ghc.haskell.org/trac/ghc/wiki/Migration/8.0. ",+ "Example usage: 'bang sourceUnpack sourceStrict'"] #-}+isStrict, notStrict, unpacked :: Q Strict+isStrict = bang noSourceUnpackedness sourceStrict+notStrict = bang noSourceUnpackedness noSourceStrictness+unpacked = bang sourceUnpack sourceStrict++bang :: SourceUnpackednessQ -> SourceStrictnessQ -> BangQ+bang u s = do u' <- u+ s' <- s+ return (Bang u' s')++bangType :: BangQ -> TypeQ -> BangTypeQ+bangType = liftM2 (,)++varBangType :: Name -> BangTypeQ -> VarBangTypeQ+varBangType v bt = do (b, t) <- bt+ return (v, b, t)++{-# DEPRECATED strictType+ "As of @template-haskell-2.11.0.0@, 'StrictType' has been replaced by 'BangType'. Please use 'bangType' instead." #-}+strictType :: Q Strict -> TypeQ -> StrictTypeQ+strictType = bangType++{-# DEPRECATED varStrictType+ "As of @template-haskell-2.11.0.0@, 'VarStrictType' has been replaced by 'VarBangType'. Please use 'varBangType' instead." #-}+varStrictType :: Name -> StrictTypeQ -> VarStrictTypeQ+varStrictType = varBangType++-- * Type Literals++numTyLit :: Integer -> TyLitQ+numTyLit n = if n >= 0 then return (NumTyLit n)+ else fail ("Negative type-level number: " ++ show n)++strTyLit :: String -> TyLitQ+strTyLit s = return (StrTyLit s)++-------------------------------------------------------------------------------+-- * Kind++plainTV :: Name -> TyVarBndrQ+plainTV = pure . PlainTV++kindedTV :: Name -> KindQ -> TyVarBndrQ+kindedTV n = fmap (KindedTV n)++varK :: Name -> Kind+varK = VarT++conK :: Name -> Kind+conK = ConT++tupleK :: Int -> Kind+tupleK = TupleT++arrowK :: Kind+arrowK = ArrowT++listK :: Kind+listK = ListT++appK :: Kind -> Kind -> Kind+appK = AppT++starK :: KindQ+starK = pure StarT++constraintK :: KindQ+constraintK = pure ConstraintT++-------------------------------------------------------------------------------+-- * Type family result++noSig :: FamilyResultSigQ+noSig = pure NoSig++kindSig :: KindQ -> FamilyResultSigQ+kindSig = fmap KindSig++tyVarSig :: TyVarBndrQ -> FamilyResultSigQ+tyVarSig = fmap TyVarSig++-------------------------------------------------------------------------------+-- * Injectivity annotation++injectivityAnn :: Name -> [Name] -> InjectivityAnn+injectivityAnn = TH.InjectivityAnn++-------------------------------------------------------------------------------+-- * Role++nominalR, representationalR, phantomR, inferR :: Role+nominalR = NominalR+representationalR = RepresentationalR+phantomR = PhantomR+inferR = InferR++-------------------------------------------------------------------------------+-- * Callconv++cCall, stdCall, cApi, prim, javaScript :: Callconv+cCall = CCall+stdCall = StdCall+cApi = CApi+prim = Prim+javaScript = JavaScript++-------------------------------------------------------------------------------+-- * Safety++unsafe, safe, interruptible :: Safety+unsafe = Unsafe+safe = Safe+interruptible = Interruptible++-------------------------------------------------------------------------------+-- * FunDep++funDep :: [Name] -> [Name] -> FunDep+funDep = FunDep++-------------------------------------------------------------------------------+-- * RuleBndr+ruleVar :: Name -> RuleBndrQ+ruleVar = return . RuleVar++typedRuleVar :: Name -> TypeQ -> RuleBndrQ+typedRuleVar n ty = ty >>= return . TypedRuleVar n++-------------------------------------------------------------------------------+-- * AnnTarget+valueAnnotation :: Name -> AnnTarget+valueAnnotation = ValueAnnotation++typeAnnotation :: Name -> AnnTarget+typeAnnotation = TypeAnnotation++moduleAnnotation :: AnnTarget+moduleAnnotation = ModuleAnnotation++-------------------------------------------------------------------------------+-- * Pattern Synonyms (sub constructs)++unidir, implBidir :: PatSynDirQ+unidir = return Unidir+implBidir = return ImplBidir++explBidir :: [ClauseQ] -> PatSynDirQ+explBidir cls = do+ cls' <- sequence cls+ return (ExplBidir cls')++prefixPatSyn :: [Name] -> PatSynArgsQ+prefixPatSyn args = return $ PrefixPatSyn args++recordPatSyn :: [Name] -> PatSynArgsQ+recordPatSyn sels = return $ RecordPatSyn sels++infixPatSyn :: Name -> Name -> PatSynArgsQ+infixPatSyn arg1 arg2 = return $ InfixPatSyn arg1 arg2++--------------------------------------------------------------+-- * Useful helper function++appsE :: [ExpQ] -> ExpQ+appsE [] = error "appsE []"+appsE [x] = x+appsE (x:y:zs) = appsE ( (appE x y) : zs )++-- | Return the Module at the place of splicing. Can be used as an+-- input for 'reifyModule'.+thisModule :: Q Module+thisModule = do+ loc <- location+ return $ Module (mkPkgName $ loc_package loc) (mkModName $ loc_module loc)
Language/Haskell/TH/Ppr.hs view
@@ -14,6 +14,7 @@ import GHC.Show ( showMultiLineString ) import GHC.Lexeme( startsVarSym ) import Data.Ratio ( numerator, denominator )+import Prelude hiding ((<>)) nestDepth :: Int nestDepth = 4@@ -143,6 +144,7 @@ pprExp _ (InfixE me1 op me2) = parens $ pprMaybeExp noPrec me1 <+> pprInfixExp op <+> pprMaybeExp noPrec me2+pprExp i (LamE [] e) = pprExp i e -- #13856 pprExp i (LamE ps e) = parensIf (i > noPrec) $ char '\\' <> hsep (map (pprPat appPrec) ps) <+> text "->" <+> ppr e pprExp i (LamCaseE ms) = parensIf (i > noPrec)@@ -150,7 +152,7 @@ pprExp _ (TupE es) = parens (commaSep es) pprExp _ (UnboxedTupE es) = hashParens (commaSep es) pprExp _ (UnboxedSumE e alt arity) = unboxedSumBars (ppr e) alt arity--- Nesting in Cond is to avoid potential problems in do statments+-- Nesting in Cond is to avoid potential problems in do statements pprExp i (CondE guard true false) = parensIf (i > noPrec) $ sep [text "if" <+> ppr guard, nest 1 $ text "then" <+> ppr true,@@ -198,6 +200,7 @@ pprExp i (StaticE e) = parensIf (i >= appPrec) $ text "static"<+> pprExp appPrec e pprExp _ (UnboundVarE v) = pprName' Applied v+pprExp _ (LabelE s) = text "#" <> text s pprFields :: [(Name,Exp)] -> Doc pprFields = sep . punctuate comma . map (\(s,e) -> ppr s <+> equals <+> ppr e)@@ -397,7 +400,7 @@ ppr_data maybeInst ctxt t argsDoc ksig cs decs = sep [text "data" <+> maybeInst <+> pprCxt ctxt- <+> ppr t <+> argsDoc <+> ksigDoc <+> maybeWhere,+ <+> pprName' Applied t <+> argsDoc <+> ksigDoc <+> maybeWhere, nest nestDepth (sep (pref $ map ppr cs)), if null decs then empty@@ -463,11 +466,6 @@ ppr_list xs = bar <+> commaSep xs -------------------------------instance Ppr FamFlavour where- ppr DataFam = text "data"- ppr TypeFam = text "type"-------------------------------- instance Ppr FamilyResultSig where ppr NoSig = empty ppr (KindSig k) = dcolon <+> ppr k@@ -677,8 +675,9 @@ ------------------------------ pprParendType :: Type -> Doc-pprParendType (VarT v) = ppr v-pprParendType (ConT c) = ppr c+pprParendType (VarT v) = pprName' Applied v+-- `Applied` is used here instead of `ppr` because of infix names (#13887)+pprParendType (ConT c) = pprName' Applied c pprParendType (TupleT 0) = text "()" pprParendType (TupleT n) = parens (hcat (replicate (n-1) comma)) pprParendType (UnboxedTupleT n) = hashParens $ hcat $ replicate (n-1) comma@@ -686,11 +685,11 @@ pprParendType ArrowT = parens (text "->") pprParendType ListT = text "[]" pprParendType (LitT l) = pprTyLit l-pprParendType (PromotedT c) = text "'" <> ppr c+pprParendType (PromotedT c) = text "'" <> pprName' Applied c pprParendType (PromotedTupleT 0) = text "'()" pprParendType (PromotedTupleT n) = quoteParens (hcat (replicate (n-1) comma)) pprParendType PromotedNilT = text "'[]"-pprParendType PromotedConsT = text "(':)"+pprParendType PromotedConsT = text "'(:)" pprParendType StarT = char '*' pprParendType ConstraintT = text "Constraint" pprParendType (SigT ty k) = parens (ppr ty <+> text "::" <+> ppr k)
Language/Haskell/TH/PprLib.hs view
@@ -41,6 +41,7 @@ import Control.Monad (liftM, liftM2, ap) import Language.Haskell.TH.Lib.Map ( Map ) import qualified Language.Haskell.TH.Lib.Map as Map ( lookup, insert, empty )+import Prelude hiding ((<>)) infixl 6 <> infixl 6 <+>
Language/Haskell/TH/Syntax.hs view
@@ -1,14 +1,10 @@-{-# LANGUAGE CPP, DeriveDataTypeable,+{-# LANGUAGE DeriveDataTypeable, DeriveGeneric, FlexibleInstances, DefaultSignatures, RankNTypes, RoleAnnotations, ScopedTypeVariables, Trustworthy #-} {-# OPTIONS_GHC -fno-warn-inline-rule-shadowing #-} -#if MIN_VERSION_base(4,9,0)-# define HAS_MONADFAIL 1-#endif- ----------------------------------------------------------------------------- -- | -- Module : Language.Haskell.Syntax@@ -34,6 +30,7 @@ import Data.IORef import System.IO.Unsafe ( unsafePerformIO ) import Control.Monad (liftM)+import Control.Monad.IO.Class (MonadIO (..)) import System.IO ( hPutStrLn, stderr ) import Data.Char ( isAlpha, isAlphaNum, isUpper ) import Data.Int@@ -45,9 +42,7 @@ import Language.Haskell.TH.LanguageExtensions import Numeric.Natural -#if HAS_MONADFAIL import qualified Control.Monad.Fail as Fail-#endif ----------------------------------------------------- --@@ -55,11 +50,7 @@ -- ----------------------------------------------------- -#if HAS_MONADFAIL-class Fail.MonadFail m => Quasi m where-#else-class Monad m => Quasi m where-#endif+class (MonadIO m, Fail.MonadFail m) => Quasi m where qNewName :: String -> m Name -- ^ Fresh names @@ -88,6 +79,7 @@ qLocation :: m Loc qRunIO :: IO a -> m a+ qRunIO = liftIO -- ^ Input/output (dangerous) qAddDependentFile :: FilePath -> m ()@@ -98,6 +90,8 @@ qAddModFinalizer :: Q () -> m () + qAddCorePlugin :: String -> m ()+ qGetQ :: Typeable a => m (Maybe a) qPutQ :: Typeable a => a -> m ()@@ -137,13 +131,12 @@ qAddTopDecls _ = badIO "addTopDecls" qAddForeignFile _ _ = badIO "addForeignFile" qAddModFinalizer _ = badIO "addModFinalizer"+ qAddCorePlugin _ = badIO "addCorePlugin" qGetQ = badIO "getQ" qPutQ _ = badIO "putQ" qIsExtEnabled _ = badIO "isExtEnabled" qExtsEnabled = badIO "extsEnabled" - qRunIO m = m- badIO :: String -> IO a badIO op = do { qReport True ("Can't do `" ++ op ++ "' in the IO monad") ; fail "Template Haskell failure" }@@ -179,14 +172,10 @@ instance Monad Q where Q m >>= k = Q (m >>= \x -> unQ (k x)) (>>) = (*>)-#if !HAS_MONADFAIL- fail s = report True s >> Q (fail "Q monad failure")-#else fail = Fail.fail instance Fail.MonadFail Q where fail s = report True s >> Q (Fail.fail "Q monad failure")-#endif instance Functor Q where fmap f (Q x) = Q (fmap f x)@@ -490,6 +479,16 @@ addModFinalizer :: Q () -> Q () addModFinalizer act = Q (qAddModFinalizer (unQ act)) +-- | Adds a core plugin to the compilation pipeline.+--+-- @addCorePlugin m@ has almost the same effect as passing @-fplugin=m@ to ghc+-- in the command line. The major difference is that the plugin module @m@+-- must not belong to the current package. When TH executes, it is too late+-- to tell the compiler that we needed to compile first a plugin module in the+-- current package.+addCorePlugin :: String -> Q ()+addCorePlugin plugin = Q (qAddCorePlugin plugin)+ -- | Get state from the 'Q' monad. Note that the state is local to the -- Haskell module in which the Template Haskell expression is executed. getQ :: Typeable a => Q (Maybe a)@@ -508,6 +507,9 @@ extsEnabled :: Q [Extension] extsEnabled = Q qExtsEnabled +instance MonadIO Q where+ liftIO = runIO+ instance Quasi Q where qNewName = newName qReport = report@@ -521,11 +523,11 @@ qReifyConStrictness = reifyConStrictness qLookupName = lookupName qLocation = location- qRunIO = runIO qAddDependentFile = addDependentFile qAddTopDecls = addTopDecls qAddForeignFile = addForeignFile qAddModFinalizer = addModFinalizer+ qAddCorePlugin = addCorePlugin qGetQ = getQ qPutQ = putQ qIsExtEnabled = isExtEnabled@@ -563,6 +565,9 @@ -- Template Haskell has no way of knowing what value @x@ will take on at -- splice-time, so it requires the type of @x@ to be an instance of 'Lift'. --+-- A 'Lift' instance must satisfy @$(lift x) ≡ x@ for all @x@, where @$(...)@+-- is a Template Haskell splice.+-- -- 'Lift' instances can be derived automatically by use of the @-XDeriveLift@ -- GHC language extension: --@@ -1538,7 +1543,7 @@ | ConE Name -- ^ @data T1 = C1 t1 t2; p = {C1} e1 e2 @ | LitE Lit -- ^ @{ 5 or \'c\'}@ | AppE Exp Exp -- ^ @{ f x }@- | AppTypeE Exp Type -- ^ @{ f \@Int }+ | AppTypeE Exp Type -- ^ @{ f \@Int }@ | InfixE (Maybe Exp) Exp (Maybe Exp) -- ^ @{x + y} or {(x+)} or {(+ x)} or {(+)}@ @@ -1582,6 +1587,7 @@ | RecUpdE Exp [FieldExp] -- ^ @{ (f x) { z = w } }@ | StaticE Exp -- ^ @{ static e }@ | UnboundVarE Name -- ^ @{ _x }@ (hole)+ | LabelE String -- ^ @{ #x }@ ( Overloaded label ) deriving( Show, Eq, Ord, Data, Generic ) type FieldExp = (Name,Exp)@@ -1770,9 +1776,6 @@ data FunDep = FunDep [Name] [Name] deriving( Show, Eq, Ord, Data, Generic ) -data FamFlavour = TypeFam | DataFam- deriving( Show, Eq, Ord, Data, Generic )- data Foreign = ImportF Callconv Safety String Name Type | ExportF Callconv String Name Type deriving( Show, Eq, Ord, Data, Generic )@@ -1844,6 +1847,35 @@ | DecidedUnpack deriving (Show, Eq, Ord, Data, Generic) +-- | A single data constructor.+--+-- The constructors for 'Con' can roughly be divided up into two categories:+-- those for constructors with \"vanilla\" syntax ('NormalC', 'RecC', and+-- 'InfixC'), and those for constructors with GADT syntax ('GadtC' and+-- 'RecGadtC'). The 'ForallC' constructor, which quantifies additional type+-- variables and class contexts, can surround either variety of constructor.+-- However, the type variables that it quantifies are different depending+-- on what constructor syntax is used:+--+-- * If a 'ForallC' surrounds a constructor with vanilla syntax, then the+-- 'ForallC' will only quantify /existential/ type variables. For example:+--+-- @+-- data Foo a = forall b. MkFoo a b+-- @+--+-- In @MkFoo@, 'ForallC' will quantify @b@, but not @a@.+--+-- * If a 'ForallC' surrounds a constructor with GADT syntax, then the+-- 'ForallC' will quantify /all/ type variables used in the constructor.+-- For example:+--+-- @+-- data Bar a b where+-- MkBar :: (a ~ b) => c -> MkBar a b+-- @+--+-- In @MkBar@, 'ForallC' will quantify @a@, @b@, and @c@. data Con = NormalC Name [BangType] -- ^ @C Int a@ | RecC Name [VarBangType] -- ^ @C { v :: Int, w :: a }@ | InfixC BangType Name BangType -- ^ @Int :+ a@@@ -1916,7 +1948,7 @@ | RecordPatSyn [Name] -- ^ @pattern P { {x,y,z} } = p@ deriving( Show, Eq, Ord, Data, Generic ) -data Type = ForallT [TyVarBndr] Cxt Type -- ^ @forall \<vars\>. \<ctxt\> -> \<type\>@+data Type = ForallT [TyVarBndr] Cxt Type -- ^ @forall \<vars\>. \<ctxt\> => \<type\>@ | AppT Type Type -- ^ @T a b@ | SigT Type Kind -- ^ @t :: k@ | VarT Name -- ^ @a@@@ -1941,7 +1973,7 @@ | StarT -- ^ @*@ | ConstraintT -- ^ @Constraint@ | LitT TyLit -- ^ @0,1,2, etc.@- | WildCardT -- ^ @_,+ | WildCardT -- ^ @_@ deriving( Show, Eq, Ord, Data, Generic ) data TyVarBndr = PlainTV Name -- ^ @a@@@ -1959,7 +1991,7 @@ deriving ( Show, Eq, Ord, Data, Generic ) data TyLit = NumTyLit Integer -- ^ @2@- | StrTyLit String -- ^ @"Hello"@+ | StrTyLit String -- ^ @\"Hello\"@ deriving ( Show, Eq, Ord, Data, Generic ) -- | Role annotations
changelog.md view
@@ -1,8 +1,30 @@ # Changelog for [`template-haskell` package](http://hackage.haskell.org/package/template-haskell) +## 2.13.0.0 *March 2018*++ * Bundled with GHC 8.4.1++ * `Language.Haskell.TH.FamFlavour`, which was deprecated in 2.11,+ has been removed.++ * Add support for overloaded labels. Introduces `labelE :: String -> ExpQ`.++ * Add `KindQ`, `TyVarBndrQ`, and `FamilyResultSigQ` aliases to+ `Language.Haskell.TH.Lib`.++ * Add `Language.Haskell.TH.Lib.Internal` module, which exposes some+ additional functionality that is used internally in GHC's integration+ with Template Haskell. This is not a part of the public API, and as+ such, there are no API guarantees for this module from version to version.++ * `MonadIO` is now a superclass of `Quasi`, `qRunIO` has a default+ implementation `qRunIO = liftIO`++ * Add `MonadIO Q` instance+ ## 2.12.0.0 *July 2017* - * Bundled with GHC 8.2.1.+ * Bundled with GHC 8.2.1 * Add support for pattern synonyms. This introduces one new constructor to `Info` (`PatSynI`), two new constructors to `Dec` (`PatSynD` and@@ -31,6 +53,8 @@ - `plainTV` and `kindedTV` - `interruptible` and `funDep` - `valueAnnotation`, `typeAnnotation`, and `moduleAnnotation`++ * Add support for overloaded labels. ## 2.11.0.0 *May 2016*
template-haskell.cabal view
@@ -1,5 +1,5 @@ name: template-haskell-version: 2.12.0.0+version: 2.13.0.0 -- NOTE: Don't forget to update ./changelog.md license: BSD3 license-file: LICENSE@@ -45,22 +45,18 @@ Language.Haskell.TH.Syntax Language.Haskell.TH.LanguageExtensions + Language.Haskell.TH.Lib.Internal+ other-modules: Language.Haskell.TH.Lib.Map build-depends:- base >= 4.8 && < 4.11,- ghc-boot-th == 8.2.*,+ base >= 4.9 && < 4.12,+ ghc-boot-th == 8.4.*, pretty == 1.1.* - -- We need to set the unit ID to template-haskell (without a- -- version number) as it's magic. ghc-options: -Wall - if impl( ghc >= 7.11 )- ghc-options: -this-unit-id template-haskell- else- if impl( ghc >= 7.9 )- ghc-options: -this-package-key template-haskell- else- ghc-options: -package-name template-haskell+ -- We need to set the unit ID to template-haskell (without a+ -- version number) as it's magic.+ ghc-options: -this-unit-id template-haskell