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) { | ||||
|         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) { | ||||
|  | ||||
| @ -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) => { | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user