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
{ varIdentifier :: Identifier
, varExtName :: ExtName
, varType :: Type
, varReqs :: Reqs
, varAddendum :: Addendum
}
instance Eq Variable where
(==) = (==) `on` varExtName
instance Show Variable where
show v = concat ["<Variable ", show (varExtName v), " ", show (varType v), ">"]
instance Exportable Variable where
sayExportCpp = sayCppExport
sayExportHaskell = sayHsExport
instance HasExtNames Variable where
getPrimaryExtName = varExtName
getNestedExtNames v = [varGetterExtName v, varSetterExtName v]
instance HasReqs Variable where
getReqs = varReqs
setReqs reqs v = v { varReqs = reqs }
instance HasAddendum Variable where
getAddendum = varAddendum
setAddendum addendum v = v { varAddendum = addendum }
makeVariable :: Identifier -> Maybe ExtName -> Type -> Variable
makeVariable identifier maybeExtName t =
Variable identifier (extNameOrIdentifier identifier maybeExtName) t mempty mempty
varIsConst :: Variable -> Bool
varIsConst v = case varType v of
Internal_TConst _ -> True
_ -> False
varGetterExtName :: Variable -> ExtName
varGetterExtName = toExtName . (++ "_get") . fromExtName . varExtName
varSetterExtName :: Variable -> ExtName
varSetterExtName = toExtName . (++ "_set") . fromExtName . varExtName
sayCppExport :: LC.SayExportMode -> Variable -> LC.Generator ()
sayCppExport mode v = case mode of
LC.SayHeader -> return ()
LC.SaySource ->
Class.sayCppExportVar (varType v)
Nothing
True
(varGetterExtName v)
(varSetterExtName v)
(LC.sayIdentifier $ varIdentifier v)
sayHsExport :: LH.SayExportMode -> Variable -> LH.Generator ()
sayHsExport mode v = LH.withErrorContext ("generating variable " ++ show (varExtName v)) $ do
let getterName = varGetterExtName v
setterName = varSetterExtName v
Class.sayHsExportVar mode
(varType v)
Nothing
True
getterName
getterName
setterName
setterName