Skip to content

Commit

Permalink
fix(compiler): Fix compiler crash due to isSkipSelf of null
Browse files Browse the repository at this point in the history
PR Closes #27125
  • Loading branch information
Keen Yee Liau committed Apr 24, 2019
1 parent 8ca208f commit e9f2653
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
4 changes: 2 additions & 2 deletions packages/compiler/src/metadata_resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -933,7 +933,7 @@ export class CompileMetadataResolver {
}
if (token == null) {
hasUnknownDeps = true;
return null !;
return {};
}

return {
Expand All @@ -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) {
Expand Down
34 changes: 33 additions & 1 deletion packages/compiler/test/metadata_resolver_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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) => {

Expand Down

0 comments on commit e9f2653

Please sign in to comment.