From ca5d243ca7afdad7c51cb9378ccf44b1663fcd06 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 15:49:00 -0800 Subject: [PATCH 1/3] Added test from original issue. --- ...leWithPriorUninstantiatedModule.errors.txt | 21 ++++++++++++ .../cloduleWithPriorUninstantiatedModule.js | 33 +++++++++++++++++++ .../cloduleWithPriorUninstantiatedModule.ts | 15 +++++++++ 3 files changed, 69 insertions(+) create mode 100644 tests/baselines/reference/cloduleWithPriorUninstantiatedModule.errors.txt create mode 100644 tests/baselines/reference/cloduleWithPriorUninstantiatedModule.js create mode 100644 tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts diff --git a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.errors.txt b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.errors.txt new file mode 100644 index 00000000000..cae69212f2f --- /dev/null +++ b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.errors.txt @@ -0,0 +1,21 @@ +tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts(2,8): error TS2434: A module declaration cannot be located prior to a class or function with which it is merged + + +==== tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts (1 errors) ==== + // Ambient/uninstantiated module. + module Moclodule { + ~~~~~~~~~ +!!! error TS2434: A module declaration cannot be located prior to a class or function with which it is merged + export interface Someinterface { + foo(): void; + } + } + + class Moclodule { + } + + // Instantiated module. + module Moclodule { + export class Manager { + } + } \ No newline at end of file diff --git a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.js b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.js new file mode 100644 index 00000000000..37bfb617375 --- /dev/null +++ b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.js @@ -0,0 +1,33 @@ +//// [cloduleWithPriorUninstantiatedModule.ts] +// Ambient/uninstantiated module. +module Moclodule { + export interface Someinterface { + foo(): void; + } +} + +class Moclodule { +} + +// Instantiated module. +module Moclodule { + export class Manager { + } +} + +//// [cloduleWithPriorUninstantiatedModule.js] +var Moclodule = (function () { + function Moclodule() { + } + return Moclodule; +})(); +// Instantiated module. +var Moclodule; +(function (Moclodule) { + var Manager = (function () { + function Manager() { + } + return Manager; + })(); + Moclodule.Manager = Manager; +})(Moclodule || (Moclodule = {})); diff --git a/tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts b/tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts new file mode 100644 index 00000000000..8c9c646b687 --- /dev/null +++ b/tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts @@ -0,0 +1,15 @@ +// Ambient/uninstantiated module. +module Moclodule { + export interface Someinterface { + foo(): void; + } +} + +class Moclodule { +} + +// Instantiated module. +module Moclodule { + export class Manager { + } +} \ No newline at end of file From fac52017653a97a2c95013b76c8d62a55bf228a7 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 17:00:42 -0800 Subject: [PATCH 2/3] Only error on non-ambient instantiated modules preceding clodules. --- src/compiler/checker.ts | 9 ++++++- src/compiler/emitter.ts | 4 +-- src/compiler/utilities.ts | 6 +++++ ...leWithPriorUninstantiatedModule.errors.txt | 21 ---------------- ...cloduleWithPriorUninstantiatedModule.types | 25 +++++++++++++++++++ 5 files changed, 41 insertions(+), 24 deletions(-) delete mode 100644 tests/baselines/reference/cloduleWithPriorUninstantiatedModule.errors.txt create mode 100644 tests/baselines/reference/cloduleWithPriorUninstantiatedModule.types diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ccc67ba3881..e5334c454d3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9003,7 +9003,12 @@ module ts { checkCollisionWithRequireExportsInGeneratedCode(node, node.name); checkExportsOnMergedDeclarations(node); var symbol = getSymbolOfNode(node); - if (symbol.flags & SymbolFlags.ValueModule && symbol.declarations.length > 1 && !isInAmbientContext(node)) { + + // The following checks only apply on a non-ambient instantiated module declaration. + if (symbol.flags & SymbolFlags.ValueModule + && symbol.declarations.length > 1 + && !isInAmbientContext(node) + && isInstantiatedModule(node, compilerOptions.preserveConstEnums)) { var classOrFunc = getFirstNonAmbientClassOrFunctionDeclaration(symbol); if (classOrFunc) { if (getSourceFileOfNode(node) !== getSourceFileOfNode(classOrFunc)) { @@ -9014,6 +9019,8 @@ module ts { } } } + + // Checks for ambient external modules. if (node.name.kind === SyntaxKind.StringLiteral) { if (!isGlobalSourceFile(node.parent)) { error(node.name, Diagnostics.Ambient_external_modules_cannot_be_nested_in_other_modules); diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index b713fddf676..005c7aa5f15 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3680,8 +3680,8 @@ module ts { } function emitModuleDeclaration(node: ModuleDeclaration) { - var shouldEmit = getModuleInstanceState(node) === ModuleInstanceState.Instantiated || - (getModuleInstanceState(node) === ModuleInstanceState.ConstEnumOnly && compilerOptions.preserveConstEnums); + // Emit only if this module is non-ambient. + var shouldEmit = isInstantiatedModule(node, compilerOptions.preserveConstEnums); if (!shouldEmit) { return emitPinnedOrTripleSlashComments(node); diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index bbe4d7dbf35..114e1dae1b3 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -525,6 +525,12 @@ module ts { return false; } + export function isInstantiatedModule(node: ModuleDeclaration, preserveConstEnums: boolean) { + var moduleState = getModuleInstanceState(node) + return moduleState === ModuleInstanceState.Instantiated || + (preserveConstEnums && moduleState === ModuleInstanceState.ConstEnumOnly); + } + export function isExternalModuleImportDeclaration(node: Node) { return node.kind === SyntaxKind.ImportDeclaration && (node).moduleReference.kind === SyntaxKind.ExternalModuleReference; } diff --git a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.errors.txt b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.errors.txt deleted file mode 100644 index cae69212f2f..00000000000 --- a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.errors.txt +++ /dev/null @@ -1,21 +0,0 @@ -tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts(2,8): error TS2434: A module declaration cannot be located prior to a class or function with which it is merged - - -==== tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts (1 errors) ==== - // Ambient/uninstantiated module. - module Moclodule { - ~~~~~~~~~ -!!! error TS2434: A module declaration cannot be located prior to a class or function with which it is merged - export interface Someinterface { - foo(): void; - } - } - - class Moclodule { - } - - // Instantiated module. - module Moclodule { - export class Manager { - } - } \ No newline at end of file diff --git a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.types b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.types new file mode 100644 index 00000000000..1ab286b5964 --- /dev/null +++ b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.types @@ -0,0 +1,25 @@ +=== tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts === +// Ambient/uninstantiated module. +module Moclodule { +>Moclodule : typeof Moclodule + + export interface Someinterface { +>Someinterface : Someinterface + + foo(): void; +>foo : () => void + } +} + +class Moclodule { +>Moclodule : Moclodule +} + +// Instantiated module. +module Moclodule { +>Moclodule : typeof Moclodule + + export class Manager { +>Manager : Manager + } +} From 46cd90daf080b2f8e3bd88cb7eda4193e4a05fc9 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 17 Dec 2014 17:05:05 -0800 Subject: [PATCH 3/3] Added test, modified test, updated baselines. --- ...duleWithPriorInstantiatedModule.errors.txt | 22 +++++++++++ .../cloduleWithPriorInstantiatedModule.js | 39 +++++++++++++++++++ .../cloduleWithPriorUninstantiatedModule.js | 2 +- ...cloduleWithPriorUninstantiatedModule.types | 2 +- .../cloduleWithPriorInstantiatedModule.ts | 16 ++++++++ .../cloduleWithPriorUninstantiatedModule.ts | 2 +- 6 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/cloduleWithPriorInstantiatedModule.errors.txt create mode 100644 tests/baselines/reference/cloduleWithPriorInstantiatedModule.js create mode 100644 tests/cases/compiler/cloduleWithPriorInstantiatedModule.ts diff --git a/tests/baselines/reference/cloduleWithPriorInstantiatedModule.errors.txt b/tests/baselines/reference/cloduleWithPriorInstantiatedModule.errors.txt new file mode 100644 index 00000000000..1b0d9cf13ca --- /dev/null +++ b/tests/baselines/reference/cloduleWithPriorInstantiatedModule.errors.txt @@ -0,0 +1,22 @@ +tests/cases/compiler/cloduleWithPriorInstantiatedModule.ts(2,8): error TS2434: A module declaration cannot be located prior to a class or function with which it is merged + + +==== tests/cases/compiler/cloduleWithPriorInstantiatedModule.ts (1 errors) ==== + // Non-ambient & instantiated module. + module Moclodule { + ~~~~~~~~~ +!!! error TS2434: A module declaration cannot be located prior to a class or function with which it is merged + export interface Someinterface { + foo(): void; + } + var x = 10; + } + + class Moclodule { + } + + // Instantiated module. + module Moclodule { + export class Manager { + } + } \ No newline at end of file diff --git a/tests/baselines/reference/cloduleWithPriorInstantiatedModule.js b/tests/baselines/reference/cloduleWithPriorInstantiatedModule.js new file mode 100644 index 00000000000..601ab0a7536 --- /dev/null +++ b/tests/baselines/reference/cloduleWithPriorInstantiatedModule.js @@ -0,0 +1,39 @@ +//// [cloduleWithPriorInstantiatedModule.ts] +// Non-ambient & instantiated module. +module Moclodule { + export interface Someinterface { + foo(): void; + } + var x = 10; +} + +class Moclodule { +} + +// Instantiated module. +module Moclodule { + export class Manager { + } +} + +//// [cloduleWithPriorInstantiatedModule.js] +// Non-ambient & instantiated module. +var Moclodule; +(function (Moclodule) { + var x = 10; +})(Moclodule || (Moclodule = {})); +var Moclodule = (function () { + function Moclodule() { + } + return Moclodule; +})(); +// Instantiated module. +var Moclodule; +(function (Moclodule) { + var Manager = (function () { + function Manager() { + } + return Manager; + })(); + Moclodule.Manager = Manager; +})(Moclodule || (Moclodule = {})); diff --git a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.js b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.js index 37bfb617375..cf06f1134fb 100644 --- a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.js +++ b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.js @@ -1,5 +1,5 @@ //// [cloduleWithPriorUninstantiatedModule.ts] -// Ambient/uninstantiated module. +// Non-ambient & uninstantiated module. module Moclodule { export interface Someinterface { foo(): void; diff --git a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.types b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.types index 1ab286b5964..8dc14646a6b 100644 --- a/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.types +++ b/tests/baselines/reference/cloduleWithPriorUninstantiatedModule.types @@ -1,5 +1,5 @@ === tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts === -// Ambient/uninstantiated module. +// Non-ambient & uninstantiated module. module Moclodule { >Moclodule : typeof Moclodule diff --git a/tests/cases/compiler/cloduleWithPriorInstantiatedModule.ts b/tests/cases/compiler/cloduleWithPriorInstantiatedModule.ts new file mode 100644 index 00000000000..c6423ce41a7 --- /dev/null +++ b/tests/cases/compiler/cloduleWithPriorInstantiatedModule.ts @@ -0,0 +1,16 @@ +// Non-ambient & instantiated module. +module Moclodule { + export interface Someinterface { + foo(): void; + } + var x = 10; +} + +class Moclodule { +} + +// Instantiated module. +module Moclodule { + export class Manager { + } +} \ No newline at end of file diff --git a/tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts b/tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts index 8c9c646b687..0c603b71a4d 100644 --- a/tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts +++ b/tests/cases/compiler/cloduleWithPriorUninstantiatedModule.ts @@ -1,4 +1,4 @@ -// Ambient/uninstantiated module. +// Non-ambient & uninstantiated module. module Moclodule { export interface Someinterface { foo(): void;