packages feed

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]
  }