From 16caa5b1b06587f49bc29ab7a6bc44766b74129a Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 7 Jun 2016 20:32:58 +0200 Subject: [PATCH] fix(compiler): properly report missing DI tokens Fixes #8245 --- .../@angular/compiler/src/metadata_resolver.ts | 13 ++++++++++++- .../compiler/test/metadata_resolver_spec.ts | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/modules/@angular/compiler/src/metadata_resolver.ts b/modules/@angular/compiler/src/metadata_resolver.ts index 1e1f22a2455a0a..b2f438a8bbec88 100644 --- a/modules/@angular/compiler/src/metadata_resolver.ts +++ b/modules/@angular/compiler/src/metadata_resolver.ts @@ -260,11 +260,12 @@ export class CompileMetadataResolver { getDependenciesMetadata(typeOrFunc: Type | Function, dependencies: any[]): cpl.CompileDiDependencyMetadata[] { + let hasUnknownDeps = false; let params = isPresent(dependencies) ? dependencies : this._reflector.parameters(typeOrFunc); if (isBlank(params)) { params = []; } - return params.map((param) => { + let dependenciesMetadata: cpl.CompileDiDependencyMetadata[] = params.map((param) => { if (isBlank(param)) { return null; } @@ -306,6 +307,7 @@ export class CompileMetadataResolver { token = param; } if (isBlank(token)) { + hasUnknownDeps = true; return null; } return new cpl.CompileDiDependencyMetadata({ @@ -320,6 +322,15 @@ export class CompileMetadataResolver { }); }); + + if (hasUnknownDeps) { + let depsTokens = dependenciesMetadata.map((dep) => { + return dep ? stringify(dep.token) : '?'; + }).join(', '); + throw new BaseException(`Can't resolve all parameters for ${stringify(typeOrFunc)}: (${depsTokens}).`); + } + + return dependenciesMetadata; } getTokenMetadata(token: any): cpl.CompileTokenMetadata { diff --git a/modules/@angular/compiler/test/metadata_resolver_spec.ts b/modules/@angular/compiler/test/metadata_resolver_spec.ts index e7b8fe101e71fb..ce910d43dd1b9c 100644 --- a/modules/@angular/compiler/test/metadata_resolver_spec.ts +++ b/modules/@angular/compiler/test/metadata_resolver_spec.ts @@ -78,6 +78,14 @@ export function main() { .toThrowError(`Expected 'styles' to be an array of strings.`); } })); + + it('should throw with descriptive error message when provider token can not be resolved', + inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => { + if (!IS_DART) { + expect(() => resolver.getDirectiveMetadata(MyBrokenComp1)) + .toThrowError(`Can't resolve all parameters for MyBrokenComp1: (?).`); + } + })); }); describe('getViewDirectivesMetadata', () => { @@ -148,3 +156,11 @@ class ComponentWithEverything implements OnChanges, ngAfterViewInit(): void {} ngAfterViewChecked(): void {} } + +interface NonExisting { +} + +@Component({selector: 'my-broken-comp', template: ''}) +class MyBrokenComp1 { + constructor(public dependency: NonExisting) {} +}