msh-0.1.0.2: Language/MSH/CodeGen/Interop.hs
module Language.MSH.CodeGen.Interop (
parseType,
parseDecs,
parseExp
) where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import qualified Language.Haskell.Exts.Syntax as Syntax
import qualified Language.Haskell.Exts.Parser as Exts
import Language.Haskell.Exts.Extension
import Language.Haskell.Meta.Syntax.Translate (toType, toDecs, toExp)
{-
Utility functions to parse and convert Haskell syntax
-}
-- | Haskell language extensions we want to allow
extensions = map EnableExtension [GADTs,
TypeFamilies,
RankNTypes,
FunctionalDependencies,
ScopedTypeVariables,
MultiParamTypeClasses,
FlexibleInstances,
FlexibleContexts,
TypeOperators,
LambdaCase]
-- | Configuration for the Haskell parser
parseMode = Exts.ParseMode "" Haskell2010 extensions True True Nothing
-- | Parses a string into a TH type
parseType :: String -> Type
parseType = toType . Exts.fromParseResult . Exts.parseTypeWithMode parseMode
parseDecs :: String -> [Dec]
parseDecs xs = let (Syntax.Module _ _ _ _ _ _ ds) = Exts.fromParseResult $ Exts.parseModuleWithMode parseMode xs in toDecs ds
parseExp :: String -> Exp
parseExp = toExp . Exts.fromParseResult . Exts.parseExpWithMode parseMode