diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index ab8e52e3dfa..a072579ed63 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1429,9 +1429,13 @@ namespace ts { return token() === SyntaxKind.CommaToken || token() === SyntaxKind.DotDotDotToken || isIdentifierOrPattern(); case ParsingContext.TypeParameters: return isIdentifier(); - case ParsingContext.ArgumentExpressions: case ParsingContext.ArrayLiteralMembers: - return token() === SyntaxKind.CommaToken || token() === SyntaxKind.DotDotDotToken || isStartOfExpression(); + if (token() === SyntaxKind.CommaToken) { + return true; + } + // falls through + case ParsingContext.ArgumentExpressions: + return token() === SyntaxKind.DotDotDotToken || isStartOfExpression(); case ParsingContext.Parameters: return isStartOfParameter(); case ParsingContext.TypeArguments: diff --git a/tests/baselines/reference/importCallExpressionGrammarError.errors.txt b/tests/baselines/reference/importCallExpressionGrammarError.errors.txt index 6d64808e111..b39228f100d 100644 --- a/tests/baselines/reference/importCallExpressionGrammarError.errors.txt +++ b/tests/baselines/reference/importCallExpressionGrammarError.errors.txt @@ -1,13 +1,11 @@ tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(5,8): error TS1325: Specifier of dynamic import cannot be spread element. tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(7,17): error TS1325: Specifier of dynamic import cannot be spread element. tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(8,12): error TS1324: Dynamic import must have one specifier as an argument. -tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(9,19): error TS1135: Argument expression expected. -tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(9,19): error TS7036: Dynamic import's specifier must be of type 'string', but here has type 'undefined'. -tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(10,12): error TS1324: Dynamic import must have one specifier as an argument. -tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(10,19): error TS2307: Cannot find module 'pathToModule'. +tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(9,12): error TS1324: Dynamic import must have one specifier as an argument. +tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(9,19): error TS2307: Cannot find module 'pathToModule'. -==== tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts (7 errors) ==== +==== tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts (5 errors) ==== declare function getSpecifier(): string; declare var whatToLoad: boolean; @@ -22,11 +20,6 @@ tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts(10,19) const p2 = import(); ~~~~~~~~ !!! error TS1324: Dynamic import must have one specifier as an argument. - const p3 = import(,); - -!!! error TS1135: Argument expression expected. - -!!! error TS7036: Dynamic import's specifier must be of type 'string', but here has type 'undefined'. const p4 = import("pathToModule", "secondModule"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! error TS1324: Dynamic import must have one specifier as an argument. diff --git a/tests/baselines/reference/importCallExpressionGrammarError.js b/tests/baselines/reference/importCallExpressionGrammarError.js index 435eab35d4e..61b47759581 100644 --- a/tests/baselines/reference/importCallExpressionGrammarError.js +++ b/tests/baselines/reference/importCallExpressionGrammarError.js @@ -7,7 +7,6 @@ import(...["PathModule"]); var p1 = import(...a); const p2 = import(); -const p3 = import(,); const p4 = import("pathToModule", "secondModule"); //// [importCallExpressionGrammarError.js] @@ -15,5 +14,4 @@ var a = ["./0"]; Promise.resolve().then(() => require(...["PathModule"])); var p1 = Promise.resolve().then(() => require(...a)); const p2 = Promise.resolve().then(() => require()); -const p3 = Promise.resolve().then(() => require()); const p4 = Promise.resolve().then(() => require("pathToModule")); diff --git a/tests/baselines/reference/importCallExpressionGrammarError.symbols b/tests/baselines/reference/importCallExpressionGrammarError.symbols index 7fce3af41b5..b4a0efd052e 100644 --- a/tests/baselines/reference/importCallExpressionGrammarError.symbols +++ b/tests/baselines/reference/importCallExpressionGrammarError.symbols @@ -17,9 +17,6 @@ var p1 = import(...a); const p2 = import(); >p2 : Symbol(p2, Decl(importCallExpressionGrammarError.ts, 7, 5)) -const p3 = import(,); ->p3 : Symbol(p3, Decl(importCallExpressionGrammarError.ts, 8, 5)) - const p4 = import("pathToModule", "secondModule"); ->p4 : Symbol(p4, Decl(importCallExpressionGrammarError.ts, 9, 5)) +>p4 : Symbol(p4, Decl(importCallExpressionGrammarError.ts, 8, 5)) diff --git a/tests/baselines/reference/importCallExpressionGrammarError.types b/tests/baselines/reference/importCallExpressionGrammarError.types index c9f95fbcb6b..2e2a8221a07 100644 --- a/tests/baselines/reference/importCallExpressionGrammarError.types +++ b/tests/baselines/reference/importCallExpressionGrammarError.types @@ -26,11 +26,6 @@ const p2 = import(); >p2 : Promise >import() : Promise -const p3 = import(,); ->p3 : Promise ->import(,) : Promise -> : undefined - const p4 = import("pathToModule", "secondModule"); >p4 : Promise >import("pathToModule", "secondModule") : Promise diff --git a/tests/baselines/reference/missingArgument1.errors.txt b/tests/baselines/reference/missingArgument1.errors.txt index ba2bb0892f2..7530da802c8 100644 --- a/tests/baselines/reference/missingArgument1.errors.txt +++ b/tests/baselines/reference/missingArgument1.errors.txt @@ -10,7 +10,7 @@ tests/cases/compiler/missingArgument1.ts(1,8): error TS2304: Cannot find name 'b !!! error TS2304: Cannot find name 'foo'. ~ !!! error TS2304: Cannot find name 'a'. - + ~ !!! error TS1135: Argument expression expected. ~ !!! error TS2304: Cannot find name 'b'. \ No newline at end of file diff --git a/tests/baselines/reference/missingArgument1.js b/tests/baselines/reference/missingArgument1.js index eed0d9b11d6..94f78377e40 100644 --- a/tests/baselines/reference/missingArgument1.js +++ b/tests/baselines/reference/missingArgument1.js @@ -2,4 +2,4 @@ foo(a,,b); //// [missingArgument1.js] -foo(a, , b); +foo(a, b); diff --git a/tests/baselines/reference/missingArgument1.types b/tests/baselines/reference/missingArgument1.types index 4b362a76145..b4468f4b3f6 100644 --- a/tests/baselines/reference/missingArgument1.types +++ b/tests/baselines/reference/missingArgument1.types @@ -3,6 +3,5 @@ foo(a,,b); >foo(a,,b) : any >foo : any >a : any -> : undefined >b : any diff --git a/tests/baselines/reference/parseErrorDoubleCommaInCall.errors.txt b/tests/baselines/reference/parseErrorDoubleCommaInCall.errors.txt new file mode 100644 index 00000000000..f209456d81f --- /dev/null +++ b/tests/baselines/reference/parseErrorDoubleCommaInCall.errors.txt @@ -0,0 +1,10 @@ +tests/cases/compiler/parseErrorDoubleCommaInCall.ts(2,10): error TS1136: Property assignment expected. + + +==== tests/cases/compiler/parseErrorDoubleCommaInCall.ts (1 errors) ==== + Boolean({ + x: 0,, + ~ +!!! error TS1136: Property assignment expected. + }); + \ No newline at end of file diff --git a/tests/baselines/reference/parseErrorDoubleCommaInCall.js b/tests/baselines/reference/parseErrorDoubleCommaInCall.js new file mode 100644 index 00000000000..f1a50cccfde --- /dev/null +++ b/tests/baselines/reference/parseErrorDoubleCommaInCall.js @@ -0,0 +1,10 @@ +//// [parseErrorDoubleCommaInCall.ts] +Boolean({ + x: 0,, +}); + + +//// [parseErrorDoubleCommaInCall.js] +Boolean({ + x: 0 +}); diff --git a/tests/baselines/reference/parseErrorDoubleCommaInCall.symbols b/tests/baselines/reference/parseErrorDoubleCommaInCall.symbols new file mode 100644 index 00000000000..fed8484d591 --- /dev/null +++ b/tests/baselines/reference/parseErrorDoubleCommaInCall.symbols @@ -0,0 +1,9 @@ +=== tests/cases/compiler/parseErrorDoubleCommaInCall.ts === +Boolean({ +>Boolean : Symbol(Boolean, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) + + x: 0,, +>x : Symbol(x, Decl(parseErrorDoubleCommaInCall.ts, 0, 9)) + +}); + diff --git a/tests/baselines/reference/parseErrorDoubleCommaInCall.types b/tests/baselines/reference/parseErrorDoubleCommaInCall.types new file mode 100644 index 00000000000..23197748490 --- /dev/null +++ b/tests/baselines/reference/parseErrorDoubleCommaInCall.types @@ -0,0 +1,12 @@ +=== tests/cases/compiler/parseErrorDoubleCommaInCall.ts === +Boolean({ +>Boolean({ x: 0,,}) : boolean +>Boolean : BooleanConstructor +>{ x: 0,,} : { x: number; } + + x: 0,, +>x : number +>0 : 0 + +}); + diff --git a/tests/baselines/reference/parserErrorRecovery_ArgumentList6.errors.txt b/tests/baselines/reference/parserErrorRecovery_ArgumentList6.errors.txt index 7562fee7936..215c8da0f4f 100644 --- a/tests/baselines/reference/parserErrorRecovery_ArgumentList6.errors.txt +++ b/tests/baselines/reference/parserErrorRecovery_ArgumentList6.errors.txt @@ -1,10 +1,13 @@ tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList6.ts(1,1): error TS2304: Cannot find name 'Foo'. +tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList6.ts(1,5): error TS1135: Argument expression expected. tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList6.ts(1,6): error TS1005: ')' expected. -==== tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList6.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList6.ts (3 errors) ==== Foo(, ~~~ !!! error TS2304: Cannot find name 'Foo'. + ~ +!!! error TS1135: Argument expression expected. !!! error TS1005: ')' expected. \ No newline at end of file diff --git a/tests/baselines/reference/parserErrorRecovery_ArgumentList6.types b/tests/baselines/reference/parserErrorRecovery_ArgumentList6.types index 202483685d7..8dee378e0a9 100644 --- a/tests/baselines/reference/parserErrorRecovery_ArgumentList6.types +++ b/tests/baselines/reference/parserErrorRecovery_ArgumentList6.types @@ -2,5 +2,4 @@ Foo(, >Foo(, : any >Foo : any -> : undefined diff --git a/tests/baselines/reference/parserErrorRecovery_ArgumentList7.errors.txt b/tests/baselines/reference/parserErrorRecovery_ArgumentList7.errors.txt index 3f4afaf930b..abe77ca9f1c 100644 --- a/tests/baselines/reference/parserErrorRecovery_ArgumentList7.errors.txt +++ b/tests/baselines/reference/parserErrorRecovery_ArgumentList7.errors.txt @@ -1,13 +1,16 @@ tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList7.ts(1,1): error TS2304: Cannot find name 'Foo'. tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList7.ts(1,5): error TS2304: Cannot find name 'a'. +tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList7.ts(1,7): error TS1135: Argument expression expected. tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList7.ts(1,8): error TS1005: ')' expected. -==== tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList7.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/ErrorRecovery/ArgumentLists/parserErrorRecovery_ArgumentList7.ts (4 errors) ==== Foo(a,, ~~~ !!! error TS2304: Cannot find name 'Foo'. ~ !!! error TS2304: Cannot find name 'a'. + ~ +!!! error TS1135: Argument expression expected. !!! error TS1005: ')' expected. \ No newline at end of file diff --git a/tests/baselines/reference/parserErrorRecovery_ArgumentList7.js b/tests/baselines/reference/parserErrorRecovery_ArgumentList7.js index 94eba9445e9..dfe0f58332f 100644 --- a/tests/baselines/reference/parserErrorRecovery_ArgumentList7.js +++ b/tests/baselines/reference/parserErrorRecovery_ArgumentList7.js @@ -2,4 +2,4 @@ Foo(a,, //// [parserErrorRecovery_ArgumentList7.js] -Foo(a, ); +Foo(a); diff --git a/tests/baselines/reference/parserErrorRecovery_ArgumentList7.types b/tests/baselines/reference/parserErrorRecovery_ArgumentList7.types index 9de43329a13..ca95e4563e1 100644 --- a/tests/baselines/reference/parserErrorRecovery_ArgumentList7.types +++ b/tests/baselines/reference/parserErrorRecovery_ArgumentList7.types @@ -3,5 +3,4 @@ Foo(a,, >Foo(a,, : any >Foo : any >a : any -> : undefined diff --git a/tests/cases/compiler/parseErrorDoubleCommaInCall.ts b/tests/cases/compiler/parseErrorDoubleCommaInCall.ts new file mode 100644 index 00000000000..2171e9262a9 --- /dev/null +++ b/tests/cases/compiler/parseErrorDoubleCommaInCall.ts @@ -0,0 +1,3 @@ +Boolean({ + x: 0,, +}); diff --git a/tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts b/tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts index 38dc47f3207..609a70a2013 100644 --- a/tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts +++ b/tests/cases/conformance/dynamicImport/importCallExpressionGrammarError.ts @@ -10,5 +10,4 @@ import(...["PathModule"]); var p1 = import(...a); const p2 = import(); -const p3 = import(,); const p4 = import("pathToModule", "secondModule"); \ No newline at end of file diff --git a/tests/cases/fourslash/signatureHelpOnOverloadsDifferentArity3.ts b/tests/cases/fourslash/signatureHelpOnOverloadsDifferentArity3.ts index b98cfe6bbfe..d445997338b 100644 --- a/tests/cases/fourslash/signatureHelpOnOverloadsDifferentArity3.ts +++ b/tests/cases/fourslash/signatureHelpOnOverloadsDifferentArity3.ts @@ -13,14 +13,14 @@ verify.currentSignatureHelpIs("f(): any"); verify.currentSignatureParameterCountIs(0); verify.signatureHelpArgumentCountIs(0); -edit.insert(", "); +edit.insert("x, "); verify.signatureHelpCountIs(4); verify.currentSignatureHelpIs("f(s: string, b: boolean): any"); verify.currentSignatureParameterCountIs(2); verify.currentParameterHelpArgumentNameIs("b"); verify.currentParameterSpanIs("b: boolean"); -edit.insert(", "); +edit.insert("x, "); verify.signatureHelpCountIs(4); verify.currentSignatureHelpIs("f(s: string, b: boolean): any"); verify.currentSignatureParameterCountIs(2); \ No newline at end of file