packages feed

hoq-0.3: src/TypeChecking/Definitions.hs

module TypeChecking.Definitions
    ( typeCheckDefs
    ) where

import Data.Void

import Syntax
import Syntax.ErrorDoc
import TypeChecking.Expressions
import TypeChecking.Expressions.Utils
import TypeChecking.Definitions.Records
import TypeChecking.Definitions.DataTypes
import TypeChecking.Definitions.Functions
import TypeChecking.Monad

typeCheckDefs :: Monad m => [Def] -> TCM m ()
typeCheckDefs [] = return ()
typeCheckDefs (DefImport{} : defs) = typeCheckDefs defs
typeCheckDefs (DefFixity{} : defs) = typeCheckDefs defs
typeCheckDefs (DefType p@(pos, name) ty : defs) = case span (theSameAs name) defs of
    ([],_) -> do
        warn [Error Other $ emsgLC pos ("Missing a realization of function " ++ show (nameToString name)) enull]
        typeCheckDefs defs
    (defs1,defs2) -> do
        typeCheckFunction p ty (map (\d -> case d of
            DefFun (pos, _) pats expr -> (pos, pats, expr)
            _ -> error "typeCheckDefs") defs1)
            `catchError` \errs -> warn errs >> return ()
        typeCheckDefs defs2
typeCheckDefs (DefFun p@(pos, name) [] (Just expr) : defs) = do
    (term, ty) <- typeCheck expr Nothing
    addFunctionCheck p ([([], closed term)]) $ Closed (vacuous ty)
    typeCheckDefs defs
typeCheckDefs (DefFun (pos, name) [] Nothing : defs) = do
    warn [Error Other $ emsgLC pos "Expected right hand side" enull]
    typeCheckDefs $ dropWhile (theSameAs name) defs
typeCheckDefs (DefFun (pos, name) _ _ : defs) = do
    warn [inferErrorMsg pos "the argument"]
    typeCheckDefs $ dropWhile (theSameAs name) defs
typeCheckDefs (DefData dt ty cons conds : defs) = do
    typeCheckDataType dt ty cons conds
    typeCheckDefs defs
typeCheckDefs (DefRecord name params mcon fields conds : defs) = do
    typeCheckRecord name params mcon fields conds
    typeCheckDefs defs

theSameAs :: Name -> Def -> Bool
theSameAs name (DefFun (_, name') _ _) = name == name'
theSameAs _ _ = False