on master help sign in
Make function arity message way better
7d8e07bEvan Czaplicki
src/Reporting/Error/Type.hs+9−6
@@ -47,7 +47,7 @@ data Hint
47 | Binop Var.Canonical
47 | Binop Var.Canonical
48 | Function (Maybe Var.Canonical)
48 | Function (Maybe Var.Canonical)
49 | UnexpectedArg (Maybe Var.Canonical) Int Region.Region
49 | UnexpectedArg (Maybe Var.Canonical) Int Region.Region
50− | FunctionArity (Maybe Var.Canonical) Int Region.Region
50+ | FunctionArity (Maybe Var.Canonical) Int Int Region.Region
51 | BadTypeAnnotation String
51 | BadTypeAnnotation String
52 | Instance String
52 | Instance String
53 | Literal String
53 | Literal String
@@ -186,11 +186,14 @@ hintToString hint =
186 ++ " has an unexpected type."
186 ++ " has an unexpected type."
187 )
187 )
188
188
189− FunctionArity maybeName index region ->
189+ FunctionArity maybeName expected actual region ->
190+ let
191+ s = if expected <= 1 then "" else "s"
192+ in
190− ( Just region
193+ ( Just region
191− , capitalize (funcName maybeName) ++ " is not expecting a "
194+ , capitalize (funcName maybeName) ++ " is expecting " ++ show expected
192− ++ ordinalize index ++ " argument."
195+ ++ " argument" ++ s ++ ", but was given " ++ show actual ++ "."
193− )
196+ )
194
197
195 BadTypeAnnotation name ->
198 BadTypeAnnotation name ->
196 ( Nothing
199 ( Nothing
src/Type/Constrain/Expression.hs+14−10
@@ -198,8 +198,8 @@ constrainApp env region f args tipe =
198 do funcVar <- variable Flexible
198 do funcVar <- variable Flexible
199 funcCon <- constrain env f (varN funcVar)
199 funcCon <- constrain env f (varN funcVar)
200
200
201− (vars, argCons, numberOfArgsCons, argMatchCons, returnVar) <-
201+ (vars, argCons, numberOfArgsCons, argMatchCons, _, returnVar) <-
202− argConstraints env maybeName region funcVar 1 args
202+ argConstraints env maybeName region (length args) funcVar 1 args
203
203
204 let returnCon =
204 let returnCon =
205 CEqual (Error.Function maybeName) region (varN returnVar) tipe
205 CEqual (Error.Function maybeName) region (varN returnVar) tipe
@@ -220,25 +220,31 @@ argConstraints
220 :: Env.Environment
220 :: Env.Environment
221 -> Maybe V.Canonical
221 -> Maybe V.Canonical
222 -> R.Region
222 -> R.Region
223+ -> Int
223 -> Variable
224 -> Variable
224 -> Int
225 -> Int
225 -> [Canonical.Expr]
226 -> [Canonical.Expr]
226− -> IO ([Variable], [TypeConstraint], [TypeConstraint], [TypeConstraint], Variable)
227+ -> IO ([Variable], [TypeConstraint], [TypeConstraint], [TypeConstraint], Maybe R.Region, Variable)
227−argConstraints env name region overallVar index args =
228+argConstraints env name region totalArgs overallVar index args =
228 case args of
229 case args of
229 [] ->
230 [] ->
230− return ([], [], [], [], overallVar)
231+ return ([], [], [], [], Nothing, overallVar)
231
232
232 expr@(A.A subregion _) : rest ->
233 expr@(A.A subregion _) : rest ->
233 do argVar <- variable Flexible
234 do argVar <- variable Flexible
234 argCon <- constrain env expr (varN argVar)
235 argCon <- constrain env expr (varN argVar)
235−
236 argIndexVar <- variable Flexible
236 argIndexVar <- variable Flexible
237 localReturnVar <- variable Flexible
237 localReturnVar <- variable Flexible
238
238
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+
239 let numberOfArgsCon =
245 let numberOfArgsCon =
240 CEqual
246 CEqual
241− (Error.FunctionArity name index subregion)
247+ (Error.FunctionArity name (index - 1) totalArgs arityRegion)
242 region
248 region
243 (varN argIndexVar ==> varN localReturnVar)
249 (varN argIndexVar ==> varN localReturnVar)
244 (varN overallVar)
250 (varN overallVar)
@@ -250,14 +256,12 @@ argConstraints env name region overallVar index args =
250 (varN argIndexVar)
256 (varN argIndexVar)
251 (varN argVar)
257 (varN argVar)
252
258
253− (vars, argConRest, numberOfArgsRest, argMatchRest, returnVar) <-
254− argConstraints env name region localReturnVar (index + 1) rest
255−
256 return
259 return
257 ( argVar : argIndexVar : localReturnVar : vars
260 ( argVar : argIndexVar : localReturnVar : vars
258 , argCon : argConRest
261 , argCon : argConRest
259 , numberOfArgsCon : numberOfArgsRest
262 , numberOfArgsCon : numberOfArgsRest
260 , argMatchCon : argMatchRest
263 , argMatchCon : argMatchRest
264+ , Just arityRegion
261 , returnVar
265 , returnVar
262 )
266 )
263
267