Skip to content

Commit 4c118ae

Browse files
authored
fix(39022): wrap export references UnaryExpression to ParenthesizedExpression (microsoft#41156)
1 parent e231821 commit 4c118ae

File tree

6 files changed

+176
-5
lines changed

6 files changed

+176
-5
lines changed

src/compiler/transformers/module/module.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1874,9 +1874,8 @@ namespace ts {
18741874
for (const exportName of exportedNames) {
18751875
// Mark the node to prevent triggering this rule again.
18761876
noSubstitution[getNodeId(expression)] = true;
1877-
expression = createExportExpression(exportName, expression);
1877+
expression = factory.createParenthesizedExpression(createExportExpression(exportName, expression));
18781878
}
1879-
18801879
return expression;
18811880
}
18821881
}

tests/baselines/reference/es6ExportClauseWithAssignmentInEs5.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@ exports.buzz = buzz;
3232
exports.buzz = buzz += 3;
3333
var bizz = 8;
3434
exports.bizz = bizz;
35-
exports.bizz = bizz += 1; // compiles to exports.bizz = bizz += 1
36-
exports.bizz = bizz -= 1; // similarly
37-
exports.bizz = ++bizz; // compiles to exports.bizz = ++bizz
35+
(exports.bizz = bizz += 1); // compiles to exports.bizz = bizz += 1
36+
(exports.bizz = bizz -= 1); // similarly
37+
(exports.bizz = ++bizz); // compiles to exports.bizz = ++bizz
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//// [moduleExportsUnaryExpression.ts]
2+
let x = 1;
3+
4+
export function foo(y: number) {
5+
if (y <= x++) return y <= x++;
6+
if (y <= x--) return y <= x--;
7+
if (y <= ++x) return y <= ++x;
8+
if (y <= --x) return y <= --x;
9+
10+
x++;
11+
x--;
12+
++x;
13+
--x;
14+
}
15+
16+
export { x };
17+
18+
19+
//// [moduleExportsUnaryExpression.js]
20+
"use strict";
21+
exports.__esModule = true;
22+
exports.x = exports.foo = void 0;
23+
var x = 1;
24+
exports.x = x;
25+
function foo(y) {
26+
if (y <= (exports.x = x += 1))
27+
return y <= (exports.x = x += 1);
28+
if (y <= (exports.x = x -= 1))
29+
return y <= (exports.x = x -= 1);
30+
if (y <= (exports.x = ++x))
31+
return y <= (exports.x = ++x);
32+
if (y <= (exports.x = --x))
33+
return y <= (exports.x = --x);
34+
(exports.x = x += 1);
35+
(exports.x = x -= 1);
36+
(exports.x = ++x);
37+
(exports.x = --x);
38+
}
39+
exports.foo = foo;
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
=== tests/cases/compiler/moduleExportsUnaryExpression.ts ===
2+
let x = 1;
3+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
4+
5+
export function foo(y: number) {
6+
>foo : Symbol(foo, Decl(moduleExportsUnaryExpression.ts, 0, 10))
7+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
8+
9+
if (y <= x++) return y <= x++;
10+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
11+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
12+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
13+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
14+
15+
if (y <= x--) return y <= x--;
16+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
17+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
18+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
19+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
20+
21+
if (y <= ++x) return y <= ++x;
22+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
23+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
24+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
25+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
26+
27+
if (y <= --x) return y <= --x;
28+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
29+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
30+
>y : Symbol(y, Decl(moduleExportsUnaryExpression.ts, 2, 20))
31+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
32+
33+
x++;
34+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
35+
36+
x--;
37+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
38+
39+
++x;
40+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
41+
42+
--x;
43+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 0, 3))
44+
}
45+
46+
export { x };
47+
>x : Symbol(x, Decl(moduleExportsUnaryExpression.ts, 14, 8))
48+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
=== tests/cases/compiler/moduleExportsUnaryExpression.ts ===
2+
let x = 1;
3+
>x : number
4+
>1 : 1
5+
6+
export function foo(y: number) {
7+
>foo : (y: number) => boolean
8+
>y : number
9+
10+
if (y <= x++) return y <= x++;
11+
>y <= x++ : boolean
12+
>y : number
13+
>x++ : number
14+
>x : number
15+
>y <= x++ : boolean
16+
>y : number
17+
>x++ : number
18+
>x : number
19+
20+
if (y <= x--) return y <= x--;
21+
>y <= x-- : boolean
22+
>y : number
23+
>x-- : number
24+
>x : number
25+
>y <= x-- : boolean
26+
>y : number
27+
>x-- : number
28+
>x : number
29+
30+
if (y <= ++x) return y <= ++x;
31+
>y <= ++x : boolean
32+
>y : number
33+
>++x : number
34+
>x : number
35+
>y <= ++x : boolean
36+
>y : number
37+
>++x : number
38+
>x : number
39+
40+
if (y <= --x) return y <= --x;
41+
>y <= --x : boolean
42+
>y : number
43+
>--x : number
44+
>x : number
45+
>y <= --x : boolean
46+
>y : number
47+
>--x : number
48+
>x : number
49+
50+
x++;
51+
>x++ : number
52+
>x : number
53+
54+
x--;
55+
>x-- : number
56+
>x : number
57+
58+
++x;
59+
>++x : number
60+
>x : number
61+
62+
--x;
63+
>--x : number
64+
>x : number
65+
}
66+
67+
export { x };
68+
>x : number
69+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// @module: commonjs
2+
let x = 1;
3+
4+
export function foo(y: number) {
5+
if (y <= x++) return y <= x++;
6+
if (y <= x--) return y <= x--;
7+
if (y <= ++x) return y <= ++x;
8+
if (y <= --x) return y <= --x;
9+
10+
x++;
11+
x--;
12+
++x;
13+
--x;
14+
}
15+
16+
export { x };

0 commit comments

Comments
 (0)