Skip to content

Commit

Permalink
fix: new (foo?.bar)() incorrectly throws exception `OptionalChainin…
Browse files Browse the repository at this point in the history
…gNoNew` (#15377)

Fixes #15376
  • Loading branch information
liuxingbaoyu committed Jan 30, 2023
1 parent 90ad7e9 commit 41aac8b
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 1 deletion.
5 changes: 4 additions & 1 deletion packages/babel-parser/src/parser/expression.ts
Expand Up @@ -1918,7 +1918,10 @@ export default abstract class ExpressionParser extends LValParser {
node.callee = this.parseNoCallExpr();
if (node.callee.type === "Import") {
this.raise(Errors.ImportCallNotNewExpression, { at: node.callee });
} else if (this.isOptionalChain(node.callee)) {
} else if (
this.isOptionalChain(node.callee) &&
!node.callee.extra?.parenthesized
) {
this.raise(Errors.OptionalChainingNoNew, {
at: this.state.lastTokEndLoc,
});
Expand Down
@@ -0,0 +1 @@
new (foo?.bar)();
@@ -0,0 +1,3 @@
{
"createParenthesizedExpressions": true
}
@@ -0,0 +1,42 @@
{
"type": "File",
"start":0,"end":17,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":17,"index":17}},
"program": {
"type": "Program",
"start":0,"end":17,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":17,"index":17}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ExpressionStatement",
"start":0,"end":17,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":17,"index":17}},
"expression": {
"type": "NewExpression",
"start":0,"end":16,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":16,"index":16}},
"callee": {
"type": "ParenthesizedExpression",
"start":4,"end":14,"loc":{"start":{"line":1,"column":4,"index":4},"end":{"line":1,"column":14,"index":14}},
"expression": {
"type": "OptionalMemberExpression",
"start":5,"end":13,"loc":{"start":{"line":1,"column":5,"index":5},"end":{"line":1,"column":13,"index":13}},
"object": {
"type": "Identifier",
"start":5,"end":8,"loc":{"start":{"line":1,"column":5,"index":5},"end":{"line":1,"column":8,"index":8},"identifierName":"foo"},
"name": "foo"
},
"computed": false,
"property": {
"type": "Identifier",
"start":10,"end":13,"loc":{"start":{"line":1,"column":10,"index":10},"end":{"line":1,"column":13,"index":13},"identifierName":"bar"},
"name": "bar"
},
"optional": true
}
},
"arguments": []
}
}
],
"directives": []
}
}
@@ -0,0 +1,4 @@
new foo?.bar();
new foo.bar?.();

new (foo?.bar)();
@@ -0,0 +1,3 @@
{
"createParenthesizedExpressions": false
}
@@ -0,0 +1,95 @@
{
"type": "File",
"start":0,"end":51,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":4,"column":17,"index":51}},
"errors": [
"SyntaxError: Constructors in/after an Optional Chain are not allowed. (1:12)",
"SyntaxError: Constructors in/after an Optional Chain are not allowed. (2:13)"
],
"program": {
"type": "Program",
"start":0,"end":51,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":4,"column":17,"index":51}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ExpressionStatement",
"start":0,"end":15,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":15,"index":15}},
"expression": {
"type": "NewExpression",
"start":0,"end":14,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":14,"index":14}},
"callee": {
"type": "OptionalMemberExpression",
"start":4,"end":12,"loc":{"start":{"line":1,"column":4,"index":4},"end":{"line":1,"column":12,"index":12}},
"object": {
"type": "Identifier",
"start":4,"end":7,"loc":{"start":{"line":1,"column":4,"index":4},"end":{"line":1,"column":7,"index":7},"identifierName":"foo"},
"name": "foo"
},
"computed": false,
"property": {
"type": "Identifier",
"start":9,"end":12,"loc":{"start":{"line":1,"column":9,"index":9},"end":{"line":1,"column":12,"index":12},"identifierName":"bar"},
"name": "bar"
},
"optional": true
},
"arguments": []
}
},
{
"type": "ExpressionStatement",
"start":16,"end":32,"loc":{"start":{"line":2,"column":0,"index":16},"end":{"line":2,"column":16,"index":32}},
"expression": {
"type": "NewExpression",
"start":16,"end":31,"loc":{"start":{"line":2,"column":0,"index":16},"end":{"line":2,"column":15,"index":31}},
"callee": {
"type": "MemberExpression",
"start":20,"end":27,"loc":{"start":{"line":2,"column":4,"index":20},"end":{"line":2,"column":11,"index":27}},
"object": {
"type": "Identifier",
"start":20,"end":23,"loc":{"start":{"line":2,"column":4,"index":20},"end":{"line":2,"column":7,"index":23},"identifierName":"foo"},
"name": "foo"
},
"computed": false,
"property": {
"type": "Identifier",
"start":24,"end":27,"loc":{"start":{"line":2,"column":8,"index":24},"end":{"line":2,"column":11,"index":27},"identifierName":"bar"},
"name": "bar"
}
},
"arguments": []
}
},
{
"type": "ExpressionStatement",
"start":34,"end":51,"loc":{"start":{"line":4,"column":0,"index":34},"end":{"line":4,"column":17,"index":51}},
"expression": {
"type": "NewExpression",
"start":34,"end":50,"loc":{"start":{"line":4,"column":0,"index":34},"end":{"line":4,"column":16,"index":50}},
"callee": {
"type": "OptionalMemberExpression",
"start":39,"end":47,"loc":{"start":{"line":4,"column":5,"index":39},"end":{"line":4,"column":13,"index":47}},
"object": {
"type": "Identifier",
"start":39,"end":42,"loc":{"start":{"line":4,"column":5,"index":39},"end":{"line":4,"column":8,"index":42},"identifierName":"foo"},
"name": "foo"
},
"computed": false,
"property": {
"type": "Identifier",
"start":44,"end":47,"loc":{"start":{"line":4,"column":10,"index":44},"end":{"line":4,"column":13,"index":47},"identifierName":"bar"},
"name": "bar"
},
"optional": true,
"extra": {
"parenthesized": true,
"parenStart": 38
}
},
"arguments": []
}
}
],
"directives": []
}
}

0 comments on commit 41aac8b

Please sign in to comment.