fficxx-0.7.0.0: src/FFICXX/Generate/Type/Module.hs
module FFICXX.Generate.Type.Module where
--
import FFICXX.Generate.Type.Cabal (AddCInc, AddCSrc)
import FFICXX.Generate.Type.Class (Class, TemplateClass, TopLevel)
import FFICXX.Runtime.CodeGen.Cxx (HeaderName (..), Namespace (..))
--
-- Import/Header
--
-- HPkg is generated C++ headers by fficxx, CPkg is original C++ headers
data ClassImportHeader = ClassImportHeader
{ cihClass :: Class,
-- | fficxx-side main header
cihSelfHeader :: HeaderName,
cihNamespace :: [Namespace],
cihSelfCpp :: String,
-- | Dependencies TODO: clarify this.
cihImportedClasses :: [Either TemplateClass Class],
cihIncludedHPkgHeadersInH :: [HeaderName], -- TODO: Explain why we need to have these two
cihIncludedHPkgHeadersInCPP :: [HeaderName], -- separately.
-- | C++-side headers
cihIncludedCPkgHeaders :: [HeaderName]
}
deriving (Show)
--
-- Submodule
--
data ClassSubmoduleType
= CSTRawType
| CSTInterface
| CSTImplementation
| CSTFFI
| CSTCast
deriving (Show)
data TemplateClassSubmoduleType
= TCSTTH
| TCSTTemplate
deriving (Show)
-- | UClass = Unified Class, either template class or ordinary class
type UClass = Either TemplateClass Class
type UClassSubmodule =
Either (TemplateClassSubmoduleType, TemplateClass) (ClassSubmoduleType, Class)
-- | Dependency cycle information. Currently just a string
-- self, former, latter
type DepCycles = [[(String, ([String], [String]))]]
--
-- Module
--
data ClassModule = ClassModule
{ cmModule :: String,
cmCIH :: ClassImportHeader,
-- | imported submodules for Interface.hs
cmImportedSubmodulesForInterface :: [UClassSubmodule],
-- | imported submodules for FFI.hs
cmImportedSubmodulesForFFI :: [UClassSubmodule],
-- | imported submodules for Cast.hs
cmImportedSubmodulesForCast,
-- imported submodules for Implementation.hs
cmImportedSubmodulesForImplementation ::
[UClassSubmodule],
cmExtraImport :: [String]
}
deriving (Show)
data TemplateClassModule = TCM
{ tcmModule :: String,
tcmTCIH :: TemplateClassImportHeader
}
deriving (Show)
data TemplateClassImportHeader = TCIH
{ tcihTClass :: TemplateClass,
-- | C++-side headers
tcihCxxHeaders :: [HeaderName]
}
deriving (Show)
data TopLevelImportHeader = TopLevelImportHeader
{ tihHeaderFileName :: String,
tihClassDep :: [ClassImportHeader],
-- | Extra class dependencies outside current package.
-- NOTE: we cannot fully construct ClassImportHeader for them.
tihExtraClassDep :: [Either TemplateClass Class],
tihFuncs :: [TopLevel],
tihNamespaces :: [Namespace],
tihExtraHeadersInH :: [HeaderName],
tihExtraHeadersInCPP :: [HeaderName]
}
deriving (Show)
--
-- Package-level
--
data PackageConfig = PkgConfig
{ pcfg_classModules :: [ClassModule],
pcfg_classImportHeaders :: [ClassImportHeader],
pcfg_topLevelImportHeader :: TopLevelImportHeader,
pcfg_templateClassModules :: [TemplateClassModule],
pcfg_templateClassImportHeaders :: [TemplateClassImportHeader],
pcfg_additional_c_incs :: [AddCInc],
pcfg_additional_c_srcs :: [AddCSrc]
}