module Foreign.Hoppy.Generator.Spec.Variable (
Variable,
makeVariable,
varExtName,
varIdentifier,
varType,
varReqs,
varAddendum,
varIsConst,
varGetterExtName,
varSetterExtName,
) where
import Data.Function (on)
import Foreign.Hoppy.Generator.Spec.Base
import qualified Foreign.Hoppy.Generator.Spec.Class as Class
import qualified Foreign.Hoppy.Generator.Language.Cpp as LC
import qualified Foreign.Hoppy.Generator.Language.Haskell as LH
data Variable = Variable
{ Variable -> Identifier
varIdentifier :: Identifier
, Variable -> ExtName
varExtName :: ExtName
, Variable -> Type
varType :: Type
, Variable -> Reqs
varReqs :: Reqs
, Variable -> Addendum
varAddendum :: Addendum
}
instance Eq Variable where
== :: Variable -> Variable -> Bool
(==) = ExtName -> ExtName -> Bool
forall a. Eq a => a -> a -> Bool
(==) (ExtName -> ExtName -> Bool)
-> (Variable -> ExtName) -> Variable -> Variable -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` Variable -> ExtName
varExtName
instance Show Variable where
show :: Variable -> String
show Variable
v = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String
"<Variable ", ExtName -> String
forall a. Show a => a -> String
show (Variable -> ExtName
varExtName Variable
v), String
" ", Type -> String
forall a. Show a => a -> String
show (Variable -> Type
varType Variable
v), String
">"]
instance Exportable Variable where
sayExportCpp :: SayExportMode -> Variable -> Generator ()
sayExportCpp = SayExportMode -> Variable -> Generator ()
sayCppExport
sayExportHaskell :: SayExportMode -> Variable -> Generator ()
sayExportHaskell = SayExportMode -> Variable -> Generator ()
sayHsExport
instance HasExtNames Variable where
getPrimaryExtName :: Variable -> ExtName
getPrimaryExtName = Variable -> ExtName
varExtName
getNestedExtNames :: Variable -> [ExtName]
getNestedExtNames Variable
v = [Variable -> ExtName
varGetterExtName Variable
v, Variable -> ExtName
varSetterExtName Variable
v]
instance HasReqs Variable where
getReqs :: Variable -> Reqs
getReqs = Variable -> Reqs
varReqs
setReqs :: Reqs -> Variable -> Variable
setReqs Reqs
reqs Variable
v = Variable
v { varReqs :: Reqs
varReqs = Reqs
reqs }
instance HasAddendum Variable where
getAddendum :: Variable -> Addendum
getAddendum = Variable -> Addendum
varAddendum
setAddendum :: Addendum -> Variable -> Variable
setAddendum Addendum
addendum Variable
v = Variable
v { varAddendum :: Addendum
varAddendum = Addendum
addendum }
makeVariable :: Identifier -> Maybe ExtName -> Type -> Variable
makeVariable :: Identifier -> Maybe ExtName -> Type -> Variable
makeVariable Identifier
identifier Maybe ExtName
maybeExtName Type
t =
Identifier -> ExtName -> Type -> Reqs -> Addendum -> Variable
Variable Identifier
identifier (HasCallStack => Identifier -> Maybe ExtName -> ExtName
Identifier -> Maybe ExtName -> ExtName
extNameOrIdentifier Identifier
identifier Maybe ExtName
maybeExtName) Type
t Reqs
forall a. Monoid a => a
mempty Addendum
forall a. Monoid a => a
mempty
varIsConst :: Variable -> Bool
varIsConst :: Variable -> Bool
varIsConst Variable
v = case Variable -> Type
varType Variable
v of
Internal_TConst Type
_ -> Bool
True
Type
_ -> Bool
False
varGetterExtName :: Variable -> ExtName
varGetterExtName :: Variable -> ExtName
varGetterExtName = HasCallStack => String -> ExtName
String -> ExtName
toExtName (String -> ExtName) -> (Variable -> String) -> Variable -> ExtName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"_get") ShowS -> (Variable -> String) -> Variable -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExtName -> String
fromExtName (ExtName -> String) -> (Variable -> ExtName) -> Variable -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Variable -> ExtName
varExtName
varSetterExtName :: Variable -> ExtName
varSetterExtName :: Variable -> ExtName
varSetterExtName = HasCallStack => String -> ExtName
String -> ExtName
toExtName (String -> ExtName) -> (Variable -> String) -> Variable -> ExtName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"_set") ShowS -> (Variable -> String) -> Variable -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExtName -> String
fromExtName (ExtName -> String) -> (Variable -> ExtName) -> Variable -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Variable -> ExtName
varExtName
sayCppExport :: LC.SayExportMode -> Variable -> LC.Generator ()
sayCppExport :: SayExportMode -> Variable -> Generator ()
sayCppExport SayExportMode
mode Variable
v = case SayExportMode
mode of
SayExportMode
LC.SayHeader -> () -> Generator ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
SayExportMode
LC.SaySource ->
Type
-> Maybe (Type, Type)
-> Bool
-> ExtName
-> ExtName
-> Generator ()
-> Generator ()
Class.sayCppExportVar (Variable -> Type
varType Variable
v)
Maybe (Type, Type)
forall a. Maybe a
Nothing
Bool
True
(Variable -> ExtName
varGetterExtName Variable
v)
(Variable -> ExtName
varSetterExtName Variable
v)
(Identifier -> Generator ()
forall (m :: * -> *). MonadWriter [Chunk] m => Identifier -> m ()
LC.sayIdentifier (Identifier -> Generator ()) -> Identifier -> Generator ()
forall a b. (a -> b) -> a -> b
$ Variable -> Identifier
varIdentifier Variable
v)
sayHsExport :: LH.SayExportMode -> Variable -> LH.Generator ()
sayHsExport :: SayExportMode -> Variable -> Generator ()
sayHsExport SayExportMode
mode Variable
v = String -> Generator () -> Generator ()
forall a. String -> Generator a -> Generator a
LH.withErrorContext (String
"generating variable " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ExtName -> String
forall a. Show a => a -> String
show (Variable -> ExtName
varExtName Variable
v)) (Generator () -> Generator ()) -> Generator () -> Generator ()
forall a b. (a -> b) -> a -> b
$ do
let getterName :: ExtName
getterName = Variable -> ExtName
varGetterExtName Variable
v
setterName :: ExtName
setterName = Variable -> ExtName
varSetterExtName Variable
v
SayExportMode
-> Type
-> Maybe Class
-> Bool
-> ExtName
-> ExtName
-> ExtName
-> ExtName
-> Generator ()
Class.sayHsExportVar SayExportMode
mode
(Variable -> Type
varType Variable
v)
Maybe Class
forall a. Maybe a
Nothing
Bool
True
ExtName
getterName
ExtName
getterName
ExtName
setterName
ExtName
setterName