Skip to content

Commit

Permalink
Merge pull request #7119 from Microsoft/checkRedeclarations
Browse files Browse the repository at this point in the history
correctly check exported type aliases merged with overloads
  • Loading branch information
vladima committed Feb 17, 2016
2 parents fdb8dc8 + 5e770bd commit 29b9fd3
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 5 deletions.
19 changes: 14 additions & 5 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15055,11 +15055,20 @@ namespace ts {
continue;
}
const { declarations, flags } = exports[id];
// ECMA262: 15.2.1.1 It is a Syntax Error if the ExportedNames of ModuleItemList contains any duplicate entries. (TS Exceptions: namespaces, function overloads, enums, and interfaces)
if (!(flags & (SymbolFlags.Namespace | SymbolFlags.Interface | SymbolFlags.Enum)) && (flags & SymbolFlags.TypeAlias ? declarations.length - 1 : declarations.length) > 1) {
const exportedDeclarations: Declaration[] = filter(declarations, isNotOverload);
if (exportedDeclarations.length > 1) {
for (const declaration of exportedDeclarations) {
// ECMA262: 15.2.1.1 It is a Syntax Error if the ExportedNames of ModuleItemList contains any duplicate entries.
// (TS Exceptions: namespaces, function overloads, enums, and interfaces)
if (flags & (SymbolFlags.Namespace | SymbolFlags.Interface | SymbolFlags.Enum)) {
continue;
}
const exportedDeclarationsCount = countWhere(declarations, isNotOverload);
if (flags & SymbolFlags.TypeAlias && exportedDeclarationsCount <= 2) {
// it is legal to merge type alias with other values
// so count should be either 1 (just type alias) or 2 (type alias + merged value)
continue;
}
if (exportedDeclarationsCount > 1) {
for (const declaration of declarations) {
if (isNotOverload(declaration)) {
diagnostics.add(createDiagnosticForNode(declaration, Diagnostics.Cannot_redeclare_exported_variable_0, id));
}
}
Expand Down
9 changes: 9 additions & 0 deletions tests/baselines/reference/exportRedeclarationTypeAliases.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//// [exportRedeclarationTypeAliases.ts]
export type Foo = number;
export function Foo(): number;
export function Foo(): any {}

//// [exportRedeclarationTypeAliases.js]
"use strict";
function Foo() { }
exports.Foo = Foo;
10 changes: 10 additions & 0 deletions tests/baselines/reference/exportRedeclarationTypeAliases.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
=== tests/cases/compiler/exportRedeclarationTypeAliases.ts ===
export type Foo = number;
>Foo : Symbol(Foo, Decl(exportRedeclarationTypeAliases.ts, 0, 0), Decl(exportRedeclarationTypeAliases.ts, 0, 25), Decl(exportRedeclarationTypeAliases.ts, 1, 30))

export function Foo(): number;
>Foo : Symbol(Foo, Decl(exportRedeclarationTypeAliases.ts, 0, 0), Decl(exportRedeclarationTypeAliases.ts, 0, 25), Decl(exportRedeclarationTypeAliases.ts, 1, 30))

export function Foo(): any {}
>Foo : Symbol(Foo, Decl(exportRedeclarationTypeAliases.ts, 0, 0), Decl(exportRedeclarationTypeAliases.ts, 0, 25), Decl(exportRedeclarationTypeAliases.ts, 1, 30))

10 changes: 10 additions & 0 deletions tests/baselines/reference/exportRedeclarationTypeAliases.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
=== tests/cases/compiler/exportRedeclarationTypeAliases.ts ===
export type Foo = number;
>Foo : number

export function Foo(): number;
>Foo : () => number

export function Foo(): any {}
>Foo : () => number

4 changes: 4 additions & 0 deletions tests/cases/compiler/exportRedeclarationTypeAliases.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// @module: commonjs
export type Foo = number;
export function Foo(): number;
export function Foo(): any {}

0 comments on commit 29b9fd3

Please sign in to comment.