{-# LANGUAGE DuplicateRecordFields #-} module IR.Pure where import Data.Word import qualified IR.Common as C import qualified IR.Name as Name data File = File { fileId :: !Word64 , fileName :: FilePath , decls :: [Decl] , reExportEnums :: [Name.LocalQ] -- ^ A list of enums that we should re-export from this module. , usesRpc :: !Bool -- ^ Whether or not the module uses rpc features. If not, we skip -- the rpc related imports. This is mainly important to avoid a -- cyclic dependency with rpc.capnp. } data Decl = DataDecl Data | ConstDecl Constant | IFaceDecl Interface data Data = Data { typeName :: Name.LocalQ , firstClass :: !Bool -- ^ Whether this is a "first class" type, i.e. it is a type in the -- capnproto sense, rather than an auxiliary type defined for a group -- or an anonymous union. -- -- Note that this *can* be set for unions, if they subsume the whole -- struct, since in that case we collapse the two types in the -- high-level API. , cerialName :: Name.LocalQ -- ^ The name of the type our 'Cerial' should be. This will only be -- different from typeName if we're an anonymous union in a struct -- that also has other fields; in this case our Cerial should be -- the same as our parent struct. , def :: DataDef } data DataDef = Sum [Variant] | Product [Field] data Constant = Constant { name :: Name.LocalQ , value :: C.Value Name.CapnpQ } data Interface = IFace { name :: Name.CapnpQ , interfaceId :: !Word64 , methods :: [Method] , supers :: [Interface] , ancestors :: [Interface] } -- TODO(cleanup): this same type exists in IR.Flat; it doesn't make sense for -- IR.Common, but we should factor this out. data Method = Method { name :: Name.UnQ , paramType :: Name.CapnpQ , resultType :: Name.CapnpQ } data Field = Field { name :: Name.UnQ -- ^ The name of the field. , type_ :: C.Type Name.CapnpQ -- ^ The type of the field. } data Variant = Variant { name :: Name.LocalQ , arg :: Maybe (C.Type Name.CapnpQ) }