capnp-0.17.0.0: cmd/capnpc-haskell/IR/AbstractOp.hs
{-# LANGUAGE DuplicateRecordFields #-}
module IR.AbstractOp where
import qualified Capnp.Repr as R
import Data.Word
import qualified IR.Common as C
import qualified IR.Name as Name
type Brand = C.ListBrand Name.CapnpQ
data File = File
{ fileId :: !Word64,
decls :: [Decl],
fileName :: FilePath,
usesRpc :: !Bool
}
data Decl
= TypeDecl
{ name :: Name.LocalQ,
nodeId :: !Word64,
params :: [Name.UnQ],
repr :: R.Repr,
extraTypeInfo :: Maybe ExtraTypeInfo
}
| FieldDecl
{ containerType :: Name.LocalQ,
typeParams :: [Name.UnQ],
fieldName :: Name.UnQ,
fieldLocType :: C.FieldLocType Brand Name.CapnpQ
}
| UnionDecl
{ name :: Name.LocalQ,
typeParams :: [Name.UnQ],
tagLoc :: C.DataLoc,
variants :: [UnionVariant]
}
| MethodDecl
{ interfaceName :: Name.LocalQ,
interfaceId :: !Word64,
methodId :: !Word16,
methodInfo :: MethodInfo
}
| SuperDecl
{ subName :: Name.LocalQ,
typeParams :: [Name.UnQ],
superType :: C.InterfaceType Brand Name.CapnpQ
}
| ParsedInstanceDecl
{ typeName :: Name.LocalQ,
typeParams :: [Name.UnQ],
parsedInstances :: ParsedInstances
}
| ConstDecl
{ name :: Name.LocalQ,
value :: C.Value Brand Name.CapnpQ
}
-- | Data needed for declaring a Parsed instance, and instances
-- of related classes.
data ParsedInstances
= ParsedStruct
{ fields :: [(Name.UnQ, C.FieldLocType Brand Name.CapnpQ)],
hasUnion :: !Bool,
dataCtorName :: Name.LocalQ
}
| ParsedUnion
{ variants :: [(Name.UnQ, C.FieldLocType Brand Name.CapnpQ)]
}
data MethodInfo = MethodInfo
{ typeParams :: [Name.UnQ],
methodName :: Name.UnQ,
paramType :: C.CompositeType Brand Name.CapnpQ,
resultType :: C.CompositeType Brand Name.CapnpQ
}
data ExtraTypeInfo
= StructTypeInfo
{ nWords :: !Word16,
nPtrs :: !Word16
}
| EnumTypeInfo [Name.UnQ]
| InterfaceTypeInfo
{ methods :: [MethodInfo],
supers :: [C.InterfaceType Brand Name.CapnpQ]
}
data UnionVariant = UnionVariant
{ variantName :: Name.UnQ,
tagValue :: !Word16,
fieldLocType :: C.FieldLocType Brand Name.CapnpQ
}