on master help sign in
Improve error messages when extra arguments are given to a function
dca97aeEvan Czaplicki
src/Reporting/Error/Type.hs+9−2
@@ -37,7 +37,8 @@ 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+ | BadArgument Region.Region
40− | Argument Region.Region
41+ | ExtraArgument Region.Region
41
42
42
43
43data Note
44data Note
@@ -157,11 +158,17 @@ hintToString hint =
157 ++ "does not match how it is used elsewhere."
158 ++ "does not match how it is used elsewhere."
158 )
159 )
159
160
160− Argument region ->
161+ BadArgument region ->
161 ( Just region
162 ( Just region
162 , "This argument is causing a type mismatch."
163 , "This argument is causing a type mismatch."
163 )
164 )
164
165
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+
165
172
166prettyOperator :: Var.Canonical -> String
173prettyOperator :: Var.Canonical -> String
167prettyOperator (Var.Canonical _ opName) =
174prettyOperator (Var.Canonical _ opName) =
src/Type/Constrain/Expression.hs+8−3
@@ -88,18 +88,23 @@ 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@(A.A argRegion _) ->
91+ E.App func@(A.A funcRegion _) arg@(A.A argRegion _) ->
92 do argVar <- variable Flexible
92 do argVar <- variable Flexible
93 argCon <- constrain env arg (varN argVar)
93 argCon <- constrain env arg (varN argVar)
94
94
95+ funcVar <- variable Flexible
96+ funcCon <- constrain env func (varN funcVar)
97+
95 argVar' <- variable Flexible
98 argVar' <- variable Flexible
96 resultVar <- variable Flexible
99 resultVar <- variable Flexible
97− funcCon <- constrain env func (varN argVar' ==> varN resultVar)
98
100
99 return $ ex [argVar,argVar',resultVar] $ CAnd $
101 return $ ex [argVar,argVar',resultVar] $ CAnd $
100 [ argCon
102 [ argCon
101 , funcCon
103 , funcCon
104+ , CEqual (Error.ExtraArgument funcRegion) region
105+ (varN funcVar)
106+ (varN argVar' ==> varN resultVar)
102− , CEqual (Error.Argument argRegion) region (varN argVar') (varN argVar)
107+ , CEqual (Error.BadArgument argRegion) region (varN argVar') (varN argVar)
103 , tipe === varN resultVar
108 , tipe === varN resultVar
104 ]
109 ]
105
110