fix(compiler): Fix compiler crash due to isSkipSelf of null (#30075)

PR Closes https://github.com/angular/angular/issues/27125

PR Close #30075
This commit is contained in:
Keen Yee Liau 2019-04-23 17:02:31 -07:00 committed by Andrew Kushnir
parent c61df39323
commit 28fd5ab12b
2 changed files with 35 additions and 3 deletions

View File

@ -933,7 +933,7 @@ export class CompileMetadataResolver {
}
if (token == null) {
hasUnknownDeps = true;
return null !;
return {};
}
return {
@ -949,7 +949,7 @@ export class CompileMetadataResolver {
if (hasUnknownDeps) {
const depsTokens =
dependenciesMetadata.map((dep) => dep ? stringifyType(dep.token) : '?').join(', ');
dependenciesMetadata.map((dep) => dep.token ? stringifyType(dep.token) : '?').join(', ');
const message =
`Can't resolve all parameters for ${stringifyType(typeOrFunc)}: (${depsTokens}).`;
if (throwOnUnknownDeps || this._config.strictInjectionParameters) {

View File

@ -10,7 +10,7 @@ import {LIFECYCLE_HOOKS_VALUES, LifecycleHooks} from '@angular/compiler/src/life
import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, ChangeDetectionStrategy, Component, Directive, DoCheck, Injectable, NgModule, OnChanges, OnDestroy, OnInit, Pipe, SimpleChanges, ViewEncapsulation, ɵstringify as stringify} from '@angular/core';
import {TestBed, async, inject} from '@angular/core/testing';
import {identifierName} from '../src/compile_metadata';
import {CompileDiDependencyMetadata, identifierName} from '../src/compile_metadata';
import {CompileMetadataResolver} from '../src/metadata_resolver';
import {ResourceLoader} from '../src/resource_loader';
import {MockResourceLoader} from '../testing/src/resource_loader_mock';
@ -371,6 +371,38 @@ import {TEST_COMPILER_PROVIDERS} from './test_bindings';
.toThrowError(`SimpleService cannot be used as an entry component.`);
}));
it('should generate an error when a dependency could not be resolved',
inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => {
// Override the errorCollector so that error gets collected instead of
// being thrown.
(resolver as any)._errorCollector = (error: Error, type?: any) => {
expect(error.message).toBe(`Can't resolve all parameters for MyComponent: (?).`);
};
@Component({template: ''})
class MyComponent {
// @ts-ignore UserService is a non-existent class.
constructor(service: UserService) {}
}
@NgModule({declarations: [MyComponent]})
class AppModule {
}
const moduleMetadata = resolver.getNgModuleMetadata(AppModule) !;
expect(moduleMetadata).toBeTruthy();
expect(moduleMetadata.declaredDirectives.length).toBe(1);
const directive = moduleMetadata.declaredDirectives[0];
const directiveMetadata =
resolver.getNonNormalizedDirectiveMetadata(directive.reference) !;
expect(directiveMetadata).toBeTruthy();
const {metadata} = directiveMetadata;
const diDeps: CompileDiDependencyMetadata[] = metadata.type.diDeps;
// 'null' does not conform to the shape of `CompileDiDependencyMetadata`
expect(diDeps.every(d => d !== null)).toBe(true);
}));
it(`should throw an error when a Directive is added to module's bootstrap list`,
inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => {