Take default export spaces into account when checking merged declarations.

This commit is contained in:
Daniel Rosenwasser 2015-07-21 17:22:14 -07:00
parent 7e464458f8
commit 8d5d73eb91
3 changed files with 22 additions and 4 deletions

View file

@ -10682,10 +10682,18 @@ namespace ts {
// to denote disjoint declarationSpaces (without making new enum type).
let exportedDeclarationSpaces = SymbolFlags.None;
let nonExportedDeclarationSpaces = SymbolFlags.None;
let defaultExportedDeclarationFlags = SymbolFlags.None;
for (let d of symbol.declarations) {
let declarationSpaces = getDeclarationSpaces(d);
if (getEffectiveDeclarationFlags(d, NodeFlags.Export)) {
exportedDeclarationSpaces |= declarationSpaces;
let effectiveDeclarationFlags = getEffectiveDeclarationFlags(d, NodeFlags.Export | NodeFlags.Default);
if (effectiveDeclarationFlags & NodeFlags.Export) {
if (effectiveDeclarationFlags & NodeFlags.Default) {
defaultExportedDeclarationFlags |= declarationSpaces;
}
else {
exportedDeclarationSpaces |= declarationSpaces;
}
}
else {
nonExportedDeclarationSpaces |= declarationSpaces;
@ -10693,11 +10701,16 @@ namespace ts {
}
let commonDeclarationSpace = exportedDeclarationSpaces & nonExportedDeclarationSpaces;
let commonDeclarationSpaceForDefault = defaultExportedDeclarationFlags & (exportedDeclarationSpaces | nonExportedDeclarationSpaces);
if (commonDeclarationSpace) {
if (commonDeclarationSpace || commonDeclarationSpaceForDefault) {
// declaration spaces for exported and non-exported declarations intersect
for (let d of symbol.declarations) {
if (getDeclarationSpaces(d) & commonDeclarationSpace) {
let declarationSpaces = getDeclarationSpaces(d);
if (declarationSpaces & commonDeclarationSpaceForDefault) {
error(d.name, Diagnostics.Merged_declaration_0_cannot_include_a_default_export_declaration, declarationNameToString(d.name));
}
else if (declarationSpaces & commonDeclarationSpace) {
error(d.name, Diagnostics.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local, declarationNameToString(d.name));
}
}

View file

@ -424,6 +424,7 @@ namespace ts {
JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property: { code: 2607, category: DiagnosticCategory.Error, key: "JSX element class does not support attributes because it does not have a '{0}' property" },
The_global_type_JSX_0_may_not_have_more_than_one_property: { code: 2608, category: DiagnosticCategory.Error, key: "The global type 'JSX.{0}' may not have more than one property" },
Cannot_emit_namespaced_JSX_elements_in_React: { code: 2650, category: DiagnosticCategory.Error, key: "Cannot emit namespaced JSX elements in React" },
Merged_declaration_0_cannot_include_a_default_export_declaration: { code: 2651, category: DiagnosticCategory.Error, key: "Merged declaration '{0}' cannot include a default export declaration." },
Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." },
Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." },
Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." },

View file

@ -1685,6 +1685,10 @@
"category": "Error",
"code": 2650
},
"Merged declaration '{0}' cannot include a default export declaration.": {
"category": "Error",
"code": 2651
},
"Import declaration '{0}' is using private name '{1}'.": {
"category": "Error",
"code": 4000