From 6bc6482765bd812314315fdaf3db68dcbb0ac27e Mon Sep 17 00:00:00 2001 From: Dzmitry Shylovich Date: Tue, 7 Mar 2017 04:00:25 +0300 Subject: [PATCH] fix(compiler): improve error message when a module imports itself (#14646) Closes #14644 --- modules/@angular/compiler/src/metadata_resolver.ts | 10 ++++++++++ .../@angular/compiler/test/metadata_resolver_spec.ts | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/modules/@angular/compiler/src/metadata_resolver.ts b/modules/@angular/compiler/src/metadata_resolver.ts index 407391c526..430feea7d1 100644 --- a/modules/@angular/compiler/src/metadata_resolver.ts +++ b/modules/@angular/compiler/src/metadata_resolver.ts @@ -425,6 +425,7 @@ export class CompileMetadataResolver { } if (importedModuleType) { + if (this._checkSelfImport(moduleType, importedModuleType)) return; const importedModuleSummary = this.getNgModuleSummary(importedModuleType); if (!importedModuleSummary) { this._reportError( @@ -567,6 +568,15 @@ export class CompileMetadataResolver { return compileMeta; } + private _checkSelfImport(moduleType: Type, importedModuleType: Type): boolean { + if (moduleType === importedModuleType) { + this._reportError( + syntaxError(`'${stringifyType(moduleType)}' module can't import itself`), moduleType); + return true; + } + return false; + } + private _getTypeDescriptor(type: Type): string { if (this._directiveResolver.isDirective(type)) { return 'directive'; diff --git a/modules/@angular/compiler/test/metadata_resolver_spec.ts b/modules/@angular/compiler/test/metadata_resolver_spec.ts index 8d57cee687..841b2c7800 100644 --- a/modules/@angular/compiler/test/metadata_resolver_spec.ts +++ b/modules/@angular/compiler/test/metadata_resolver_spec.ts @@ -135,6 +135,15 @@ export function main() { .toThrowError(`Expected 'styles' to be an array of strings.`); })); + it('should throw with descriptive error message when a module imports itself', + inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => { + @NgModule({imports: [SomeModule]}) + class SomeModule { + } + expect(() => resolver.loadNgModuleDirectiveAndPipeMetadata(SomeModule, true)) + .toThrowError(`'SomeModule' module can't import itself`); + })); + it('should throw with descriptive error message when provider token can not be resolved', inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => { @NgModule({declarations: [MyBrokenComp1]}) @@ -144,6 +153,7 @@ export function main() { expect(() => resolver.loadNgModuleDirectiveAndPipeMetadata(SomeModule, true)) .toThrowError(`Can't resolve all parameters for MyBrokenComp1: (?).`); })); + it('should throw with descriptive error message when a directive is passed to imports', inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => { @NgModule({imports: [ComponentWithoutModuleId]})