diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 3f17986359c..3afb23c6df3 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3607,7 +3607,14 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri function willEmitLeadingNewLine(node: Expression): boolean { if (!currentSourceFile) return false; - if (some(getLeadingCommentRanges(currentSourceFile.text, node.pos), commentWillEmitNewLine)) return true; + const leadingCommentRanges = getLeadingCommentRanges(currentSourceFile.text, node.pos); + if (leadingCommentRanges) { + const parseNode = getParseTreeNode(node); + if (parseNode && isParenthesizedExpression(parseNode.parent)) { + return true; + } + } + if (some(leadingCommentRanges, commentWillEmitNewLine)) return true; if (some(getSyntheticLeadingComments(node), commentWillEmitNewLine)) return true; if (isPartiallyEmittedExpression(node)) { if (node.pos !== node.expression.pos) { diff --git a/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.js b/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.js new file mode 100644 index 00000000000..bf3d947dca0 --- /dev/null +++ b/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.js @@ -0,0 +1,28 @@ +//// [tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts] //// + +//// [commentEmitOnParenthesizedAssertionInReturnStatement.ts] +export class Foo { + client = { + getThing: () => Promise.resolve('') + } + + foo(): Promise { + return ( + /* TODO: Avoid using type assertions, please refactor. */ this.client + .getThing() as unknown as Promise + ); + } +} + + +//// [commentEmitOnParenthesizedAssertionInReturnStatement.js] +export class Foo { + client = { + getThing: () => Promise.resolve('') + }; + foo() { + return ( + /* TODO: Avoid using type assertions, please refactor. */ this.client + .getThing()); + } +} diff --git a/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.symbols b/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.symbols new file mode 100644 index 00000000000..0a0b1f2d68d --- /dev/null +++ b/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.symbols @@ -0,0 +1,35 @@ +//// [tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts] //// + +=== commentEmitOnParenthesizedAssertionInReturnStatement.ts === +export class Foo { +>Foo : Symbol(Foo, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 0)) + + client = { +>client : Symbol(Foo.client, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 18)) + + getThing: () => Promise.resolve('') +>getThing : Symbol(getThing, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 1, 12)) +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>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, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + } + + foo(): Promise { +>foo : Symbol(Foo.foo, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 3, 3)) +>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, --, --)) + + return ( + /* TODO: Avoid using type assertions, please refactor. */ this.client +>this.client .getThing : Symbol(getThing, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 1, 12)) +>this.client : Symbol(Foo.client, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 18)) +>this : Symbol(Foo, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 0)) +>client : Symbol(Foo.client, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 0, 18)) + + .getThing() as unknown as Promise +>getThing : Symbol(getThing, Decl(commentEmitOnParenthesizedAssertionInReturnStatement.ts, 1, 12)) +>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, --, --)) + + ); + } +} + diff --git a/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.types b/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.types new file mode 100644 index 00000000000..433932a4d91 --- /dev/null +++ b/tests/baselines/reference/commentEmitOnParenthesizedAssertionInReturnStatement.types @@ -0,0 +1,42 @@ +//// [tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts] //// + +=== commentEmitOnParenthesizedAssertionInReturnStatement.ts === +export class Foo { +>Foo : Foo + + client = { +>client : { getThing: () => Promise; } +>{ getThing: () => Promise.resolve('') } : { getThing: () => Promise; } + + getThing: () => Promise.resolve('') +>getThing : () => Promise +>() => Promise.resolve('') : () => Promise +>Promise.resolve('') : Promise +>Promise.resolve : { (): Promise; (value: T): Promise>; (value: T_1 | PromiseLike): Promise>; } +>Promise : PromiseConstructor +>resolve : { (): Promise; (value: T): Promise>; (value: T_1 | PromiseLike): Promise>; } +>'' : "" + } + + foo(): Promise { +>foo : () => Promise + + return ( +>( /* TODO: Avoid using type assertions, please refactor. */ this.client .getThing() as unknown as Promise ) : Promise + + /* TODO: Avoid using type assertions, please refactor. */ this.client +>this.client .getThing() as unknown as Promise : Promise +>this.client .getThing() as unknown : unknown +>this.client .getThing() : Promise +>this.client .getThing : () => Promise +>this.client : { getThing: () => Promise; } +>this : this +>client : { getThing: () => Promise; } + + .getThing() as unknown as Promise +>getThing : () => Promise + + ); + } +} + diff --git a/tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts b/tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts new file mode 100644 index 00000000000..042c639812a --- /dev/null +++ b/tests/cases/compiler/commentEmitOnParenthesizedAssertionInReturnStatement.ts @@ -0,0 +1,17 @@ +// @strict: true +// @lib: esnext +// @target: esnext +// @removeComments: false + +export class Foo { + client = { + getThing: () => Promise.resolve('') + } + + foo(): Promise { + return ( + /* TODO: Avoid using type assertions, please refactor. */ this.client + .getThing() as unknown as Promise + ); + } +}