Emit es6 export ModuleDeclaration

Conflicts:
	src/compiler/emitter.ts
	tests/baselines/reference/es6ExportAll.js
	tests/baselines/reference/es6ExportClauseWithoutModuleSpecifier.js
This commit is contained in:
Mohamed Hegazy 2015-03-12 01:38:35 -07:00
parent 05932fdddf
commit b9f63a85b1
9 changed files with 278 additions and 5 deletions

View file

@ -4198,6 +4198,12 @@ module ts {
generatedBlockScopeNames[variableId] = generatedName;
}
function isES6ModuleMemberDeclaration(node: Node) {
return !!(node.flags & NodeFlags.Export) &&
languageVersion >= ScriptTarget.ES6 &&
node.parent.kind === SyntaxKind.SourceFile;
}
function emitVariableStatement(node: VariableStatement) {
if (!(node.flags & NodeFlags.Export)) {
emitStartOfVariableDeclarationList(node.declarationList);
@ -4979,7 +4985,8 @@ module ts {
scopeEmitEnd();
}
write(")(");
if (node.flags & NodeFlags.Export) {
// write moduleDecl = containingModule.m only if it is not exported es6 module member
if ((node.flags & NodeFlags.Export) && !isES6ModuleMemberDeclaration(node)) {
emit(node.name);
write(" = ");
}
@ -4988,7 +4995,15 @@ module ts {
emitModuleMemberName(node);
write(" = {}));");
emitEnd(node);
if (languageVersion < ScriptTarget.ES6 && node.name.kind === SyntaxKind.Identifier && node.parent === currentSourceFile) {
if (isES6ModuleMemberDeclaration(node)) {
writeLine();
emitStart(node);
write("export { ");
emit(node.name);
write(" };");
emitEnd(node);
}
else if (languageVersion < ScriptTarget.ES6 && node.name.kind === SyntaxKind.Identifier && node.parent === currentSourceFile) {
emitExportMemberAssignments(<Identifier>node.name);
}
}

View file

@ -0,0 +1,49 @@
//// [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;
})();
c = c;
var m;
(function (m) {
m.x = 10;
})(m || (m = {}));
export { m };
export var 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]
export * from "server";

View file

@ -0,0 +1,66 @@
//// [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;
})();
c = c;
var m;
(function (m) {
m.x = 10;
})(m || (m = {}));
export { m };
export var x = 10;
//// [client.js]
var _server = require("server");
exports.c = _server.c;
var _server_1 = require("server");
exports.c2 = _server_1.c;
var _server_2 = require("server");
exports.i = _server_2.i;
exports.instantiatedModule = _server_2.m;
var _server_3 = require("server");
exports.uninstantiated = _server_3.uninstantiated;
var _server_4 = require("server");
exports.x = _server_4.x;
//// [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]
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";

View file

@ -27,7 +27,8 @@ var m1;
m1.l = b, m1.m = m1.k;
const n = m1.k;
const o = n, p = m1.k;
})(m1 = m1 || (m1 = {}));
})(m1 || (m1 = {}));
export { m1 };
var m2;
(function (m2) {
m2.k = a;

View file

@ -27,7 +27,8 @@ var m1;
m1.l = b, m1.m = m1.k;
let n = m1.k;
let o = n, p = m1.k;
})(m1 = m1 || (m1 = {}));
})(m1 || (m1 = {}));
export { m1 };
var m2;
(function (m2) {
m2.k = a;

View file

@ -0,0 +1,58 @@
//// [es6ModuleModuleDeclaration.ts]
export module m1 {
export var a = 10;
var b = 10;
export module innerExportedModule {
export var k = 10;
var l = 10;
}
export module innerNonExportedModule {
export var x = 10;
var y = 10;
}
}
module m2 {
export var a = 10;
var b = 10;
export module innerExportedModule {
export var k = 10;
var l = 10;
}
export module innerNonExportedModule {
export var x = 10;
var y = 10;
}
}
//// [es6ModuleModuleDeclaration.js]
var m1;
(function (m1) {
m1.a = 10;
var b = 10;
var innerExportedModule;
(function (innerExportedModule) {
innerExportedModule.k = 10;
var l = 10;
})(innerExportedModule = m1.innerExportedModule || (m1.innerExportedModule = {}));
var innerNonExportedModule;
(function (innerNonExportedModule) {
innerNonExportedModule.x = 10;
var y = 10;
})(innerNonExportedModule = m1.innerNonExportedModule || (m1.innerNonExportedModule = {}));
})(m1 || (m1 = {}));
export { m1 };
var m2;
(function (m2) {
m2.a = 10;
var b = 10;
var innerExportedModule;
(function (innerExportedModule) {
innerExportedModule.k = 10;
var l = 10;
})(innerExportedModule = m2.innerExportedModule || (m2.innerExportedModule = {}));
var innerNonExportedModule;
(function (innerNonExportedModule) {
innerNonExportedModule.x = 10;
var y = 10;
})(innerNonExportedModule = m2.innerNonExportedModule || (m2.innerNonExportedModule = {}));
})(m2 || (m2 = {}));

View file

@ -0,0 +1,57 @@
=== tests/cases/compiler/es6ModuleModuleDeclaration.ts ===
export module m1 {
>m1 : typeof m1
export var a = 10;
>a : number
var b = 10;
>b : number
export module innerExportedModule {
>innerExportedModule : typeof innerExportedModule
export var k = 10;
>k : number
var l = 10;
>l : number
}
export module innerNonExportedModule {
>innerNonExportedModule : typeof innerNonExportedModule
export var x = 10;
>x : number
var y = 10;
>y : number
}
}
module m2 {
>m2 : typeof m2
export var a = 10;
>a : number
var b = 10;
>b : number
export module innerExportedModule {
>innerExportedModule : typeof innerExportedModule
export var k = 10;
>k : number
var l = 10;
>l : number
}
export module innerNonExportedModule {
>innerNonExportedModule : typeof innerNonExportedModule
export var x = 10;
>x : number
var y = 10;
>y : number
}
}

View file

@ -27,7 +27,8 @@ var m1;
m1.l = b, m1.m = m1.k;
var n = m1.k;
var o = n, p = m1.k;
})(m1 = m1 || (m1 = {}));
})(m1 || (m1 = {}));
export { m1 };
var m2;
(function (m2) {
m2.k = a;

View file

@ -0,0 +1,25 @@
// @target: ES6
export module m1 {
export var a = 10;
var b = 10;
export module innerExportedModule {
export var k = 10;
var l = 10;
}
export module innerNonExportedModule {
export var x = 10;
var y = 10;
}
}
module m2 {
export var a = 10;
var b = 10;
export module innerExportedModule {
export var k = 10;
var l = 10;
}
export module innerNonExportedModule {
export var x = 10;
var y = 10;
}
}