Skip to content

Commit f83283c

Browse files
author
Andy
authored
Improve parse error for double comma somewhere inside a call expression (microsoft#20399)
1 parent 7e150a9 commit f83283c

20 files changed

Lines changed: 67 additions & 34 deletions

src/compiler/parser.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,9 +1429,13 @@ namespace ts {
14291429
return token() === SyntaxKind.CommaToken || token() === SyntaxKind.DotDotDotToken || isIdentifierOrPattern();
14301430
case ParsingContext.TypeParameters:
14311431
return isIdentifier();
1432-
case ParsingContext.ArgumentExpressions:
14331432
case ParsingContext.ArrayLiteralMembers:
1434-
return token() === SyntaxKind.CommaToken || token() === SyntaxKind.DotDotDotToken || isStartOfExpression();
1433+
if (token() === SyntaxKind.CommaToken) {
1434+
return true;
1435+
}
1436+
// falls through
1437+
case ParsingContext.ArgumentExpressions:
1438+
return token() === SyntaxKind.DotDotDotToken || isStartOfExpression();
14351439
case ParsingContext.Parameters:
14361440
return isStartOfParameter();
14371441
case ParsingContext.TypeArguments:

tests/baselines/reference/importCallExpressionGrammarError.errors.txt

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(5,8): error TS1325: Specifier of dynamic import cannot be spread element.
22
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(7,17): error TS1325: Specifier of dynamic import cannot be spread element.
33
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(8,12): error TS1324: Dynamic import must have one specifier as an argument.
4-
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(9,19): error TS1135: Argument expression expected.
5-
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(9,19): error TS7036: Dynamic import's specifier must be of type 'string', but here has type 'undefined'.
6-
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(10,12): error TS1324: Dynamic import must have one specifier as an argument.
7-
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(10,19): error TS2307: Cannot find module 'pathToModule'.
4+
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(9,12): error TS1324: Dynamic import must have one specifier as an argument.
5+
tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(9,19): error TS2307: Cannot find module 'pathToModule'.
86

97

10-
==== tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts (7 errors) ====
8+
==== tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts (5 errors) ====
119
declare function getSpecifier(): string;
1210
declare var whatToLoad: boolean;
1311

@@ -22,11 +20,6 @@ tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(10,19)
2220
const p2 = import();
2321
~~~~~~~~
2422
!!! error TS1324: Dynamic import must have one specifier as an argument.
25-
const p3 = import(,);
26-
27-
!!! error TS1135: Argument expression expected.
28-
29-
!!! error TS7036: Dynamic import's specifier must be of type 'string', but here has type 'undefined'.
3023
const p4 = import("pathToModule", "secondModule");
3124
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3225
!!! error TS1324: Dynamic import must have one specifier as an argument.

tests/baselines/reference/importCallExpressionGrammarError.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ import(...["PathModule"]);
77

88
var p1 = import(...a);
99
const p2 = import();
10-
const p3 = import(,);
1110
const p4 = import("pathToModule", "secondModule");
1211

1312
//// [importCallExpressionGrammarError.js]
1413
var a = ["./0"];
1514
Promise.resolve().then(() => require(...["PathModule"]));
1615
var p1 = Promise.resolve().then(() => require(...a));
1716
const p2 = Promise.resolve().then(() => require());
18-
const p3 = Promise.resolve().then(() => require());
1917
const p4 = Promise.resolve().then(() => require("pathToModule"));

tests/baselines/reference/importCallExpressionGrammarError.symbols

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ var p1 = import(...a);
1717
const p2 = import();
1818
>p2 : Symbol(p2, Decl(importCallExpressionGrammarError.ts, 7, 5))
1919

20-
const p3 = import(,);
21-
>p3 : Symbol(p3, Decl(importCallExpressionGrammarError.ts, 8, 5))
22-
2320
const p4 = import("pathToModule", "secondModule");
24-
>p4 : Symbol(p4, Decl(importCallExpressionGrammarError.ts, 9, 5))
21+
>p4 : Symbol(p4, Decl(importCallExpressionGrammarError.ts, 8, 5))
2522

tests/baselines/reference/importCallExpressionGrammarError.types

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@ const p2 = import();
2626
>p2 : Promise<any>
2727
>import() : Promise<any>
2828

29-
const p3 = import(,);
30-
>p3 : Promise<any>
31-
>import(,) : Promise<any>
32-
> : undefined
33-
3429
const p4 = import("pathToModule", "secondModule");
3530
>p4 : Promise<any>
3631
>import("pathToModule", "secondModule") : Promise<any>

tests/baselines/reference/missingArgument1.errors.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ tests/cases/compiler/missingArgument1.ts(1,8): error TS2304: Cannot find name 'b
1010
!!! error TS2304: Cannot find name 'foo'.
1111
~
1212
!!! error TS2304: Cannot find name 'a'.
13-
13+
~
1414
!!! error TS1135: Argument expression expected.
1515
~
1616
!!! error TS2304: Cannot find name 'b'.

tests/baselines/reference/missingArgument1.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
foo(a,,b);
33

44
//// [missingArgument1.js]
5-
foo(a, , b);
5+
foo(a, b);

tests/baselines/reference/missingArgument1.types

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,5 @@ foo(a,,b);
33
>foo(a,,b) : any
44
>foo : any
55
>a : any
6-
> : undefined
76
>b : any
87

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
tests/cases/compiler/parseErrorDoubleCommaInCall.ts(2,10): error TS1136: Property assignment expected.
2+
3+
4+
==== tests/cases/compiler/parseErrorDoubleCommaInCall.ts (1 errors) ====
5+
Boolean({
6+
x: 0,,
7+
~
8+
!!! error TS1136: Property assignment expected.
9+
});
10+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//// [parseErrorDoubleCommaInCall.ts]
2+
Boolean({
3+
x: 0,,
4+
});
5+
6+
7+
//// [parseErrorDoubleCommaInCall.js]
8+
Boolean({
9+
x: 0
10+
});

0 commit comments

Comments
 (0)