@@ -304,7 +304,7 @@ typval2type_vimvar(typval_T *tv, garray_T *type_gap)
304304 * Return FAIL if "expected" and "actual" don't match.
305305 */
306306 int
307- check_typval_type (type_T * expected , typval_T * actual_tv )
307+ check_typval_type (type_T * expected , typval_T * actual_tv , int argidx )
308308{
309309 garray_T type_list ;
310310 type_T * actual_type ;
@@ -313,40 +313,41 @@ check_typval_type(type_T *expected, typval_T *actual_tv)
313313 ga_init2 (& type_list , sizeof (type_T * ), 10 );
314314 actual_type = typval2type (actual_tv , & type_list );
315315 if (actual_type != NULL )
316- res = check_type (expected , actual_type , TRUE);
316+ res = check_type (expected , actual_type , TRUE, argidx );
317317 clear_type_list (& type_list );
318318 return res ;
319319}
320320
321321 void
322322type_mismatch (type_T * expected , type_T * actual )
323323{
324- char * tofree1 , * tofree2 ;
325-
326- semsg (_ (e_type_mismatch_expected_str_but_got_str ),
327- type_name (expected , & tofree1 ), type_name (actual , & tofree2 ));
328- vim_free (tofree1 );
329- vim_free (tofree2 );
324+ arg_type_mismatch (expected , actual , 0 );
330325}
331326
332327 void
333328arg_type_mismatch (type_T * expected , type_T * actual , int argidx )
334329{
335330 char * tofree1 , * tofree2 ;
336-
337- semsg (_ (e_argument_nr_type_mismatch_expected_str_but_got_str ),
338- argidx ,
339- type_name (expected , & tofree1 ), type_name (actual , & tofree2 ));
331+ char * typename1 = type_name (expected , & tofree1 );
332+ char * typename2 = type_name (actual , & tofree2 );
333+
334+ if (argidx > 0 )
335+ semsg (_ (e_argument_nr_type_mismatch_expected_str_but_got_str ),
336+ argidx , typename1 , typename2 );
337+ else
338+ semsg (_ (e_type_mismatch_expected_str_but_got_str ),
339+ typename1 , typename2 );
340340 vim_free (tofree1 );
341341 vim_free (tofree2 );
342342}
343343
344344/*
345345 * Check if the expected and actual types match.
346346 * Does not allow for assigning "any" to a specific type.
347+ * When "argidx" > 0 it is included in the error message.
347348 */
348349 int
349- check_type (type_T * expected , type_T * actual , int give_msg )
350+ check_type (type_T * expected , type_T * actual , int give_msg , int argidx )
350351{
351352 int ret = OK ;
352353
@@ -359,19 +360,21 @@ check_type(type_T *expected, type_T *actual, int give_msg)
359360 if (expected -> tt_type != actual -> tt_type )
360361 {
361362 if (give_msg )
362- type_mismatch (expected , actual );
363+ arg_type_mismatch (expected , actual , argidx );
363364 return FAIL ;
364365 }
365366 if (expected -> tt_type == VAR_DICT || expected -> tt_type == VAR_LIST )
366367 {
367368 // "unknown" is used for an empty list or dict
368369 if (actual -> tt_member != & t_unknown )
369- ret = check_type (expected -> tt_member , actual -> tt_member , FALSE);
370+ ret = check_type (expected -> tt_member , actual -> tt_member ,
371+ FALSE, 0 );
370372 }
371373 else if (expected -> tt_type == VAR_FUNC )
372374 {
373375 if (expected -> tt_member != & t_unknown )
374- ret = check_type (expected -> tt_member , actual -> tt_member , FALSE);
376+ ret = check_type (expected -> tt_member , actual -> tt_member ,
377+ FALSE, 0 );
375378 if (ret == OK && expected -> tt_argcount != -1
376379 && (actual -> tt_argcount < expected -> tt_min_argcount
377380 || actual -> tt_argcount > expected -> tt_argcount ))
@@ -383,7 +386,7 @@ check_type(type_T *expected, type_T *actual, int give_msg)
383386 for (i = 0 ; i < expected -> tt_argcount ; ++ i )
384387 // Allow for using "any" argument type, lambda's have them.
385388 if (actual -> tt_args [i ] != & t_any && check_type (
386- expected -> tt_args [i ], actual -> tt_args [i ], FALSE)
389+ expected -> tt_args [i ], actual -> tt_args [i ], FALSE, 0 )
387390 == FAIL )
388391 {
389392 ret = FAIL ;
@@ -392,7 +395,7 @@ check_type(type_T *expected, type_T *actual, int give_msg)
392395 }
393396 }
394397 if (ret == FAIL && give_msg )
395- type_mismatch (expected , actual );
398+ arg_type_mismatch (expected , actual , argidx );
396399 }
397400 return ret ;
398401}
0 commit comments