Skip to content

Commit 4a646c9

Browse files
authored
Fix parenthesization rules for yield (microsoft#37849)
1 parent 2a25901 commit 4a646c9

File tree

6 files changed

+116
-3
lines changed

6 files changed

+116
-3
lines changed

src/compiler/factoryPublic.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,9 +1555,11 @@ namespace ts {
15551555
export function createYield(expression?: Expression): YieldExpression;
15561556
export function createYield(asteriskToken: AsteriskToken | undefined, expression: Expression): YieldExpression;
15571557
export function createYield(asteriskTokenOrExpression?: AsteriskToken | undefined | Expression, expression?: Expression) {
1558+
const asteriskToken = asteriskTokenOrExpression && asteriskTokenOrExpression.kind === SyntaxKind.AsteriskToken ? <AsteriskToken>asteriskTokenOrExpression : undefined;
1559+
expression = asteriskTokenOrExpression && asteriskTokenOrExpression.kind !== SyntaxKind.AsteriskToken ? asteriskTokenOrExpression : expression;
15581560
const node = <YieldExpression>createSynthesizedNode(SyntaxKind.YieldExpression);
1559-
node.asteriskToken = asteriskTokenOrExpression && asteriskTokenOrExpression.kind === SyntaxKind.AsteriskToken ? <AsteriskToken>asteriskTokenOrExpression : undefined;
1560-
node.expression = asteriskTokenOrExpression && asteriskTokenOrExpression.kind !== SyntaxKind.AsteriskToken ? asteriskTokenOrExpression : expression;
1561+
node.asteriskToken = asteriskToken;
1562+
node.expression = expression && parenthesizeExpressionForList(expression);
15611563
return node;
15621564
}
15631565

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//// [tests/cases/conformance/dynamicImport/importCallExpressionInUMD5.ts] ////
2+
3+
//// [0.ts]
4+
export function foo() { return "foo"; }
5+
6+
//// [1.ts]
7+
// https://github.com/microsoft/TypeScript/issues/36780
8+
async function func() {
9+
const packageName = '.';
10+
const packageJson = await import(packageName + '/package.json');
11+
}
12+
13+
14+
//// [0.js]
15+
(function (factory) {
16+
if (typeof module === "object" && typeof module.exports === "object") {
17+
var v = factory(require, exports);
18+
if (v !== undefined) module.exports = v;
19+
}
20+
else if (typeof define === "function" && define.amd) {
21+
define(["require", "exports"], factory);
22+
}
23+
})(function (require, exports) {
24+
"use strict";
25+
Object.defineProperty(exports, "__esModule", { value: true });
26+
exports.foo = void 0;
27+
function foo() { return "foo"; }
28+
exports.foo = foo;
29+
});
30+
//// [1.js]
31+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
32+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
33+
return new (P || (P = Promise))(function (resolve, reject) {
34+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
35+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
36+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
37+
step((generator = generator.apply(thisArg, _arguments || [])).next());
38+
});
39+
};
40+
(function (factory) {
41+
if (typeof module === "object" && typeof module.exports === "object") {
42+
var v = factory(require, exports);
43+
if (v !== undefined) module.exports = v;
44+
}
45+
else if (typeof define === "function" && define.amd) {
46+
define(["require", "exports"], factory);
47+
}
48+
})(function (require, exports) {
49+
"use strict";
50+
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
51+
// https://github.com/microsoft/TypeScript/issues/36780
52+
function func() {
53+
return __awaiter(this, void 0, void 0, function* () {
54+
var _a;
55+
const packageName = '.';
56+
const packageJson = yield (_a = packageName + '/package.json', __syncRequire ? Promise.resolve().then(() => require(_a)) : new Promise((resolve_1, reject_1) => { require([_a], resolve_1, reject_1); }));
57+
});
58+
}
59+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
=== tests/cases/conformance/dynamicImport/0.ts ===
2+
export function foo() { return "foo"; }
3+
>foo : Symbol(foo, Decl(0.ts, 0, 0))
4+
5+
=== tests/cases/conformance/dynamicImport/1.ts ===
6+
// https://github.com/microsoft/TypeScript/issues/36780
7+
async function func() {
8+
>func : Symbol(func, Decl(1.ts, 0, 0))
9+
10+
const packageName = '.';
11+
>packageName : Symbol(packageName, Decl(1.ts, 2, 9))
12+
13+
const packageJson = await import(packageName + '/package.json');
14+
>packageJson : Symbol(packageJson, Decl(1.ts, 3, 9))
15+
>packageName : Symbol(packageName, Decl(1.ts, 2, 9))
16+
}
17+
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== tests/cases/conformance/dynamicImport/0.ts ===
2+
export function foo() { return "foo"; }
3+
>foo : () => string
4+
>"foo" : "foo"
5+
6+
=== tests/cases/conformance/dynamicImport/1.ts ===
7+
// https://github.com/microsoft/TypeScript/issues/36780
8+
async function func() {
9+
>func : () => Promise<void>
10+
11+
const packageName = '.';
12+
>packageName : "."
13+
>'.' : "."
14+
15+
const packageJson = await import(packageName + '/package.json');
16+
>packageJson : any
17+
>await import(packageName + '/package.json') : any
18+
>import(packageName + '/package.json') : Promise<any>
19+
>packageName + '/package.json' : string
20+
>packageName : "."
21+
>'/package.json' : "/package.json"
22+
}
23+

tests/baselines/reference/importCallExpressionNestedUMD.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
4646
function foo() {
4747
return __awaiter(this, void 0, void 0, function* () {
4848
var _a;
49-
return yield _a = (yield __syncRequire ? Promise.resolve().then(() => require("./foo")) : new Promise((resolve_1, reject_1) => { require(["./foo"], resolve_1, reject_1); })).default, __syncRequire ? Promise.resolve().then(() => require(_a)) : new Promise((resolve_2, reject_2) => { require([_a], resolve_2, reject_2); });
49+
return yield (_a = (yield __syncRequire ? Promise.resolve().then(() => require("./foo")) : new Promise((resolve_1, reject_1) => { require(["./foo"], resolve_1, reject_1); })).default, __syncRequire ? Promise.resolve().then(() => require(_a)) : new Promise((resolve_2, reject_2) => { require([_a], resolve_2, reject_2); }));
5050
});
5151
}
5252
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// @module: umd
2+
// @target: es2015
3+
// @filename: 0.ts
4+
export function foo() { return "foo"; }
5+
6+
// @filename: 1.ts
7+
8+
// https://github.com/microsoft/TypeScript/issues/36780
9+
async function func() {
10+
const packageName = '.';
11+
const packageJson = await import(packageName + '/package.json');
12+
}

0 commit comments

Comments
 (0)