From 063399d228b21cd855bbc58c8be6a35faf3fb4b5 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Fri, 11 Jul 2014 14:35:10 -0700 Subject: [PATCH] Emit declaration if its identifier is used in export assignment of external module --- src/compiler/checker.ts | 19 ++++++++++++++++++- src/compiler/emitter.ts | 13 +++++-------- src/compiler/types.ts | 1 + ...lFileExportAssignmentOfGenericInterface.js | 3 +++ .../reference/declFileExportImportChain.js | 6 ++++++ .../reference/declFileExportImportChain2.js | 6 ++++++ ...eclFileImportModuleWithExportAssignment.js | 9 +++++++++ .../reference/declareFileExportAssignment.js | 9 +++++++++ tests/baselines/reference/exportImport.js | 3 +++ .../exportImportNonInstantiatedModule2.js | 3 +++ .../missingImportAfterModuleImport.js | 4 ++++ 11 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e0eaba6ff66..4f5851e91d7 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5706,6 +5706,22 @@ module ts { return false; } + function isReferencedInExportAssignment(node: Declaration): boolean { + var exportAssignedSymbol = getExportAssignmentSymbol(getSymbolOfNode(node.parent)); + if (exportAssignedSymbol) { + var symbol = getSymbolOfNode(node); + if (exportAssignedSymbol === symbol) { + // This symbol was export assigned symbol + return true; + } + + // TODO(shkamat): if export assignment is alias, the alias target would make the node as referenced in export assignment + + } + + return false; + } + function getNodeCheckFlags(node: Node): NodeCheckFlags { return getNodeLinks(node).flags; } @@ -5725,7 +5741,8 @@ module ts { getNodeCheckFlags: getNodeCheckFlags, getEnumMemberValue: getEnumMemberValue, isTopLevelValueImportedViaEntityName: isTopLevelValueImportedViaEntityName, - shouldEmitDeclarations: shouldEmitDeclarations + shouldEmitDeclarations: shouldEmitDeclarations, + isReferencedInExportAssignment: isReferencedInExportAssignment }; checkProgram(); return emitFiles(resolver); diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 661adef45f5..9a9a3676efa 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1922,16 +1922,13 @@ module ts { return true; } - if (node.parent.kind === SyntaxKind.SourceFile) { - // Global context nodes - emit this declaration - if (!(node.parent.flags & NodeFlags.ExternalModule)) { - return true; - } + // If this node is in external module, check if this is export assigned + if (node.parent.flags & NodeFlags.ExternalModule) { + return resolver.isReferencedInExportAssignment(node); } - // TODO(shkamat): check if this node is part of export assignment in the external module - - return false; + // emit the declaration if this is global source file + return node.parent.kind === SyntaxKind.SourceFile; } function emitDeclarationFlags(node: Declaration) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index c09d3a0cee2..570f33325d8 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -601,6 +601,7 @@ module ts { getNodeCheckFlags(node: Node): NodeCheckFlags; getEnumMemberValue(node: EnumMember): number; shouldEmitDeclarations(): boolean; + isReferencedInExportAssignment(node: Declaration): boolean; } export enum SymbolFlags { diff --git a/tests/baselines/reference/declFileExportAssignmentOfGenericInterface.js b/tests/baselines/reference/declFileExportAssignmentOfGenericInterface.js index 0451afdfa61..5671c39ba75 100644 --- a/tests/baselines/reference/declFileExportAssignmentOfGenericInterface.js +++ b/tests/baselines/reference/declFileExportAssignmentOfGenericInterface.js @@ -23,6 +23,9 @@ define(["require", "exports"], function (require, exports) { //// [declFileExportAssignmentOfGenericInterface_0.d.ts] +interface Foo { + a; +} export = Foo; //// [declFileExportAssignmentOfGenericInterface_1.d.ts] export declare var x; diff --git a/tests/baselines/reference/declFileExportImportChain.js b/tests/baselines/reference/declFileExportImportChain.js index 7613b45d5b0..7d1961044f2 100644 --- a/tests/baselines/reference/declFileExportImportChain.js +++ b/tests/baselines/reference/declFileExportImportChain.js @@ -59,6 +59,12 @@ define(["require", "exports"], function (require, exports) { //// [declFileExportImportChain_a.d.ts] +declare module m1 { + module m2 { + class c1 { + } + } +} export = m1; //// [declFileExportImportChain_b.d.ts] export import a = require("declFileExportImportChain_a"); diff --git a/tests/baselines/reference/declFileExportImportChain2.js b/tests/baselines/reference/declFileExportImportChain2.js index 46e340af8a0..5e5a87ccfba 100644 --- a/tests/baselines/reference/declFileExportImportChain2.js +++ b/tests/baselines/reference/declFileExportImportChain2.js @@ -52,6 +52,12 @@ define(["require", "exports"], function (require, exports) { //// [declFileExportImportChain2_a.d.ts] +declare module m1 { + module m2 { + class c1 { + } + } +} export = m1; //// [declFileExportImportChain2_b.d.ts] export = a; diff --git a/tests/baselines/reference/declFileImportModuleWithExportAssignment.js b/tests/baselines/reference/declFileImportModuleWithExportAssignment.js index c876c98d4f1..0421feed885 100644 --- a/tests/baselines/reference/declFileImportModuleWithExportAssignment.js +++ b/tests/baselines/reference/declFileImportModuleWithExportAssignment.js @@ -36,6 +36,15 @@ exports.a.test1(null, null, null); //// [declFileImportModuleWithExportAssignment_0.d.ts] +declare module m2 { + interface connectModule { + (res, req, next); + } + interface connectExport { + use; + listen; + } +} export = m2; //// [declFileImportModuleWithExportAssignment_1.d.ts] export declare var a; diff --git a/tests/baselines/reference/declareFileExportAssignment.js b/tests/baselines/reference/declareFileExportAssignment.js index 5b8d65bbc3b..49a1771d4e6 100644 --- a/tests/baselines/reference/declareFileExportAssignment.js +++ b/tests/baselines/reference/declareFileExportAssignment.js @@ -24,4 +24,13 @@ module.exports = m2; //// [declareFileExportAssignment.d.ts] +declare module m2 { + interface connectModule { + (res, req, next); + } + interface connectExport { + use; + listen; + } +} export = m2; diff --git a/tests/baselines/reference/exportImport.js b/tests/baselines/reference/exportImport.js index 56e48ddb8f3..8b65cbf03a1 100644 --- a/tests/baselines/reference/exportImport.js +++ b/tests/baselines/reference/exportImport.js @@ -40,6 +40,9 @@ define(["require", "exports", './exporter'], function (require, exports, e) { //// [w1.d.ts] export = Widget1; +declare class Widget1 { + name; +} //// [exporter.d.ts] export import w = require('./w1'); //// [consumer.d.ts] diff --git a/tests/baselines/reference/exportImportNonInstantiatedModule2.js b/tests/baselines/reference/exportImportNonInstantiatedModule2.js index 85e8f33ffd8..2d1834d3210 100644 --- a/tests/baselines/reference/exportImportNonInstantiatedModule2.js +++ b/tests/baselines/reference/exportImportNonInstantiatedModule2.js @@ -32,6 +32,9 @@ define(["require", "exports"], function (require, exports) { //// [w1.d.ts] export = Widget1; +interface Widget1 { + name; +} //// [exporter.d.ts] export import w = require('./w1'); //// [consumer.d.ts] diff --git a/tests/baselines/reference/missingImportAfterModuleImport.js b/tests/baselines/reference/missingImportAfterModuleImport.js index 088fb293f9c..665e5cdfcf8 100644 --- a/tests/baselines/reference/missingImportAfterModuleImport.js +++ b/tests/baselines/reference/missingImportAfterModuleImport.js @@ -39,4 +39,8 @@ declare module "SubModule" { } //// [missingImportAfterModuleImport_1.d.ts] /// +declare class MainModule { + SubModule; + constructor (); +} export = MainModule;