haskell-src-meta 0.6.0.14 → 0.7.0
raw patch · 6 files changed
+382/−302 lines, 6 filesdep ~basedep ~haskell-src-extsdep ~template-haskellPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, haskell-src-exts, template-haskell
API changes (from Hackage documentation)
- Language.Haskell.Meta.Parse: emptySrcLoc :: SrcLoc
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToCxt Language.Haskell.Exts.Syntax.Context
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDec Language.Haskell.Exts.Syntax.Decl
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs (GHC.Base.Maybe Language.Haskell.Exts.Syntax.Binds)
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs Language.Haskell.Exts.Syntax.Binds
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs Language.Haskell.Exts.Syntax.Decl
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs Language.Haskell.Exts.Syntax.InstDecl
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToExp Language.Haskell.Exts.Syntax.Exp
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToExp Language.Haskell.Exts.Syntax.QOp
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToLit Language.Haskell.Exts.Syntax.Literal
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName Language.Haskell.Exts.Syntax.Module
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName Language.Haskell.Exts.Syntax.Name
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName Language.Haskell.Exts.Syntax.Op
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName Language.Haskell.Exts.Syntax.QName
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName Language.Haskell.Exts.Syntax.SpecialCon
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName Language.Haskell.Exts.Syntax.TyVarBind
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToPat Language.Haskell.Exts.Syntax.Pat
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToStmt Language.Haskell.Exts.Syntax.Stmt
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToType Language.Haskell.Exts.Syntax.Kind
- Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToType Language.Haskell.Exts.Syntax.Type
+ Language.Haskell.Meta.Parse: noSrcSpanInfo :: SrcSpanInfo
+ Language.Haskell.Meta.Syntax.Translate: class ToInjectivityAnn a
+ Language.Haskell.Meta.Syntax.Translate: class ToMaybeKind a
+ Language.Haskell.Meta.Syntax.Translate: class ToNames a
+ Language.Haskell.Meta.Syntax.Translate: class ToPred a
+ Language.Haskell.Meta.Syntax.Translate: class ToTyVars a
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToCxt (Language.Haskell.Exts.Syntax.Context l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToCxt (Language.Haskell.Exts.Syntax.Deriving l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToCxt (Language.Haskell.Exts.Syntax.InstRule l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToCxt [Language.Haskell.Exts.Syntax.InstRule l]
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToCxt a => Language.Haskell.Meta.Syntax.Translate.ToCxt (GHC.Base.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDec (Language.Haskell.Exts.Syntax.Decl l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs (Language.Haskell.Exts.Syntax.Binds l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs (Language.Haskell.Exts.Syntax.ClassDecl l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs (Language.Haskell.Exts.Syntax.Decl l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs (Language.Haskell.Exts.Syntax.InstDecl l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToDecs a => Language.Haskell.Meta.Syntax.Translate.ToDecs (GHC.Base.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToExp (Language.Haskell.Exts.Syntax.Exp l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToExp (Language.Haskell.Exts.Syntax.QOp l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToInjectivityAnn (Language.Haskell.Exts.Syntax.InjectivityInfo l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToLit (Language.Haskell.Exts.Syntax.Literal l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToMaybeKind (Language.Haskell.Exts.Syntax.ResultSig l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToMaybeKind a => Language.Haskell.Meta.Syntax.Translate.ToMaybeKind (GHC.Base.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName (Language.Haskell.Exts.Syntax.DeclHead l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName (Language.Haskell.Exts.Syntax.Name l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName (Language.Haskell.Exts.Syntax.Op l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName (Language.Haskell.Exts.Syntax.QName l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName (Language.Haskell.Exts.Syntax.SpecialCon l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToName (Language.Haskell.Exts.Syntax.TyVarBind l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToNames (Language.Haskell.Exts.Syntax.Deriving l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToNames (Language.Haskell.Exts.Syntax.InstHead l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToNames (Language.Haskell.Exts.Syntax.InstRule l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToNames a => Language.Haskell.Meta.Syntax.Translate.ToNames (GHC.Base.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToPat (Language.Haskell.Exts.Syntax.Pat l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToPred (Language.Haskell.Exts.Syntax.Asst l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToStmt (Language.Haskell.Exts.Syntax.Stmt l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToTyVars (Language.Haskell.Exts.Syntax.DeclHead l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToTyVars (Language.Haskell.Exts.Syntax.TyVarBind l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToTyVars a => Language.Haskell.Meta.Syntax.Translate.ToTyVars (GHC.Base.Maybe a)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToTyVars a => Language.Haskell.Meta.Syntax.Translate.ToTyVars [a]
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToType (Language.Haskell.Exts.Syntax.InstHead l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToType (Language.Haskell.Exts.Syntax.InstRule l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToType (Language.Haskell.Exts.Syntax.Kind l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToType (Language.Haskell.Exts.Syntax.QName l)
+ Language.Haskell.Meta.Syntax.Translate: instance Language.Haskell.Meta.Syntax.Translate.ToType (Language.Haskell.Exts.Syntax.Type l)
+ Language.Haskell.Meta.Syntax.Translate: toInjectivityAnn :: ToInjectivityAnn a => a -> InjectivityAnn
+ Language.Haskell.Meta.Syntax.Translate: toMaybeKind :: ToMaybeKind a => a -> Maybe Kind
+ Language.Haskell.Meta.Syntax.Translate: toNames :: ToNames a => a -> [Name]
+ Language.Haskell.Meta.Syntax.Translate: toPred :: ToPred a => a -> Pred
+ Language.Haskell.Meta.Syntax.Translate: toTyVars :: ToTyVars a => a -> [TyVarBndr]
+ Language.Haskell.Meta.Utils: infixr 0 |$|
+ Language.Haskell.Meta.Utils: infixr 9 |->|
- Language.Haskell.Meta.Parse: emptyHsModule :: String -> Module
+ Language.Haskell.Meta.Parse: emptyHsModule :: String -> Module SrcSpanInfo
- Language.Haskell.Meta.Parse: moduleDecls :: Module -> [Decl]
+ Language.Haskell.Meta.Parse: moduleDecls :: Module SrcSpanInfo -> [Decl SrcSpanInfo]
- Language.Haskell.Meta.Parse: parseHsDecls :: String -> Either String [Decl]
+ Language.Haskell.Meta.Parse: parseHsDecls :: String -> Either String [Decl SrcSpanInfo]
- Language.Haskell.Meta.Parse: parseHsExp :: String -> Either String Exp
+ Language.Haskell.Meta.Parse: parseHsExp :: String -> Either String (Exp SrcSpanInfo)
- Language.Haskell.Meta.Parse: parseHsModule :: String -> Either String Module
+ Language.Haskell.Meta.Parse: parseHsModule :: String -> Either String (Module SrcSpanInfo)
- Language.Haskell.Meta.Parse: parseHsPat :: String -> Either String Pat
+ Language.Haskell.Meta.Parse: parseHsPat :: String -> Either String (Pat SrcSpanInfo)
- Language.Haskell.Meta.Parse: parseHsType :: String -> Either String Type
+ Language.Haskell.Meta.Parse: parseHsType :: String -> Either String (Type SrcSpanInfo)
- Language.Haskell.Meta.Parse: pprHsModule :: Module -> String
+ Language.Haskell.Meta.Parse: pprHsModule :: Module SrcSpanInfo -> String
- Language.Haskell.Meta.Syntax.Translate: conDeclToCon :: ConDecl -> Con
+ Language.Haskell.Meta.Syntax.Translate: conDeclToCon :: ConDecl l -> Con
- Language.Haskell.Meta.Syntax.Translate: hsGuardedRhsToBody :: GuardedRhs -> Body
+ Language.Haskell.Meta.Syntax.Translate: hsGuardedRhsToBody :: GuardedRhs l -> Body
- Language.Haskell.Meta.Syntax.Translate: hsMatchToClause :: Match -> Clause
+ Language.Haskell.Meta.Syntax.Translate: hsMatchToClause :: Match l -> Clause
- Language.Haskell.Meta.Syntax.Translate: hsMatchesToFunD :: [Match] -> Dec
+ Language.Haskell.Meta.Syntax.Translate: hsMatchesToFunD :: [Match l] -> Dec
- Language.Haskell.Meta.Syntax.Translate: hsRhsToBody :: Rhs -> Body
+ Language.Haskell.Meta.Syntax.Translate: hsRhsToBody :: Rhs l -> Body
- Language.Haskell.Meta.Syntax.Translate: hsStmtToGuard :: Stmt -> Guard
+ Language.Haskell.Meta.Syntax.Translate: hsStmtToGuard :: Stmt l -> Guard
- Language.Haskell.Meta.Syntax.Translate: noTH :: Show e => String -> e -> a
+ Language.Haskell.Meta.Syntax.Translate: noTH :: (Functor f, Show (f ())) => String -> f e -> a
- Language.Haskell.Meta.Syntax.Translate: noTHyet :: Show e => String -> String -> e -> a
+ Language.Haskell.Meta.Syntax.Translate: noTHyet :: (Functor f, Show (f ())) => String -> String -> f e -> a
- Language.Haskell.Meta.Syntax.Translate: nonsense :: Show e => String -> String -> e -> a
+ Language.Haskell.Meta.Syntax.Translate: nonsense :: (Functor f, Show (f ())) => String -> String -> f e -> a
- Language.Haskell.Meta.Syntax.Translate: qualConDeclToCon :: QualConDecl -> Con
+ Language.Haskell.Meta.Syntax.Translate: qualConDeclToCon :: QualConDecl l -> Con
- Language.Haskell.Meta.Syntax.Translate: toBody :: Rhs -> Body
+ Language.Haskell.Meta.Syntax.Translate: toBody :: Rhs l -> Body
- Language.Haskell.Meta.Syntax.Translate: toFieldExp :: FieldUpdate -> FieldExp
+ Language.Haskell.Meta.Syntax.Translate: toFieldExp :: FieldUpdate l -> FieldExp
- Language.Haskell.Meta.Syntax.Translate: toGuard :: GuardedRhs -> (Guard, Exp)
+ Language.Haskell.Meta.Syntax.Translate: toGuard :: GuardedRhs t -> (Guard, Exp)
- Language.Haskell.Meta.Syntax.Translate: toKind :: Kind -> Kind
+ Language.Haskell.Meta.Syntax.Translate: toKind :: Kind l -> Kind
- Language.Haskell.Meta.Syntax.Translate: toMatch :: Alt -> Match
+ Language.Haskell.Meta.Syntax.Translate: toMatch :: Alt l -> Match
- Language.Haskell.Meta.Syntax.Translate: toStrictType :: Type -> StrictType
+ Language.Haskell.Meta.Syntax.Translate: toStrictType :: Type l -> StrictType
- Language.Haskell.Meta.Syntax.Translate: toTyVar :: TyVarBind -> TyVarBndr
+ Language.Haskell.Meta.Syntax.Translate: toTyVar :: TyVarBind l -> TyVarBndr
- Language.Haskell.Meta.Syntax.Translate: todo :: Show e => String -> e -> a
+ Language.Haskell.Meta.Syntax.Translate: todo :: (Functor f, Show (f ())) => String -> f e -> a
- Language.Haskell.Meta.Syntax.Translate: transAct :: Activation -> Phases
+ Language.Haskell.Meta.Syntax.Translate: transAct :: Maybe (Activation l) -> Phases
Files
- haskell-src-meta.cabal +3/−11
- src/Language/Haskell/Meta.hs +0/−1
- src/Language/Haskell/Meta/Parse.hs +23/−20
- src/Language/Haskell/Meta/Parse/Careful.hs +5/−5
- src/Language/Haskell/Meta/Syntax/Translate.hs +350/−264
- src/Language/Haskell/TH/Instances/Lift.hs +1/−1
haskell-src-meta.cabal view
@@ -1,5 +1,5 @@ name: haskell-src-meta-version: 0.6.0.14+version: 0.7.0 cabal-version: >= 1.6 build-type: Simple license: BSD3@@ -10,7 +10,7 @@ maintainer: Ben Millwood <haskell@benmachine.co.uk> bug-reports: https://github.com/bmillwood/haskell-src-meta/issues -- That is to say, "builds with". It's not like we have a testsuite.-tested-with: GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.3, GHC == 7.10.3, GHC == 8.0.1+tested-with: GHC == 7.6.3, GHC == 7.8.3, GHC == 7.10.3, GHC == 8.0.1 synopsis: Parse source to template-haskell abstract syntax. description: The translation from haskell-src-exts abstract syntax to template-haskell abstract syntax isn't 100% complete yet.@@ -19,19 +19,11 @@ library build-depends: base >= 4.5 && < 4.10,+ haskell-src-exts >= 1.17 && < 1.19, pretty >= 1.0 && < 1.2, syb >= 0.1 && < 0.7, template-haskell >= 2.7 && < 2.12, th-orphans >= 0.9.1 && < 0.14-- -- haskell-src-exts 1.17 is not compatible with versions of GHC prior to 7.8,- -- but we still maintain compatibility back to GHC 7.4.- if impl(ghc >= 7.8)- build-depends:- haskell-src-exts >= 1.16 && < 1.18- else - build-depends:- haskell-src-exts == 1.16.* extensions: CPP, RankNTypes,
src/Language/Haskell/Meta.hs view
@@ -1,4 +1,3 @@- {- | Module : Language.Haskell.Meta Copyright : (c) Matt Morrow 2008
src/Language/Haskell/Meta/Parse.hs view
@@ -23,7 +23,7 @@ parseHsPat, pprHsModule, moduleDecls,- emptySrcLoc,+ noSrcSpanInfo, emptyHsModule ) where @@ -33,11 +33,19 @@ import Language.Haskell.TH.Syntax #endif import Language.Haskell.Meta.Syntax.Translate+#if MIN_VERSION_haskell_src_exts(1,18,0) import qualified Language.Haskell.Exts.Syntax as Hs+import Language.Haskell.Exts.Fixity as Fix+import Language.Haskell.Exts.Parser hiding (parseExp, parseType, parsePat)+#else+import qualified Language.Haskell.Exts.Annotated.Syntax as Hs import Language.Haskell.Exts.Annotated.Fixity as Fix+import Language.Haskell.Exts.Annotated.Parser hiding (parseExp, parseType, parsePat)+#endif+import qualified Language.Haskell.Exts.SrcLoc as Hs import Language.Haskell.Exts.Extension-import Language.Haskell.Exts.Parser hiding (parseExp, parseType, parsePat) import Language.Haskell.Exts.Pretty+import Language.Haskell.Exts.Parser (ParseMode(..), ParseResult(..)) ----------------------------------------------------------------------------- @@ -67,9 +75,7 @@ ,ignoreLinePragmas = False ,ignoreLanguagePragmas = False ,fixities = Nothing-#if MIN_VERSION_haskell_src_exts(1,17,0) ,ignoreFunctionArity = False-#endif } myDefaultExtensions :: [KnownExtension]@@ -90,47 +96,44 @@ = let line = Hs.srcLine loc - 1 in Left (unlines [show line,show loc,e]) -parseHsModule :: String -> Either String Hs.Module+parseHsModule :: String -> Either String (Hs.Module Hs.SrcSpanInfo) parseHsModule = parseResultToEither . parseModuleWithMode myDefaultParseMode -parseHsDecls :: String -> Either String [Hs.Decl]+parseHsDecls :: String -> Either String [Hs.Decl Hs.SrcSpanInfo] parseHsDecls = either Left (Right . moduleDecls) . parseResultToEither . parseModuleWithMode myDefaultParseMode -parseHsType :: String -> Either String Hs.Type+parseHsType :: String -> Either String (Hs.Type Hs.SrcSpanInfo) parseHsType = parseResultToEither . parseTypeWithMode myDefaultParseMode -parseHsExp :: String -> Either String Hs.Exp+parseHsExp :: String -> Either String (Hs.Exp Hs.SrcSpanInfo) parseHsExp = parseResultToEither . parseExpWithMode myDefaultParseMode -parseHsPat :: String -> Either String Hs.Pat+parseHsPat :: String -> Either String (Hs.Pat Hs.SrcSpanInfo) parseHsPat = parseResultToEither . parsePatWithMode myDefaultParseMode -pprHsModule :: Hs.Module -> String+pprHsModule :: Hs.Module Hs.SrcSpanInfo -> String pprHsModule = prettyPrint -moduleDecls :: Hs.Module -> [Hs.Decl]-moduleDecls (Hs.Module _ _ _ _ _ _ x) = x+moduleDecls :: Hs.Module Hs.SrcSpanInfo -> [Hs.Decl Hs.SrcSpanInfo]+moduleDecls (Hs.Module _ _ _ _ x) = x -- mkModule :: String -> Hs.Module -- mkModule s = Hs.Module undefined (Hs.ModuleName s) Nothing [] [] -emptySrcLoc :: Hs.SrcLoc-emptySrcLoc = (Hs.SrcLoc [] 0 0)--emptyHsModule :: String -> Hs.Module+emptyHsModule :: String -> Hs.Module Hs.SrcSpanInfo emptyHsModule n = (Hs.Module- emptySrcLoc- (Hs.ModuleName n)+ noSrcSpanInfo+ (Just (Hs.ModuleHead noSrcSpanInfo (Hs.ModuleName noSrcSpanInfo n) Nothing Nothing)) []- Nothing- Nothing [] [])++noSrcSpanInfo = Hs.noInfoSpan (Hs.mkSrcSpan Hs.noLoc Hs.noLoc) {- ghci> :i Module
src/Language/Haskell/Meta/Parse/Careful.hs view
@@ -26,9 +26,9 @@ -} module Language.Haskell.Meta.Parse.Careful(- parsePat, - parseExp, - parseType, + parsePat,+ parseExp,+ parseType, parseDecs ) where @@ -37,8 +37,8 @@ import qualified Language.Haskell.TH as TH import qualified Language.Haskell.Exts.Syntax as Hs -doChecked parser translater p = - case parser p of +doChecked parser translater p =+ case parser p of Left s -> Left s Right p' | amb p' -> Left "Infix expression could not be resolved as operator fixities are not known. Resolve ambiguity by adding parentheses" | otherwise -> Right (translater p')
src/Language/Haskell/Meta/Syntax/Translate.hs view
@@ -17,12 +17,18 @@ import Data.Typeable import Data.List (foldl', nub, (\\)) import Language.Haskell.TH.Syntax+import qualified Language.Haskell.Exts.SrcLoc as Hs+#if MIN_VERSION_haskell_src_exts(1,18,0) import qualified Language.Haskell.Exts.Syntax as Hs+#else+import qualified Language.Haskell.Exts.Annotated.Syntax as Hs+#endif ----------------------------------------------------------------------------- class ToName a where toName :: a -> Name+class ToNames a where toNames :: a -> [Name] class ToLit a where toLit :: a -> Lit class ToType a where toType :: a -> Type class ToPat a where toPat :: a -> Pat@@ -32,27 +38,35 @@ class ToStmt a where toStmt :: a -> Stmt class ToLoc a where toLoc :: a -> Loc class ToCxt a where toCxt :: a -> Cxt+class ToPred a where toPred :: a -> Pred+class ToTyVars a where toTyVars :: a -> [TyVarBndr]+#if MIN_VERSION_haskell_src_exts(1,18,0)+class ToMaybeKind a where toMaybeKind :: a -> Maybe Kind+#if MIN_VERSION_template_haskell(2,11,0)+class ToInjectivityAnn a where toInjectivityAnn :: a -> InjectivityAnn+#endif+#endif -- for error messages moduleName = "Language.Haskell.Meta.Syntax.Translate" -- When to use each of these isn't always clear: prefer 'todo' if unsure.-noTH :: Show e => String -> e -> a+noTH :: (Functor f, Show (f ())) => String -> f e -> a noTH fun thing = error . concat $ [moduleName, ".", fun,- ": template-haskell has no representation for: ", show thing]+ ": template-haskell has no representation for: ", show (fmap (const ()) thing)] -noTHyet :: Show e => String -> String -> e -> a+noTHyet :: (Functor f, Show (f ())) => String -> String -> f e -> a noTHyet fun minVersion thing = error . concat $ [moduleName, ".", fun, ": template-haskell-", VERSION_template_haskell, " (< ", minVersion, ")",- " has no representation for: ", show thing]+ " has no representation for: ", show (fmap (const ()) thing)] -todo :: Show e => String -> e -> a+todo :: (Functor f, Show (f ())) => String -> f e -> a todo fun thing = error . concat $ [moduleName, ".", fun,- ": not implemented: ", show thing]+ ": not implemented: ", show (fmap (const ()) thing)] -nonsense :: Show e => String -> String -> e -> a+nonsense :: (Functor f, Show (f ())) => String -> String -> f e -> a nonsense fun inparticular thing = error . concat $ [moduleName, ".", fun,- ": nonsensical: ", inparticular, ": ", show thing]+ ": nonsensical: ", inparticular, ": ", show (fmap (const ()) thing)] ----------------------------------------------------------------------------- @@ -104,40 +118,36 @@ instance ToName String where toName = mkName -instance ToName Hs.Name where- toName (Hs.Ident s) = toName s- toName (Hs.Symbol s) = toName s--instance ToName Hs.Module where- toName (Hs.Module _ (Hs.ModuleName s) _ _ _ _ _) = toName s-+instance ToName (Hs.Name l) where+ toName (Hs.Ident _ s) = toName s+ toName (Hs.Symbol _ s) = toName s -instance ToName Hs.SpecialCon where- toName Hs.UnitCon = '()- toName Hs.ListCon = '[]- toName Hs.FunCon = ''(->)- toName (Hs.TupleCon _ n)+instance ToName (Hs.SpecialCon l) where+ toName (Hs.UnitCon _) = '()+ toName (Hs.ListCon _) = '[]+ toName (Hs.FunCon _) = ''(->)+ toName (Hs.TupleCon _ _ n) | n<2 = '() | otherwise = let x = maybe [] (++".") (nameModule '(,)) in mkName . concat $ x : ["(",replicate (n-1) ',',")"]- toName Hs.Cons = '(:)+ toName (Hs.Cons _) = '(:) -instance ToName Hs.QName where+instance ToName (Hs.QName l) where -- toName (Hs.Qual (Hs.Module []) n) = toName n- toName (Hs.Qual (Hs.ModuleName []) n) = toName n- toName (Hs.Qual (Hs.ModuleName m) n) =+ toName (Hs.Qual _ (Hs.ModuleName _ []) n) = toName n+ toName (Hs.Qual _ (Hs.ModuleName _ m) n) = let m' = show . toName $ m n' = show . toName $ n in toName . concat $ [m',".",n']- toName (Hs.UnQual n) = toName n- toName (Hs.Special s) = toName s+ toName (Hs.UnQual _ n) = toName n+ toName (Hs.Special _ s) = toName s -instance ToName Hs.Op where- toName (Hs.VarOp n) = toName n- toName (Hs.ConOp n) = toName n+instance ToName (Hs.Op l) where+ toName (Hs.VarOp _ n) = toName n+ toName (Hs.ConOp _ n) = toName n -----------------------------------------------------------------------------@@ -145,23 +155,19 @@ -- * ToLit HsLiteral -instance ToLit Hs.Literal where- toLit (Hs.Char a) = CharL a- toLit (Hs.String a) = StringL a- toLit (Hs.Int a) = IntegerL a- toLit (Hs.Frac a) = RationalL a+instance ToLit (Hs.Literal l) where+ toLit (Hs.Char _ a _) = CharL a+ toLit (Hs.String _ a _) = StringL a+ toLit (Hs.Int _ a _) = IntegerL a+ toLit (Hs.Frac _ a _) = RationalL a toLit l@Hs.PrimChar{} = noTH "toLit" l-#if MIN_VERSION_template_haskell(2,8,0)- toLit (Hs.PrimString a) = StringPrimL (map toWord8 a)+ toLit (Hs.PrimString _ a _) = StringPrimL (map toWord8 a) where toWord8 = fromIntegral . ord-#else- toLit (Hs.PrimString a) = StringPrimL a-#endif- toLit (Hs.PrimInt a) = IntPrimL a- toLit (Hs.PrimFloat a) = FloatPrimL a- toLit (Hs.PrimDouble a) = DoublePrimL a- toLit (Hs.PrimWord a) = WordPrimL a+ toLit (Hs.PrimInt _ a _) = IntPrimL a+ toLit (Hs.PrimFloat _ a _) = FloatPrimL a+ toLit (Hs.PrimDouble _ a _) = DoublePrimL a+ toLit (Hs.PrimWord _ a _) = WordPrimL a -----------------------------------------------------------------------------@@ -169,31 +175,31 @@ -- * ToPat HsPat -instance ToPat Hs.Pat where- toPat (Hs.PVar n)+instance ToPat (Hs.Pat l) where+ toPat (Hs.PVar _ n) = VarP (toName n)- toPat (Hs.PLit Hs.Signless l)+ toPat (Hs.PLit _ (Hs.Signless _) l) = LitP (toLit l)- toPat (Hs.PLit Hs.Negative l) = LitP $ case toLit l of+ toPat (Hs.PLit _ (Hs.Negative _) l) = LitP $ case toLit l of IntegerL z -> IntegerL (negate z) RationalL q -> RationalL (negate q) IntPrimL z' -> IntPrimL (negate z') FloatPrimL r' -> FloatPrimL (negate r') DoublePrimL r'' -> DoublePrimL (negate r'') _ -> nonsense "toPat" "negating wrong kind of literal" l- toPat (Hs.PInfixApp p n q) = UInfixP (toPat p) (toName n) (toPat q) - toPat (Hs.PApp n ps) = ConP (toName n) (fmap toPat ps)- toPat (Hs.PTuple Hs.Boxed ps) = TupP (fmap toPat ps)- toPat (Hs.PTuple Hs.Unboxed ps) = UnboxedTupP (fmap toPat ps)- toPat (Hs.PList ps) = ListP (fmap toPat ps)- toPat (Hs.PParen p) = ParensP (toPat p) - toPat (Hs.PRec n pfs) = let toFieldPat (Hs.PFieldPat n p) = (toName n, toPat p)- in RecP (toName n) (fmap toFieldPat pfs)- toPat (Hs.PAsPat n p) = AsP (toName n) (toPat p)- toPat (Hs.PWildCard) = WildP- toPat (Hs.PIrrPat p) = TildeP (toPat p)+ toPat (Hs.PInfixApp _ p n q) = UInfixP (toPat p) (toName n) (toPat q)+ toPat (Hs.PApp _ n ps) = ConP (toName n) (fmap toPat ps)+ toPat (Hs.PTuple _ Hs.Boxed ps) = TupP (fmap toPat ps)+ toPat (Hs.PTuple _ Hs.Unboxed ps) = UnboxedTupP (fmap toPat ps)+ toPat (Hs.PList _ ps) = ListP (fmap toPat ps)+ toPat (Hs.PParen _ p) = ParensP (toPat p)+ toPat (Hs.PRec _ n pfs) = let toFieldPat (Hs.PFieldPat _ n p) = (toName n, toPat p)+ in RecP (toName n) (fmap toFieldPat pfs)+ toPat (Hs.PAsPat _ n p) = AsP (toName n) (toPat p)+ toPat (Hs.PWildCard _) = WildP+ toPat (Hs.PIrrPat _ p) = TildeP (toPat p) toPat (Hs.PatTypeSig _ p t) = SigP (toPat p) (toType t)- toPat (Hs.PViewPat e p) = ViewP (toExp e) (toPat p)+ toPat (Hs.PViewPat _ e p) = ViewP (toExp e) (toPat p) -- regular pattern toPat p@Hs.PRPat{} = noTH "toPat" p -- XML stuff@@ -201,69 +207,65 @@ toPat p@Hs.PXETag{} = noTH "toPat" p toPat p@Hs.PXPcdata{} = noTH "toPat" p toPat p@Hs.PXPatTag{} = noTH "toPat" p- toPat (Hs.PBangPat p) = BangP (toPat p)+ toPat (Hs.PBangPat _ p) = BangP (toPat p) toPat p = todo "toPat" p ----------------------------------------------------------------------------- -- * ToExp HsExp -instance ToExp Hs.QOp where- toExp (Hs.QVarOp n) = VarE (toName n)- toExp (Hs.QConOp n) = ConE (toName n)+instance ToExp (Hs.QOp l) where+ toExp (Hs.QVarOp _ n) = VarE (toName n)+ toExp (Hs.QConOp _ n) = ConE (toName n) -toFieldExp :: Hs.FieldUpdate -> FieldExp-toFieldExp (Hs.FieldUpdate n e) = (toName n, toExp e)+toFieldExp :: Hs.FieldUpdate l -> FieldExp+toFieldExp (Hs.FieldUpdate _ n e) = (toName n, toExp e) -instance ToExp Hs.Exp where- toExp (Hs.Var n) = VarE (toName n)+instance ToExp (Hs.Exp l) where+ toExp (Hs.Var _ n) = VarE (toName n) toExp e@Hs.IPVar{} = noTH "toExp" e- toExp (Hs.Con n) = ConE (toName n)- toExp (Hs.Lit l) = LitE (toLit l)- toExp (Hs.InfixApp e o f) = UInfixE (toExp e) (toExp o) (toExp f)- toExp (Hs.App e f) = AppE (toExp e) (toExp f)- toExp (Hs.NegApp e) = AppE (VarE 'negate) (toExp e)+ toExp (Hs.Con _ n) = ConE (toName n)+ toExp (Hs.Lit _ l) = LitE (toLit l)+ toExp (Hs.InfixApp _ e o f) = UInfixE (toExp e) (toExp o) (toExp f)+ toExp (Hs.App _ e f) = AppE (toExp e) (toExp f)+ toExp (Hs.NegApp _ e) = AppE (VarE 'negate) (toExp e) toExp (Hs.Lambda _ ps e) = LamE (fmap toPat ps) (toExp e)- toExp (Hs.Let bs e) = LetE (toDecs bs) (toExp e)- toExp (Hs.If a b c) = CondE (toExp a) (toExp b) (toExp c)-#if MIN_VERSION_template_haskell(2,8,0)- toExp (Hs.MultiIf ifs) = MultiIfE (map toGuard ifs)-#else- toExp e@Hs.MultiIf{} = noTHyet "toExp" "2.8.0" e-#endif- toExp (Hs.Case e alts) = CaseE (toExp e) (map toMatch alts)- toExp (Hs.Do ss) = DoE (map toStmt ss)- toExp e@(Hs.MDo _) = noTH "toExp" e- toExp (Hs.Tuple Hs.Boxed xs) = TupE (fmap toExp xs)- toExp (Hs.Tuple Hs.Unboxed xs) = UnboxedTupE (fmap toExp xs)+ toExp (Hs.Let _ bs e) = LetE (toDecs bs) (toExp e)+ toExp (Hs.If _ a b c) = CondE (toExp a) (toExp b) (toExp c)+ toExp (Hs.MultiIf _ ifs) = MultiIfE (map toGuard ifs)+ toExp (Hs.Case _ e alts) = CaseE (toExp e) (map toMatch alts)+ toExp (Hs.Do _ ss) = DoE (map toStmt ss)+ toExp e@(Hs.MDo _ _) = noTH "toExp" e+ toExp (Hs.Tuple _ Hs.Boxed xs) = TupE (fmap toExp xs)+ toExp (Hs.Tuple _ Hs.Unboxed xs) = UnboxedTupE (fmap toExp xs) toExp e@Hs.TupleSection{} = noTH "toExp" e- toExp (Hs.List xs) = ListE (fmap toExp xs)- toExp (Hs.Paren e) = ParensE (toExp e)- toExp (Hs.LeftSection e o) = InfixE (Just . toExp $ e) (toExp o) Nothing- toExp (Hs.RightSection o f) = InfixE Nothing (toExp o) (Just . toExp $ f)- toExp (Hs.RecConstr n xs) = RecConE (toName n) (fmap toFieldExp xs)- toExp (Hs.RecUpdate e xs) = RecUpdE (toExp e) (fmap toFieldExp xs)- toExp (Hs.EnumFrom e) = ArithSeqE $ FromR (toExp e)- toExp (Hs.EnumFromTo e f) = ArithSeqE $ FromToR (toExp e) (toExp f)- toExp (Hs.EnumFromThen e f) = ArithSeqE $ FromThenR (toExp e) (toExp f)- toExp (Hs.EnumFromThenTo e f g) = ArithSeqE $ FromThenToR (toExp e) (toExp f) (toExp g)- toExp (Hs.ListComp e ss) = CompE $ map convert ss ++ [NoBindS (toExp e)]+ toExp (Hs.List _ xs) = ListE (fmap toExp xs)+ toExp (Hs.Paren _ e) = ParensE (toExp e)+ toExp (Hs.LeftSection _ e o) = InfixE (Just . toExp $ e) (toExp o) Nothing+ toExp (Hs.RightSection _ o f) = InfixE Nothing (toExp o) (Just . toExp $ f)+ toExp (Hs.RecConstr _ n xs) = RecConE (toName n) (fmap toFieldExp xs)+ toExp (Hs.RecUpdate _ e xs) = RecUpdE (toExp e) (fmap toFieldExp xs)+ toExp (Hs.EnumFrom _ e) = ArithSeqE $ FromR (toExp e)+ toExp (Hs.EnumFromTo _ e f) = ArithSeqE $ FromToR (toExp e) (toExp f)+ toExp (Hs.EnumFromThen _ e f) = ArithSeqE $ FromThenR (toExp e) (toExp f)+ toExp (Hs.EnumFromThenTo _ e f g) = ArithSeqE $ FromThenToR (toExp e) (toExp f) (toExp g)+ toExp (Hs.ListComp _ e ss) = CompE $ map convert ss ++ [NoBindS (toExp e)] where- convert (Hs.QualStmt st) = toStmt st+ convert (Hs.QualStmt _ st) = toStmt st convert s = noTH "toExp ListComp" s toExp (Hs.ExpTypeSig _ e t) = SigE (toExp e) (toType t) toExp e = todo "toExp" e -toMatch :: Hs.Alt -> Match+toMatch :: Hs.Alt l -> Match toMatch (Hs.Alt _ p rhs ds) = Match (toPat p) (toBody rhs) (toDecs ds) -toBody :: Hs.Rhs -> Body-toBody (Hs.UnGuardedRhs e) = NormalB $ toExp e-toBody (Hs.GuardedRhss rhss) = GuardedB $ map toGuard rhss+toBody :: Hs.Rhs l -> Body+toBody (Hs.UnGuardedRhs _ e) = NormalB $ toExp e+toBody (Hs.GuardedRhss _ rhss) = GuardedB $ map toGuard rhss toGuard (Hs.GuardedRhs _ stmts e) = (g, toExp e) where@@ -271,7 +273,18 @@ [NoBindS x] -> NormalG x xs -> PatG xs +instance ToDecs a => ToDecs (Maybe a) where+ toDecs Nothing = []+ toDecs (Just a) = toDecs a +instance ToDecs (Hs.Binds l) where+ toDecs (Hs.BDecls _ ds) = toDecs ds+ toDecs a@(Hs.IPBinds {}) = noTH "ToDecs Hs.Binds" a++instance ToDecs (Hs.ClassDecl l) where+ toDecs (Hs.ClsDecl _ d) = toDecs d+ toDecs x = todo "classDecl" x+ ----------------------------------------------------------------------------- -- * ToLoc SrcLoc@@ -284,9 +297,9 @@ -- * ToType HsType -instance ToName Hs.TyVarBind where- toName (Hs.KindedVar n _) = toName n- toName (Hs.UnkindedVar n) = toName n+instance ToName (Hs.TyVarBind l) where+ toName (Hs.KindedVar _ n _) = toName n+ toName (Hs.UnkindedVar _ n) = toName n instance ToName Name where toName = id@@ -295,99 +308,109 @@ toName (PlainTV n) = n toName (KindedTV n _) = n -#if MIN_VERSION_template_haskell(2,8,0)--instance ToType Hs.Kind where- toType Hs.KindStar = StarT- toType (Hs.KindFn k1 k2) = toType k1 .->. toType k2- toType (Hs.KindParen kp) = toType kp-#if !MIN_VERSION_haskell_src_exts(1,17,0)- toType k@Hs.KindBang = noTH "toKind" k-#endif - toType (Hs.KindVar n) = VarT (toName n)+instance ToType (Hs.Kind l) where+ toType (Hs.KindStar _) = StarT+ toType (Hs.KindFn _ k1 k2) = toType k1 .->. toType k2+ toType (Hs.KindParen _ kp) = toType kp+ toType (Hs.KindVar _ n) = VarT (toName n) -toKind :: Hs.Kind -> Kind+toKind :: Hs.Kind l -> Kind toKind = toType -#else--toKind :: Hs.Kind -> Kind-toKind Hs.KindStar = StarK-toKind (Hs.KindFn k1 k2) = ArrowK (toKind k1) (toKind k2)-toKind (Hs.KindParen kp) = toKind kp-toKind k@Hs.KindBang = noTH "toKind" k-toKind k@Hs.KindVar{} = noTHyet "toKind" "2.8.0" k--#endif /* !MIN_VERSION_template_haskell(2,8,0) */--toTyVar :: Hs.TyVarBind -> TyVarBndr-toTyVar (Hs.KindedVar n k) = KindedTV (toName n) (toKind k)-toTyVar (Hs.UnkindedVar n) = PlainTV (toName n)+toTyVar :: Hs.TyVarBind l -> TyVarBndr+toTyVar (Hs.KindedVar _ n k) = KindedTV (toName n) (toKind k)+toTyVar (Hs.UnkindedVar _ n) = PlainTV (toName n) -instance ToType Hs.Type where- toType (Hs.TyForall tvbM cxt t) = ForallT (maybe [] (fmap toTyVar) tvbM) (toCxt cxt) (toType t)- toType (Hs.TyFun a b) = toType a .->. toType b- toType (Hs.TyList t) = ListT `AppT` toType t- toType (Hs.TyTuple b ts) = foldAppT (tuple . length $ ts) (fmap toType ts)+instance ToType (Hs.Type l) where+ toType (Hs.TyForall _ tvbM cxt t) = ForallT (maybe [] (fmap toTyVar) tvbM) (toCxt cxt) (toType t)+ toType (Hs.TyFun _ a b) = toType a .->. toType b+ toType (Hs.TyList _ t) = ListT `AppT` toType t+ toType (Hs.TyTuple _ b ts) = foldAppT (tuple . length $ ts) (fmap toType ts) where tuple = case b of Hs.Boxed -> TupleT Hs.Unboxed -> UnboxedTupleT- toType (Hs.TyApp a b) = AppT (toType a) (toType b)- toType (Hs.TyVar n) = VarT (toName n)- toType (Hs.TyCon qn) = ConT (toName qn)- toType (Hs.TyParen t) = toType t+ toType (Hs.TyApp _ a b) = AppT (toType a) (toType b)+ toType (Hs.TyVar _ n) = VarT (toName n)+ toType (Hs.TyCon _ qn) = ConT (toName qn)+ toType (Hs.TyParen _ t) = toType t -- XXX: need to wrap the name in parens!- toType (Hs.TyInfix a o b) = AppT (AppT (ConT (toName o)) (toType a)) (toType b)- toType (Hs.TyKind t k) = SigT (toType t) (toKind k)+ toType (Hs.TyInfix _ a o b) = AppT (AppT (ConT (toName o)) (toType a)) (toType b)+ toType (Hs.TyKind _ t k) = SigT (toType t) (toKind k) toType t@Hs.TyBang{} = nonsense "toType" "type cannot have strictness annotations in this context" t -toStrictType :: Hs.Type -> StrictType+toStrictType :: Hs.Type l -> StrictType+#if MIN_VERSION_haskell_src_exts(1,18,0) #if MIN_VERSION_template_haskell(2,11,0)-toStrictType (Hs.TyBang Hs.UnpackedTy t) = toStrictType2 SourceUnpack t+toStrictType (Hs.TyBang _ s u t) = (Bang (toUnpack u) (toStrict s), toType t)+ where+ toStrict (Hs.LazyTy _) = SourceLazy+ toStrict (Hs.BangedTy _) = SourceStrict+ toStrict (Hs.NoStrictAnnot _) = NoSourceStrictness+ toUnpack (Hs.Unpack _) = SourceUnpack+ toUnpack (Hs.NoUnpack _) = SourceNoUnpack+ toUnpack (Hs.NoUnpackPragma _) = NoSourceUnpackedness+#else+-- TyBang l (BangType l) (Unpackedness l) (Type l)+-- data BangType l = BangedTy l | LazyTy l | NoStrictAnnot l+-- data Unpackedness l = Unpack l | NoUnpack l | NoUnpackPragma l+toStrictType (Hs.TyBang _ b u t) = (toStrict b u, toType t)+ where+ toStrict :: Hs.BangType l -> Hs.Unpackedness l -> Strict+ toStrict (Hs.BangedTy _) _ = IsStrict+ toStrict _ (Hs.Unpack _) = Unpacked+ toStrict _ _ = NotStrict+#endif+#else+#if MIN_VERSION_template_haskell(2,11,0)+toStrictType (Hs.TyBang _ (Hs.UnpackedTy _) t) = toStrictType2 SourceUnpack t toStrictType t = toStrictType2 NoSourceUnpackedness t -toStrictType2 u t@(Hs.TyBang _ Hs.TyBang{}) =+toStrictType2 u t@(Hs.TyBang _ _ Hs.TyBang{}) = nonsense "toStrictType" "double strictness annotation" t-toStrictType2 u (Hs.TyBang Hs.BangedTy t) = (Bang u SourceStrict, toType t)-toStrictType2 u (Hs.TyBang Hs.UnpackedTy t) =+toStrictType2 u (Hs.TyBang _ (Hs.BangedTy _) t) = (Bang u SourceStrict, toType t)+toStrictType2 u (Hs.TyBang _ (Hs.UnpackedTy _) t) = nonsense "toStrictType" "double unpackedness annotation" t toStrictType2 u t = (Bang u NoSourceStrictness, toType t) #else /* !MIN_VERSION_template_haskell(2,11,0) */-toStrictType t@(Hs.TyBang _ Hs.TyBang{}) =+toStrictType t@(Hs.TyBang _ _ Hs.TyBang{}) = nonsense "toStrictType" "double strictness annotation" t-toStrictType (Hs.TyBang Hs.BangedTy t) = (IsStrict, toType t)-toStrictType (Hs.TyBang Hs.UnpackedTy t) = (Unpacked, toType t)+toStrictType (Hs.TyBang _ (Hs.BangedTy _) t) = (IsStrict, toType t)+toStrictType (Hs.TyBang _ (Hs.UnpackedTy _) t) = (Unpacked, toType t) toStrictType t = (NotStrict, toType t) #endif /* !MIN_VERSION_template_haskell(2,11,0) */+#endif (.->.) :: Type -> Type -> Type a .->. b = AppT (AppT ArrowT a) b -instance ToCxt Hs.Context where- toCxt = fmap toPred- where+instance ToPred (Hs.Asst l) where #if MIN_VERSION_template_haskell(2,10,0)- toPred (Hs.ClassA n ts) = foldl' AppT (ConT (toName n)) (fmap toType ts)- toPred (Hs.InfixA t1 n t2) = foldl' AppT (ConT (toName n)) (fmap toType [t1,t2])- toPred (Hs.EqualP t1 t2) = foldl' AppT EqualityT (fmap toType [t1,t2])+ toPred (Hs.ClassA _ n ts) = foldl' AppT (ConT (toName n)) (fmap toType ts)+ toPred (Hs.InfixA _ t1 n t2) = foldl' AppT (ConT (toName n)) (fmap toType [t1,t2])+ toPred (Hs.EqualP _ t1 t2) = foldl' AppT EqualityT (fmap toType [t1,t2]) #else- toPred (Hs.ClassA n ts) = ClassP (toName n) (fmap toType ts)- toPred (Hs.InfixA t1 n t2) = ClassP (toName n) (fmap toType [t1, t2])- toPred (Hs.EqualP t1 t2) = EqualP (toType t1) (toType t2)+ toPred (Hs.ClassA _ n ts) = ClassP (toName n) (fmap toType ts)+ toPred (Hs.InfixA _ t1 n t2) = ClassP (toName n) (fmap toType [t1, t2])+ toPred (Hs.EqualP _ t1 t2) = EqualP (toType t1) (toType t2) #endif toPred a@Hs.IParam{} = noTH "toCxt" a+ toPred p = todo "toPred" p #if MIN_VERSION_template_haskell(2,11,0)-instance ToCxt [Hs.Deriving] where- toCxt = fmap toPred- where- toPred (qn, ts) = foldl' AppT (ConT (toName qn)) (fmap toType ts)+instance ToCxt (Hs.Deriving l) where+ toCxt (Hs.Deriving _ rule) = toCxt rule+instance ToCxt [Hs.InstRule l] where+ toCxt = concatMap toCxt #endif +instance ToCxt a => ToCxt (Maybe a) where+ toCxt Nothing = []+ toCxt (Just a) = toCxt a+ foldAppT :: Type -> [Type] -> Type foldAppT t ts = foldl' AppT t ts @@ -395,10 +418,10 @@ -- * ToStmt HsStmt -instance ToStmt Hs.Stmt where+instance ToStmt (Hs.Stmt l) where toStmt (Hs.Generator _ p e) = BindS (toPat p) (toExp e)- toStmt (Hs.Qualifier e) = NoBindS (toExp e)- toStmt a@(Hs.LetStmt bnds) = LetS (toDecs bnds)+ toStmt (Hs.Qualifier _ e) = NoBindS (toExp e)+ toStmt a@(Hs.LetStmt _ bnds) = LetS (toDecs bnds) toStmt s@Hs.RecStmt{} = noTH "toStmt" s @@ -406,15 +429,15 @@ -- * ToDec HsDecl -instance ToDec Hs.Decl where- toDec (Hs.TypeDecl _ n ns t)- = TySynD (toName n) (fmap toTyVar ns) (toType t)+instance ToDec (Hs.Decl l) where+ toDec (Hs.TypeDecl _ h t)+ = TySynD (toName h) (toTyVars h) (toType t) - toDec a@(Hs.DataDecl _ dOrN cxt n ns qcds qns)+ toDec a@(Hs.DataDecl _ dOrN cxt h qcds qns) = case dOrN of- Hs.DataType -> DataD (toCxt cxt)- (toName n)- (fmap toTyVar ns)+ Hs.DataType _ -> DataD (toCxt cxt)+ (toName h)+ (toTyVars h) #if MIN_VERSION_template_haskell(2,11,0) Nothing #endif@@ -422,15 +445,15 @@ #if MIN_VERSION_template_haskell(2,11,0) (toCxt qns) #else- (fmap (toName . fst) qns)+ (toNames qns) #endif- Hs.NewType -> let qcd = case qcds of- [x] -> x- _ -> nonsense "toDec" ("newtype with " ++- "wrong number of constructors") a+ Hs.NewType _ -> let qcd = case qcds of+ [x] -> x+ _ -> nonsense "toDec" ("newtype with " +++ "wrong number of constructors") a in NewtypeD (toCxt cxt)- (toName n)- (fmap toTyVar ns)+ (toName h)+ (toTyVars h) #if MIN_VERSION_template_haskell(2,11,0) Nothing #endif@@ -438,18 +461,16 @@ #if MIN_VERSION_template_haskell(2,11,0) (toCxt qns) #else- (fmap (toName . fst) qns)+ (toNames qns) #endif - -- This type-signature conversion is just wrong. + -- This type-signature conversion is just wrong. -- Type variables need to be dealt with. /Jonas toDec a@(Hs.TypeSig _ ns t) -- XXXXXXXXXXXXXX: oh crap, we can't return a [Dec] from this class! = let xs = fmap (flip SigD (toType t) . toName) ns in case xs of x:_ -> x; [] -> error "toDec: malformed TypeSig!" -#if MIN_VERSION_template_haskell(2,8,0)- toDec (Hs.InlineConlikeSig _ act qn) = PragmaD $ InlineP (toName qn) Inline ConLike (transAct act) toDec (Hs.InlineSig _ b act qn) = PragmaD $@@ -457,124 +478,198 @@ where inline | b = Inline | otherwise = NoInline -#else-- toDec (Hs.InlineConlikeSig _ act id) = PragmaD $ - InlineP (toName id) (InlineSpec True True $ transAct act)- toDec (Hs.InlineSig _ b act id) = PragmaD $ - InlineP (toName id) (InlineSpec b False $ transAct act)--#endif /* MIN_VERSION_template_haskell(2,8,0) */- #if MIN_VERSION_template_haskell(2,11,0)- toDec (Hs.TypeFamDecl _ n ns k)- = OpenTypeFamilyD $ TypeFamilyHead (toName n)- (fmap toTyVar ns)+#if MIN_VERSION_haskell_src_exts(1,18,0)+ toDec (Hs.TypeFamDecl _ h sig inj)+ = OpenTypeFamilyD $ TypeFamilyHead (toName h)+ (toTyVars h)+ (maybe NoSig KindSig . toMaybeKind $ sig)+ (fmap toInjectivityAnn inj)+ toDec (Hs.DataFamDecl _ _ h sig)+ = DataFamilyD (toName h) (toTyVars h) (toMaybeKind sig)+#else+ toDec (Hs.TypeFamDecl _ h k)+ = OpenTypeFamilyD $ TypeFamilyHead (toName h)+ (toTyVars h) (maybe NoSig (KindSig . toKind) k) Nothing- -- TODO: do something with context?- toDec (Hs.DataFamDecl _ _ n ns k)- = DataFamilyD (toName n) (fmap toTyVar ns) (fmap toKind k)+ toDec (Hs.DataFamDecl _ _ h k)+ = DataFamilyD (toName h) (toTyVars h) (fmap toKind k)+#endif+ #else- toDec (Hs.TypeFamDecl _ n ns k)- = FamilyD TypeFam (toName n) (fmap toTyVar ns) (fmap toKind k)+#if MIN_VERSION_haskell_src_exts(1,18,0)+ toDec (Hs.TypeFamDecl _ h sig inj)+ = FamilyD TypeFam (toName h) (toTyVars h) (toMaybeKind sig)+ toDec (Hs.DataFamDecl _ _ h sig)+ = FamilyD DataFam (toName h) (toTyVars h) (toMaybeKind sig)+#else+ toDec (Hs.TypeFamDecl _ h k)+ = FamilyD TypeFam (toName h) (toTyVars h) (fmap toKind k) -- TODO: do something with context?- toDec (Hs.DataFamDecl _ _ n ns k)- = FamilyD DataFam (toName n) (fmap toTyVar ns) (fmap toKind k)+ toDec (Hs.DataFamDecl _ _ h k)+ = FamilyD DataFam (toName h) (toTyVars h) (fmap toKind k)+#endif #endif /* MIN_VERSION_template_haskell(2,11,0) */ - toDec a@(Hs.FunBind mtchs) = hsMatchesToFunD mtchs+ toDec a@(Hs.FunBind _ mtchs) = hsMatchesToFunD mtchs toDec (Hs.PatBind _ p rhs bnds) = ValD (toPat p) (hsRhsToBody rhs) (toDecs bnds) - toDec i@(Hs.InstDecl _ (Just overlap) _ _ _ _ _) =- noTH "toDec" (overlap, i)+ toDec i@(Hs.InstDecl _ (Just overlap) _ _) =+ noTH "toDec" (fmap (const ()) overlap, i) -- the 'vars' bit seems to be for: instance forall a. C (T a) where ... -- TH's own parser seems to flat-out ignore them, and honestly I can't see -- that it's obviously wrong to do so. #if MIN_VERSION_template_haskell(2,11,0)- toDec (Hs.InstDecl _ Nothing _vars cxt qname ts ids) = InstanceD + toDec (Hs.InstDecl _ Nothing irule ids) = InstanceD Nothing- (toCxt cxt) - (foldl AppT (ConT (toName qname)) (map toType ts))+ (toCxt irule)+ (toType irule) (toDecs ids) #else- toDec (Hs.InstDecl _ Nothing _vars cxt qname ts ids) = InstanceD - (toCxt cxt) - (foldl AppT (ConT (toName qname)) (map toType ts))+ toDec (Hs.InstDecl _ Nothing irule ids) = InstanceD+ (toCxt irule)+ (toType irule) (toDecs ids) #endif - toDec (Hs.ClassDecl _ cxt name ts fds decls) = ClassD+ toDec (Hs.ClassDecl _ cxt h fds decls) = ClassD (toCxt cxt)- (toName name)- (fmap toTyVar ts)+ (toName h)+ (toTyVars h) (fmap toFunDep fds)- (fmap classDeclToDec decls)+ (toDecs decls) where- classDeclToDec cd = case cd of- (Hs.ClsDecl d) -> toDec d- x -> todo "classDecl" x- toFunDep (Hs.FunDep ls rs) = FunDep (fmap toName ls) (fmap toName rs)+ toFunDep (Hs.FunDep _ ls rs) = FunDep (fmap toName ls) (fmap toName rs) toDec x = todo "toDec" x -#if MIN_VERSION_template_haskell(2,8,0)-transAct :: Hs.Activation -> Phases-transAct Hs.AlwaysActive = AllPhases-transAct (Hs.ActiveFrom n) = FromPhase n-transAct (Hs.ActiveUntil n) = BeforePhase n-#else-transAct act = case act of- Hs.AlwaysActive -> Nothing- Hs.ActiveFrom n -> Just (True,n)- Hs.ActiveUntil n -> Just (False,n)+#if MIN_VERSION_haskell_src_exts(1,18,0)+instance ToMaybeKind (Hs.ResultSig l) where+ toMaybeKind (Hs.KindSig _ k) = Just $ toKind k+ toMaybeKind (Hs.TyVarSig _ _) = Nothing++instance ToMaybeKind a => ToMaybeKind (Maybe a) where+ toMaybeKind Nothing = Nothing+ toMaybeKind (Just a) = toMaybeKind a++#if MIN_VERSION_template_haskell(2,11,0)+instance ToInjectivityAnn (Hs.InjectivityInfo l) where+ toInjectivityAnn (Hs.InjectivityInfo _ n ns) = InjectivityAnn (toName n) (fmap toName ns) #endif+#endif +transAct :: Maybe (Hs.Activation l) -> Phases+transAct Nothing = AllPhases+transAct (Just (Hs.ActiveFrom _ n)) = FromPhase n+transAct (Just (Hs.ActiveUntil _ n)) = BeforePhase n -qualConDeclToCon :: Hs.QualConDecl -> Con-qualConDeclToCon (Hs.QualConDecl _ [] [] cdecl) = conDeclToCon cdecl-qualConDeclToCon (Hs.QualConDecl _ ns cxt cdecl) = ForallC (fmap toTyVar ns)+instance ToName (Hs.DeclHead l) where+ toName (Hs.DHead _ n) = toName n+ toName (Hs.DHInfix _ _ n) = toName n+ toName (Hs.DHParen _ h) = toName h+ toName (Hs.DHApp _ h _) = toName h++instance ToTyVars (Hs.DeclHead l) where+ toTyVars (Hs.DHead _ _) = []+ toTyVars (Hs.DHParen _ h) = toTyVars h+ toTyVars (Hs.DHInfix _ tvb _) = [toTyVar tvb]+ toTyVars (Hs.DHApp _ h tvb) = toTyVars h ++ [toTyVar tvb]++instance ToNames a => ToNames (Maybe a) where+ toNames Nothing = []+ toNames (Just a) = toNames a++instance ToNames (Hs.Deriving l) where+ toNames (Hs.Deriving _ irules) = concatMap toNames irules+instance ToNames (Hs.InstRule l) where+ toNames (Hs.IParen _ irule) = toNames irule+ toNames (Hs.IRule _ _mtvbs _mcxt mihd) = toNames mihd+instance ToNames (Hs.InstHead l) where+ toNames (Hs.IHCon _ n) = [toName n]+ toNames (Hs.IHInfix _ _ n) = [toName n]+ toNames (Hs.IHParen _ h) = toNames h+ toNames (Hs.IHApp _ h _) = toNames h++instance ToCxt (Hs.InstRule l) where+ toCxt (Hs.IRule _ _ cxt _) = toCxt cxt+ toCxt (Hs.IParen _ irule) = toCxt irule++instance ToCxt (Hs.Context l) where+ toCxt x = case x of+ Hs.CxEmpty _ -> []+ Hs.CxSingle _ x' -> [toPred x']+ Hs.CxTuple _ xs -> fmap toPred xs++instance ToType (Hs.InstRule l) where+ toType (Hs.IRule _ _ _ h) = toType h+ toType (Hs.IParen _ irule) = toType irule++instance ToType (Hs.InstHead l) where+ toType (Hs.IHCon _ qn) = toType qn+ toType (Hs.IHInfix _ typ qn) = AppT (toType typ) (toType qn)+ toType (Hs.IHParen _ hd) = toType hd+ toType (Hs.IHApp _ hd typ) = AppT (toType hd) (toType typ)++qualConDeclToCon :: Hs.QualConDecl l -> Con+qualConDeclToCon (Hs.QualConDecl _ Nothing Nothing cdecl) = conDeclToCon cdecl+qualConDeclToCon (Hs.QualConDecl _ ns cxt cdecl) = ForallC (toTyVars ns) (toCxt cxt) (conDeclToCon cdecl)-conDeclToCon :: Hs.ConDecl -> Con-conDeclToCon (Hs.ConDecl n tys)++instance ToTyVars a => ToTyVars (Maybe a) where+ toTyVars Nothing = []+ toTyVars (Just a) = toTyVars a++instance ToTyVars a => ToTyVars [a] where+ toTyVars = concatMap toTyVars++instance ToTyVars (Hs.TyVarBind l) where+ toTyVars tvb = [toTyVar tvb]++instance ToType (Hs.QName l) where+ toType = ConT . toName++conDeclToCon :: Hs.ConDecl l -> Con+conDeclToCon (Hs.ConDecl _ n tys) = NormalC (toName n) (map toStrictType tys)-conDeclToCon (Hs.RecDecl n fieldDecls)+conDeclToCon (Hs.RecDecl _ n fieldDecls) = RecC (toName n) (concatMap convField fieldDecls) where- convField (fields, t) =+ convField :: Hs.FieldDecl l -> [VarStrictType]+ convField (Hs.FieldDecl _ ns t) = let (strict, ty) = toStrictType t- in map (\field -> (toName field, strict, ty)) fields+ in map (\n' -> (toName n', strict, ty)) ns -hsMatchesToFunD :: [Hs.Match] -> Dec+hsMatchesToFunD :: [Hs.Match l] -> Dec hsMatchesToFunD [] = FunD (mkName []) [] -- errorish-hsMatchesToFunD xs@(Hs.Match _ n _ _ _ _:_) = FunD (toName n) (fmap hsMatchToClause xs)+hsMatchesToFunD xs@(Hs.Match _ n _ _ _ : _) = FunD (toName n) (fmap hsMatchToClause xs) -hsMatchToClause :: Hs.Match -> Clause-hsMatchToClause (Hs.Match _ _ ps _ rhs bnds) = Clause+hsMatchToClause :: Hs.Match l -> Clause+hsMatchToClause (Hs.Match _ _ ps rhs bnds) = Clause (fmap toPat ps) (hsRhsToBody rhs) (toDecs bnds) -hsRhsToBody :: Hs.Rhs -> Body-hsRhsToBody (Hs.UnGuardedRhs e) = NormalB (toExp e)-hsRhsToBody (Hs.GuardedRhss hsgrhs) = let fromGuardedB (GuardedB a) = a+hsRhsToBody :: Hs.Rhs l -> Body+hsRhsToBody (Hs.UnGuardedRhs _ e) = NormalB (toExp e)+hsRhsToBody (Hs.GuardedRhss _ hsgrhs) = let fromGuardedB (GuardedB a) = a in GuardedB . concat . fmap (fromGuardedB . hsGuardedRhsToBody) $ hsgrhs -hsGuardedRhsToBody :: Hs.GuardedRhs -> Body+hsGuardedRhsToBody :: Hs.GuardedRhs l -> Body hsGuardedRhsToBody (Hs.GuardedRhs _ [] e) = NormalB (toExp e) hsGuardedRhsToBody (Hs.GuardedRhs _ [s] e) = GuardedB [(hsStmtToGuard s, toExp e)] hsGuardedRhsToBody (Hs.GuardedRhs _ ss e) = let ss' = fmap hsStmtToGuard ss@@ -587,35 +682,35 @@ -hsStmtToGuard :: Hs.Stmt -> Guard+hsStmtToGuard :: Hs.Stmt l -> Guard hsStmtToGuard (Hs.Generator _ p e) = PatG [BindS (toPat p) (toExp e)]-hsStmtToGuard (Hs.Qualifier e) = NormalG (toExp e)-hsStmtToGuard (Hs.LetStmt bs) = PatG [LetS (toDecs bs)]+hsStmtToGuard (Hs.Qualifier _ e) = NormalG (toExp e)+hsStmtToGuard (Hs.LetStmt _ bs) = PatG [LetS (toDecs bs)] ----------------------------------------------------------------------------- -- * ToDecs InstDecl-instance ToDecs Hs.InstDecl where- toDecs (Hs.InsDecl decl) = toDecs decl+instance ToDecs (Hs.InstDecl l) where+ toDecs (Hs.InsDecl _ decl) = toDecs decl toDecs d = todo "toDec" d -- * ToDecs HsDecl HsBinds -instance ToDecs Hs.Decl where+instance ToDecs (Hs.Decl l) where toDecs a@(Hs.TypeSig _ ns t) = let xs = fmap (flip SigD (fixForall $ toType t) . toName) ns in xs -#if MIN_VERSION_template_haskell(2,8,0)- toDecs (Hs.InfixDecl _ assoc fixity ops) =+ toDecs (Hs.InfixDecl l assoc Nothing ops) =+ toDecs (Hs.InfixDecl l assoc (Just 9) ops)+ toDecs (Hs.InfixDecl _ assoc (Just fixity) ops) = map (\op -> InfixD (Fixity fixity dir) (toName op)) ops where dir = case assoc of- Hs.AssocNone -> InfixN- Hs.AssocLeft -> InfixL- Hs.AssocRight -> InfixR-#endif+ Hs.AssocNone _ -> InfixN+ Hs.AssocLeft _ -> InfixL+ Hs.AssocRight _ -> InfixR toDecs a = [toDec a] @@ -632,14 +727,5 @@ instance ToDecs a => ToDecs [a] where toDecs a = concatMap toDecs a--instance ToDecs Hs.Binds where- toDecs (Hs.BDecls ds) = toDecs ds- toDecs a@(Hs.IPBinds {}) = noTH "ToDecs Hs.Binds" a--instance ToDecs (Maybe Hs.Binds) where- toDecs Nothing = []- toDecs (Just (Hs.BDecls ds)) = toDecs ds- -----------------------------------------------------------------------------
src/Language/Haskell/TH/Instances/Lift.hs view
@@ -7,7 +7,7 @@ Portability : portable (template-haskell) This module is exported for backwards-compatibility purposes.- All it does is re-export the instances defined in + All it does is re-export the instances defined in "Language.Haskell.TH.Instances", from the th-orphans package. -} module Language.Haskell.TH.Instances.Lift