From db888b86709b0a55d3105dc882ae98297e853fb6 Mon Sep 17 00:00:00 2001 From: Martin Probst Date: Thu, 12 Jul 2018 12:23:24 +0200 Subject: [PATCH] Retain synthetic comments on exported variables. Variables that do not have a local variable created get transformed into a single exports assignment expression. TypeScript previously just created a new expression and set the text range to retain original comments, but for synthetic comments, merging the emit nodes by setting the original node is required. --- src/compiler/transformers/module/module.ts | 2 +- src/testRunner/unittests/transform.ts | 30 +++++++++++++++++++ ...rectly.transformAddCommentToExportedVar.js | 7 +++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/transformApi/transformsCorrectly.transformAddCommentToExportedVar.js diff --git a/src/compiler/transformers/module/module.ts b/src/compiler/transformers/module/module.ts index ce405694cb4..6df143d0265 100644 --- a/src/compiler/transformers/module/module.ts +++ b/src/compiler/transformers/module/module.ts @@ -1140,7 +1140,7 @@ namespace ts { } if (expressions) { - statements = append(statements, setTextRange(createExpressionStatement(inlineExpressions(expressions)), node)); + statements = append(statements, setOriginalNode(setTextRange(createExpressionStatement(inlineExpressions(expressions)), node), node)); } } else { diff --git a/src/testRunner/unittests/transform.ts b/src/testRunner/unittests/transform.ts index 6c74c558b16..547b22f2cbc 100644 --- a/src/testRunner/unittests/transform.ts +++ b/src/testRunner/unittests/transform.ts @@ -296,6 +296,36 @@ namespace ts { } } }); + + // https://github.com/Microsoft/TypeScript/issues/17594 + testBaseline("transformAddCommentToExportedVar", () => { + return transpileModule(`export const exportedDirectly = 1; +const exportedSeparately = 2; +export {exportedSeparately}; +`, { + 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 (isVariableStatement(node)) { + setEmitFlags(node, EmitFlags.NoLeadingComments); + setSyntheticLeadingComments(node, [{ kind: SyntaxKind.MultiLineCommentTrivia, text: "* @type {number} ", pos: -1, end: -1, hasTrailingNewLine: true }]); + return node; + } + return visitEachChild(node, rootTransform, context); + } + } + }); }); } diff --git a/tests/baselines/reference/transformApi/transformsCorrectly.transformAddCommentToExportedVar.js b/tests/baselines/reference/transformApi/transformsCorrectly.transformAddCommentToExportedVar.js new file mode 100644 index 00000000000..32be082c1f4 --- /dev/null +++ b/tests/baselines/reference/transformApi/transformsCorrectly.transformAddCommentToExportedVar.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** @type {number} */ +exports.exportedDirectly = 1; +/** @type {number} */ +var exportedSeparately = 2; +exports.exportedSeparately = exportedSeparately;