Disallow module elements in a non-module context
This commit is contained in:
parent
4fcbbc8cce
commit
05e7f11e88
3 changed files with 56 additions and 3 deletions
|
@ -11114,6 +11114,14 @@ module ts {
|
||||||
function checkModuleDeclaration(node: ModuleDeclaration) {
|
function checkModuleDeclaration(node: ModuleDeclaration) {
|
||||||
if (produceDiagnostics) {
|
if (produceDiagnostics) {
|
||||||
// Grammar checking
|
// Grammar checking
|
||||||
|
let isAmbientExternalModule = node.name.kind === SyntaxKind.StringLiteral;
|
||||||
|
let contextErrorMessage = isAmbientExternalModule
|
||||||
|
? Diagnostics.An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file
|
||||||
|
: Diagnostics.A_namespace_declaration_is_only_allowed_in_a_namespace_or_module;
|
||||||
|
if (!checkGrammarModuleElementContext(node, contextErrorMessage)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!checkGrammarDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node)) {
|
if (!checkGrammarDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node)) {
|
||||||
if (!isInAmbientContext(node) && node.name.kind === SyntaxKind.StringLiteral) {
|
if (!isInAmbientContext(node) && node.name.kind === SyntaxKind.StringLiteral) {
|
||||||
grammarErrorOnNode(node.name, Diagnostics.Only_ambient_modules_can_use_quoted_names);
|
grammarErrorOnNode(node.name, Diagnostics.Only_ambient_modules_can_use_quoted_names);
|
||||||
|
@ -11150,7 +11158,7 @@ module ts {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks for ambient external modules.
|
// Checks for ambient external modules.
|
||||||
if (node.name.kind === SyntaxKind.StringLiteral) {
|
if (isAmbientExternalModule) {
|
||||||
if (!isGlobalSourceFile(node.parent)) {
|
if (!isGlobalSourceFile(node.parent)) {
|
||||||
error(node.name, Diagnostics.Ambient_modules_cannot_be_nested_in_other_modules);
|
error(node.name, Diagnostics.Ambient_modules_cannot_be_nested_in_other_modules);
|
||||||
}
|
}
|
||||||
|
@ -11227,6 +11235,9 @@ module ts {
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkImportDeclaration(node: ImportDeclaration) {
|
function checkImportDeclaration(node: ImportDeclaration) {
|
||||||
|
if (!checkGrammarModuleElementContext(node, Diagnostics.An_import_declaration_can_only_be_used_in_a_namespace_or_module)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!checkGrammarImportDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & NodeFlags.Modifier)) {
|
if (!checkGrammarImportDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & NodeFlags.Modifier)) {
|
||||||
grammarErrorOnFirstToken(node, Diagnostics.An_import_declaration_cannot_have_modifiers);
|
grammarErrorOnFirstToken(node, Diagnostics.An_import_declaration_cannot_have_modifiers);
|
||||||
}
|
}
|
||||||
|
@ -11249,6 +11260,10 @@ module ts {
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkImportEqualsDeclaration(node: ImportEqualsDeclaration) {
|
function checkImportEqualsDeclaration(node: ImportEqualsDeclaration) {
|
||||||
|
if (!checkGrammarModuleElementContext(node, Diagnostics.An_import_declaration_can_only_be_used_in_a_namespace_or_module)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node);
|
checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node);
|
||||||
if (isInternalModuleImportEqualsDeclaration(node) || checkExternalImportOrExportDeclaration(node)) {
|
if (isInternalModuleImportEqualsDeclaration(node) || checkExternalImportOrExportDeclaration(node)) {
|
||||||
checkImportBinding(node);
|
checkImportBinding(node);
|
||||||
|
@ -11280,9 +11295,14 @@ module ts {
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkExportDeclaration(node: ExportDeclaration) {
|
function checkExportDeclaration(node: ExportDeclaration) {
|
||||||
|
if (!checkGrammarModuleElementContext(node, Diagnostics.An_export_declaration_can_only_be_used_in_a_module)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & NodeFlags.Modifier)) {
|
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & NodeFlags.Modifier)) {
|
||||||
grammarErrorOnFirstToken(node, Diagnostics.An_export_declaration_cannot_have_modifiers);
|
grammarErrorOnFirstToken(node, Diagnostics.An_export_declaration_cannot_have_modifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!node.moduleSpecifier || checkExternalImportOrExportDeclaration(node)) {
|
if (!node.moduleSpecifier || checkExternalImportOrExportDeclaration(node)) {
|
||||||
if (node.exportClause) {
|
if (node.exportClause) {
|
||||||
// export { x, y }
|
// export { x, y }
|
||||||
|
@ -11304,6 +11324,15 @@ module ts {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function checkGrammarModuleElementContext(node: ModuleElement, errorMessage: DiagnosticMessage): boolean {
|
||||||
|
if (node.parent.kind !== SyntaxKind.SourceFile && node.parent.kind !== SyntaxKind.ModuleBlock && node.parent.kind !== SyntaxKind.ModuleDeclaration) {
|
||||||
|
grammarErrorOnFirstToken(node, errorMessage);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
function checkExportSpecifier(node: ExportSpecifier) {
|
function checkExportSpecifier(node: ExportSpecifier) {
|
||||||
checkAliasSymbol(node);
|
checkAliasSymbol(node);
|
||||||
if (!(<ExportDeclaration>node.parent.parent).moduleSpecifier) {
|
if (!(<ExportDeclaration>node.parent.parent).moduleSpecifier) {
|
||||||
|
@ -11312,8 +11341,7 @@ module ts {
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkExportAssignment(node: ExportAssignment) {
|
function checkExportAssignment(node: ExportAssignment) {
|
||||||
if (node.parent.kind !== SyntaxKind.SourceFile && node.parent.kind !== SyntaxKind.ModuleBlock) {
|
if (!checkGrammarModuleElementContext(node, Diagnostics.An_export_assignment_can_only_be_used_in_a_module)) {
|
||||||
// TODO: StatementFlags
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -186,6 +186,11 @@ module ts {
|
||||||
A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods: { code: 1228, category: DiagnosticCategory.Error, key: "A type predicate is only allowed in return type position for functions and methods." },
|
A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods: { code: 1228, category: DiagnosticCategory.Error, key: "A type predicate is only allowed in return type position for functions and methods." },
|
||||||
A_type_predicate_cannot_reference_a_rest_parameter: { code: 1229, category: DiagnosticCategory.Error, key: "A type predicate cannot reference a rest parameter." },
|
A_type_predicate_cannot_reference_a_rest_parameter: { code: 1229, category: DiagnosticCategory.Error, key: "A type predicate cannot reference a rest parameter." },
|
||||||
A_type_predicate_cannot_reference_element_0_in_a_binding_pattern: { code: 1230, category: DiagnosticCategory.Error, key: "A type predicate cannot reference element '{0}' in a binding pattern." },
|
A_type_predicate_cannot_reference_element_0_in_a_binding_pattern: { code: 1230, category: DiagnosticCategory.Error, key: "A type predicate cannot reference element '{0}' in a binding pattern." },
|
||||||
|
An_export_assignment_can_only_be_used_in_a_module: { code: 1231, category: DiagnosticCategory.Error, key: "An export assignment can only be used in a module." },
|
||||||
|
An_import_declaration_can_only_be_used_in_a_namespace_or_module: { code: 1232, category: DiagnosticCategory.Error, key: "An import declaration can only be used in a namespace or module." },
|
||||||
|
An_export_declaration_can_only_be_used_in_a_module: { code: 1233, category: DiagnosticCategory.Error, key: "An export declaration can only be used in a module." },
|
||||||
|
An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file: { code: 1234, category: DiagnosticCategory.Error, key: "An ambient module declaration is only allowed at the top level in a file." },
|
||||||
|
A_namespace_declaration_is_only_allowed_in_a_namespace_or_module: { code: 1235, category: DiagnosticCategory.Error, key: "A namespace declaration is only allowed in a namespace or module." },
|
||||||
Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." },
|
Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." },
|
||||||
Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." },
|
Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." },
|
||||||
Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." },
|
Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." },
|
||||||
|
|
|
@ -731,6 +731,26 @@
|
||||||
"category": "Error",
|
"category": "Error",
|
||||||
"code": 1230
|
"code": 1230
|
||||||
},
|
},
|
||||||
|
"An export assignment can only be used in a module.": {
|
||||||
|
"category": "Error",
|
||||||
|
"code": 1231
|
||||||
|
},
|
||||||
|
"An import declaration can only be used in a namespace or module.": {
|
||||||
|
"category": "Error",
|
||||||
|
"code": 1232
|
||||||
|
},
|
||||||
|
"An export declaration can only be used in a module.": {
|
||||||
|
"category": "Error",
|
||||||
|
"code": 1233
|
||||||
|
},
|
||||||
|
"An ambient module declaration is only allowed at the top level in a file.": {
|
||||||
|
"category": "Error",
|
||||||
|
"code": 1234
|
||||||
|
},
|
||||||
|
"A namespace declaration is only allowed in a namespace or module.": {
|
||||||
|
"category": "Error",
|
||||||
|
"code": 1235
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
"Duplicate identifier '{0}'.": {
|
"Duplicate identifier '{0}'.": {
|
||||||
|
|
Loading…
Reference in a new issue