paragon-0.1.22: src/Language/Java/Paragon/QuasiQuoter/Lift.hs
{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Language.Java.Paragon.QuasiQuoter.Lift where
import qualified Language.Haskell.TH as TH
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Lift
--import Language.Haskell.TH.Lib
import Language.Java.Paragon.Syntax
import Language.Java.Paragon.QuasiQuoter.Derive
import Data.Generics (extQ)
import Data.Data
instance Lift Double where
lift d = let s = show d
cs = lift s
in [|(read $cs)::Double|]
-- Anti-quoting
antiQ :: Data b => b -> Maybe (TH.Q TH.Exp)
antiQ = const Nothing
`extQ` (antiCaseExp :: Exp () -> Maybe (TH.Q TH.Exp))
`extQ` (antiCaseType :: Type () -> Maybe (TH.Q TH.Exp))
`extQ` (antiCaseName :: Name () -> Maybe (TH.Q TH.Exp))
`extQ` (antiCaseIdent :: Ident () -> Maybe (TH.Q TH.Exp))
-- Idents
instance (Data a, Lift a) => Lift (Ident a) where
lift = dataToExpQ antiQ
antiCaseIdent :: Ident a -> Maybe (TH.Q TH.Exp)
antiCaseIdent (AntiQIdent _ s) = Just $ TH.varE $ TH.mkName s
antiCaseIdent _ = Nothing
-- Names
instance (Data a, Lift a) => Lift (Name a) where
lift = dataToExpQ antiQ
antiCaseName :: Name a -> Maybe (TH.Q TH.Exp)
antiCaseName (AntiQName _ s) = Just $ TH.varE $ TH.mkName s
antiCaseName _ = Nothing
-- Types
instance (Data a, Lift a) => Lift (Type a) where
lift = dataToExpQ antiQ
antiCaseType :: Type a -> Maybe (TH.Q TH.Exp)
antiCaseType (AntiQType _ s) = Just $ TH.varE $ TH.mkName s
antiCaseType _ = Nothing
-- Exps
instance (Data a, Lift a) => Lift (Exp a) where
lift = dataToExpQ antiQ
antiCaseExp :: Exp a -> Maybe (TH.Q TH.Exp)
antiCaseExp (AntiQExp _ s) = Just $ TH.varE $ TH.mkName s
antiCaseExp _ = Nothing
{-
deriveLiftAll :: [TH.Name] -> TH.Q [TH.Dec]
deriveLiftAll ns = do
is <- mapM (addDataCx <=< TH.reify) ns
deriveLiftMany' is
addDataCx :: TH.Info -> TH.Q TH.Info
addDataCx i =
case i of
TH.TyConI (TH.DataD dcx n vsk cons _) -> do
dp <- dataPred $ head vsk
return $ TH.TyConI (TH.DataD (dp:dcx) n vsk cons [])
TH.TyConI (TH.NewtypeD dcx n vsk con _) -> do
dp <- dataPred $ head vsk
return $ TH.TyConI (TH.NewtypeD (dp:dcx) n vsk con [])
_ -> error $ "Unhandled Dec: " ++ show i
where dataPred (TH.PlainTV n) = TH.classP ''Data [TH.varT n]
-}
$(deriveLiftAll [''Literal,''ClassType,''TypeArgument,
''ClassBody,''ArrayInit,''MethodInvocation,''Op,
''AssignOp,''PolicyExp,''Lhs,''RefType,
''ArrayIndex,''FieldAccess,''NonWildTypeArgument,
''WildcardBound,''Decl,''VarInit,
''Clause, ''LClause,
''PrimType,
''Atom,
''Actor,
''ActorName,
''Lock,
''Block,
''MemberDecl,
''MethodBody,
''FormalParam,
''ExceptionSpec,
''ConstructorBody,
''InterfaceDecl,
''BlockStmt,
''Modifier,
''LockProperties,
''ClassDecl,
''TypeParam,
''VarDecl,
''InterfaceBody,
''VarDeclId,
''ExplConstrInv,
''Stmt,
''ImportDecl,
''EnumConstant, ''ForInit, ''SwitchBlock, ''Catch,
''SwitchLabel, ''EnumBody])