Skip to content

Commit ff9470b

Browse files
JoostKalxhub
authored andcommitted
fix(compiler): include used components during JIT compilation of partial component declaration (#41353)
In #41104 the list of used directives was split into two arrays of used directives and components, but the JIT side was not updated. This commit fixes the JIT integration by including the list of used components. Fixes #41318 PR Close #41353
1 parent 0226a11 commit ff9470b

File tree

5 files changed

+69
-17
lines changed

5 files changed

+69
-17
lines changed

packages/compiler/src/compiler_facade_interface.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,8 @@ export interface R3DeclareComponentFacade extends R3DeclareDirectiveFacade {
200200
template: string;
201201
isInline?: boolean;
202202
styles?: string[];
203-
directives?: {
204-
selector: string; type: OpaqueValue | (() => OpaqueValue);
205-
inputs?: string[];
206-
outputs?: string[];
207-
exportAs?: string[];
208-
}[];
203+
components?: R3DeclareUsedDirectiveFacade[];
204+
directives?: R3DeclareUsedDirectiveFacade[];
209205
pipes?: {[pipeName: string]: OpaqueValue|(() => OpaqueValue)};
210206
viewProviders?: OpaqueValue;
211207
animations?: OpaqueValue;
@@ -215,6 +211,14 @@ export interface R3DeclareComponentFacade extends R3DeclareDirectiveFacade {
215211
preserveWhitespaces?: boolean;
216212
}
217213

214+
export interface R3DeclareUsedDirectiveFacade {
215+
selector: string;
216+
type: OpaqueValue|(() => OpaqueValue);
217+
inputs?: string[];
218+
outputs?: string[];
219+
exportAs?: string[];
220+
}
221+
218222
export interface R3UsedDirectiveMetadata {
219223
selector: string;
220224
inputs: string[];

packages/compiler/src/jit_compiler_facade.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88

99

10-
import {CompilerFacade, CoreEnvironment, ExportedCompilerFacade, OpaqueValue, R3ComponentMetadataFacade, R3DeclareComponentFacade, R3DeclareDependencyMetadataFacade, R3DeclareDirectiveFacade, R3DeclareFactoryFacade, R3DeclareInjectorFacade, R3DeclareNgModuleFacade, R3DeclarePipeFacade, R3DeclareQueryMetadataFacade, R3DependencyMetadataFacade, R3DirectiveMetadataFacade, R3FactoryDefMetadataFacade, R3InjectableMetadataFacade, R3InjectorMetadataFacade, R3NgModuleMetadataFacade, R3PipeMetadataFacade, R3QueryMetadataFacade, StringMap, StringMapWithRename} from './compiler_facade_interface';
10+
import {CompilerFacade, CoreEnvironment, ExportedCompilerFacade, OpaqueValue, R3ComponentMetadataFacade, R3DeclareComponentFacade, R3DeclareDependencyMetadataFacade, R3DeclareDirectiveFacade, R3DeclareFactoryFacade, R3DeclareInjectorFacade, R3DeclareNgModuleFacade, R3DeclarePipeFacade, R3DeclareQueryMetadataFacade, R3DeclareUsedDirectiveFacade, R3DependencyMetadataFacade, R3DirectiveMetadataFacade, R3FactoryDefMetadataFacade, R3InjectableMetadataFacade, R3InjectorMetadataFacade, R3NgModuleMetadataFacade, R3PipeMetadataFacade, R3QueryMetadataFacade, StringMap, StringMapWithRename} from './compiler_facade_interface';
1111
import {ConstantPool} from './constant_pool';
1212
import {ChangeDetectionStrategy, HostBinding, HostListener, Input, Output, Type, ViewEncapsulation} from './core';
1313
import {compileInjectable} from './injectable_compiler_2';
@@ -384,7 +384,9 @@ function convertDeclareComponentFacadeToMetadata(
384384
...convertDeclareDirectiveFacadeToMetadata(declaration, typeSourceSpan),
385385
template,
386386
styles: declaration.styles ?? [],
387-
directives: (declaration.directives ?? []).map(convertUsedDirectiveDeclarationToMetadata),
387+
directives: (declaration.components ?? [])
388+
.concat(declaration.directives ?? [])
389+
.map(convertUsedDirectiveDeclarationToMetadata),
388390
pipes: convertUsedPipesToMetadata(declaration.pipes),
389391
viewProviders: declaration.viewProviders !== undefined ?
390392
new WrappedNodeExpr(declaration.viewProviders) :
@@ -400,8 +402,7 @@ function convertDeclareComponentFacadeToMetadata(
400402
};
401403
}
402404

403-
function convertUsedDirectiveDeclarationToMetadata(
404-
declaration: NonNullable<R3DeclareComponentFacade['directives']>[number]):
405+
function convertUsedDirectiveDeclarationToMetadata(declaration: R3DeclareUsedDirectiveFacade):
405406
R3UsedDirectiveMetadata {
406407
return {
407408
selector: declaration.selector,

packages/compiler/test/compiler_facade_interface_spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ const coreR3DeclareComponentFacade: core.R3DeclareComponentFacade =
116116
const compilerR3DeclareComponentFacade: compiler.R3DeclareComponentFacade =
117117
null! as core.R3DeclareComponentFacade;
118118

119+
const coreR3DeclareUsedDirectiveFacade: core.R3DeclareUsedDirectiveFacade =
120+
null! as compiler.R3DeclareUsedDirectiveFacade;
121+
const compilerR3DeclareUsedDirectiveFacade: compiler.R3DeclareUsedDirectiveFacade =
122+
null! as core.R3DeclareUsedDirectiveFacade;
123+
119124
const coreR3UsedDirectiveMetadata: core.R3UsedDirectiveMetadata =
120125
null! as compiler.R3UsedDirectiveMetadata;
121126
const compilerR3UsedDirectiveMetadata: compiler.R3UsedDirectiveMetadata =

packages/core/src/compiler/compiler_facade_interface.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,8 @@ export interface R3DeclareComponentFacade extends R3DeclareDirectiveFacade {
200200
template: string;
201201
isInline?: boolean;
202202
styles?: string[];
203-
directives?: {
204-
selector: string; type: OpaqueValue | (() => OpaqueValue);
205-
inputs?: string[];
206-
outputs?: string[];
207-
exportAs?: string[];
208-
}[];
203+
components?: R3DeclareUsedDirectiveFacade[];
204+
directives?: R3DeclareUsedDirectiveFacade[];
209205
pipes?: {[pipeName: string]: OpaqueValue|(() => OpaqueValue)};
210206
viewProviders?: OpaqueValue;
211207
animations?: OpaqueValue;
@@ -215,6 +211,14 @@ export interface R3DeclareComponentFacade extends R3DeclareDirectiveFacade {
215211
preserveWhitespaces?: boolean;
216212
}
217213

214+
export interface R3DeclareUsedDirectiveFacade {
215+
selector: string;
216+
type: OpaqueValue|(() => OpaqueValue);
217+
inputs?: string[];
218+
outputs?: string[];
219+
exportAs?: string[];
220+
}
221+
218222
export interface R3UsedDirectiveMetadata {
219223
selector: string;
220224
inputs: string[];

packages/core/test/render3/jit/declare_component_spec.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88

9-
import {ChangeDetectionStrategy, Directive, ElementRef, forwardRef, Pipe, Type, ViewEncapsulation, ɵɵngDeclareComponent} from '@angular/core';
9+
import {ChangeDetectionStrategy, Component, Directive, ElementRef, forwardRef, Pipe, Type, ViewEncapsulation, ɵɵngDeclareComponent} from '@angular/core';
1010
import {AttributeMarker, ComponentDef} from '../../../src/render3';
1111
import {functionContaining} from './matcher';
1212

@@ -338,6 +338,21 @@ describe('component declaration jit compilation', () => {
338338
});
339339
});
340340

341+
it('should compile used components', () => {
342+
const def = ɵɵngDeclareComponent({
343+
type: TestClass,
344+
template: '<cmp></cmp>',
345+
components: [{
346+
type: TestCmp,
347+
selector: 'cmp',
348+
}],
349+
}) as ComponentDef<TestClass>;
350+
351+
expectComponentDef(def, {
352+
directives: [TestCmp],
353+
});
354+
});
355+
341356
it('should compile used directives', () => {
342357
const def = ɵɵngDeclareComponent({
343358
type: TestClass,
@@ -353,6 +368,25 @@ describe('component declaration jit compilation', () => {
353368
});
354369
});
355370

371+
it('should compile used directives together with used components', () => {
372+
const def = ɵɵngDeclareComponent({
373+
type: TestClass,
374+
template: '<cmp dir></cmp>',
375+
components: [{
376+
type: TestCmp,
377+
selector: 'cmp',
378+
}],
379+
directives: [{
380+
type: TestDir,
381+
selector: '[dir]',
382+
}],
383+
}) as ComponentDef<TestClass>;
384+
385+
expectComponentDef(def, {
386+
directives: [TestCmp, TestDir],
387+
});
388+
});
389+
356390
it('should compile forward declared directives', () => {
357391
const def = ɵɵngDeclareComponent({
358392
type: TestClass,
@@ -534,6 +568,10 @@ class TestClass {}
534568
class TestDir {
535569
}
536570

571+
@Component({selector: 'cmp', template: ''})
572+
class TestCmp {
573+
}
574+
537575
@Pipe({name: 'test'})
538576
class TestPipe {
539577
}

0 commit comments

Comments
 (0)