From 8615eecfc15b00d132c0fc140768f5eeaeee0abf Mon Sep 17 00:00:00 2001 From: Rustin <1196089730@qq.com> Date: Thu, 26 Mar 2020 03:37:46 +0800 Subject: [PATCH] Enhancement new expression with type arguments without parenthesized argument list error message (#37576) * Enhancement new expression with type arguments without parenthesized argument list error message Signed-off-by: Rustin-Liu * add baselines Signed-off-by: Rustin-Liu * use parseErrorAt Signed-off-by: Rustin-Liu * refine code Signed-off-by: Rustin-Liu * Space before paren Co-authored-by: Daniel Rosenwasser --- src/compiler/diagnosticMessages.json | 4 ++++ src/compiler/parser.ts | 5 ++++- .../reference/genericCallsWithoutParens.errors.txt | 6 +++--- tests/baselines/reference/genericCallsWithoutParens.js | 2 +- .../genericConstructExpressionWithoutArgs.errors.txt | 8 ++++---- .../reference/genericConstructExpressionWithoutArgs.js | 2 +- .../genericObjectCreationWithoutTypeArgs.errors.txt | 6 +++--- .../reference/genericObjectCreationWithoutTypeArgs.js | 2 +- .../baselines/reference/newOperatorErrorCases.errors.txt | 6 +++--- tests/baselines/reference/newOperatorErrorCases.js | 2 +- .../reference/parserConstructorAmbiguity3.errors.txt | 8 ++++---- tests/baselines/reference/parserConstructorAmbiguity3.js | 2 +- 12 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 2bbc21cd6f8..d0d7b1f7785 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1147,6 +1147,10 @@ "category": "Error", "code": 1383 }, + "A 'new' expression with type arguments must always be followed by a parenthesized argument list.": { + "category": "Error", + "code": 1384 + }, "The types of '{0}' are incompatible between these types.": { "category": "Error", diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 255fd183433..5194315ad92 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -5199,9 +5199,12 @@ namespace ts { const node = createNode(SyntaxKind.NewExpression, fullStart); node.expression = expression; node.typeArguments = typeArguments; - if (node.typeArguments || token() === SyntaxKind.OpenParenToken) { + if (token() === SyntaxKind.OpenParenToken) { node.arguments = parseArgumentList(); } + else if (node.typeArguments) { + parseErrorAt(fullStart, scanner.getStartPos(), Diagnostics.A_new_expression_with_type_arguments_must_always_be_followed_by_a_parenthesized_argument_list); + } return finishNode(node); } diff --git a/tests/baselines/reference/genericCallsWithoutParens.errors.txt b/tests/baselines/reference/genericCallsWithoutParens.errors.txt index 9883efb3783..aa53a586d88 100644 --- a/tests/baselines/reference/genericCallsWithoutParens.errors.txt +++ b/tests/baselines/reference/genericCallsWithoutParens.errors.txt @@ -1,5 +1,5 @@ tests/cases/compiler/genericCallsWithoutParens.ts(2,18): error TS1005: '(' expected. -tests/cases/compiler/genericCallsWithoutParens.ts(7,22): error TS1005: '(' expected. +tests/cases/compiler/genericCallsWithoutParens.ts(7,8): error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. ==== tests/cases/compiler/genericCallsWithoutParens.ts (2 errors) ==== @@ -12,7 +12,7 @@ tests/cases/compiler/genericCallsWithoutParens.ts(7,22): error TS1005: '(' expec foo: T; } var c = new C; // parse error - ~ -!!! error TS1005: '(' expected. + ~~~~~~~~~~~~~~ +!!! error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. \ No newline at end of file diff --git a/tests/baselines/reference/genericCallsWithoutParens.js b/tests/baselines/reference/genericCallsWithoutParens.js index f94001be166..99e29292e6a 100644 --- a/tests/baselines/reference/genericCallsWithoutParens.js +++ b/tests/baselines/reference/genericCallsWithoutParens.js @@ -17,4 +17,4 @@ var C = /** @class */ (function () { } return C; }()); -var c = new C(); // parse error +var c = new C; // parse error diff --git a/tests/baselines/reference/genericConstructExpressionWithoutArgs.errors.txt b/tests/baselines/reference/genericConstructExpressionWithoutArgs.errors.txt index 2f16241aa6c..9043b301399 100644 --- a/tests/baselines/reference/genericConstructExpressionWithoutArgs.errors.txt +++ b/tests/baselines/reference/genericConstructExpressionWithoutArgs.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/genericConstructExpressionWithoutArgs.ts(10,1): error TS1005: '(' expected. +tests/cases/compiler/genericConstructExpressionWithoutArgs.ts(9,9): error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. ==== tests/cases/compiler/genericConstructExpressionWithoutArgs.ts (1 errors) ==== @@ -11,6 +11,6 @@ tests/cases/compiler/genericConstructExpressionWithoutArgs.ts(10,1): error TS100 var c = new C // C var c2 = new C // error, type params are actually part of the arg list so you need both - - -!!! error TS1005: '(' expected. \ No newline at end of file + ~~~~~~~~~~~~~~ +!!! error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. + \ No newline at end of file diff --git a/tests/baselines/reference/genericConstructExpressionWithoutArgs.js b/tests/baselines/reference/genericConstructExpressionWithoutArgs.js index f0cc7f7d163..d83bc41ae54 100644 --- a/tests/baselines/reference/genericConstructExpressionWithoutArgs.js +++ b/tests/baselines/reference/genericConstructExpressionWithoutArgs.js @@ -23,4 +23,4 @@ var C = /** @class */ (function () { return C; }()); var c = new C; // C -var c2 = new C(); // error, type params are actually part of the arg list so you need both +var c2 = new C; // error, type params are actually part of the arg list so you need both diff --git a/tests/baselines/reference/genericObjectCreationWithoutTypeArgs.errors.txt b/tests/baselines/reference/genericObjectCreationWithoutTypeArgs.errors.txt index 825fec7fa72..f4ea0db74e4 100644 --- a/tests/baselines/reference/genericObjectCreationWithoutTypeArgs.errors.txt +++ b/tests/baselines/reference/genericObjectCreationWithoutTypeArgs.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/genericObjectCreationWithoutTypeArgs.ts(6,26): error TS1005: '(' expected. +tests/cases/compiler/genericObjectCreationWithoutTypeArgs.ts(6,9): error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. ==== tests/cases/compiler/genericObjectCreationWithoutTypeArgs.ts (1 errors) ==== @@ -8,8 +8,8 @@ tests/cases/compiler/genericObjectCreationWithoutTypeArgs.ts(6,26): error TS1005 var x1 = new SS(); // OK var x2 = new SS < number>; // Correctly give error - ~ -!!! error TS1005: '(' expected. + ~~~~~~~~~~~~~~~~~ +!!! error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. var x3 = new SS(); // OK var x4 = new SS; // Should be allowed, but currently give error ('supplied parameters do not match any signature of the call target') \ No newline at end of file diff --git a/tests/baselines/reference/genericObjectCreationWithoutTypeArgs.js b/tests/baselines/reference/genericObjectCreationWithoutTypeArgs.js index 04459125022..c0226ca9c41 100644 --- a/tests/baselines/reference/genericObjectCreationWithoutTypeArgs.js +++ b/tests/baselines/reference/genericObjectCreationWithoutTypeArgs.js @@ -16,6 +16,6 @@ var SS = /** @class */ (function () { return SS; }()); var x1 = new SS(); // OK -var x2 = new SS(); // Correctly give error +var x2 = new SS; // Correctly give error var x3 = new SS(); // OK var x4 = new SS; // Should be allowed, but currently give error ('supplied parameters do not match any signature of the call target') diff --git a/tests/baselines/reference/newOperatorErrorCases.errors.txt b/tests/baselines/reference/newOperatorErrorCases.errors.txt index c41efaac289..168fb886f61 100644 --- a/tests/baselines/reference/newOperatorErrorCases.errors.txt +++ b/tests/baselines/reference/newOperatorErrorCases.errors.txt @@ -1,6 +1,6 @@ tests/cases/conformance/expressions/newOperator/newOperatorErrorCases.ts(26,16): error TS1005: ',' expected. tests/cases/conformance/expressions/newOperator/newOperatorErrorCases.ts(26,16): error TS2695: Left side of comma operator is unused and has no side effects. -tests/cases/conformance/expressions/newOperator/newOperatorErrorCases.ts(31,23): error TS1005: '(' expected. +tests/cases/conformance/expressions/newOperator/newOperatorErrorCases.ts(31,9): error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. tests/cases/conformance/expressions/newOperator/newOperatorErrorCases.ts(36,9): error TS2350: Only a void function can be called with the 'new' keyword. @@ -40,8 +40,8 @@ tests/cases/conformance/expressions/newOperator/newOperatorErrorCases.ts(36,9): var c1 = new T; var c1: T<{}>; var c2 = new T; // Parse error - ~ -!!! error TS1005: '(' expected. + ~~~~~~~~~~~~~~ +!!! error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. // Construct expression of non-void returning function diff --git a/tests/baselines/reference/newOperatorErrorCases.js b/tests/baselines/reference/newOperatorErrorCases.js index f5735abdd06..e9292cd20ad 100644 --- a/tests/baselines/reference/newOperatorErrorCases.js +++ b/tests/baselines/reference/newOperatorErrorCases.js @@ -62,7 +62,7 @@ var b = new C0; // Generic construct expression with no parentheses var c1 = new T; var c1; -var c2 = new T(); // Parse error +var c2 = new T; // Parse error // Construct expression of non-void returning function function fnNumber() { return 32; } var s = new fnNumber(); // Error diff --git a/tests/baselines/reference/parserConstructorAmbiguity3.errors.txt b/tests/baselines/reference/parserConstructorAmbiguity3.errors.txt index cd58ed117f6..09677fcbb7a 100644 --- a/tests/baselines/reference/parserConstructorAmbiguity3.errors.txt +++ b/tests/baselines/reference/parserConstructorAmbiguity3.errors.txt @@ -1,13 +1,13 @@ +tests/cases/conformance/parser/ecmascript5/Generics/parserConstructorAmbiguity3.ts(1,1): error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. tests/cases/conformance/parser/ecmascript5/Generics/parserConstructorAmbiguity3.ts(1,10): error TS2304: Cannot find name 'A'. tests/cases/conformance/parser/ecmascript5/Generics/parserConstructorAmbiguity3.ts(1,10): error TS2558: Expected 0 type arguments, but got 1. -tests/cases/conformance/parser/ecmascript5/Generics/parserConstructorAmbiguity3.ts(1,12): error TS1005: '(' expected. ==== tests/cases/conformance/parser/ecmascript5/Generics/parserConstructorAmbiguity3.ts (3 errors) ==== new Date + ~~~~~~~~~~~ +!!! error TS1384: A 'new' expression with type arguments must always be followed by a parenthesized argument list. ~ !!! error TS2304: Cannot find name 'A'. ~ -!!! error TS2558: Expected 0 type arguments, but got 1. - -!!! error TS1005: '(' expected. \ No newline at end of file +!!! error TS2558: Expected 0 type arguments, but got 1. \ No newline at end of file diff --git a/tests/baselines/reference/parserConstructorAmbiguity3.js b/tests/baselines/reference/parserConstructorAmbiguity3.js index bc565c70a7a..1de126bef61 100644 --- a/tests/baselines/reference/parserConstructorAmbiguity3.js +++ b/tests/baselines/reference/parserConstructorAmbiguity3.js @@ -2,4 +2,4 @@ new Date //// [parserConstructorAmbiguity3.js] -new Date(); +new Date;