From a281cad4926a1201479f9b555accfa2c5a082fa3 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Sat, 11 Apr 2015 06:33:09 -0700 Subject: [PATCH] hoist source level module declarations --- src/compiler/emitter.ts | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index f2e8d0160a4..7ce201699bc 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -4327,15 +4327,18 @@ var __param = this.__param || function(index, decorator) { return function (targ return emitOnlyPinnedOrTripleSlashComments(node); } - emitStart(node); - if (isES6ExportedDeclaration(node)) { - write("export "); + let hoistedInDeclarationScope = currentFileIsEmittedAsSystemModule() && isSourceFileLevelDeclaration(node) + if (!hoistedInDeclarationScope) { + emitStart(node); + if (isES6ExportedDeclaration(node)) { + write("export "); + } + write("var "); + emit(node.name); + write(";"); + emitEnd(node); + writeLine(); } - write("var "); - emit(node.name); - write(";"); - emitEnd(node); - writeLine(); emitStart(node); write("(function ("); emitStart(node.name); @@ -4378,6 +4381,14 @@ var __param = this.__param || function(index, decorator) { return function (targ write(" = {}));"); emitEnd(node); if (!isES6ExportedDeclaration(node) && node.name.kind === SyntaxKind.Identifier && node.parent === currentSourceFile) { + if (currentFileIsEmittedAsSystemModule() && node.flags & NodeFlags.Export) { + writeLine(); + write(`${exportFunctionForFile}("`); + emitDeclarationName(node); + write(`", `); + emitDeclarationName(node); + write(")"); + } emitExportMemberAssignments(node.name); } } @@ -4829,7 +4840,7 @@ var __param = this.__param || function(index, decorator) { return function (targ } function hoistTopLevelVariableAndFunctionDeclarations(node: SourceFile): void { - let hoistedVars: (Identifier | ClassDeclaration)[]; + let hoistedVars: (Identifier | ClassDeclaration | ModuleDeclaration)[]; let hoistedFunctionDeclarations: FunctionDeclaration[]; visit(node); @@ -4842,7 +4853,7 @@ var __param = this.__param || function(index, decorator) { return function (targ if (i !== 0) { write(", "); } - if (local.kind === SyntaxKind.ClassDeclaration) { + if (local.kind === SyntaxKind.ClassDeclaration || local.kind === SyntaxKind.ModuleDeclaration) { emitDeclarationName(local); } else { @@ -4871,6 +4882,11 @@ var __param = this.__param || function(index, decorator) { return function (targ return; } + if (node.kind === SyntaxKind.ModuleDeclaration && shouldEmitModuleDeclaration(node)) { + (hoistedVars || (hoistedVars = [])).push(node); + return; + } + if (node.kind === SyntaxKind.VariableDeclaration || node.kind === SyntaxKind.BindingElement) { let name = (node).name; if (name.kind === SyntaxKind.Identifier) {