33 lines
1.1 KiB
Idris
33 lines
1.1 KiB
Idris
||| check that special functions (e.g. `main`) have the expected type
|
||
module Quox.CheckBuiltin
|
||
|
||
import Quox.Syntax
|
||
import Quox.Typing
|
||
import Quox.Whnf
|
||
|
||
%default total
|
||
|
||
|
||
export covering
|
||
expectSingleEnum : Definitions -> TyContext d n -> SQty -> Loc ->
|
||
Term d n -> Eff Whnf ()
|
||
expectSingleEnum defs ctx sg loc s = do
|
||
let err = delay $ ExpectedSingleEnum loc ctx.names s
|
||
cases <- wrapErr (const err) $ expectEnum defs ctx sg loc s
|
||
unless (length (SortedSet.toList cases) == 1) $ throw err
|
||
|
||
||| `main` should have a type `1.IOState → {𝑎} × IOState`,
|
||
||| for some (single) tag `𝑎`
|
||
export covering
|
||
expectMainType : Definitions -> Term 0 0 -> Eff Whnf ()
|
||
expectMainType defs ty =
|
||
wrapErr (WrongBuiltinType Main) $ do
|
||
let ctx = TyContext.empty
|
||
(qty, arg, res) <- expectPi defs ctx SZero ty.loc ty
|
||
expectEqualQ ty.loc qty One
|
||
expectIOState defs ctx SZero arg.loc arg
|
||
let ctx = extendTy qty res.name arg ctx
|
||
(ret, st) <- expectSig defs ctx SZero res.loc res.term
|
||
expectSingleEnum defs ctx SZero ret.loc ret
|
||
let ctx = extendTy qty st.name ret ctx
|
||
expectIOState defs ctx SZero st.loc st.term
|