packages feed

hic-0.0.0.1: src/Language/Cimple/Analysis/Refined/Registry.hs

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE StrictData    #-}

module Language.Cimple.Analysis.Refined.Registry
    ( Registry (..)
    , TypeDefinition (..)
    , Member (..)
    ) where

import           Data.Map.Strict                            (Map)
import           Data.Text                                  (Text)
import           GHC.Generics                               (Generic)
import           Language.Cimple                            (Lexeme (..))
import           Language.Cimple.Analysis.Refined.LatticeOp (Variance (..))
import           Language.Cimple.Analysis.Refined.Types     (TemplateId)

-- | The Registry stores the formal definitions of all nominal types.
-- It is the source of truth for struct arity and structural links.
data Registry a = Registry
    { regDefinitions :: Map Text (TypeDefinition a)
    }
    deriving (Show, Eq, Ord, Generic)

-- | Formal definition of a Nominal type.
data TypeDefinition a
    = StructDef
        { sdName       :: Lexeme Text
        , sdParameters :: [(TemplateId, Variance)] -- ^ Structural parameters with variance
        , sdMembers    :: [Member a]              -- ^ Internal fields
        }
    | UnionDef
        { udName       :: Lexeme Text
        , udParameters :: [(TemplateId, Variance)]
        , udMembers    :: [Member a]
        }
    | EnumDef
        { edName    :: Lexeme Text
        , edMembers :: [Lexeme Text]
        }
    deriving (Show, Eq, Ord, Generic)

-- | A member field within a struct or union.
data Member a = Member
    { mName :: Lexeme Text
    , mType :: a -- ^ Type reference (ID or Symbolic)
    }
    deriving (Show, Eq, Ord, Generic)