Skip to content

Commit 28fd5ab

Browse files
Keen Yee LiauAndrewKushnir
Keen Yee Liau
authored andcommittedApr 25, 2019
fix(compiler): Fix compiler crash due to isSkipSelf of null (#30075)
PR Closes #27125 PR Close #30075
1 parent c61df39 commit 28fd5ab

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed
 

‎packages/compiler/src/metadata_resolver.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ export class CompileMetadataResolver {
933933
}
934934
if (token == null) {
935935
hasUnknownDeps = true;
936-
return null !;
936+
return {};
937937
}
938938

939939
return {
@@ -949,7 +949,7 @@ export class CompileMetadataResolver {
949949

950950
if (hasUnknownDeps) {
951951
const depsTokens =
952-
dependenciesMetadata.map((dep) => dep ? stringifyType(dep.token) : '?').join(', ');
952+
dependenciesMetadata.map((dep) => dep.token ? stringifyType(dep.token) : '?').join(', ');
953953
const message =
954954
`Can't resolve all parameters for ${stringifyType(typeOrFunc)}: (${depsTokens}).`;
955955
if (throwOnUnknownDeps || this._config.strictInjectionParameters) {

‎packages/compiler/test/metadata_resolver_spec.ts

+33-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {LIFECYCLE_HOOKS_VALUES, LifecycleHooks} from '@angular/compiler/src/life
1010
import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, ChangeDetectionStrategy, Component, Directive, DoCheck, Injectable, NgModule, OnChanges, OnDestroy, OnInit, Pipe, SimpleChanges, ViewEncapsulation, ɵstringify as stringify} from '@angular/core';
1111
import {TestBed, async, inject} from '@angular/core/testing';
1212

13-
import {identifierName} from '../src/compile_metadata';
13+
import {CompileDiDependencyMetadata, identifierName} from '../src/compile_metadata';
1414
import {CompileMetadataResolver} from '../src/metadata_resolver';
1515
import {ResourceLoader} from '../src/resource_loader';
1616
import {MockResourceLoader} from '../testing/src/resource_loader_mock';
@@ -371,6 +371,38 @@ import {TEST_COMPILER_PROVIDERS} from './test_bindings';
371371
.toThrowError(`SimpleService cannot be used as an entry component.`);
372372
}));
373373

374+
it('should generate an error when a dependency could not be resolved',
375+
inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => {
376+
377+
// Override the errorCollector so that error gets collected instead of
378+
// being thrown.
379+
(resolver as any)._errorCollector = (error: Error, type?: any) => {
380+
expect(error.message).toBe(`Can't resolve all parameters for MyComponent: (?).`);
381+
};
382+
383+
@Component({template: ''})
384+
class MyComponent {
385+
// @ts-ignore UserService is a non-existent class.
386+
constructor(service: UserService) {}
387+
}
388+
389+
@NgModule({declarations: [MyComponent]})
390+
class AppModule {
391+
}
392+
393+
const moduleMetadata = resolver.getNgModuleMetadata(AppModule) !;
394+
expect(moduleMetadata).toBeTruthy();
395+
expect(moduleMetadata.declaredDirectives.length).toBe(1);
396+
const directive = moduleMetadata.declaredDirectives[0];
397+
const directiveMetadata =
398+
resolver.getNonNormalizedDirectiveMetadata(directive.reference) !;
399+
expect(directiveMetadata).toBeTruthy();
400+
const {metadata} = directiveMetadata;
401+
const diDeps: CompileDiDependencyMetadata[] = metadata.type.diDeps;
402+
// 'null' does not conform to the shape of `CompileDiDependencyMetadata`
403+
expect(diDeps.every(d => d !== null)).toBe(true);
404+
}));
405+
374406
it(`should throw an error when a Directive is added to module's bootstrap list`,
375407
inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => {
376408

0 commit comments

Comments
 (0)
Please sign in to comment.