Skip to content

Commit 1434ea0

Browse files
yegappanchrisbra
authored andcommitted
patch 9.1.1617: Vim9: some error messages can be improved
Problem: Vim9: some error messages can be improved Solution: Improve error messages when parsing generic function type arguments (Yegappan Lakshmanan). closes: #17957 Signed-off-by: Yegappan Lakshmanan <[email protected]> Signed-off-by: Christian Brabandt <[email protected]>
1 parent 57eb1d4 commit 1434ea0

4 files changed

Lines changed: 42 additions & 17 deletions

File tree

src/ex_docmd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3715,9 +3715,9 @@ find_ex_command(
37153715
// "&option" can be followed by "->" or "=", check below
37163716
}
37173717

3718-
if (*p == '<' && vim9)
3718+
if (vim9 && *p == '<')
37193719
{
3720-
// generic function
3720+
// generic function type args
37213721
if (skip_generic_func_type_args(&p) == FAIL)
37223722
{
37233723
eap->cmdidx = CMD_SIZE;

src/testdir/test_vim9_generics.vim

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,14 @@ def Test_generic_func_invoke_whitespace_error()
387387
Fn<number,string>()
388388
END
389389
v9.CheckSourceFailure(lines, "E1069: White space required after ',': <number,string>()", 4)
390+
391+
lines =<< trim END
392+
vim9script
393+
def Fn<A>()
394+
enddef
395+
Fn<number> ()
396+
END
397+
v9.CheckSourceFailure(lines, "E1202: No white space allowed after '>': <number> ()", 4)
390398
enddef
391399

392400
def Test_generic_func_typename()
@@ -2211,7 +2219,7 @@ def Test_generic_disassemble_generic_obj_method()
22112219
endclass
22122220
disassemble Foo.Fn<number, dict<number>
22132221
END
2214-
v9.CheckScriptFailure(lines, 'E1553: Missing comma after type in generic function: <number, dict<number>', 6)
2222+
v9.CheckScriptFailure(lines, "E1554: Missing '>' in generic function: Fn<number, dict<number>", 6)
22152223

22162224
lines =<< trim END
22172225
vim9script
@@ -2229,7 +2237,7 @@ def Test_generic_disassemble_generic_obj_method()
22292237
endclass
22302238
disassemble Foo.Fn<number,
22312239
END
2232-
v9.CheckScriptFailure(lines, "E1069: White space required after ','", 6)
2240+
v9.CheckScriptFailure(lines, "E1554: Missing '>' in generic function: Fn<number,", 6)
22332241

22342242
lines =<< trim END
22352243
vim9script
@@ -2239,7 +2247,7 @@ def Test_generic_disassemble_generic_obj_method()
22392247
endclass
22402248
disassemble Foo.Fn<
22412249
END
2242-
v9.CheckScriptFailure(lines, 'E475: Invalid argument: Foo.Fn<', 6)
2250+
v9.CheckScriptFailure(lines, "E1554: Missing '>' in generic function: Fn<", 6)
22432251

22442252
lines =<< trim END
22452253
vim9script
@@ -2339,7 +2347,7 @@ def Test_generic_disassemble_generic_class_method()
23392347
endclass
23402348
disassemble Foo.Fn<number, dict<number>
23412349
END
2342-
v9.CheckScriptFailure(lines, 'E1553: Missing comma after type in generic function: <number, dict<number>', 6)
2350+
v9.CheckScriptFailure(lines, "E1554: Missing '>' in generic function: Fn<number, dict<number>", 6)
23432351

23442352
lines =<< trim END
23452353
vim9script
@@ -2349,7 +2357,7 @@ def Test_generic_disassemble_generic_class_method()
23492357
endclass
23502358
disassemble Foo.Fn<number,
23512359
END
2352-
v9.CheckScriptFailure(lines, "E1069: White space required after ','", 6)
2360+
v9.CheckScriptFailure(lines, "E1554: Missing '>' in generic function: Fn<number,", 6)
23532361

23542362
lines =<< trim END
23552363
vim9script
@@ -2359,7 +2367,7 @@ def Test_generic_disassemble_generic_class_method()
23592367
endclass
23602368
disassemble Foo.Fn<
23612369
END
2362-
v9.CheckScriptFailure(lines, 'E475: Invalid argument: Foo.Fn<', 6)
2370+
v9.CheckScriptFailure(lines, "E1554: Missing '>' in generic function: Fn<", 6)
23632371

23642372
lines =<< trim END
23652373
vim9script

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,8 @@ static char *(features[]) =
719719

720720
static int included_patches[] =
721721
{ /* Add new patch number below this line */
722+
/**/
723+
1617,
722724
/**/
723725
1616,
724726
/**/

src/vim9generics.c

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,14 @@ generic_func_find_close_bracket(char_u *start)
149149
return NULL;
150150
}
151151

152+
if (VIM_ISWHITE(*(p + 1)) && *skipwhite(p + 1) == '(')
153+
{
154+
// white space not allowed between '>' and '('
155+
semsg(_(e_no_white_space_allowed_after_str_str), ">", start);
156+
return NULL;
157+
}
158+
159+
152160
if (type_count == 0)
153161
{
154162
semsg(_(e_empty_type_list_for_generic_function_str), start);
@@ -326,28 +334,35 @@ parse_generic_func_type_args(
326334

327335
p = skipwhite(p);
328336

337+
if (*p == NUL || *p == '>')
338+
break;
339+
329340
// after a type, expect ',' or '>'
330-
if (*p != ',' && *p != '>')
341+
if (*p != ',')
331342
{
332343
semsg(_(e_missing_comma_in_generic_function_str), start);
333344
return NULL;
334345
}
335346

336-
// if there's a comma, require whitespace after it and skip it
337-
if (*p == ',')
347+
if (*(p + 1) == NUL)
348+
break;
349+
350+
// Require whitespace after a comma and skip it
351+
if (!VIM_ISWHITE(*(p + 1)))
338352
{
339-
if (!VIM_ISWHITE(*(p + 1)))
340-
{
341-
semsg(_(e_white_space_required_after_str_str), ",", p);
342-
return NULL;
343-
}
344-
p++;
353+
semsg(_(e_white_space_required_after_str_str), ",", p);
354+
return NULL;
345355
}
356+
p++;
346357
}
347358

348359
// ensure the list of types ends in a closing '>'
349360
if (*p != '>')
361+
{
362+
semsg(_(e_missing_closing_angle_bracket_in_generic_function_str),
363+
func_name);
350364
return NULL;
365+
}
351366

352367
// no whitespace allowed before '>'
353368
if (VIM_ISWHITE(*(p - 1)))

0 commit comments

Comments
 (0)