aboutsummaryrefslogtreecommitdiff
path: root/Sil/Types.icl
diff options
context:
space:
mode:
Diffstat (limited to 'Sil/Types.icl')
-rw-r--r--Sil/Types.icl27
1 files changed, 14 insertions, 13 deletions
diff --git a/Sil/Types.icl b/Sil/Types.icl
index a68a7b8..2fdd666 100644
--- a/Sil/Types.icl
+++ b/Sil/Types.icl
@@ -21,6 +21,7 @@ from ABC.Assembler import :: BasicType(..)
import Sil.Error
import Sil.Syntax
+import Sil.Util.Parser
import Sil.Util.Printer
derive gEq Type
@@ -70,30 +71,30 @@ where
type res (Literal _ lit) = case lit of
BLit _ -> Just $ Ok TBool
ILit _ -> Just $ Ok TInt
- type res (App _ n args) =
+ type res (App p n args) =
mapM (type res) args >>= \ats ->
res n >>= \ft -> pure
( sequence ats >>= \ats ->
- ft >>= \ft -> foldM tryApply ft ats)
- type res (BuiltinApp _ op e) =
+ ft >>= \ft -> foldM (tryApply p) ft ats)
+ type res (BuiltinApp p op e) =
type res e >>= \te ->
type res op >>= \top -> pure
( top >>= \top ->
- te >>= \te -> tryApply top te)
- type res (BuiltinApp2 _ e1 Cons e2) =
+ te >>= \te -> tryApply p top te)
+ type res (BuiltinApp2 p e1 Cons e2) =
type res e1 >>= \te1 ->
type res e2 >>= \te2 -> pure
( te1 >>= \te1 ->
te2 >>= \te2 ->
let top = te1 --> TList te1 --> TList te1 in
- foldM tryApply top [te1,te2])
- type res (BuiltinApp2 _ e1 op e2) =
+ foldM (tryApply p) top [te1,te2])
+ type res (BuiltinApp2 p e1 op e2) =
type res e1 >>= \te1 ->
type res e2 >>= \te2 ->
type res op >>= \top -> pure
( top >>= \top ->
te1 >>= \te1 ->
- te2 >>= \te2 -> foldM tryApply top [te1,te2])
+ te2 >>= \te2 -> foldM (tryApply p) top [te1,te2])
type res e=:(List _ (Just t) es) =
mapM (type res) es >>= \tes -> pure
(sequence tes >>= \tes -> case [(e,t`) \\ e <- es & t` <- tes | t <> t`] of
@@ -131,11 +132,11 @@ where
isTuple = length f` >= 2 && hd f` == '_' && all isDigit (tl f`)
tupleEl = toInt $ toString $ tl f`
-tryApply :: Type Type -> MaybeError Error Type
-tryApply ft=:(at --> rt) et
-| et == at = Ok rt
-| otherwise = Error $ T_IllegalApplication ft et
-tryApply ft et = Error $ T_IllegalApplication ft et
+tryApply :: ParsePosition Type Type -> MaybeError Error Type
+tryApply p ft=:(at --> rt) et
+| et == at = Ok rt
+| otherwise = Error $ T_IllegalApplication (errpos p) ft et
+tryApply p ft et = Error $ T_IllegalApplication (errpos p) ft et
instance type Name where type res n = res n