on master help sign in
Make errors for bad argument types nicer
33261ecEvan Czaplicki
src/Reporting/Error/Type.hs+6
@@ -37,6 +37,7 @@ data Hint
37 | BinopLeft Var.Canonical Region.Region
37 | BinopLeft Var.Canonical Region.Region
38 | BinopRight Var.Canonical Region.Region
38 | BinopRight Var.Canonical Region.Region
39 | Binop Var.Canonical
39 | Binop Var.Canonical
40+ | Argument Region.Region
40
41
41
42
42data Note
43data Note
@@ -156,6 +157,11 @@ hintToString hint =
156 ++ "does not match how it is used elsewhere."
157 ++ "does not match how it is used elsewhere."
157 )
158 )
158
159
160+ Argument region ->
161+ ( Just region
162+ , "This argument is causing a type mismatch."
163+ )
164+
159
165
160prettyOperator :: Var.Canonical -> String
166prettyOperator :: Var.Canonical -> String
161prettyOperator (Var.Canonical _ opName) =
167prettyOperator (Var.Canonical _ opName) =
src/Type/Constrain/Expression.hs+12−6
@@ -88,14 +88,20 @@ constrain env (A.A region expression) tipe =
88 )
88 )
89 return $ con /\ tipe === (argType ==> resType)
89 return $ con /\ tipe === (argType ==> resType)
90
90
91− E.App func arg ->
91+ E.App func arg@(A.A argRegion _) ->
92 do argVar <- variable Flexible
92 do argVar <- variable Flexible
93− resultVar <- variable Flexible
94 argCon <- constrain env arg (varN argVar)
93 argCon <- constrain env arg (varN argVar)
94+
95+ argVar' <- variable Flexible
96+ resultVar <- variable Flexible
95− funcCon <- constrain env func (varN argVar ==> varN resultVar)
97+ funcCon <- constrain env func (varN argVar' ==> varN resultVar)
96− let appCon = tipe === varN resultVar
98+
97− return $
98− ex [argVar,resultVar] (CAnd [ argCon, funcCon, appCon ])
99+ return $ ex [argVar,argVar',resultVar] $ CAnd $
100+ [ argCon
101+ , funcCon
102+ , CEqual (Error.Argument argRegion) region (varN argVar') (varN argVar)
103+ , tipe === varN resultVar
104+ ]
99
105
100 E.MultiIf branches ->
106 E.MultiIf branches ->
101 constrainIf env region branches tipe
107 constrainIf env region branches tipe