Skip to content

Commit 575863c

Browse files
Avoid unnecessary parens around sequence expressions (#16722)
* Add test * Avoid unnecessary parens around sequence expressions * Fix test * Re-build `@babel/runtime`
1 parent 14308d3 commit 575863c

File tree

117 files changed

+431
-400
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

117 files changed

+431
-400
lines changed

packages/babel-generator/src/node/parentheses.ts

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
isObjectPattern,
99
isOptionalMemberExpression,
1010
isYieldExpression,
11+
isStatement,
1112
} from "@babel/types";
1213
import type * as t from "@babel/types";
1314

@@ -289,25 +290,18 @@ export function SequenceExpression(
289290
): boolean {
290291
const parentType = parent.type;
291292
if (
292-
// Although parentheses wouldn't hurt around sequence
293-
// expressions in the head of for loops, traditional style
294-
// dictates that e.g. i++, j++ should not be wrapped with
295-
// parentheses.
296-
parentType === "ForStatement" ||
297-
parentType === "ThrowStatement" ||
298-
parentType === "ReturnStatement" ||
299-
(parentType === "IfStatement" && parent.test === node) ||
300-
(parentType === "WhileStatement" && parent.test === node) ||
301-
(parentType === "ForInStatement" && parent.right === node) ||
302-
(parentType === "SwitchStatement" && parent.discriminant === node) ||
303-
(parentType === "ExpressionStatement" && parent.expression === node)
293+
parentType === "SequenceExpression" ||
294+
parentType === "ParenthesizedExpression" ||
295+
(parentType === "MemberExpression" && parent.property === node) ||
296+
(parentType === "OptionalMemberExpression" && parent.property === node) ||
297+
parentType === "TemplateLiteral"
304298
) {
305299
return false;
306300
}
307-
308-
// Otherwise err on the side of overparenthesization, adding
309-
// explicit exceptions above if this proves overzealous.
310-
return true;
301+
if (parentType === "ClassDeclaration" || parentType === "ClassExpression") {
302+
return parent.superClass === node;
303+
}
304+
return !isStatement(parent);
311305
}
312306

313307
export function YieldExpression(
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function foo() {
2+
return a, b;
3+
}
4+
5+
if (a, b, c) d();
6+
7+
throw a, b, c;
8+
9+
switch (a, b, c) {}
10+
11+
for (a in b, c);
12+
13+
while (a, b, c);
14+
15+
!(function () {})(), a();
16+
17+
(a, b), c;
18+
a, (b, c);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"parserOpts": { "createParenthesizedExpressions": true }
3+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
function foo() {
2+
return a, b;
3+
}
4+
if (a, b, c) d();
5+
throw a, b, c;
6+
switch (a, b, c) {}
7+
for (a in b, c);
8+
while (a, b, c);
9+
!(function () {})(), a();
10+
(a, b), c;
11+
a, (b, c);

packages/babel-generator/test/fixtures/parentheses/sequence-expressions/input.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ for (a in b, c);
1313
while (a, b, c);
1414

1515
!(function () {})(), a();
16+
17+
(a, b), c;
18+
a, (b, c);

packages/babel-generator/test/fixtures/parentheses/sequence-expressions/output.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ throw a, b, c;
66
switch (a, b, c) {}
77
for (a in b, c);
88
while (a, b, c);
9-
!function () {}(), a();
9+
!function () {}(), a();
10+
a, b, c;
11+
a, b, c;

packages/babel-plugin-proposal-decorators/test/fixtures/2018-09-transformation/initialize-after-super-expression/output.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ let B = babelHelpers.decorate([dec], function (_initialize, _A) {
33

44
class B extends _A {
55
constructor() {
6-
0, (super(), _initialize(this), this);
6+
0, super(), _initialize(this), this;
77
}
88
}
99
return {
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,51 @@
11
var _Class, _A3, _Class2, _C3, _Class3, _D3, _Class4, _Class5, _Class6, _G3, _Class7, _Class8, _Class9, _H3, _Class10, _K3;
22
let _initClass, _A, _A2, _initClass2, _C, _C2, _initClass3, _D, _D2, _initClass4, _decorated_class, _ref, _initClass5, _G, _G2, _initClass6, _decorated_class2, _ref2, _initClass7, _H, _H2, _initClass8, _K, _K2;
33
const dec = () => {};
4-
const A = (new (_A2 = (_A3 = class A {}, [_A, _initClass] = babelHelpers.applyDecs(_A3, [], [dec]), _A3), (_Class = class extends babelHelpers.identity {
4+
const A = (new (_A2 = (_A3 = class A {}, [_A, _initClass] = babelHelpers.applyDecs(_A3, [], [dec]), _A3), _Class = class extends babelHelpers.identity {
55
constructor() {
66
super(_A), (() => {})(), _initClass();
77
}
8-
}, babelHelpers.defineProperty(_Class, _A2, void 0), _Class))(), _A);
9-
const B = (new (_C2 = (_C3 = class C {}, [_C, _initClass2] = babelHelpers.applyDecs(_C3, [], [dec]), _C3), (_Class2 = class extends babelHelpers.identity {
8+
}, babelHelpers.defineProperty(_Class, _A2, void 0), _Class)(), _A);
9+
const B = (new (_C2 = (_C3 = class C {}, [_C, _initClass2] = babelHelpers.applyDecs(_C3, [], [dec]), _C3), _Class2 = class extends babelHelpers.identity {
1010
constructor() {
1111
super(_C), (() => {})(), _initClass2();
1212
}
13-
}, babelHelpers.defineProperty(_Class2, _C2, void 0), _Class2))(), _C);
14-
const D = (new (_D2 = (_D3 = class D {}, [_D, _initClass3] = babelHelpers.applyDecs(_D3, [], [dec]), _D3), (_Class3 = class extends babelHelpers.identity {
13+
}, babelHelpers.defineProperty(_Class2, _C2, void 0), _Class2)(), _C);
14+
const D = (new (_D2 = (_D3 = class D {}, [_D, _initClass3] = babelHelpers.applyDecs(_D3, [], [dec]), _D3), _Class3 = class extends babelHelpers.identity {
1515
constructor() {
1616
super(_D), (() => {})(), _initClass3();
1717
}
18-
}, babelHelpers.defineProperty(_Class3, _D2, void 0), _Class3))(), _D);
19-
const E = ((new (_ref = (_Class5 = class _ref {}, [_decorated_class, _initClass4] = babelHelpers.applyDecs(_Class5, [], [dec]), _Class5), (_Class4 = class extends babelHelpers.identity {
18+
}, babelHelpers.defineProperty(_Class3, _D2, void 0), _Class3)(), _D);
19+
const E = (new (_ref = (_Class5 = class _ref {}, [_decorated_class, _initClass4] = babelHelpers.applyDecs(_Class5, [], [dec]), _Class5), _Class4 = class extends babelHelpers.identity {
2020
constructor() {
2121
super(_decorated_class), (() => {})(), _initClass4();
2222
}
23-
}, babelHelpers.defineProperty(_Class4, _ref, void 0), _Class4))(), _decorated_class), 123);
24-
const F = [(new (_G2 = (_G3 = class G {}, [_G, _initClass5] = babelHelpers.applyDecs(_G3, [], [dec]), _G3), (_Class6 = class extends babelHelpers.identity {
23+
}, babelHelpers.defineProperty(_Class4, _ref, void 0), _Class4)(), _decorated_class, 123);
24+
const F = [(new (_G2 = (_G3 = class G {}, [_G, _initClass5] = babelHelpers.applyDecs(_G3, [], [dec]), _G3), _Class6 = class extends babelHelpers.identity {
2525
constructor() {
2626
super(_G), (() => {})(), _initClass5();
2727
}
28-
}, babelHelpers.defineProperty(_Class6, _G2, void 0), _Class6))(), _G), (new (_ref2 = (_Class8 = class _ref2 {}, [_decorated_class2, _initClass6] = babelHelpers.applyDecs(_Class8, [], [dec]), _Class8), (_Class7 = class extends babelHelpers.identity {
28+
}, babelHelpers.defineProperty(_Class6, _G2, void 0), _Class6)(), _G), (new (_ref2 = (_Class8 = class _ref2 {}, [_decorated_class2, _initClass6] = babelHelpers.applyDecs(_Class8, [], [dec]), _Class8), _Class7 = class extends babelHelpers.identity {
2929
constructor() {
3030
super(_decorated_class2), (() => {})(), _initClass6();
3131
}
32-
}, babelHelpers.defineProperty(_Class7, _ref2, void 0), _Class7))(), _decorated_class2)];
33-
const H = (new (_H2 = (_H3 = class H extends I {}, [_H, _initClass7] = babelHelpers.applyDecs(_H3, [], [dec]), _H3), (_Class9 = class extends babelHelpers.identity {
32+
}, babelHelpers.defineProperty(_Class7, _ref2, void 0), _Class7)(), _decorated_class2)];
33+
const H = (new (_H2 = (_H3 = class H extends I {}, [_H, _initClass7] = babelHelpers.applyDecs(_H3, [], [dec]), _H3), _Class9 = class extends babelHelpers.identity {
3434
constructor() {
3535
super(_H), (() => {})(), _initClass7();
3636
}
37-
}, babelHelpers.defineProperty(_Class9, _H2, void 0), _Class9))(), _H);
38-
const J = (new (_K2 = (_K3 = class K extends L {}, [_K, _initClass8] = babelHelpers.applyDecs(_K3, [], [dec]), _K3), (_Class10 = class extends babelHelpers.identity {
37+
}, babelHelpers.defineProperty(_Class9, _H2, void 0), _Class9)(), _H);
38+
const J = (new (_K2 = (_K3 = class K extends L {}, [_K, _initClass8] = babelHelpers.applyDecs(_K3, [], [dec]), _K3), _Class10 = class extends babelHelpers.identity {
3939
constructor() {
4040
super(_K), (() => {})(), _initClass8();
4141
}
42-
}, babelHelpers.defineProperty(_Class10, _K2, void 0), _Class10))(), _K);
42+
}, babelHelpers.defineProperty(_Class10, _K2, void 0), _Class10)(), _K);
4343
function classFactory() {
4444
var _Class11, _Class12;
4545
let _initClass9, _decorated_class3, _ref3;
46-
return new (_ref3 = (_Class12 = class _ref3 {}, [_decorated_class3, _initClass9] = babelHelpers.applyDecs(_Class12, [], [dec]), _Class12), (_Class11 = class extends babelHelpers.identity {
46+
return new (_ref3 = (_Class12 = class _ref3 {}, [_decorated_class3, _initClass9] = babelHelpers.applyDecs(_Class12, [], [dec]), _Class12), _Class11 = class extends babelHelpers.identity {
4747
constructor() {
4848
super(_decorated_class3), (() => {})(), _initClass9();
4949
}
50-
}, babelHelpers.defineProperty(_Class11, _ref3, void 0), _Class11))(), _decorated_class3;
50+
}, babelHelpers.defineProperty(_Class11, _ref3, void 0), _Class11)(), _decorated_class3;
5151
}
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
var _A2, _C2, _D2, _Class, _G2, _Class2, _H2, _K2;
22
let _initClass, _A, _initClass2, _C, _initClass3, _D, _initClass4, _decorated_class, _initClass5, _G, _initClass6, _decorated_class2, _initClass7, _H, _initClass8, _K;
33
const dec = () => {};
4-
const A = ((_A2 = class A {}, [_A, _initClass] = babelHelpers.applyDecs(_A2, [], [dec]), _initClass()), _A);
5-
const B = ((_C2 = class C {}, [_C, _initClass2] = babelHelpers.applyDecs(_C2, [], [dec]), _initClass2()), _C);
6-
const D = ((_D2 = class D {}, [_D, _initClass3] = babelHelpers.applyDecs(_D2, [], [dec]), _initClass3()), _D);
7-
const E = (((_Class = class {}, [_decorated_class, _initClass4] = babelHelpers.applyDecs(_Class, [], [dec]), _initClass4()), _decorated_class), 123);
8-
const F = [((_G2 = class G {}, [_G, _initClass5] = babelHelpers.applyDecs(_G2, [], [dec]), _initClass5()), _G), ((_Class2 = class {}, [_decorated_class2, _initClass6] = babelHelpers.applyDecs(_Class2, [], [dec]), _initClass6()), _decorated_class2)];
9-
const H = ((_H2 = class H extends I {}, [_H, _initClass7] = babelHelpers.applyDecs(_H2, [], [dec]), _initClass7()), _H);
10-
const J = ((_K2 = class K extends L {}, [_K, _initClass8] = babelHelpers.applyDecs(_K2, [], [dec]), _initClass8()), _K);
4+
const A = (_A2 = class A {}, [_A, _initClass] = babelHelpers.applyDecs(_A2, [], [dec]), _initClass(), _A);
5+
const B = (_C2 = class C {}, [_C, _initClass2] = babelHelpers.applyDecs(_C2, [], [dec]), _initClass2(), _C);
6+
const D = (_D2 = class D {}, [_D, _initClass3] = babelHelpers.applyDecs(_D2, [], [dec]), _initClass3(), _D);
7+
const E = (_Class = class {}, [_decorated_class, _initClass4] = babelHelpers.applyDecs(_Class, [], [dec]), _initClass4(), _decorated_class, 123);
8+
const F = [(_G2 = class G {}, [_G, _initClass5] = babelHelpers.applyDecs(_G2, [], [dec]), _initClass5(), _G), (_Class2 = class {}, [_decorated_class2, _initClass6] = babelHelpers.applyDecs(_Class2, [], [dec]), _initClass6(), _decorated_class2)];
9+
const H = (_H2 = class H extends I {}, [_H, _initClass7] = babelHelpers.applyDecs(_H2, [], [dec]), _initClass7(), _H);
10+
const J = (_K2 = class K extends L {}, [_K, _initClass8] = babelHelpers.applyDecs(_K2, [], [dec]), _initClass8(), _K);
1111
function classFactory() {
1212
var _Class3;
1313
let _initClass9, _decorated_class3;
14-
return (_Class3 = class {}, [_decorated_class3, _initClass9] = babelHelpers.applyDecs(_Class3, [], [dec]), _initClass9()), _decorated_class3;
14+
return _Class3 = class {}, [_decorated_class3, _initClass9] = babelHelpers.applyDecs(_Class3, [], [dec]), _initClass9(), _decorated_class3;
1515
}

packages/babel-plugin-proposal-decorators/test/fixtures/2021-12-classes--to-es2015/initializers/output.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ var _Class, _Foo3, _Class2, _Bar3;
22
let _initClass, _Foo2, _initClass2, _Bar2;
33
const dec = () => {};
44
let _Foo;
5-
new (_Foo2 = (_Foo3 = class Foo {}, [_Foo, _initClass] = babelHelpers.applyDecs(_Foo3, [], [dec]), _Foo3), (_Class = class extends babelHelpers.identity {
5+
new (_Foo2 = (_Foo3 = class Foo {}, [_Foo, _initClass] = babelHelpers.applyDecs(_Foo3, [], [dec]), _Foo3), _Class = class extends babelHelpers.identity {
66
constructor() {
7-
(super(_Foo), babelHelpers.defineProperty(this, "field", 123)), _initClass();
7+
super(_Foo), babelHelpers.defineProperty(this, "field", 123), _initClass();
88
}
9-
}, babelHelpers.defineProperty(_Class, _Foo2, void 0), _Class))();
9+
}, babelHelpers.defineProperty(_Class, _Foo2, void 0), _Class)();
1010
let _Bar;
11-
new (_Bar2 = (_Bar3 = class Bar extends _Foo {}, [_Bar, _initClass2] = babelHelpers.applyDecs(_Bar3, [], [dec]), _Bar3), (_Class2 = class extends babelHelpers.identity {
11+
new (_Bar2 = (_Bar3 = class Bar extends _Foo {}, [_Bar, _initClass2] = babelHelpers.applyDecs(_Bar3, [], [dec]), _Bar3), _Class2 = class extends babelHelpers.identity {
1212
constructor() {
13-
(super(_Bar), babelHelpers.defineProperty(this, "field", ((() => {
13+
super(_Bar), babelHelpers.defineProperty(this, "field", ((() => {
1414
this.otherField = 456;
15-
})(), 123))), _initClass2();
15+
})(), 123)), _initClass2();
1616
}
17-
}, babelHelpers.defineProperty(_Class2, _Bar2, void 0), _Class2))();
17+
}, babelHelpers.defineProperty(_Class2, _Bar2, void 0), _Class2)();

0 commit comments

Comments
 (0)