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