on master help sign in
Make function arity message way better

“Function `f` is expecting N arguments, but was given M.”

commit7d8e07bf2f162addafb3dc1d338bfd24e2384368 authorEvan Czaplicki <info@elm-lang.org> dateThu 25 Jun 2015, 16:38 (11 years ago) parent8a77ab9
2 files changed+23−16
src/Reporting/Error/Type.hs+9−6 src/Type/Constrain/Expression.hs+14−10
src/Reporting/Error/Type.hs+9−6
@@ -47,7 +47,7 @@ data Hint
4747 | Binop Var.Canonical
4848 | Function (Maybe Var.Canonical)
4949 | UnexpectedArg (Maybe Var.Canonical) Int Region.Region
50− | FunctionArity (Maybe Var.Canonical) Int Region.Region
50+ | FunctionArity (Maybe Var.Canonical) Int Int Region.Region
5151 | BadTypeAnnotation String
5252 | Instance String
5353 | Literal String
@@ -186,11 +186,14 @@ hintToString hint =
186186 ++ " has an unexpected type."
187187 )
188188
189− FunctionArity maybeName index region ->
190− ( Just region
191− , capitalize (funcName maybeName) ++ " is not expecting a "
192− ++ ordinalize index ++ " argument."
193− )
189+ FunctionArity maybeName expected actual region ->
190+ let
191+ s = if expected <= 1 then "" else "s"
192+ in
193+ ( Just region
194+ , capitalize (funcName maybeName) ++ " is expecting " ++ show expected
195+ ++ " argument" ++ s ++ ", but was given " ++ show actual ++ "."
196+ )
194197
195198 BadTypeAnnotation name ->
196199 ( Nothing
src/Type/Constrain/Expression.hs+14−10
@@ -198,8 +198,8 @@ constrainApp env region f args tipe =
198198 do funcVar <- variable Flexible
199199 funcCon <- constrain env f (varN funcVar)
200200
201− (vars, argCons, numberOfArgsCons, argMatchCons, returnVar) <-
202− argConstraints env maybeName region funcVar 1 args
201+ (vars, argCons, numberOfArgsCons, argMatchCons, _, returnVar) <-
202+ argConstraints env maybeName region (length args) funcVar 1 args
203203
204204 let returnCon =
205205 CEqual (Error.Function maybeName) region (varN returnVar) tipe
@@ -220,25 +220,31 @@ argConstraints
220220 :: Env.Environment
221221 -> Maybe V.Canonical
222222 -> R.Region
223+ -> Int
223224 -> Variable
224225 -> Int
225226 -> [Canonical.Expr]
226− -> IO ([Variable], [TypeConstraint], [TypeConstraint], [TypeConstraint], Variable)
227−argConstraints env name region overallVar index args =
227+ -> IO ([Variable], [TypeConstraint], [TypeConstraint], [TypeConstraint], Maybe R.Region, Variable)
228+argConstraints env name region totalArgs overallVar index args =
228229 case args of
229230 [] ->
230− return ([], [], [], [], overallVar)
231+ return ([], [], [], [], Nothing, overallVar)
231232
232233 expr@(A.A subregion _) : rest ->
233234 do argVar <- variable Flexible
234235 argCon <- constrain env expr (varN argVar)
235−
236236 argIndexVar <- variable Flexible
237237 localReturnVar <- variable Flexible
238238
239+ (vars, argConRest, numberOfArgsRest, argMatchRest, restRegion, returnVar) <-
240+ argConstraints env name region totalArgs localReturnVar (index + 1) rest
241+
242+ let arityRegion =
243+ maybe subregion (R.merge subregion) restRegion
244+
239245 let numberOfArgsCon =
240246 CEqual
241− (Error.FunctionArity name index subregion)
247+ (Error.FunctionArity name (index - 1) totalArgs arityRegion)
242248 region
243249 (varN argIndexVar ==> varN localReturnVar)
244250 (varN overallVar)
@@ -250,14 +256,12 @@ argConstraints env name region overallVar index args =
250256 (varN argIndexVar)
251257 (varN argVar)
252258
253− (vars, argConRest, numberOfArgsRest, argMatchRest, returnVar) <-
254− argConstraints env name region localReturnVar (index + 1) rest
255−
256259 return
257260 ( argVar : argIndexVar : localReturnVar : vars
258261 , argCon : argConRest
259262 , numberOfArgsCon : numberOfArgsRest
260263 , argMatchCon : argMatchRest
264+ , Just arityRegion
261265 , returnVar
262266 )
263267