From 86dce41ec0be40ceba690ce9a4e041d046bfc747 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 15 May 2018 13:11:38 -0700 Subject: [PATCH] Move synthetic comments from arrow body expressions to return statement (#24135) --- src/compiler/factory.ts | 9 ++++++ src/compiler/transformers/es2015.ts | 1 + src/harness/unittests/transform.ts | 29 +++++++++++++++++++ .../reference/api/tsserverlibrary.d.ts | 1 + tests/baselines/reference/api/typescript.d.ts | 1 + ...y.transformAddCommentToArrowReturnValue.js | 4 +++ 6 files changed, 45 insertions(+) create mode 100644 tests/baselines/reference/transformApi/transformsCorrectly.transformAddCommentToArrowReturnValue.js diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index 766b87ae941..a286c9fae35 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -2900,6 +2900,15 @@ namespace ts { return setSyntheticTrailingComments(node, append(getSyntheticTrailingComments(node), { kind, pos: -1, end: -1, hasTrailingNewLine, text })); } + export function moveSyntheticComments(node: T, original: Node): T { + setSyntheticLeadingComments(node, getSyntheticLeadingComments(original)); + setSyntheticTrailingComments(node, getSyntheticTrailingComments(original)); + const emit = getOrCreateEmitNode(original); + emit.leadingComments = undefined; + emit.trailingComments = undefined; + return node; + } + /** * Gets the constant value to emit for an expression. */ diff --git a/src/compiler/transformers/es2015.ts b/src/compiler/transformers/es2015.ts index 2685f1da88d..7e356ca4a3a 100644 --- a/src/compiler/transformers/es2015.ts +++ b/src/compiler/transformers/es2015.ts @@ -1885,6 +1885,7 @@ namespace ts { const expression = visitNode(body, visitor, isExpression); const returnStatement = createReturn(expression); setTextRange(returnStatement, body); + moveSyntheticComments(returnStatement, body); setEmitFlags(returnStatement, EmitFlags.NoTokenSourceMaps | EmitFlags.NoTrailingSourceMap | EmitFlags.NoTrailingComments); statements.push(returnStatement); diff --git a/src/harness/unittests/transform.ts b/src/harness/unittests/transform.ts index 14b9ccdbfb8..61d8dc04e18 100644 --- a/src/harness/unittests/transform.ts +++ b/src/harness/unittests/transform.ts @@ -270,6 +270,35 @@ namespace ts { program.emit(program.getSourceFiles()[1], (p, s, bom) => host.writeFile(p, s, bom), /*cancellationToken*/ undefined, /*onlyDts*/ true, opts.transformers); return fs.readFileSync("/.src/index.d.ts").toString(); } + + // https://github.com/Microsoft/TypeScript/issues/24096 + testBaseline("transformAddCommentToArrowReturnValue", () => { + return transpileModule(`const foo = () => + void 0 +`, { + transformers: { + before: [addSyntheticComment], + }, + compilerOptions: { + target: ScriptTarget.ES5, + newLine: NewLineKind.CarriageReturnLineFeed, + } + }).outputText; + + function addSyntheticComment(context: TransformationContext) { + return (sourceFile: SourceFile): SourceFile => { + return visitNode(sourceFile, rootTransform, isSourceFile); + }; + function rootTransform(node: T): VisitResult { + if (isVoidExpression(node)) { + setEmitFlags(node, EmitFlags.NoLeadingComments); + setSyntheticLeadingComments(node, [{ kind: SyntaxKind.SingleLineCommentTrivia, text: "// comment!", pos: -1, end: -1, hasTrailingNewLine: true }]); + return node; + } + return visitEachChild(node, rootTransform, context); + } + } + }); }); } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 6c3e0c9b7a1..d3c9bb8849f 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -3860,6 +3860,7 @@ declare namespace ts { function getSyntheticTrailingComments(node: Node): SynthesizedComment[] | undefined; function setSyntheticTrailingComments(node: T, comments: SynthesizedComment[]): T; function addSyntheticTrailingComment(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T; + function moveSyntheticComments(node: T, original: Node): T; /** * Gets the constant value to emit for an expression. */ diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 2b4f6fe5beb..4f1b38c2c8a 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3860,6 +3860,7 @@ declare namespace ts { function getSyntheticTrailingComments(node: Node): SynthesizedComment[] | undefined; function setSyntheticTrailingComments(node: T, comments: SynthesizedComment[]): T; function addSyntheticTrailingComment(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T; + function moveSyntheticComments(node: T, original: Node): T; /** * Gets the constant value to emit for an expression. */ diff --git a/tests/baselines/reference/transformApi/transformsCorrectly.transformAddCommentToArrowReturnValue.js b/tests/baselines/reference/transformApi/transformsCorrectly.transformAddCommentToArrowReturnValue.js new file mode 100644 index 00000000000..37ff0597054 --- /dev/null +++ b/tests/baselines/reference/transformApi/transformsCorrectly.transformAddCommentToArrowReturnValue.js @@ -0,0 +1,4 @@ +var foo = function () { + //// comment! + return void 0; +};