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:
parent
c61df39323
commit
28fd5ab12b
@ -933,7 +933,7 @@ export class CompileMetadataResolver {
|
|||||||
}
|
}
|
||||||
if (token == null) {
|
if (token == null) {
|
||||||
hasUnknownDeps = true;
|
hasUnknownDeps = true;
|
||||||
return null !;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -949,7 +949,7 @@ export class CompileMetadataResolver {
|
|||||||
|
|
||||||
if (hasUnknownDeps) {
|
if (hasUnknownDeps) {
|
||||||
const depsTokens =
|
const depsTokens =
|
||||||
dependenciesMetadata.map((dep) => dep ? stringifyType(dep.token) : '?').join(', ');
|
dependenciesMetadata.map((dep) => dep.token ? stringifyType(dep.token) : '?').join(', ');
|
||||||
const message =
|
const message =
|
||||||
`Can't resolve all parameters for ${stringifyType(typeOrFunc)}: (${depsTokens}).`;
|
`Can't resolve all parameters for ${stringifyType(typeOrFunc)}: (${depsTokens}).`;
|
||||||
if (throwOnUnknownDeps || this._config.strictInjectionParameters) {
|
if (throwOnUnknownDeps || this._config.strictInjectionParameters) {
|
||||||
|
@ -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 {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 {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 {CompileMetadataResolver} from '../src/metadata_resolver';
|
||||||
import {ResourceLoader} from '../src/resource_loader';
|
import {ResourceLoader} from '../src/resource_loader';
|
||||||
import {MockResourceLoader} from '../testing/src/resource_loader_mock';
|
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.`);
|
.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`,
|
it(`should throw an error when a Directive is added to module's bootstrap list`,
|
||||||
inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => {
|
inject([CompileMetadataResolver], (resolver: CompileMetadataResolver) => {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user