Export * and export { names } emit in es6 format

Conflicts:
	src/compiler/emitter.ts
	tests/baselines/reference/es6ExportAll.js
	tests/baselines/reference/es6ExportClause.js
	tests/baselines/reference/es6ExportClauseWithoutModuleSpecifier.js
This commit is contained in:
Mohamed Hegazy 2015-03-12 11:51:32 -07:00
parent 680cf6d844
commit fe9fff506d
13 changed files with 439 additions and 32 deletions

View File

@ -5108,7 +5108,7 @@ module ts {
}
}
function emitImportSpecifier(node: ImportSpecifier) {
function emitImportOrExportSpecifier(node: ImportSpecifier) {
Debug.assert(languageVersion >= ScriptTarget.ES6);
if (node.propertyName) {
emit(node.propertyName);
@ -5186,42 +5186,61 @@ module ts {
}
function emitExportDeclaration(node: ExportDeclaration) {
if (node.moduleSpecifier) {
emitStart(node);
var generatedName = resolver.getGeneratedNameForNode(node);
if (compilerOptions.module !== ModuleKind.AMD) {
write("var ");
write(generatedName);
write(" = ");
emitRequire(getExternalModuleName(node));
if (languageVersion < ScriptTarget.ES6) {
if (node.moduleSpecifier) {
emitStart(node);
var generatedName = resolver.getGeneratedNameForNode(node);
if (compilerOptions.module !== ModuleKind.AMD) {
write("var ");
write(generatedName);
write(" = ");
emitRequire(getExternalModuleName(node));
}
if (node.exportClause) {
// export { x, y, ... }
forEach(node.exportClause.elements, specifier => {
writeLine();
emitStart(specifier);
emitContainingModuleName(specifier);
write(".");
emitNodeWithoutSourceMap(specifier.name);
write(" = ");
write(generatedName);
write(".");
emitNodeWithoutSourceMap(specifier.propertyName || specifier.name);
write(";");
emitEnd(specifier);
});
}
else {
// export *
var tempName = createTempVariable(node).text;
writeLine();
write("for (var " + tempName + " in " + generatedName + ") if (!");
emitContainingModuleName(node);
write(".hasOwnProperty(" + tempName + ")) ");
emitContainingModuleName(node);
write("[" + tempName + "] = " + generatedName + "[" + tempName + "];");
}
emitEnd(node);
}
}
else {
write("export ");
if (node.exportClause) {
// export { x, y, ... }
forEach(node.exportClause.elements, specifier => {
writeLine();
emitStart(specifier);
emitContainingModuleName(specifier);
write(".");
emitNodeWithoutSourceMap(specifier.name);
write(" = ");
write(generatedName);
write(".");
emitNodeWithoutSourceMap(specifier.propertyName || specifier.name);
write(";");
emitEnd(specifier);
});
write("{ ");
emitCommaList(node.exportClause.elements);
write(" }");
}
else {
// export *
var tempName = createTempVariable(node).text;
writeLine();
write("for (var " + tempName + " in " + generatedName + ") if (!");
emitContainingModuleName(node);
write(".hasOwnProperty(" + tempName + ")) ");
emitContainingModuleName(node);
write("[" + tempName + "] = " + generatedName + "[" + tempName + "];");
write("*");
}
emitEnd(node);
if (node.moduleSpecifier) {
write(" from ");
emit(node.moduleSpecifier);
}
write(";");
}
}
@ -5689,7 +5708,8 @@ module ts {
case SyntaxKind.ImportDeclaration:
return emitImportDeclaration(<ImportDeclaration>node);
case SyntaxKind.ImportSpecifier:
return emitImportSpecifier(<ImportSpecifier>node);
case SyntaxKind.ExportSpecifier:
return emitImportOrExportSpecifier(<ImportOrExportSpecifier>node);
case SyntaxKind.ImportEqualsDeclaration:
return emitImportEqualsDeclaration(<ImportEqualsDeclaration>node);
case SyntaxKind.ExportDeclaration:

View File

@ -0,0 +1,47 @@
//// [tests/cases/compiler/es6ExportAll.ts] ////
//// [server.ts]
export class c {
}
export interface i {
}
export module m {
export var x = 10;
}
export var x = 10;
export module uninstantiated {
}
//// [client.ts]
export * from "server";
//// [server.js]
var c = (function () {
function c() {
}
return c;
})();
export { c };
var m;
(function (m) {
m.x = 10;
})(m || (m = {}));
export { m };
export var x = 10;
//// [client.js]
export * from "server";
//// [server.d.ts]
export declare class c {
}
export interface i {
}
export declare module m {
var x: number;
}
export declare var x: number;
export declare module uninstantiated {
}
//// [client.d.ts]

View File

@ -0,0 +1,24 @@
=== tests/cases/compiler/server.ts ===
export class c {
>c : c
}
export interface i {
>i : i
}
export module m {
>m : typeof m
export var x = 10;
>x : number
}
export var x = 10;
>x : number
export module uninstantiated {
>uninstantiated : unknown
}
=== tests/cases/compiler/client.ts ===
export * from "server";
No type information for this code.

View File

@ -0,0 +1,47 @@
//// [tests/cases/compiler/es6ExportAllInEs5.ts] ////
//// [server.ts]
export class c {
}
export interface i {
}
export module m {
export var x = 10;
}
export var x = 10;
export module uninstantiated {
}
//// [client.ts]
export * from "server";
//// [server.js]
var c = (function () {
function c() {
}
return c;
})();
exports.c = c;
var m;
(function (m) {
m.x = 10;
})(m = exports.m || (exports.m = {}));
exports.x = 10;
//// [client.js]
var _server = require("server");
for (var _a in _server) if (!exports.hasOwnProperty(_a)) exports[_a] = _server[_a];
//// [server.d.ts]
export declare class c {
}
export interface i {
}
export declare module m {
var x: number;
}
export declare var x: number;
export declare module uninstantiated {
}
//// [client.d.ts]

View File

@ -0,0 +1,24 @@
=== tests/cases/compiler/server.ts ===
export class c {
>c : c
}
export interface i {
>i : i
}
export module m {
>m : typeof m
export var x = 10;
>x : number
}
export var x = 10;
>x : number
export module uninstantiated {
>uninstantiated : unknown
}
=== tests/cases/compiler/client.ts ===
export * from "server";
No type information for this code.

View File

@ -0,0 +1,37 @@
//// [es6ExportClause.ts]
class c {
}
interface i {
}
module m {
export var x = 10;
}
var x = 10;
module uninstantiated {
}
export { c };
export { c as c2 };
export { i, m as instantiatedModule };
export { uninstantiated };
export { x };
//// [es6ExportClause.js]
var c = (function () {
function c() {
}
return c;
})();
var m;
(function (m) {
m.x = 10;
})(m || (m = {}));
var x = 10;
export { c };
export { c as c2 };
export { i, m as instantiatedModule };
export { uninstantiated };
export { x };
//// [es6ExportClause.d.ts]

View File

@ -0,0 +1,38 @@
=== tests/cases/compiler/es6ExportClause.ts ===
class c {
>c : c
}
interface i {
>i : i
}
module m {
>m : typeof m
export var x = 10;
>x : number
}
var x = 10;
>x : number
module uninstantiated {
>uninstantiated : unknown
}
export { c };
>c : typeof c
export { c as c2 };
>c : typeof c
>c2 : typeof c
export { i, m as instantiatedModule };
>i : unknown
>m : typeof m
>instantiatedModule : typeof m
export { uninstantiated };
>uninstantiated : unknown
export { x };
>x : number

View File

@ -0,0 +1,55 @@
//// [tests/cases/compiler/es6ExportClauseWithoutModuleSpecifier.ts] ////
//// [server.ts]
export class c {
}
export interface i {
}
export module m {
export var x = 10;
}
export var x = 10;
export module uninstantiated {
}
//// [client.ts]
export { c } from "server";
export { c as c2 } from "server";
export { i, m as instantiatedModule } from "server";
export { uninstantiated } from "server";
export { x } from "server";
//// [server.js]
var c = (function () {
function c() {
}
return c;
})();
export { c };
var m;
(function (m) {
m.x = 10;
})(m || (m = {}));
export { m };
export var x = 10;
//// [client.js]
export { c } from "server";
export { c as c2 } from "server";
export { i, m as instantiatedModule } from "server";
export { uninstantiated } from "server";
export { x } from "server";
//// [server.d.ts]
export declare class c {
}
export interface i {
}
export declare module m {
var x: number;
}
export declare var x: number;
export declare module uninstantiated {
}
//// [client.d.ts]

View File

@ -0,0 +1,40 @@
=== tests/cases/compiler/server.ts ===
export class c {
>c : c
}
export interface i {
>i : i
}
export module m {
>m : typeof m
export var x = 10;
>x : number
}
export var x = 10;
>x : number
export module uninstantiated {
>uninstantiated : unknown
}
=== tests/cases/compiler/client.ts ===
export { c } from "server";
>c : typeof c
export { c as c2 } from "server";
>c : typeof c
>c2 : typeof c
export { i, m as instantiatedModule } from "server";
>i : unknown
>m : typeof instantiatedModule
>instantiatedModule : typeof instantiatedModule
export { uninstantiated } from "server";
>uninstantiated : unknown
export { x } from "server";
>x : number

View File

@ -0,0 +1,17 @@
// @target: es6
// @declaration: true
// @filename: server.ts
export class c {
}
export interface i {
}
export module m {
export var x = 10;
}
export var x = 10;
export module uninstantiated {
}
// @filename: client.ts
export * from "server";

View File

@ -0,0 +1,18 @@
// @target: es5
// @module: commonjs
// @declaration: true
// @filename: server.ts
export class c {
}
export interface i {
}
export module m {
export var x = 10;
}
export var x = 10;
export module uninstantiated {
}
// @filename: client.ts
export * from "server";

View File

@ -0,0 +1,19 @@
// @target: es6
// @declaration: true
// @filename: server.ts
class c {
}
interface i {
}
module m {
export var x = 10;
}
var x = 10;
module uninstantiated {
}
export { c };
export { c as c2 };
export { i, m as instantiatedModule };
export { uninstantiated };
export { x };

View File

@ -0,0 +1,21 @@
// @target: es6
// @declaration: true
// @filename: server.ts
export class c {
}
export interface i {
}
export module m {
export var x = 10;
}
export var x = 10;
export module uninstantiated {
}
// @filename: client.ts
export { c } from "server";
export { c as c2 } from "server";
export { i, m as instantiatedModule } from "server";
export { uninstantiated } from "server";
export { x } from "server";