Skip to content

Commit

Permalink
fix(48653): throw an error on an invalid optional chain from new expr…
Browse files Browse the repository at this point in the history
…ession (#48656)
  • Loading branch information
a-tarasyuk committed Jun 2, 2022
1 parent c6447f9 commit 2cb8ee2
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/compiler/diagnosticMessages.json
Expand Up @@ -651,6 +651,10 @@
"category": "Error",
"code": 1208
},
"Invalid optional chain from new expression. Did you mean to call '{0}()'?": {
"category": "Error",
"code": 1209
},
"Code contained in a class is evaluated in JavaScript's strict mode which does not allow this use of '{0}'. For more information, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode.": {
"category": "Error",
"code": 1210
Expand Down
3 changes: 3 additions & 0 deletions src/compiler/parser.ts
Expand Up @@ -5942,6 +5942,9 @@ namespace ts {
typeArguments = (expression as ExpressionWithTypeArguments).typeArguments;
expression = (expression as ExpressionWithTypeArguments).expression;
}
if (token() === SyntaxKind.QuestionDotToken) {
parseErrorAtCurrentToken(Diagnostics.Invalid_optional_chain_from_new_expression_Did_you_mean_to_call_0, getTextOfNodeFromSourceText(sourceText, expression));
}
const argumentList = token() === SyntaxKind.OpenParenToken ? parseArgumentList() : undefined;
return finishNode(factory.createNewExpression(expression, typeArguments, argumentList), pos);
}
Expand Down
@@ -0,0 +1,13 @@
tests/cases/compiler/invalidOptionalChainFromNewExpression.ts(5,6): error TS1209: Invalid optional chain from new expression. Did you mean to call 'A()'?


==== tests/cases/compiler/invalidOptionalChainFromNewExpression.ts (1 errors) ====
class A {
b() {}
}

new A?.b() // error
~~
!!! error TS1209: Invalid optional chain from new expression. Did you mean to call 'A()'?
new A()?.b() // ok

19 changes: 19 additions & 0 deletions tests/baselines/reference/invalidOptionalChainFromNewExpression.js
@@ -0,0 +1,19 @@
//// [invalidOptionalChainFromNewExpression.ts]
class A {
b() {}
}

new A?.b() // error
new A()?.b() // ok


//// [invalidOptionalChainFromNewExpression.js]
var _a, _b;
var A = /** @class */ (function () {
function A() {
}
A.prototype.b = function () { };
return A;
}());
(_a = new A) === null || _a === void 0 ? void 0 : _a.b(); // error
(_b = new A()) === null || _b === void 0 ? void 0 : _b.b(); // ok
@@ -0,0 +1,18 @@
=== tests/cases/compiler/invalidOptionalChainFromNewExpression.ts ===
class A {
>A : Symbol(A, Decl(invalidOptionalChainFromNewExpression.ts, 0, 0))

b() {}
>b : Symbol(A.b, Decl(invalidOptionalChainFromNewExpression.ts, 0, 9))
}

new A?.b() // error
>new A?.b : Symbol(A.b, Decl(invalidOptionalChainFromNewExpression.ts, 0, 9))
>A : Symbol(A, Decl(invalidOptionalChainFromNewExpression.ts, 0, 0))
>b : Symbol(A.b, Decl(invalidOptionalChainFromNewExpression.ts, 0, 9))

new A()?.b() // ok
>new A()?.b : Symbol(A.b, Decl(invalidOptionalChainFromNewExpression.ts, 0, 9))
>A : Symbol(A, Decl(invalidOptionalChainFromNewExpression.ts, 0, 0))
>b : Symbol(A.b, Decl(invalidOptionalChainFromNewExpression.ts, 0, 9))

@@ -0,0 +1,22 @@
=== tests/cases/compiler/invalidOptionalChainFromNewExpression.ts ===
class A {
>A : A

b() {}
>b : () => void
}

new A?.b() // error
>new A?.b() : void
>new A?.b : () => void
>new A : A
>A : typeof A
>b : () => void

new A()?.b() // ok
>new A()?.b() : void
>new A()?.b : () => void
>new A() : A
>A : typeof A
>b : () => void

6 changes: 6 additions & 0 deletions tests/cases/compiler/invalidOptionalChainFromNewExpression.ts
@@ -0,0 +1,6 @@
class A {
b() {}
}

new A?.b() // error
new A()?.b() // ok

0 comments on commit 2cb8ee2

Please sign in to comment.