module Language.Haskell.HSX.QQ
( hsx
)
where
import qualified Language.Haskell.Exts.Syntax as Hs
import Language.Haskell.Exts hiding (Exp, parse, parseExp)
import Language.Haskell.HSX.Transform (transformExp)
import Language.Haskell.Meta.Parse hiding (parseHsExp, parseExp)
import Language.Haskell.Meta.Syntax.Translate (toExp)
import Language.Haskell.TH (Exp, ExpQ)
import Language.Haskell.TH.Quote (QuasiQuoter(..))
hsx :: QuasiQuoter
hsx = QuasiQuoter { quoteExp = parseHsxExp
, quotePat = error "the hsx QuasiQuoter can only be used on expressions."
, quoteType = error "the hsx QuasiQuoter can only be used on expressions."
, quoteDec = error "the hsx QuasiQuoter can only be used on expressions."
}
parseHsxExp :: String -> ExpQ
parseHsxExp = either (error . show) (return . toExp . transformExp) . parseHsExp
parseExp :: String -> Either String Exp
parseExp = either Left (Right . toExp . transformExp) . parseHsExp
parseHsExp :: String -> Either String Hs.Exp
parseHsExp = either Left (Right . transformExp) . parseResultToEither . parseExpWithMode parseMode
parseMode :: ParseMode
parseMode = ParseMode "" Haskell2010 allExtensions False True (Just baseFixities)
allExtensions :: [Extension]
allExtensions = map EnableExtension
[RecursiveDo,ParallelListComp,MultiParamTypeClasses,FunctionalDependencies,RankNTypes,ExistentialQuantification,
ScopedTypeVariables,ImplicitParams,FlexibleContexts,FlexibleInstances,EmptyDataDecls,KindSignatures,
BangPatterns,TemplateHaskell,ForeignFunctionInterface,Arrows,Generics,NamedFieldPuns,PatternGuards,
MagicHash,TypeFamilies,StandaloneDeriving,TypeOperators,RecordWildCards,GADTs,UnboxedTuples,
PackageImports,QuasiQuotes,TransformListComp,ViewPatterns,XmlSyntax,RegularPatterns]