Skip to content

Include reexported names in list of exported names #38809

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 0 additions & 31 deletions src/compiler/transformers/module/system.ts
Original file line number Diff line number Diff line change
Expand Up @@ -339,37 +339,6 @@ namespace ts {
}
}

for (const externalImport of moduleInfo.externalImports) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't see any tests affected that use SystemJS, so I'm not sure what effect (if any) this change made. Is it handled by the change in utilities.ts, or are we missing test cases?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This removed code duplicated the reexports preservation for systemjs. In effect, for systemjs only, we were tracking reexports in a second list. So, rather than duplicating the systemjs code into all the other module systems, I removed code from the systemjs resolver and let it rely on the single list having the reexports in it (since every module mode needs them now).

if (externalImport.kind !== SyntaxKind.ExportDeclaration) {
continue;
}

if (!externalImport.exportClause) {
// export * from ...
continue;
}

if (isNamedExports(externalImport.exportClause)) {
for (const element of externalImport.exportClause.elements) {
// write name of indirectly exported entry, i.e. 'export {x} from ...'
exportedNames.push(
createPropertyAssignment(
createLiteral(idText(element.name || element.propertyName)),
createTrue()
)
);
}
}
else {
exportedNames.push(
createPropertyAssignment(
createLiteral(idText(externalImport.exportClause.name)),
createTrue()
)
);
}
}

const exportedNamesStorageRef = createUniqueName("exportedNames");
statements.push(
createVariableStatement(
Expand Down
47 changes: 31 additions & 16 deletions src/compiler/transformers/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,26 +112,22 @@ namespace ts {
// export * as ns from "mod"
// export { x, y } from "mod"
externalImports.push(<ExportDeclaration>node);
if (isNamedExports((node as ExportDeclaration).exportClause!)) {
addExportedNamesForExportDeclaration(node as ExportDeclaration);
}
else {
const name = ((node as ExportDeclaration).exportClause as NamespaceExport).name;
if (!uniqueExports.get(idText(name))) {
multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(node), name);
uniqueExports.set(idText(name), true);
exportedNames = append(exportedNames, name);
}
}
}
}
else {
// export { x, y }
for (const specifier of cast((<ExportDeclaration>node).exportClause, isNamedExports).elements) {
if (!uniqueExports.get(idText(specifier.name))) {
const name = specifier.propertyName || specifier.name;
exportSpecifiers.add(idText(name), specifier);

const decl = resolver.getReferencedImportDeclaration(name)
|| resolver.getReferencedValueDeclaration(name);

if (decl) {
multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(decl), specifier.name);
}

uniqueExports.set(idText(specifier.name), true);
exportedNames = append(exportedNames, specifier.name);
}
}
addExportedNamesForExportDeclaration(node as ExportDeclaration);
}
break;

Expand Down Expand Up @@ -200,6 +196,25 @@ namespace ts {
}

return { externalImports, exportSpecifiers, exportEquals, hasExportStarsToExportValues, exportedBindings, exportedNames, externalHelpersImportDeclaration };

function addExportedNamesForExportDeclaration(node: ExportDeclaration) {
for (const specifier of cast(node.exportClause, isNamedExports).elements) {
if (!uniqueExports.get(idText(specifier.name))) {
const name = specifier.propertyName || specifier.name;
exportSpecifiers.add(idText(name), specifier);

const decl = resolver.getReferencedImportDeclaration(name)
|| resolver.getReferencedValueDeclaration(name);

if (decl) {
multiMapSparseArrayAdd(exportedBindings, getOriginalNodeId(decl), specifier.name);
}

uniqueExports.set(idText(specifier.name), true);
exportedNames = append(exportedNames, specifier.name);
}
}
}
}

function collectExportedVariableInfo(decl: VariableDeclaration | BindingElement, uniqueExports: Map<boolean>, exportedNames: Identifier[] | undefined) {
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/ambientShorthand_reExport.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports.x = void 0;
var jquery_1 = require("jquery");
__createBinding(exports, jquery_1, "x");
//// [reExportAll.js]
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/commentsOnRequireStatement.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ exports.subject1 = 10;
//// [2.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.subject1 = exports.subject = void 0;
/* blah0 */
// blah
// blah
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/constEnumPreserveEmitReexport.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,6 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports["default"] = void 0;
var ConstEnum_1 = require("./ConstEnum");
__createBinding(exports, ConstEnum_1, "MyConstEnum", "default");
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ exports.x = 10;
//// [client.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.x = exports.instantiatedModule = exports.c2 = exports.c = void 0;
var server_1 = require("./server");
Object.defineProperty(exports, "c", { enumerable: true, get: function () { return server_1.c; } });
var server_2 = require("./server");
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/es6ExportEqualsInterop.js
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
};
exports.__esModule = true;
exports.a0 = exports.a9 = exports.a8 = exports.a7 = exports.a6 = exports.a5 = exports.a4 = exports.a3 = exports.a2 = exports.a1 = void 0;
var z2 = require("variable");
var z3 = require("interface-variable");
var z4 = require("module");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
};
exports.__esModule = true;
exports.y = exports.x = void 0;
var fs = __importStar(require("./fs"));
fs;
__exportStar(require("./fs"), exports);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.y = exports.x = void 0;
var fs = __importStar(require("./fs"));
fs;
__exportStar(require("./fs"), exports);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports", "./0"], function (require, exports, ns) {
"use strict";
exports.__esModule = true;
exports.ns = void 0;
exports.ns = ns;
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ exports.b = 2;
//// [1.js]
"use strict";
exports.__esModule = true;
exports.ns = void 0;
exports.ns = require("./0");
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ foo.ns.b;
})(function (require, exports) {
"use strict";
exports.__esModule = true;
exports.ns = void 0;
exports.ns = require("./0");
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports", "./0"], function (require, exports, ns) {
"use strict";
exports.__esModule = true;
exports.ns = void 0;
exports.ns = ns;
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result;
};
exports.__esModule = true;
exports.ns = void 0;
exports.ns = __importStar(require("./0"));
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
})(function (require, exports) {
"use strict";
exports.__esModule = true;
exports.ns = void 0;
exports.ns = __importStar(require("./0"));
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports", "./0"], function (require, exports, ns) {
"use strict";
exports.__esModule = true;
exports.ns = void 0;
exports.ns = ns;
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result;
};
exports.__esModule = true;
exports.ns = void 0;
exports.ns = __importStar(require("./0"));
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
})(function (require, exports) {
"use strict";
exports.__esModule = true;
exports.ns = void 0;
exports.ns = __importStar(require("./0"));
ns.a;
ns.b;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,5 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result;
};
exports.__esModule = true;
exports.ns = void 0;
exports.ns = __importStar(require("./a"));
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ exports.__esModule = true;
//// [b.js]
"use strict";
exports.__esModule = true;
exports.ns = void 0;
exports.ns = require("./a"); // Error
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports.x = void 0;
var t1_1 = require("./t1");
__createBinding(exports, t1_1, "x");
//// [t3.js]
Expand All @@ -49,6 +50,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports.a = void 0;
var t1_1 = require("./t1");
__createBinding(exports, t1_1, "x", "a");
//// [t5.js]
Expand All @@ -61,5 +63,6 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports.a = void 0;
var t1_1 = require("./t1");
__createBinding(exports, t1_1, "x", "a");
1 change: 1 addition & 0 deletions tests/baselines/reference/exportDefaultDuplicateCrash.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports["default"] = void 0;
function default_1() { }
exports["default"] = default_1;
var hi_1 = require("./hi");
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportNamespace2.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ exports.A = A;
//// [b.js]
"use strict";
exports.__esModule = true;
exports.a = void 0;
exports.a = require("./a");
//// [c.js]
"use strict";
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportNamespace3.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ exports.__esModule = true;
//// [c.js]
"use strict";
exports.__esModule = true;
exports.a = void 0;
exports.a = require("./b");
//// [d.js]
"use strict";
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportStarNotElided.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
};
exports.__esModule = true;
exports.aliased = void 0;
__exportStar(require("./register"), exports);
__exportStar(require("./data1"), exports);
exports.aliased = require("./data1");
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports1-amd.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports", "./t1"], function (require, exports, t1_1) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.a = exports.M = exports.E = exports.C = exports.f = exports.v = void 0;
Object.defineProperty(exports, "v", { enumerable: true, get: function () { return t1_1.v; } });
Object.defineProperty(exports, "f", { enumerable: true, get: function () { return t1_1.f; } });
Object.defineProperty(exports, "C", { enumerable: true, get: function () { return t1_1.C; } });
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports1-es6.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ exports.a = a;
//// [t2.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.a = exports.M = exports.E = exports.C = exports.f = exports.v = void 0;
var t1_1 = require("./t1");
Object.defineProperty(exports, "v", { enumerable: true, get: function () { return t1_1.v; } });
Object.defineProperty(exports, "f", { enumerable: true, get: function () { return t1_1.f; } });
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports1.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports.a = exports.M = exports.E = exports.C = exports.f = exports.v = void 0;
var t1_1 = require("./t1");
__createBinding(exports, t1_1, "v");
__createBinding(exports, t1_1, "f");
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports2-amd.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports", "./t1"], function (require, exports, t1_1) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.x = exports.y = void 0;
Object.defineProperty(exports, "y", { enumerable: true, get: function () { return t1_1.x; } });
Object.defineProperty(exports, "x", { enumerable: true, get: function () { return t1_1.y; } });
});
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports2-es6.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ exports.y = "y";
//// [t2.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.x = exports.y = void 0;
var t1_1 = require("./t1");
Object.defineProperty(exports, "y", { enumerable: true, get: function () { return t1_1.x; } });
Object.defineProperty(exports, "x", { enumerable: true, get: function () { return t1_1.y; } });
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports2.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports.x = exports.y = void 0;
var t1_1 = require("./t1");
__createBinding(exports, t1_1, "x", "y");
__createBinding(exports, t1_1, "y", "x");
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports3-amd.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports", "./t1"], function (require, exports, t1_1) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.a = exports.M = exports.E = exports.C = exports.f = exports.v = void 0;
Object.defineProperty(exports, "v", { enumerable: true, get: function () { return t1_1.v1; } });
Object.defineProperty(exports, "f", { enumerable: true, get: function () { return t1_1.f1; } });
Object.defineProperty(exports, "C", { enumerable: true, get: function () { return t1_1.C1; } });
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports3-es6.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ exports.a1 = exports.a;
//// [t2.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.a = exports.M = exports.E = exports.C = exports.f = exports.v = void 0;
var t1_1 = require("./t1");
Object.defineProperty(exports, "v", { enumerable: true, get: function () { return t1_1.v1; } });
Object.defineProperty(exports, "f", { enumerable: true, get: function () { return t1_1.f1; } });
Expand Down
1 change: 1 addition & 0 deletions tests/baselines/reference/exportsAndImports3.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports.a = exports.M = exports.E = exports.C = exports.f = exports.v = void 0;
var t1_1 = require("./t1");
__createBinding(exports, t1_1, "v1", "v");
__createBinding(exports, t1_1, "f1", "f");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ var __extends = (this && this.__extends) || (function () {
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.z = void 0;
exports.z = exports.c1 = void 0;
var module_1 = require("module");
var module_2 = require("module");
var ns = require("module");
Expand Down
2 changes: 1 addition & 1 deletion tests/baselines/reference/isolatedModulesReExportType.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
o[k2] = m[k];
}));
exports.__esModule = true;
exports.NS = void 0;
exports.NS = exports.C = void 0;
// OK, has a value side
var exportValue_1 = require("./exportValue");
__createBinding(exports, exportValue_1, "C");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ exports.OtherThing = OtherThing;
//// [index.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = exports.Thing = void 0;
var source_1 = require("./source");
Object.defineProperty(exports, "Thing", { enumerable: true, get: function () { return source_1.Thing; } });
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return source_1.OtherThing; } });
Expand Down
Loading