Skip to content

Commit 1e00399

Browse files
authored
Fixed emit of return statements with parenthesized assertions and comments (#56601)
1 parent f57e510 commit 1e00399

5 files changed

+130
-1
lines changed

src/compiler/emitter.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3607,7 +3607,14 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
36073607

36083608
function willEmitLeadingNewLine(node: Expression): boolean {
36093609
if (!currentSourceFile) return false;
3610-
if (some(getLeadingCommentRanges(currentSourceFile.text, node.pos), commentWillEmitNewLine)) return true;
3610+
const leadingCommentRanges = getLeadingCommentRanges(currentSourceFile.text, node.pos);
3611+
if (leadingCommentRanges) {
3612+
const parseNode = getParseTreeNode(node);
3613+
if (parseNode && isParenthesizedExpression(parseNode.parent)) {
3614+
return true;
3615+
}
3616+
}
3617+
if (some(leadingCommentRanges, commentWillEmitNewLine)) return true;
36113618
if (some(getSyntheticLeadingComments(node), commentWillEmitNewLine)) return true;
36123619
if (isPartiallyEmittedExpression(node)) {
36133620
if (node.pos !== node.expression.pos) {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//// [tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts] ////
2+
3+
//// [commentEmitOnParenthesizedAssertionInReturnStatement.ts]
4+
export class Foo {
5+
client = {
6+
getThing: () => Promise.resolve('')
7+
}
8+
9+
foo(): Promise<void> {
10+
return (
11+
/* TODO: Avoid using type assertions, please refactor. */ this.client
12+
.getThing() as unknown as Promise<void>
13+
);
14+
}
15+
}
16+
17+
18+
//// [commentEmitOnParenthesizedAssertionInReturnStatement.js]
19+
export class Foo {
20+
client = {
21+
getThing: () => Promise.resolve('')
22+
};
23+
foo() {
24+
return (
25+
/* TODO: Avoid using type assertions, please refactor. */ this.client
26+
.getThing());
27+
}
28+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//// [tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts] ////
2+
3+
=== commentEmitOnParenthesizedAssertionInReturnStatement.ts ===
4+
export class Foo {
5+
>Foo : Symbol(Foo, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 0))
6+
7+
client = {
8+
>client : Symbol(Foo.client, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 18))
9+
10+
getThing: () => Promise.resolve('')
11+
>getThing : Symbol(getThing, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 1, 12))
12+
>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
13+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
14+
>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --))
15+
}
16+
17+
foo(): Promise<void> {
18+
>foo : Symbol(Foo.foo, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 3, 3))
19+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
20+
21+
return (
22+
/* TODO: Avoid using type assertions, please refactor. */ this.client
23+
>this.client .getThing : Symbol(getThing, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 1, 12))
24+
>this.client : Symbol(Foo.client, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 18))
25+
>this : Symbol(Foo, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 0))
26+
>client : Symbol(Foo.client, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 18))
27+
28+
.getThing() as unknown as Promise<void>
29+
>getThing : Symbol(getThing, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 1, 12))
30+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
31+
32+
);
33+
}
34+
}
35+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//// [tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts] ////
2+
3+
=== commentEmitOnParenthesizedAssertionInReturnStatement.ts ===
4+
export class Foo {
5+
>Foo : Foo
6+
7+
client = {
8+
>client : { getThing: () => Promise<string>; }
9+
>{ getThing: () => Promise.resolve('') } : { getThing: () => Promise<string>; }
10+
11+
getThing: () => Promise.resolve('')
12+
>getThing : () => Promise<string>
13+
>() => Promise.resolve('') : () => Promise<string>
14+
>Promise.resolve('') : Promise<string>
15+
>Promise.resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
16+
>Promise : PromiseConstructor
17+
>resolve : { (): Promise<void>; <T>(value: T): Promise<Awaited<T>>; <T_1>(value: T_1 | PromiseLike<T_1>): Promise<Awaited<T_1>>; }
18+
>'' : ""
19+
}
20+
21+
foo(): Promise<void> {
22+
>foo : () => Promise<void>
23+
24+
return (
25+
>( /* TODO: Avoid using type assertions, please refactor. */ this.client .getThing() as unknown as Promise<void> ) : Promise<void>
26+
27+
/* TODO: Avoid using type assertions, please refactor. */ this.client
28+
>this.client .getThing() as unknown as Promise<void> : Promise<void>
29+
>this.client .getThing() as unknown : unknown
30+
>this.client .getThing() : Promise<string>
31+
>this.client .getThing : () => Promise<string>
32+
>this.client : { getThing: () => Promise<string>; }
33+
>this : this
34+
>client : { getThing: () => Promise<string>; }
35+
36+
.getThing() as unknown as Promise<void>
37+
>getThing : () => Promise<string>
38+
39+
);
40+
}
41+
}
42+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// @strict: true
2+
// @lib: esnext
3+
// @target: esnext
4+
// @removeComments: false
5+
6+
export class Foo {
7+
client = {
8+
getThing: () => Promise.resolve('')
9+
}
10+
11+
foo(): Promise<void> {
12+
return (
13+
/* TODO: Avoid using type assertions, please refactor. */ this.client
14+
.getThing() as unknown as Promise<void>
15+
);
16+
}
17+
}

0 commit comments

Comments
 (0)