on master help sign in
Make errors for bad argument types nicer

Resolve https://github.com/evancz/error-message-catalog/issues/4

commit33261ecd3b098011e30d421faf1058eeb7a2780d authorEvan Czaplicki <info@elm-lang.org> dateSun 10 May 2015, 22:43 (11 years ago) parent43d4388
2 files changed+18−6
src/Reporting/Error/Type.hs+6 src/Type/Constrain/Expression.hs+12−6
src/Reporting/Error/Type.hs+6
@@ -37,6 +37,7 @@ data Hint
3737 | BinopLeft Var.Canonical Region.Region
3838 | BinopRight Var.Canonical Region.Region
3939 | Binop Var.Canonical
40+ | Argument Region.Region
4041
4142
4243data Note
@@ -156,6 +157,11 @@ hintToString hint =
156157 ++ "does not match how it is used elsewhere."
157158 )
158159
160+ Argument region ->
161+ ( Just region
162+ , "This argument is causing a type mismatch."
163+ )
164+
159165
160166prettyOperator :: Var.Canonical -> String
161167prettyOperator (Var.Canonical _ opName) =
src/Type/Constrain/Expression.hs+12−6
@@ -88,14 +88,20 @@ constrain env (A.A region expression) tipe =
8888 )
8989 return $ con /\ tipe === (argType ==> resType)
9090
91− E.App func arg ->
91+ E.App func arg@(A.A argRegion _) ->
9292 do argVar <- variable Flexible
93− resultVar <- variable Flexible
9493 argCon <- constrain env arg (varN argVar)
95− funcCon <- constrain env func (varN argVar ==> varN resultVar)
96− let appCon = tipe === varN resultVar
97− return $
98− ex [argVar,resultVar] (CAnd [ argCon, funcCon, appCon ])
94+
95+ argVar' <- variable Flexible
96+ resultVar <- variable Flexible
97+ funcCon <- constrain env func (varN argVar' ==> varN resultVar)
98+
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+ ]
99105
100106 E.MultiIf branches ->
101107 constrainIf env region branches tipe