on master help sign in
Improve error messages when extra arguments are given to a function
commitdca97ae6882434817f687e4cbc9064e088012b61 authorEvan Czaplicki <info@elm-lang.org> dateSun 10 May 2015, 23:20 (11 years ago) parent33261ec
2 files changed+17−5
src/Reporting/Error/Type.hs+9−2 src/Type/Constrain/Expression.hs+8−3
src/Reporting/Error/Type.hs+9−2
@@ -37,7 +37,8 @@ data Hint
3737 | BinopLeft Var.Canonical Region.Region
3838 | BinopRight Var.Canonical Region.Region
3939 | Binop Var.Canonical
40− | Argument Region.Region
40+ | BadArgument Region.Region
41+ | ExtraArgument Region.Region
4142
4243
4344data Note
@@ -157,11 +158,17 @@ hintToString hint =
157158 ++ "does not match how it is used elsewhere."
158159 )
159160
160− Argument region ->
161+ BadArgument region ->
161162 ( Just region
162163 , "This argument is causing a type mismatch."
163164 )
164165
166+ ExtraArgument region ->
167+ ( Just region
168+ , "This expression is mistakenly being used as a function.\n"
169+ ++ "Maybe you provided an extra argument?"
170+ )
171+
165172
166173prettyOperator :: Var.Canonical -> String
167174prettyOperator (Var.Canonical _ opName) =
src/Type/Constrain/Expression.hs+8−3
@@ -88,18 +88,23 @@ constrain env (A.A region expression) tipe =
8888 )
8989 return $ con /\ tipe === (argType ==> resType)
9090
91− E.App func arg@(A.A argRegion _) ->
91+ E.App func@(A.A funcRegion _) arg@(A.A argRegion _) ->
9292 do argVar <- variable Flexible
9393 argCon <- constrain env arg (varN argVar)
9494
95+ funcVar <- variable Flexible
96+ funcCon <- constrain env func (varN funcVar)
97+
9598 argVar' <- variable Flexible
9699 resultVar <- variable Flexible
97− funcCon <- constrain env func (varN argVar' ==> varN resultVar)
98100
99101 return $ ex [argVar,argVar',resultVar] $ CAnd $
100102 [ argCon
101103 , funcCon
102− , CEqual (Error.Argument argRegion) region (varN argVar') (varN argVar)
104+ , CEqual (Error.ExtraArgument funcRegion) region
105+ (varN funcVar)
106+ (varN argVar' ==> varN resultVar)
107+ , CEqual (Error.BadArgument argRegion) region (varN argVar') (varN argVar)
103108 , tipe === varN resultVar
104109 ]
105110