SSTG-0.1.1.6: src/SSTG/Core/Language/Typing.hs
-- | Typing Module
module SSTG.Core.Language.Typing
( module SSTG.Core.Language.Typing
) where
import SSTG.Core.Language.Syntax
-- | Variable type.
varType :: Var -> Type
varType (Var _ ty) = ty
-- | Literal type.
litType :: Lit -> Type
litType (MachChar _ ty) = ty
litType (MachStr _ ty) = ty
litType (MachInt _ ty) = ty
litType (MachWord _ ty) = ty
litType (MachFloat _ ty) = ty
litType (MachDouble _ ty) = ty
litType (MachLabel _ _ ty) = ty
litType (MachNullAddr ty) = ty
litType (BlankAddr) = Bottom
litType (AddrLit _) = Bottom
litType (LitEval pf args) = foldl AppTy (primFunType pf) (map litType args)
-- | Atom type.
atomType :: Atom -> Type
atomType (LitAtom lit) = litType lit
atomType (VarAtom var) = varType var
-- | Primitive function type.
primFunType :: PrimFun -> Type
primFunType (PrimFun _ ty) = ty
-- | Data constructor type denoted as a function.
dataConType :: DataCon -> Type
dataConType (DataCon _ ty tys) = foldr FunTy ty tys
-- | Alt type
altType :: Alt -> Type
altType (Alt _ expr) = exprType expr
-- | I wonder what this could possibly be?
exprType :: Expr -> Type
exprType (Atom atom) = atomType atom
exprType (PrimApp pf args) = foldl AppTy (primFunType pf) (map atomType args)
exprType (ConApp dc args) = foldl AppTy (dataConType dc) (map atomType args)
exprType (FunApp fun args) = foldl AppTy (varType fun) (map atomType args)
exprType (Let _ expr) = exprType expr
exprType (Case _ _ (alt:_)) = altType alt
exprType _ = Bottom