Skip to content

Commit 6f114a2

Browse files
committed
Fix comments for import and export declarations.
Previously, TypeScript would only set the text range when transforming import and export declarations, leading it to drop synthetic comments and emit flags. This commit sets the original node on the statements that contains the generated `require()` call (or similar, depending on module system), retaining emit flags and synthetic comments.
1 parent db888b8 commit 6f114a2

File tree

3 files changed

+128
-63
lines changed

3 files changed

+128
-63
lines changed

src/compiler/transformers/module/module.ts

Lines changed: 78 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,7 @@ namespace ts {
767767
if (moduleKind !== ModuleKind.AMD) {
768768
if (!node.importClause) {
769769
// import "mod";
770-
return setTextRange(createExpressionStatement(createRequireCall(node)), node);
770+
return setOriginalNode(setTextRange(createExpressionStatement(createRequireCall(node)), node), node);
771771
}
772772
else {
773773
const variables: VariableDeclaration[] = [];
@@ -806,15 +806,17 @@ namespace ts {
806806
}
807807

808808
statements = append(statements,
809-
setTextRange(
810-
createVariableStatement(
811-
/*modifiers*/ undefined,
812-
createVariableDeclarationList(
813-
variables,
814-
languageVersion >= ScriptTarget.ES2015 ? NodeFlags.Const : NodeFlags.None
815-
)
816-
),
817-
/*location*/ node
809+
setOriginalNode(
810+
setTextRange(
811+
createVariableStatement(
812+
/*modifiers*/ undefined,
813+
createVariableDeclarationList(
814+
variables,
815+
languageVersion >= ScriptTarget.ES2015 ? NodeFlags.Const : NodeFlags.None
816+
)
817+
),
818+
/*location*/ node),
819+
/*original*/ node
818820
)
819821
);
820822
}
@@ -826,13 +828,15 @@ namespace ts {
826828
/*modifiers*/ undefined,
827829
createVariableDeclarationList(
828830
[
829-
setTextRange(
830-
createVariableDeclaration(
831-
getSynthesizedClone(namespaceDeclaration.name),
832-
/*type*/ undefined,
833-
getGeneratedNameForNode(node)
834-
),
835-
/*location*/ node
831+
setOriginalNode(
832+
setTextRange(
833+
createVariableDeclaration(
834+
getSynthesizedClone(namespaceDeclaration.name),
835+
/*type*/ undefined,
836+
getGeneratedNameForNode(node)
837+
),
838+
/*location*/ node),
839+
/*original*/ node
836840
)
837841
],
838842
languageVersion >= ScriptTarget.ES2015 ? NodeFlags.Const : NodeFlags.None
@@ -880,33 +884,37 @@ namespace ts {
880884
if (moduleKind !== ModuleKind.AMD) {
881885
if (hasModifier(node, ModifierFlags.Export)) {
882886
statements = append(statements,
883-
setTextRange(
884-
createExpressionStatement(
885-
createExportExpression(
886-
node.name,
887-
createRequireCall(node)
888-
)
889-
),
887+
setOriginalNode(
888+
setTextRange(
889+
createExpressionStatement(
890+
createExportExpression(
891+
node.name,
892+
createRequireCall(node)
893+
)
894+
),
895+
node),
890896
node
891897
)
892898
);
893899
}
894900
else {
895901
statements = append(statements,
896-
setTextRange(
897-
createVariableStatement(
898-
/*modifiers*/ undefined,
899-
createVariableDeclarationList(
900-
[
901-
createVariableDeclaration(
902-
getSynthesizedClone(node.name),
903-
/*type*/ undefined,
904-
createRequireCall(node)
905-
)
906-
],
907-
/*flags*/ languageVersion >= ScriptTarget.ES2015 ? NodeFlags.Const : NodeFlags.None
908-
)
909-
),
902+
setOriginalNode(
903+
setTextRange(
904+
createVariableStatement(
905+
/*modifiers*/ undefined,
906+
createVariableDeclarationList(
907+
[
908+
createVariableDeclaration(
909+
getSynthesizedClone(node.name),
910+
/*type*/ undefined,
911+
createRequireCall(node)
912+
)
913+
],
914+
/*flags*/ languageVersion >= ScriptTarget.ES2015 ? NodeFlags.Const : NodeFlags.None
915+
)
916+
),
917+
node),
910918
node
911919
)
912920
);
@@ -915,10 +923,12 @@ namespace ts {
915923
else {
916924
if (hasModifier(node, ModifierFlags.Export)) {
917925
statements = append(statements,
918-
setTextRange(
919-
createExpressionStatement(
920-
createExportExpression(getExportName(node), getLocalName(node))
921-
),
926+
setOriginalNode(
927+
setTextRange(
928+
createExpressionStatement(
929+
createExportExpression(getExportName(node), getLocalName(node))
930+
),
931+
node),
922932
node
923933
)
924934
);
@@ -956,18 +966,20 @@ namespace ts {
956966
// export { x, y } from "mod";
957967
if (moduleKind !== ModuleKind.AMD) {
958968
statements.push(
959-
setTextRange(
960-
createVariableStatement(
961-
/*modifiers*/ undefined,
962-
createVariableDeclarationList([
963-
createVariableDeclaration(
964-
generatedName,
965-
/*type*/ undefined,
966-
createRequireCall(node)
967-
)
968-
])
969-
),
970-
/*location*/ node
969+
setOriginalNode(
970+
setTextRange(
971+
createVariableStatement(
972+
/*modifiers*/ undefined,
973+
createVariableDeclarationList([
974+
createVariableDeclaration(
975+
generatedName,
976+
/*type*/ undefined,
977+
createRequireCall(node)
978+
)
979+
])
980+
),
981+
/*location*/ node),
982+
/* original */ node
971983
)
972984
);
973985
}
@@ -977,10 +989,12 @@ namespace ts {
977989
specifier.propertyName || specifier.name
978990
);
979991
statements.push(
980-
setTextRange(
981-
createExpressionStatement(
982-
createExportExpression(getExportName(specifier), exportedValue)
983-
),
992+
setOriginalNode(
993+
setTextRange(
994+
createExpressionStatement(
995+
createExportExpression(getExportName(specifier), exportedValue)
996+
),
997+
specifier),
984998
specifier
985999
)
9861000
);
@@ -990,10 +1004,12 @@ namespace ts {
9901004
}
9911005
else {
9921006
// export * from "mod";
993-
return setTextRange(
994-
createExpressionStatement(
995-
createExportStarHelper(context, moduleKind !== ModuleKind.AMD ? createRequireCall(node) : generatedName)
996-
),
1007+
return setOriginalNode(
1008+
setTextRange(
1009+
createExpressionStatement(
1010+
createExportStarHelper(context, moduleKind !== ModuleKind.AMD ? createRequireCall(node) : generatedName)
1011+
),
1012+
node),
9971013
node
9981014
);
9991015
}

src/testRunner/unittests/transform.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,39 @@ export {exportedSeparately};
326326
}
327327
}
328328
});
329-
});
329+
330+
// https://github.com/Microsoft/TypeScript/issues/17594
331+
testBaseline("transformAddCommentToImport", () => {
332+
return transpileModule(`
333+
// Previous comment on import.
334+
import {Value} from 'somewhere';
335+
import * as X from 'somewhere';
336+
// Previous comment on export.
337+
export { /* specifier comment */ X, Y} from 'somewhere';
338+
export * from 'somewhere';
339+
export {Value};
340+
`, {
341+
transformers: {
342+
before: [addSyntheticComment],
343+
},
344+
compilerOptions: {
345+
target: ScriptTarget.ES5,
346+
newLine: NewLineKind.CarriageReturnLineFeed,
347+
}
348+
}).outputText;
349+
350+
function addSyntheticComment(context: TransformationContext) {
351+
return (sourceFile: SourceFile): SourceFile => {
352+
return visitNode(sourceFile, rootTransform, isSourceFile);
353+
};
354+
function rootTransform<T extends Node>(node: T): VisitResult<T> {
355+
if (isImportDeclaration(node) || isExportDeclaration(node) || isImportSpecifier(node) || isExportSpecifier(node)) {
356+
setEmitFlags(node, EmitFlags.NoLeadingComments);
357+
setSyntheticLeadingComments(node, [{ kind: SyntaxKind.MultiLineCommentTrivia, text: `comment!`, pos: -1, end: -1, hasTrailingNewLine: true }]);
358+
}
359+
return visitEachChild(node, rootTransform, context);
360+
}
361+
}
362+
}); });
330363
}
331364

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"use strict";
2+
function __export(m) {
3+
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4+
}
5+
Object.defineProperty(exports, "__esModule", { value: true });
6+
/*comment!*/
7+
var somewhere_1 = require("somewhere");
8+
exports.Value = somewhere_1.Value;
9+
/*comment!*/
10+
var somewhere_2 = require("somewhere");
11+
/*comment!*/
12+
exports.X = somewhere_2.X;
13+
/*comment!*/
14+
exports.Y = somewhere_2.Y;
15+
/*comment!*/
16+
__export(require("somewhere"));

0 commit comments

Comments
 (0)