From 72b65f995d21847e473cac398d52c25978446f4d Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Tue, 23 Mar 2021 15:14:53 +0000 Subject: [PATCH] refactor(compiler): remove `R3ResolvedDependencyType` altogether (#41231) Now that other values were removed from `R3ResolvedDependencyType`, its meaning can now be inferred from the other properties in the `R3DeclareDependencyMetadata` type. This commit removes this enum and updates the code to work without it. PR Close #41231 --- .../partial_factory_linker_1.ts | 37 +++--- .../ngcc/test/integration/ngcc_spec.ts | 4 +- .../src/ngtsc/annotations/src/component.ts | 2 +- .../src/ngtsc/annotations/src/directive.ts | 26 ++--- .../src/ngtsc/annotations/src/injectable.ts | 5 +- .../src/ngtsc/annotations/src/util.ts | 13 +-- .../lifecycle_hooks/GOLDEN_PARTIAL.js | 2 +- .../pipes/GOLDEN_PARTIAL.js | 4 +- .../template_variables/GOLDEN_PARTIAL.js | 8 +- .../value_composition/GOLDEN_PARTIAL.js | 4 +- .../ng_modules/GOLDEN_PARTIAL.js | 4 +- .../r3_view_compiler_di/di/GOLDEN_PARTIAL.js | 24 ++-- .../di/component_factory.js | 1 + .../di/component_factory.ts | 5 + .../r3_view_compiler_di_spec.ts | 6 + packages/compiler/src/compiler.ts | 2 +- .../compiler/src/compiler_facade_interface.ts | 21 +--- packages/compiler/src/jit_compiler_facade.ts | 68 +++++------ packages/compiler/src/render3/partial/api.ts | 65 ++++------- .../compiler/src/render3/partial/factory.ts | 20 ++-- packages/compiler/src/render3/r3_factory.ts | 107 ++++++------------ .../compiler/src/render3/r3_identifiers.ts | 4 - .../test/compiler_facade_interface_spec.ts | 17 +-- .../src/compiler/compiler_facade_interface.ts | 29 ++--- .../core/src/core_render3_private_export.ts | 2 - packages/core/src/di/jit/util.ts | 24 ++-- packages/core/src/render3/jit/directive.ts | 12 +- packages/core/src/render3/jit/partial.ts | 2 +- packages/core/src/render3/jit/pipe.ts | 12 +- .../test/render3/jit/declare_factory_spec.ts | 4 +- .../core/test/render3/jit_environment_spec.ts | 2 - 31 files changed, 219 insertions(+), 317 deletions(-) diff --git a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_factory_linker_1.ts b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_factory_linker_1.ts index e777b65312..c19e509716 100644 --- a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_factory_linker_1.ts +++ b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_factory_linker_1.ts @@ -5,7 +5,7 @@ * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ -import {compileFactoryFunction, ConstantPool, R3DeclareFactoryMetadata, R3DependencyMetadata, R3FactoryMetadata, R3FactoryTarget, R3PartialDeclaration, R3ResolvedDependencyType} from '@angular/compiler'; +import {compileFactoryFunction, ConstantPool, R3DeclareDependencyMetadata, R3DeclareFactoryMetadata, R3DependencyMetadata, R3FactoryMetadata, R3FactoryTarget, R3PartialDeclaration} from '@angular/compiler'; import * as o from '@angular/compiler/src/output/output_ast'; import {AstObject} from '../../ast/ast_value'; @@ -39,18 +39,14 @@ export function toR3FactoryMeta( typeExpr.expression, 'Unsupported type, its name could not be determined'); } - const deps = getDeps(metaObj, 'deps'); - - const meta: R3FactoryMetadata = { + return { name: typeName, type: wrapReference(typeExpr.getOpaque()), internalType: metaObj.getOpaque('type'), typeArgumentCount: 0, target: parseEnum(metaObj.getValue('target'), R3FactoryTarget), - deps, + deps: getDeps(metaObj, 'deps'), }; - - return meta; } function getDeps( @@ -69,15 +65,24 @@ function getDeps( return null; } -function getDep(dep: AstObject): +function getDep(depObj: AstObject): R3DependencyMetadata { - return { - token: dep.getOpaque('token'), - attribute: null, - resolved: parseEnum(dep.getValue('resolved'), R3ResolvedDependencyType), - host: dep.has('host') && dep.getBoolean('host'), - optional: dep.has('optional') && dep.getBoolean('optional'), - self: dep.has('self') && dep.getBoolean('self'), - skipSelf: dep.has('skipSelf') && dep.getBoolean('skipSelf'), + const isAttribute = depObj.has('attribute') && depObj.getBoolean('attribute'); + const token = depObj.getOpaque('token'); + // Normally `attribute` is a string literal and so its `attributeNameType` is the same string + // literal. If the `attribute` is some other expression, the `attributeNameType` would be the + // `unknown` type. It is not possible to generate this when linking, since it only deals with JS + // and not typings. When linking the existence of the `attributeNameType` only acts as a marker to + // change the injection instruction that is generated, so we just pass the literal string + // `"unknown"`. + const attributeNameType = isAttribute ? o.literal('unknown') : null; + const dep: R3DependencyMetadata = { + token, + attributeNameType, + host: depObj.has('host') && depObj.getBoolean('host'), + optional: depObj.has('optional') && depObj.getBoolean('optional'), + self: depObj.has('self') && depObj.getBoolean('self'), + skipSelf: depObj.has('skipSelf') && depObj.getBoolean('skipSelf'), }; + return dep; } diff --git a/packages/compiler-cli/ngcc/test/integration/ngcc_spec.ts b/packages/compiler-cli/ngcc/test/integration/ngcc_spec.ts index 3788df438d..1420293481 100644 --- a/packages/compiler-cli/ngcc/test/integration/ngcc_spec.ts +++ b/packages/compiler-cli/ngcc/test/integration/ngcc_spec.ts @@ -384,7 +384,7 @@ runInEachFileSystem(() => { expect(jsContents).toContain('__spreadArray([], __read(arguments))'); expect(jsContents) .toContain( - 'var ɵSubClass_BaseFactory = /*@__PURE__*/ ɵngcc0.ɵɵgetInheritedFactory(SubClass);'); + 'var ɵSubClass_BaseFactory; return function SubClass_Factory(t) { return (ɵSubClass_BaseFactory || (ɵSubClass_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(SubClass)))(t || SubClass); };'); }); it(`should be able to detect synthesized constructors in ES5 with downlevelIteration enabled (emitted helpers)`, @@ -423,7 +423,7 @@ runInEachFileSystem(() => { expect(jsContents).toContain('__spreadArray([], __read(arguments))'); expect(jsContents) .toContain( - 'var ɵSubClass_BaseFactory = /*@__PURE__*/ ɵngcc0.ɵɵgetInheritedFactory(SubClass);'); + 'var ɵSubClass_BaseFactory; return function SubClass_Factory(t) { return (ɵSubClass_BaseFactory || (ɵSubClass_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(SubClass)))(t || SubClass); };'); }); it('should not add `const` in ES5 generated code', () => { diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/component.ts b/packages/compiler-cli/src/ngtsc/annotations/src/component.ts index 28aaa1a398..4898493dff 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/component.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/component.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {compileComponentFromMetadata, compileDeclareComponentFromMetadata, ConstantPool, CssSelector, DeclarationListEmitMode, DEFAULT_INTERPOLATION_CONFIG, DomElementSchemaRegistry, Expression, ExternalExpr, Identifiers, InterpolationConfig, LexerRange, makeBindingParser, ParsedTemplate, ParseSourceFile, parseTemplate, R3CompiledExpression, R3ComponentMetadata, R3FactoryMetadata, R3FactoryTarget, R3TargetBinder, R3UsedDirectiveMetadata, SelectorMatcher, Statement, TmplAstNode, WrappedNodeExpr} from '@angular/compiler'; +import {compileComponentFromMetadata, compileDeclareComponentFromMetadata, ConstantPool, CssSelector, DeclarationListEmitMode, DEFAULT_INTERPOLATION_CONFIG, DomElementSchemaRegistry, Expression, ExternalExpr, InterpolationConfig, LexerRange, makeBindingParser, ParsedTemplate, ParseSourceFile, parseTemplate, R3ComponentMetadata, R3FactoryMetadata, R3FactoryTarget, R3TargetBinder, R3UsedDirectiveMetadata, SelectorMatcher, Statement, TmplAstNode, WrappedNodeExpr} from '@angular/compiler'; import * as ts from 'typescript'; import {Cycle, CycleAnalyzer, CycleHandlingStrategy} from '../../cycles'; diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts b/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts index 085eb6e27c..0a175d7eeb 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {compileDeclareDirectiveFromMetadata, compileDirectiveFromMetadata, ConstantPool, Expression, ExternalExpr, getSafePropertyAccessString, Identifiers, makeBindingParser, ParsedHostBindings, ParseError, parseHostBindings, R3CompiledExpression, R3DependencyMetadata, R3DirectiveMetadata, R3FactoryMetadata, R3FactoryTarget, R3QueryMetadata, R3ResolvedDependencyType, Statement, verifyHostBindings, WrappedNodeExpr} from '@angular/compiler'; +import {compileDeclareDirectiveFromMetadata, compileDirectiveFromMetadata, ConstantPool, Expression, ExternalExpr, getSafePropertyAccessString, makeBindingParser, ParsedHostBindings, ParseError, parseHostBindings, R3DirectiveMetadata, R3FactoryMetadata, R3FactoryTarget, R3QueryMetadata, Statement, verifyHostBindings, WrappedNodeExpr} from '@angular/compiler'; import {emitDistinctChangesOnlyDefaultValue} from '@angular/compiler/src/core'; import * as ts from 'typescript'; @@ -468,27 +468,19 @@ export function extractDirectiveMetadata( } const rawCtorDeps = getConstructorDependencies(clazz, reflector, defaultImportRecorder, isCore); - let ctorDeps: R3DependencyMetadata[]|'invalid'|null; // Non-abstract directives (those with a selector) require valid constructor dependencies, whereas // abstract directives are allowed to have invalid dependencies, given that a subclass may call // the constructor explicitly. - if (selector !== null) { - ctorDeps = validateConstructorDependencies(clazz, rawCtorDeps); - } else { - ctorDeps = unwrapConstructorDependencies(rawCtorDeps); - } + const ctorDeps = selector !== null ? validateConstructorDependencies(clazz, rawCtorDeps) : + unwrapConstructorDependencies(rawCtorDeps); - const isStructural = ctorDeps !== null && ctorDeps !== 'invalid' && ctorDeps.some(dep => { - if (dep.resolved !== R3ResolvedDependencyType.Token || !(dep.token instanceof ExternalExpr)) { - return false; - } - if (dep.token.value.moduleName !== '@angular/core' || dep.token.value.name !== 'TemplateRef') { - return false; - } - - return true; - }); + // Structural directives must have a `TemplateRef` dependency. + const isStructural = ctorDeps !== null && ctorDeps !== 'invalid' && + ctorDeps.some( + dep => (dep.token instanceof ExternalExpr) && + dep.token.value.moduleName === '@angular/core' && + dep.token.value.name === 'TemplateRef'); // Detect if the component inherits from another class const usesInheritance = reflector.hasBaseClass(clazz); diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts b/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts index 23cc137afc..65d5e4839b 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {compileInjectable as compileIvyInjectable, Expression, LiteralExpr, R3DependencyMetadata, R3FactoryMetadata, R3FactoryTarget, R3InjectableMetadata, R3ResolvedDependencyType, Statement, WrappedNodeExpr} from '@angular/compiler'; +import {compileInjectable as compileIvyInjectable, Expression, LiteralExpr, R3DependencyMetadata, R3FactoryMetadata, R3FactoryTarget, R3InjectableMetadata, Statement, WrappedNodeExpr} from '@angular/compiler'; import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; @@ -320,9 +320,8 @@ function extractInjectableCtorDeps( function getDep(dep: ts.Expression, reflector: ReflectionHost): R3DependencyMetadata { const meta: R3DependencyMetadata = { token: new WrappedNodeExpr(dep), - attribute: null, + attributeNameType: null, host: false, - resolved: R3ResolvedDependencyType.Token, optional: false, self: false, skipSelf: false, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/util.ts b/packages/compiler-cli/src/ngtsc/annotations/src/util.ts index 2adc004ca6..2fbf65c983 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/util.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/util.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Expression, ExternalExpr, LiteralExpr, ParseLocation, ParseSourceFile, ParseSourceSpan, R3CompiledExpression, R3DependencyMetadata, R3Reference, R3ResolvedDependencyType, ReadPropExpr, Statement, WrappedNodeExpr} from '@angular/compiler'; +import {Expression, ExternalExpr, LiteralExpr, ParseLocation, ParseSourceFile, ParseSourceSpan, R3CompiledExpression, R3DependencyMetadata, R3Reference, ReadPropExpr, Statement, WrappedNodeExpr} from '@angular/compiler'; import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError, makeDiagnostic, makeRelatedInformation} from '../../diagnostics'; @@ -44,9 +44,8 @@ export function getConstructorDependencies( } ctorParams.forEach((param, idx) => { let token = valueReferenceToExpression(param.typeValueReference, defaultImportRecorder); - let attribute: Expression|null = null; + let attributeNameType: Expression|null = null; let optional = false, self = false, skipSelf = false, host = false; - let resolved = R3ResolvedDependencyType.Token; (param.decorators || []).filter(dec => isCore || isAngularCore(dec)).forEach(dec => { const name = isCore || dec.import === null ? dec.name : dec.import!.name; @@ -74,11 +73,11 @@ export function getConstructorDependencies( const attributeName = dec.args[0]; token = new WrappedNodeExpr(attributeName); if (ts.isStringLiteralLike(attributeName)) { - attribute = new LiteralExpr(attributeName.text); + attributeNameType = new LiteralExpr(attributeName.text); } else { - attribute = new WrappedNodeExpr(ts.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword)); + attributeNameType = + new WrappedNodeExpr(ts.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword)); } - resolved = R3ResolvedDependencyType.Attribute; } else { throw new FatalDiagnosticError( ErrorCode.DECORATOR_UNEXPECTED, Decorator.nodeForError(dec), @@ -97,7 +96,7 @@ export function getConstructorDependencies( reason: param.typeValueReference.reason, }); } else { - deps.push({token, attribute, optional, self, skipSelf, host, resolved}); + deps.push({token, attributeNameType, optional, self, skipSelf, host}); } }); if (errors.length === 0) { diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/GOLDEN_PARTIAL.js index 2cfb6cffd8..f57ec5ffbb 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/GOLDEN_PARTIAL.js @@ -43,7 +43,7 @@ import * as i0 from "@angular/core"; export class IfDirective { constructor(template) { } } -IfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: IfDirective, deps: [{ token: i0.TemplateRef, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Directive }); +IfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: IfDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); IfDirective.ɵdir = i0.ɵɵngDeclareDirective({ version: "0.0.0-PLACEHOLDER", type: IfDirective, selector: "[if]", ngImport: i0 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(IfDirective, [{ type: Directive, diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/GOLDEN_PARTIAL.js index 4746dbfb8f..46909d4709 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/pipes/GOLDEN_PARTIAL.js @@ -156,7 +156,7 @@ export class MyPipe { return value; } } -MyPipe.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyPipe, deps: [{ token: i0.ChangeDetectorRef, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Pipe }); +MyPipe.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyPipe, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe }); MyPipe.ɵpipe = i0.ɵɵngDeclarePipe({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyPipe, name: "myPipe" }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyPipe, [{ type: Pipe, @@ -168,7 +168,7 @@ export class MyOtherPipe { return value; } } -MyOtherPipe.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyOtherPipe, deps: [{ token: i0.ChangeDetectorRef, resolved: i0.ɵɵResolvedDependencyType.Token, optional: true }], target: i0.ɵɵFactoryTarget.Pipe }); +MyOtherPipe.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyOtherPipe, deps: [{ token: i0.ChangeDetectorRef, optional: true }], target: i0.ɵɵFactoryTarget.Pipe }); MyOtherPipe.ɵpipe = i0.ɵɵngDeclarePipe({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyOtherPipe, name: "myOtherPipe" }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyOtherPipe, [{ type: Pipe, diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/GOLDEN_PARTIAL.js index 3ea3936c4c..c9dd4dd27a 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/GOLDEN_PARTIAL.js @@ -10,7 +10,7 @@ export class ForOfDirective { } ngOnChanges(simpleChanges) { } } -ForOfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ForOfDirective, deps: [{ token: i0.ViewContainerRef, resolved: i0.ɵɵResolvedDependencyType.Token }, { token: i0.TemplateRef, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Directive }); +ForOfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ForOfDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); ForOfDirective.ɵdir = i0.ɵɵngDeclareDirective({ version: "0.0.0-PLACEHOLDER", type: ForOfDirective, selector: "[forOf]", inputs: { forOf: "forOf" }, usesOnChanges: true, ngImport: i0 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ForOfDirective, [{ type: Directive, @@ -101,7 +101,7 @@ export class ForOfDirective { } ngOnChanges(simpleChanges) { } } -ForOfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ForOfDirective, deps: [{ token: i0.ViewContainerRef, resolved: i0.ɵɵResolvedDependencyType.Token }, { token: i0.TemplateRef, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Directive }); +ForOfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ForOfDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); ForOfDirective.ɵdir = i0.ɵɵngDeclareDirective({ version: "0.0.0-PLACEHOLDER", type: ForOfDirective, selector: "[forOf]", inputs: { forOf: "forOf" }, usesOnChanges: true, ngImport: i0 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ForOfDirective, [{ type: Directive, @@ -192,7 +192,7 @@ export class ForOfDirective { } ngOnChanges(simpleChanges) { } } -ForOfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ForOfDirective, deps: [{ token: i0.ViewContainerRef, resolved: i0.ɵɵResolvedDependencyType.Token }, { token: i0.TemplateRef, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Directive }); +ForOfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ForOfDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); ForOfDirective.ɵdir = i0.ɵɵngDeclareDirective({ version: "0.0.0-PLACEHOLDER", type: ForOfDirective, selector: "[forOf]", inputs: { forOf: "forOf" }, usesOnChanges: true, ngImport: i0 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ForOfDirective, [{ type: Directive, @@ -309,7 +309,7 @@ export class ForOfDirective { } ngOnChanges(simpleChanges) { } } -ForOfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ForOfDirective, deps: [{ token: i0.ViewContainerRef, resolved: i0.ɵɵResolvedDependencyType.Token }, { token: i0.TemplateRef, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Directive }); +ForOfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ForOfDirective, deps: [{ token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); ForOfDirective.ɵdir = i0.ɵɵngDeclareDirective({ version: "0.0.0-PLACEHOLDER", type: ForOfDirective, selector: "[forOf]", inputs: { forOf: "forOf" }, usesOnChanges: true, ngImport: i0 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ForOfDirective, [{ type: Directive, diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js index ee31a55555..38db1b6e6d 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/value_composition/GOLDEN_PARTIAL.js @@ -206,7 +206,7 @@ export class MyComponent { this.cdr = cdr; } } -MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, deps: [{ token: i0.ElementRef, resolved: i0.ɵɵResolvedDependencyType.Token }, { token: i0.ViewContainerRef, resolved: i0.ɵɵResolvedDependencyType.Token }, { token: i0.ChangeDetectorRef, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Component }); +MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", ngImport: i0, template: '', isInline: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyComponent, [{ type: Component, @@ -249,7 +249,7 @@ import * as i0 from "@angular/core"; export class IfDirective { constructor(template) { } } -IfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: IfDirective, deps: [{ token: i0.TemplateRef, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Directive }); +IfDirective.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: IfDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); IfDirective.ɵdir = i0.ɵɵngDeclareDirective({ version: "0.0.0-PLACEHOLDER", type: IfDirective, selector: "[if]", ngImport: i0 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(IfDirective, [{ type: Directive, diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/GOLDEN_PARTIAL.js index c6070f813d..c3038d1b96 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/GOLDEN_PARTIAL.js @@ -177,7 +177,7 @@ export class BaseService { } ; } -BaseService.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: BaseService, deps: [{ token: Thing, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Injectable }); +BaseService.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: BaseService, deps: [{ token: Thing }], target: i0.ɵɵFactoryTarget.Injectable }); BaseService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: BaseService, factory: BaseService.ɵfac }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseService, [{ type: Injectable @@ -478,7 +478,7 @@ export class BaseModule { this.service = service; } } -BaseModule.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: BaseModule, deps: [{ token: Service, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.NgModule }); +BaseModule.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: BaseModule, deps: [{ token: Service }], target: i0.ɵɵFactoryTarget.NgModule }); BaseModule.ɵmod = i0.ɵɵngDeclareNgModule({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: BaseModule }); BaseModule.ɵinj = i0.ɵɵngDeclareInjector({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: BaseModule, providers: [Service] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseModule, [{ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/GOLDEN_PARTIAL.js index f16f629185..3fff571e69 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/GOLDEN_PARTIAL.js @@ -10,10 +10,13 @@ MyService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MyService, fac (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyService, [{ type: Injectable }], null, null); })(); -export class MyComponent { - constructor(name, s1, s2, s4, s3, s5, s6) { } +function dynamicAttrName() { + return 'the-attr'; } -MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, deps: [{ token: 'name', resolved: i0.ɵɵResolvedDependencyType.Attribute }, { token: MyService, resolved: i0.ɵɵResolvedDependencyType.Token }, { token: MyService, resolved: i0.ɵɵResolvedDependencyType.Token, host: true }, { token: MyService, resolved: i0.ɵɵResolvedDependencyType.Token, self: true }, { token: MyService, resolved: i0.ɵɵResolvedDependencyType.Token, skipSelf: true }, { token: MyService, resolved: i0.ɵɵResolvedDependencyType.Token, optional: true }, { token: MyService, resolved: i0.ɵɵResolvedDependencyType.Token, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); +export class MyComponent { + constructor(name, other, s1, s2, s4, s3, s5, s6) { } +} +MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, deps: [{ token: 'name', attribute: true }, { token: dynamicAttrName(), attribute: true }, { token: MyService }, { token: MyService, host: true }, { token: MyService, self: true }, { token: MyService, skipSelf: true }, { token: MyService, optional: true }, { token: MyService, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", ngImport: i0, template: ``, isInline: true }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyComponent, [{ type: Component, @@ -21,6 +24,9 @@ MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ version: "0.0.0-PLACEHOLDER", ty }], function () { return [{ type: undefined, decorators: [{ type: Attribute, args: ['name'] + }] }, { type: undefined, decorators: [{ + type: Attribute, + args: [dynamicAttrName()] }] }, { type: MyService }, { type: MyService, decorators: [{ type: Host }] }, { type: MyService, decorators: [{ @@ -53,8 +59,8 @@ export declare class MyService { static ɵprov: i0.ɵɵInjectableDef; } export declare class MyComponent { - constructor(name: string, s1: MyService, s2: MyService, s4: MyService, s3: MyService, s5: MyService, s6: MyService); - static ɵfac: i0.ɵɵFactoryDeclaration; + constructor(name: string, other: string, s1: MyService, s2: MyService, s4: MyService, s3: MyService, s5: MyService, s6: MyService); + static ɵfac: i0.ɵɵFactoryDeclaration; static ɵcmp: i0.ɵɵComponentDeclaration; } export declare class MyModule { @@ -73,7 +79,7 @@ class MyDependency { export class MyService { constructor(dep) { } } -MyService.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyService, deps: [{ token: MyDependency, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Injectable }); +MyService.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyService, deps: [{ token: MyDependency }], target: i0.ɵɵFactoryTarget.Injectable }); MyService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MyService, factory: MyService.ɵfac }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyService, [{ type: Injectable @@ -104,7 +110,7 @@ class MyOptionalDependency { export class MyService { constructor(dep, optionalDep) { } } -MyService.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyService, deps: [{ token: MyDependency, resolved: i0.ɵɵResolvedDependencyType.Token }, { token: MyOptionalDependency, resolved: i0.ɵɵResolvedDependencyType.Token, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); +MyService.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyService, deps: [{ token: MyDependency }, { token: MyOptionalDependency, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); MyService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MyService, factory: MyService.ɵfac }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyService, [{ type: Injectable @@ -296,7 +302,7 @@ export class MyPipe { return value; } } -MyPipe.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyPipe, deps: [{ token: Service, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Pipe }); +MyPipe.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyPipe, deps: [{ token: Service }], target: i0.ɵɵFactoryTarget.Pipe }); MyPipe.ɵpipe = i0.ɵɵngDeclarePipe({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyPipe, name: "myPipe" }); MyPipe.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MyPipe, factory: MyPipe.ɵfac }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyPipe, [{ @@ -311,7 +317,7 @@ export class MyOtherPipe { return value; } } -MyOtherPipe.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyOtherPipe, deps: [{ token: Service, resolved: i0.ɵɵResolvedDependencyType.Token }], target: i0.ɵɵFactoryTarget.Pipe }); +MyOtherPipe.ɵfac = i0.ɵɵngDeclareFactory({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyOtherPipe, deps: [{ token: Service }], target: i0.ɵɵFactoryTarget.Pipe }); MyOtherPipe.ɵpipe = i0.ɵɵngDeclarePipe({ version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyOtherPipe, name: "myOtherPipe" }); MyOtherPipe.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MyOtherPipe, factory: MyOtherPipe.ɵfac }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MyOtherPipe, [{ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/component_factory.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/component_factory.js index 8fa4c3e930..0f784bd350 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/component_factory.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/component_factory.js @@ -2,6 +2,7 @@ MyComponent.ɵfac = function MyComponent_Factory(t) { return new (t || MyComponent)( $r3$.ɵɵinjectAttribute('name'), + $r3$.ɵɵinjectAttribute(dynamicAttrName()), $r3$.ɵɵdirectiveInject(MyService), $r3$.ɵɵdirectiveInject(MyService, 1), $r3$.ɵɵdirectiveInject(MyService, 2), diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/component_factory.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/component_factory.ts index fa992ec008..fd77f5aa65 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/component_factory.ts +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/component_factory.ts @@ -4,10 +4,15 @@ import {Attribute, Component, Host, Injectable, NgModule, Optional, Self, SkipSe export class MyService { } +function dynamicAttrName() { + return 'the-attr'; +} + @Component({selector: 'my-component', template: ``}) export class MyComponent { constructor( @Attribute('name') name: string, + @Attribute(dynamicAttrName()) other: string, s1: MyService, @Host() s2: MyService, @Self() s4: MyService, diff --git a/packages/compiler-cli/test/compliance_old/r3_view_compiler_di_spec.ts b/packages/compiler-cli/test/compliance_old/r3_view_compiler_di_spec.ts index 94437eca40..91820d3953 100644 --- a/packages/compiler-cli/test/compliance_old/r3_view_compiler_di_spec.ts +++ b/packages/compiler-cli/test/compliance_old/r3_view_compiler_di_spec.ts @@ -25,6 +25,10 @@ describe('compiler compliance: dependency injection', () => { @Injectable() export class MyService {} + function dynamicAttrName() { + return 'the-attr'; + } + @Component({ selector: 'my-component', template: \`\` @@ -32,6 +36,7 @@ describe('compiler compliance: dependency injection', () => { export class MyComponent { constructor( @Attribute('name') name:string, + @Attribute(dynamicAttrName()) other: string, s1: MyService, @Host() s2: MyService, @Self() s4: MyService, @@ -51,6 +56,7 @@ describe('compiler compliance: dependency injection', () => { MyComponent.ɵfac = function MyComponent_Factory(t) { return new (t || MyComponent)( $r3$.ɵɵinjectAttribute('name'), + $r3$.ɵɵinjectAttribute(dynamicAttrName()), $r3$.ɵɵdirectiveInject(MyService), $r3$.ɵɵdirectiveInject(MyService, 1), $r3$.ɵɵdirectiveInject(MyService, 2), diff --git a/packages/compiler/src/compiler.ts b/packages/compiler/src/compiler.ts index 8dbd4a72e9..6800cf5d20 100644 --- a/packages/compiler/src/compiler.ts +++ b/packages/compiler/src/compiler.ts @@ -97,7 +97,7 @@ export {BoundAttribute as TmplAstBoundAttribute, BoundEvent as TmplAstBoundEvent export * from './render3/view/t2_api'; export * from './render3/view/t2_binder'; export {Identifiers as R3Identifiers} from './render3/r3_identifiers'; -export {compileFactoryFunction, R3DependencyMetadata, R3FactoryMetadata, R3FactoryTarget, R3ResolvedDependencyType} from './render3/r3_factory'; +export {compileFactoryFunction, R3DependencyMetadata, R3FactoryMetadata, R3FactoryTarget} from './render3/r3_factory'; export {compileNgModule, R3NgModuleMetadata} from './render3/r3_module_compiler'; export {compileInjector, R3InjectorMetadata} from './render3/r3_injector_compiler'; export {compilePipeFromMetadata, R3PipeMetadata} from './render3/r3_pipe_compiler'; diff --git a/packages/compiler/src/compiler_facade_interface.ts b/packages/compiler/src/compiler_facade_interface.ts index 6ce8a1d3ce..d18ee13010 100644 --- a/packages/compiler/src/compiler_facade_interface.ts +++ b/packages/compiler/src/compiler_facade_interface.ts @@ -60,7 +60,6 @@ export interface CompilerFacade { createParseSourceSpan(kind: string, typeName: string, sourceUrl: string): ParseSourceSpan; - R3ResolvedDependencyType: typeof R3ResolvedDependencyType; R3FactoryTarget: typeof R3FactoryTarget; ResourceLoader: {new(): ResourceLoader}; } @@ -83,12 +82,6 @@ export type StringMapWithRename = { export type Provider = any; -export enum R3ResolvedDependencyType { - Token = 0, - Attribute = 1, - Invalid = 2, -} - export enum R3FactoryTarget { Directive = 0, Component = 1, @@ -98,17 +91,17 @@ export enum R3FactoryTarget { } export interface R3DependencyMetadataFacade { - token: any; - resolved: R3ResolvedDependencyType; + token: unknown; + attribute: string|null; host: boolean; optional: boolean; self: boolean; - skipSelf?: boolean; + skipSelf: boolean; } export interface R3DeclareDependencyMetadataFacade { - token: any; - resolved: R3ResolvedDependencyType; + token: unknown; + attribute?: boolean; host?: boolean; optional?: boolean; self?: boolean; @@ -118,9 +111,7 @@ export interface R3DeclareDependencyMetadataFacade { export interface R3PipeMetadataFacade { name: string; type: any; - typeArgumentCount: number; pipeName: string; - deps: R3DependencyMetadataFacade[]|null; pure: boolean; } @@ -156,9 +147,7 @@ export interface R3InjectorMetadataFacade { export interface R3DirectiveMetadataFacade { name: string; type: any; - typeArgumentCount: number; typeSourceSpan: ParseSourceSpan; - deps: R3DependencyMetadataFacade[]|null; selector: string|null; queries: R3QueryMetadataFacade[]; host: {[key: string]: string}; diff --git a/packages/compiler/src/jit_compiler_facade.ts b/packages/compiler/src/jit_compiler_facade.ts index a0ac369f0a..7ba0e81591 100644 --- a/packages/compiler/src/jit_compiler_facade.ts +++ b/packages/compiler/src/jit_compiler_facade.ts @@ -10,18 +10,17 @@ 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'; import {ConstantPool} from './constant_pool'; import {ChangeDetectionStrategy, HostBinding, HostListener, Input, Output, Type, ViewEncapsulation} from './core'; -import {Identifiers} from './identifiers'; import {compileInjectable} from './injectable_compiler_2'; import {DEFAULT_INTERPOLATION_CONFIG, InterpolationConfig} from './ml_parser/interpolation_config'; -import {DeclareVarStmt, Expression, LiteralExpr, Statement, StmtModifier, WrappedNodeExpr} from './output/output_ast'; +import {DeclareVarStmt, Expression, literal, LiteralExpr, Statement, StmtModifier, WrappedNodeExpr} from './output/output_ast'; import {JitEvaluator} from './output/output_jit'; import {ParseError, ParseSourceSpan, r3JitTypeSourceSpan} from './parse_util'; -import {compileFactoryFunction, R3DependencyMetadata, R3FactoryTarget, R3ResolvedDependencyType} from './render3/r3_factory'; +import {compileFactoryFunction, R3DependencyMetadata, R3FactoryTarget} from './render3/r3_factory'; import {compileInjector, R3InjectorMetadata} from './render3/r3_injector_compiler'; import {R3JitReflector} from './render3/r3_jit'; import {compileNgModule, compileNgModuleDeclarationExpression, R3NgModuleMetadata} from './render3/r3_module_compiler'; import {compilePipeFromMetadata, R3PipeMetadata} from './render3/r3_pipe_compiler'; -import {getSafePropertyAccessString, R3Reference, wrapReference} from './render3/util'; +import {getSafePropertyAccessString, wrapReference} from './render3/util'; import {DeclarationListEmitMode, R3ComponentMetadata, R3DirectiveMetadata, R3HostMetadata, R3QueryMetadata, R3UsedDirectiveMetadata} from './render3/view/api'; import {compileComponentFromMetadata, compileDirectiveFromMetadata, ParsedHostBindings, parseHostBindings, verifyHostBindings} from './render3/view/compiler'; import {makeBindingParser, parseTemplate} from './render3/view/template'; @@ -29,7 +28,6 @@ import {ResourceLoader} from './resource_loader'; import {DomElementSchemaRegistry} from './schema/dom_element_schema_registry'; export class CompilerFacadeImpl implements CompilerFacade { - R3ResolvedDependencyType = R3ResolvedDependencyType as any; R3FactoryTarget = R3FactoryTarget as any; ResourceLoader = ResourceLoader; private elementSchemaRegistry = new DomElementSchemaRegistry(); @@ -42,8 +40,8 @@ export class CompilerFacadeImpl implements CompilerFacade { name: facade.name, type: wrapReference(facade.type), internalType: new WrappedNodeExpr(facade.type), - typeArgumentCount: facade.typeArgumentCount, - deps: convertR3DependencyMetadataArray(facade.deps), + typeArgumentCount: 0, + deps: null, pipeName: facade.pipeName, pure: facade.pure, }; @@ -220,7 +218,7 @@ export class CompilerFacadeImpl implements CompilerFacade { type: wrapReference(meta.type), internalType: new WrappedNodeExpr(meta.type), typeArgumentCount: 0, - deps: convertR3DeclareDependencyMetadataArray(meta.deps), + deps: meta.deps && meta.deps.map(convertR3DeclareDependencyMetadata), target: meta.target, }); return this.jitExpression( @@ -314,10 +312,11 @@ function convertDirectiveFacadeToMetadata(facade: R3DirectiveMetadataFacade): R3 return { ...facade as R3DirectiveMetadataFacadeNoPropAndWhitespace, + typeArgumentCount: 0, typeSourceSpan: facade.typeSourceSpan, type: wrapReference(facade.type), internalType: new WrappedNodeExpr(facade.type), - deps: convertR3DependencyMetadataArray(facade.deps), + deps: null, host: extractHostBindings(facade.propMetadata, facade.typeSourceSpan, facade.host), inputs: {...inputsFromMetadata, ...inputsFromType}, outputs: {...outputsFromMetadata, ...outputsFromType}, @@ -462,35 +461,38 @@ function computeProvidedIn(providedIn: Type|string|null|undefined): Expression { } } -function convertR3DependencyMetadata(facade: R3DeclareDependencyMetadataFacade): - R3DependencyMetadata { - let tokenExpr; - if (facade.token === null) { - tokenExpr = new LiteralExpr(null); - } else if (facade.resolved === R3ResolvedDependencyType.Attribute) { - tokenExpr = new LiteralExpr(facade.token); - } else { - tokenExpr = new WrappedNodeExpr(facade.token); - } - return { - token: tokenExpr, - attribute: null, - resolved: facade.resolved, - host: !!facade.host, - optional: !!facade.optional, - self: !!facade.self, - skipSelf: !!facade.skipSelf, - }; -} - function convertR3DependencyMetadataArray(facades: R3DependencyMetadataFacade[]|null| undefined): R3DependencyMetadata[]|null { return facades == null ? null : facades.map(convertR3DependencyMetadata); } -function convertR3DeclareDependencyMetadataArray(facades: R3DeclareDependencyMetadataFacade[]|null| - undefined): R3DependencyMetadata[]|null { - return facades == null ? null : facades.map(convertR3DependencyMetadata); +function convertR3DependencyMetadata(facade: R3DependencyMetadataFacade): R3DependencyMetadata { + const isAttributeDep = facade.attribute != null; // both `null` and `undefined` + const rawToken = facade.token === null ? null : new WrappedNodeExpr(facade.token); + // In JIT mode, if the dep is an `@Attribute()` then we use the attribute name given in + // `attribute` rather than the `token`. + const token = isAttributeDep ? new WrappedNodeExpr(facade.attribute) : rawToken; + return createR3DependencyMetadata( + token, isAttributeDep, facade.host, facade.optional, facade.self, facade.skipSelf); +} + +function convertR3DeclareDependencyMetadata(facade: R3DeclareDependencyMetadataFacade): + R3DependencyMetadata { + const isAttributeDep = facade.attribute ?? false; + const token = facade.token === null ? null : new WrappedNodeExpr(facade.token); + return createR3DependencyMetadata( + token, isAttributeDep, facade.host ?? false, facade.optional ?? false, facade.self ?? false, + facade.skipSelf ?? false); +} + +function createR3DependencyMetadata( + token: WrappedNodeExpr|null, isAttributeDep: boolean, host: boolean, optional: boolean, + self: boolean, skipSelf: boolean): R3DependencyMetadata { + // If the dep is an `@Attribute()` the `attributeNameType` ought to be the `unknown` type. + // But types are not available at runtime so we just use a literal `""` string as a dummy + // marker. + const attributeNameType = isAttributeDep ? literal('unknown') : null; + return {token, attributeNameType, host, optional, self, skipSelf}; } function extractHostBindings( diff --git a/packages/compiler/src/render3/partial/api.ts b/packages/compiler/src/render3/partial/api.ts index 283c48d734..2ca458e4b6 100644 --- a/packages/compiler/src/render3/partial/api.ts +++ b/packages/compiler/src/render3/partial/api.ts @@ -343,14 +343,15 @@ export interface R3DeclarePipeMetadata extends R3PartialDeclaration { */ export interface R3DeclareFactoryMetadata extends R3PartialDeclaration { /** - * Regardless of whether `fnOrClass` is a constructor function or a user-defined factory, it - * may have 0 or more parameters, which will be injected according to the `R3DependencyMetadata` - * for those parameters. If this is `null`, then the type's constructor is nonexistent and will - * be inherited from `fnOrClass` which is interpreted as the current type. If this is `'invalid'`, - * then one or more of the parameters wasn't resolvable and any attempt to use these deps will - * result in a runtime error. + * A collection of dependencies that this factory relies upon. + * + * If this is `null`, then the type's constructor is nonexistent and will be inherited from an + * ancestor of the type. + * + * If this is `'invalid'`, then one or more of the parameters wasn't resolvable and any attempt to + * use these deps will result in a runtime error. */ - deps: R3DependencyMetadata[]|'invalid'|null; + deps: R3DeclareDependencyMetadata[]|'invalid'|null; /** * Type of the target being created by the factory. @@ -358,11 +359,6 @@ export interface R3DeclareFactoryMetadata extends R3PartialDeclaration { target: R3FactoryTarget; } -export enum R3FactoryDelegateType { - Class = 0, - Function = 1, -} - export enum R3FactoryTarget { Directive = 0, Component = 1, @@ -372,19 +368,23 @@ export enum R3FactoryTarget { } /** - * Metadata representing a single dependency to be injected into a constructor or function call. + * Metadata indicating how a dependency should be injected into a factory. */ -export interface R3DependencyMetadata { +export interface R3DeclareDependencyMetadata { /** - * An expression representing the token or value to be injected. + * An expression representing the token or value to be injected, or `null` if the dependency is + * not valid. + * + * If this dependency is due to the `@Attribute()` decorator, then this is an expression + * evaluating to the name of the attribute. */ - token: o.Expression; + token: o.Expression|null; /** - * An enum indicating whether this dependency has special meaning to Angular and needs to be - * injected specially. + * Whether the dependency is injecting an attribute value. + * Default: false. */ - resolved: R3ResolvedDependencyType; + attribute?: boolean; /** * Whether the dependency has an @Host qualifier. @@ -410,30 +410,3 @@ export interface R3DependencyMetadata { */ skipSelf?: boolean; } - -/** - * Resolved type of a dependency. - * - * Occasionally, dependencies will have special significance which is known statically. In that - * case the `R3ResolvedDependencyType` informs the factory generator that a particular dependency - * should be generated specially (usually by calling a special injection function instead of the - * standard one). - */ -export enum R3ResolvedDependencyType { - /** - * A normal token dependency. - */ - Token = 0, - - /** - * The dependency is for an attribute. - * - * The token expression is a string representing the attribute name. - */ - Attribute = 1, - - /** - * An invalid dependency (no token could be determined). An error should be thrown at runtime. - */ - Invalid = 2, -} diff --git a/packages/compiler/src/render3/partial/factory.ts b/packages/compiler/src/render3/partial/factory.ts index d6adfaadae..8b371c8419 100644 --- a/packages/compiler/src/render3/partial/factory.ts +++ b/packages/compiler/src/render3/partial/factory.ts @@ -6,12 +6,12 @@ * found in the LICENSE file at https://angular.io/license */ import * as o from '../../output/output_ast'; -import {createFactoryType, R3FactoryMetadata, R3FactoryTarget, R3ResolvedDependencyType} from '../r3_factory'; +import {createFactoryType, R3DependencyMetadata, R3FactoryMetadata, R3FactoryTarget} from '../r3_factory'; import {Identifiers as R3} from '../r3_identifiers'; import {R3CompiledExpression} from '../util'; import {DefinitionMap} from '../view/util'; -import {R3DeclareFactoryMetadata, R3DependencyMetadata} from './api'; +import {R3DeclareDependencyMetadata, R3DeclareFactoryMetadata} from './api'; export function compileDeclareFactoryFunction(meta: R3FactoryMetadata): R3CompiledExpression { const definitionMap = new DefinitionMap(); @@ -40,22 +40,22 @@ function compileDependencies(deps: R3DependencyMetadata[]|'invalid'|null): o.Lit } function compileDependency(dep: R3DependencyMetadata): o.LiteralMapExpr { - const depMeta = new DefinitionMap(); + const depMeta = new DefinitionMap(); depMeta.set('token', dep.token); - depMeta.set( - 'resolved', - o.importExpr(R3.R3ResolvedDependencyType).prop(R3ResolvedDependencyType[dep.resolved])); + if (dep.attributeNameType !== null) { + depMeta.set('attribute', o.literal(true)); + } if (dep.host) { - depMeta.set('host', o.literal(dep.host)); + depMeta.set('host', o.literal(true)); } if (dep.optional) { - depMeta.set('optional', o.literal(dep.optional)); + depMeta.set('optional', o.literal(true)); } if (dep.self) { - depMeta.set('self', o.literal(dep.self)); + depMeta.set('self', o.literal(true)); } if (dep.skipSelf) { - depMeta.set('skipSelf', o.literal(dep.skipSelf)); + depMeta.set('skipSelf', o.literal(true)); } return depMeta.toLiteralMap(); } diff --git a/packages/compiler/src/render3/r3_factory.ts b/packages/compiler/src/render3/r3_factory.ts index 2a299abe44..90b898928c 100644 --- a/packages/compiler/src/render3/r3_factory.ts +++ b/packages/compiler/src/render3/r3_factory.ts @@ -8,9 +8,7 @@ import {StaticSymbol} from '../aot/static_symbol'; import {CompileTypeMetadata, tokenReference} from '../compile_metadata'; -import {CompileReflector} from '../compile_reflector'; import {InjectFlags} from '../core'; -import {Identifiers} from '../identifiers'; import * as o from '../output/output_ast'; import {Identifiers as R3} from '../render3/r3_identifiers'; import {OutputContext} from '../util'; @@ -88,54 +86,19 @@ export enum R3FactoryTarget { NgModule = 4, } -/** - * Resolved type of a dependency. - * - * Occasionally, dependencies will have special significance which is known statically. In that - * case the `R3ResolvedDependencyType` informs the factory generator that a particular dependency - * should be generated specially (usually by calling a special injection function instead of the - * standard one). - */ -export enum R3ResolvedDependencyType { - /** - * A normal token dependency. - */ - Token = 0, - - /** - * The dependency is for an attribute. - * - * The token expression is a string representing the attribute name. - */ - Attribute = 1, - - /** - * An invalid dependency (no token could be determined). An error should be thrown at runtime. - */ - Invalid = 2, -} - -/** - * Metadata representing a single dependency to be injected into a constructor or function call. - */ export interface R3DependencyMetadata { /** * An expression representing the token or value to be injected. + * Or `null` if the dependency could not be resolved - making it invalid. */ - token: o.Expression; + token: o.Expression|null; /** * If an @Attribute decorator is present, this is the literal type of the attribute name, or * the unknown type if no literal type is available (e.g. the attribute name is an expression). - * Will be null otherwise. + * Otherwise it is null; */ - attribute: o.Expression|null; - - /** - * An enum indicating whether this dependency has special meaning to Angular and needs to be - * injected specially. - */ - resolved: R3ResolvedDependencyType; + attributeNameType: o.Expression|null; /** * Whether the dependency has an @Host qualifier. @@ -266,35 +229,37 @@ function injectDependencies(deps: R3DependencyMetadata[], target: R3FactoryTarge function compileInjectDependency( dep: R3DependencyMetadata, target: R3FactoryTarget, index: number): o.Expression { // Interpret the dependency according to its resolved type. - switch (dep.resolved) { - case R3ResolvedDependencyType.Token: - // Build up the injection flags according to the metadata. - const flags = InjectFlags.Default | (dep.self ? InjectFlags.Self : 0) | - (dep.skipSelf ? InjectFlags.SkipSelf : 0) | (dep.host ? InjectFlags.Host : 0) | - (dep.optional ? InjectFlags.Optional : 0) | - (target === R3FactoryTarget.Pipe ? InjectFlags.ForPipe : 0); + if (dep.token === null) { + return o.importExpr(R3.invalidFactoryDep).callFn([o.literal(index)]); + } else if (dep.attributeNameType === null) { + // Build up the injection flags according to the metadata. + const flags = InjectFlags.Default | (dep.self ? InjectFlags.Self : 0) | + (dep.skipSelf ? InjectFlags.SkipSelf : 0) | (dep.host ? InjectFlags.Host : 0) | + (dep.optional ? InjectFlags.Optional : 0) | + (target === R3FactoryTarget.Pipe ? InjectFlags.ForPipe : 0); - // If this dependency is optional or otherwise has non-default flags, then additional - // parameters describing how to inject the dependency must be passed to the inject function - // that's being used. - let flagsParam: o.LiteralExpr|null = - (flags !== InjectFlags.Default || dep.optional) ? o.literal(flags) : null; + // If this dependency is optional or otherwise has non-default flags, then additional + // parameters describing how to inject the dependency must be passed to the inject function + // that's being used. + let flagsParam: o.LiteralExpr|null = + (flags !== InjectFlags.Default || dep.optional) ? o.literal(flags) : null; - // Build up the arguments to the injectFn call. - const injectArgs = [dep.token]; - if (flagsParam) { - injectArgs.push(flagsParam); - } - const injectFn = getInjectFn(target); - return o.importExpr(injectFn).callFn(injectArgs); - case R3ResolvedDependencyType.Attribute: - // In the case of attributes, the attribute name in question is given as the token. - return o.importExpr(R3.injectAttribute).callFn([dep.token]); - case R3ResolvedDependencyType.Invalid: - return o.importExpr(R3.invalidFactoryDep).callFn([o.literal(index)]); - default: - return unsupported( - `Unknown R3ResolvedDependencyType: ${R3ResolvedDependencyType[dep.resolved]}`); + // Build up the arguments to the injectFn call. + const injectArgs = [dep.token]; + if (flagsParam) { + injectArgs.push(flagsParam); + } + const injectFn = getInjectFn(target); + return o.importExpr(injectFn).callFn(injectArgs); + } else { + // The `dep.attributeTypeName` value is defined, which indicates that this is an `@Attribute()` + // type dependency. For the generated JS we still want to use the `dep.token` value in case the + // name given for the attribute is not a string literal. For example given `@Attribute(foo())`, + // we want to generate `ɵɵinjectAttribute(foo())`. + // + // The `dep.attributeTypeName` is only actually used (in `createCtorDepType()`) to generate + // typings. + return o.importExpr(R3.injectAttribute).callFn([dep.token]); } } @@ -320,10 +285,8 @@ function createCtorDepsType(deps: R3DependencyMetadata[]): o.Type { function createCtorDepType(dep: R3DependencyMetadata): o.LiteralMapExpr|null { const entries: {key: string, quoted: boolean, value: o.Expression}[] = []; - if (dep.resolved === R3ResolvedDependencyType.Attribute) { - if (dep.attribute !== null) { - entries.push({key: 'attribute', value: dep.attribute, quoted: false}); - } + if (dep.attributeNameType !== null) { + entries.push({key: 'attribute', value: dep.attributeNameType, quoted: false}); } if (dep.optional) { entries.push({key: 'optional', value: o.literal(true), quoted: false}); diff --git a/packages/compiler/src/render3/r3_identifiers.ts b/packages/compiler/src/render3/r3_identifiers.ts index 4c10ec3e58..329f17095f 100644 --- a/packages/compiler/src/render3/r3_identifiers.ts +++ b/packages/compiler/src/render3/r3_identifiers.ts @@ -258,10 +258,6 @@ export class Identifiers { }; static declareFactory: o.ExternalReference = {name: 'ɵɵngDeclareFactory', moduleName: CORE}; static R3FactoryTarget: o.ExternalReference = {name: 'ɵɵFactoryTarget', moduleName: CORE}; - static R3ResolvedDependencyType: - o.ExternalReference = {name: 'ɵɵResolvedDependencyType', moduleName: CORE}; - static R3FactoryDelegateType: - o.ExternalReference = {name: 'ɵɵFactoryDelegateType', moduleName: CORE}; static defineDirective: o.ExternalReference = {name: 'ɵɵdefineDirective', moduleName: CORE}; static declareDirective: o.ExternalReference = {name: 'ɵɵngDeclareDirective', moduleName: CORE}; diff --git a/packages/compiler/test/compiler_facade_interface_spec.ts b/packages/compiler/test/compiler_facade_interface_spec.ts index a6dc4dbc5f..9082d3b9ba 100644 --- a/packages/compiler/test/compiler_facade_interface_spec.ts +++ b/packages/compiler/test/compiler_facade_interface_spec.ts @@ -7,7 +7,7 @@ */ import * as core from '../../core/src/compiler/compiler_facade_interface'; -import {R3FactoryTarget, R3ResolvedDependencyType} from '../public_api'; +import {R3FactoryTarget} from '../public_api'; import * as compiler from '../src/compiler_facade_interface'; /** @@ -45,21 +45,6 @@ const compilerStringMap: compiler.StringMap = null! as core.StringMap; const coreProvider: core.Provider = null! as compiler.Provider; const compilerProvider: compiler.Provider = null! as core.Provider; -const coreR3ResolvedDependencyType: core.R3ResolvedDependencyType = - null! as compiler.R3ResolvedDependencyType; -const compilerR3ResolvedDependencyType: compiler.R3ResolvedDependencyType = - null! as core.R3ResolvedDependencyType; - -const coreR3ResolvedDependencyType2: R3ResolvedDependencyType = - null! as core.R3ResolvedDependencyType; -const compilerR3ResolvedDependencyType2: R3ResolvedDependencyType = - null! as core.R3ResolvedDependencyType; - -const coreR3ResolvedDependencyType3: core.R3ResolvedDependencyType = - null! as R3ResolvedDependencyType; -const compilerR3ResolvedDependencyType3: compiler.R3ResolvedDependencyType = - null! as R3ResolvedDependencyType; - const coreR3FactoryTarget: core.R3FactoryTarget = null! as compiler.R3FactoryTarget; const compilerR3FactoryTarget: compiler.R3FactoryTarget = null! as core.R3FactoryTarget; diff --git a/packages/core/src/compiler/compiler_facade_interface.ts b/packages/core/src/compiler/compiler_facade_interface.ts index 6ce8a1d3ce..ac3264d0c0 100644 --- a/packages/core/src/compiler/compiler_facade_interface.ts +++ b/packages/core/src/compiler/compiler_facade_interface.ts @@ -60,8 +60,7 @@ export interface CompilerFacade { createParseSourceSpan(kind: string, typeName: string, sourceUrl: string): ParseSourceSpan; - R3ResolvedDependencyType: typeof R3ResolvedDependencyType; - R3FactoryTarget: typeof R3FactoryTarget; + R3FactoryTarget: typeof FactoryTarget; ResourceLoader: {new(): ResourceLoader}; } @@ -83,13 +82,7 @@ export type StringMapWithRename = { export type Provider = any; -export enum R3ResolvedDependencyType { - Token = 0, - Attribute = 1, - Invalid = 2, -} - -export enum R3FactoryTarget { +export enum FactoryTarget { Directive = 0, Component = 1, Injectable = 2, @@ -98,17 +91,17 @@ export enum R3FactoryTarget { } export interface R3DependencyMetadataFacade { - token: any; - resolved: R3ResolvedDependencyType; + token: unknown; + attribute: string|null; host: boolean; optional: boolean; self: boolean; - skipSelf?: boolean; + skipSelf: boolean; } export interface R3DeclareDependencyMetadataFacade { - token: any; - resolved: R3ResolvedDependencyType; + token: unknown; + attribute?: boolean; host?: boolean; optional?: boolean; self?: boolean; @@ -118,9 +111,7 @@ export interface R3DeclareDependencyMetadataFacade { export interface R3PipeMetadataFacade { name: string; type: any; - typeArgumentCount: number; pipeName: string; - deps: R3DependencyMetadataFacade[]|null; pure: boolean; } @@ -156,9 +147,7 @@ export interface R3InjectorMetadataFacade { export interface R3DirectiveMetadataFacade { name: string; type: any; - typeArgumentCount: number; typeSourceSpan: ParseSourceSpan; - deps: R3DependencyMetadataFacade[]|null; selector: string|null; queries: R3QueryMetadataFacade[]; host: {[key: string]: string}; @@ -239,13 +228,13 @@ export interface R3FactoryDefMetadataFacade { type: any; typeArgumentCount: number; deps: R3DependencyMetadataFacade[]|null; - target: R3FactoryTarget; + target: FactoryTarget; } export interface R3DeclareFactoryFacade { type: Function; deps: R3DeclareDependencyMetadataFacade[]|null; - target: R3FactoryTarget; + target: FactoryTarget; } export enum ViewEncapsulation { diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index 393f16c16d..940db40ba2 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -268,9 +268,7 @@ export { transitiveScopesFor as ɵtransitiveScopesFor, } from './render3/jit/module'; export { - R3FactoryDelegateType as ɵɵFactoryDelegateType, R3FactoryTarget as ɵɵFactoryTarget, - R3ResolvedDependencyType as ɵɵResolvedDependencyType, ɵɵngDeclareComponent, ɵɵngDeclareDirective, ɵɵngDeclareFactory, diff --git a/packages/core/src/di/jit/util.ts b/packages/core/src/di/jit/util.ts index 06f44565de..a19b72340c 100644 --- a/packages/core/src/di/jit/util.ts +++ b/packages/core/src/di/jit/util.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {CompilerFacade, getCompilerFacade, R3DependencyMetadataFacade, R3ResolvedDependencyType} from '../../compiler/compiler_facade'; +import {R3DependencyMetadataFacade} from '../../compiler/compiler_facade'; import {Type} from '../../interface/type'; import {ReflectionCapabilities} from '../../reflection/reflection_capabilities'; import {Host, Inject, Optional, Self, SkipSelf} from '../metadata'; @@ -23,25 +23,19 @@ export function reflectDependencies(type: Type): R3DependencyMetadataFacade } export function convertDependencies(deps: any[]): R3DependencyMetadataFacade[] { - const compiler = getCompilerFacade(); - return deps.map(dep => reflectDependency(compiler, dep)); + return deps.map(dep => reflectDependency(dep)); } -function reflectDependency(compiler: CompilerFacade, dep: any|any[]): R3DependencyMetadataFacade { +function reflectDependency(dep: any|any[]): R3DependencyMetadataFacade { const meta: R3DependencyMetadataFacade = { token: null, + attribute: null, host: false, optional: false, - resolved: compiler.R3ResolvedDependencyType.Token, self: false, skipSelf: false, }; - function setTokenAndResolvedType(token: any): void { - meta.resolved = compiler.R3ResolvedDependencyType.Token; - meta.token = token; - } - if (Array.isArray(dep) && dep.length > 0) { for (let j = 0; j < dep.length; j++) { const param = dep[j]; @@ -66,17 +60,15 @@ function reflectDependency(compiler: CompilerFacade, dep: any|any[]): R3Dependen if (param.attributeName === undefined) { throw new Error(`Attribute name must be defined.`); } - meta.token = param.attributeName; - meta.resolved = compiler.R3ResolvedDependencyType.Attribute; + meta.attribute = param.attributeName; } else { - setTokenAndResolvedType(param); + meta.token = param; } } } else if (dep === undefined || (Array.isArray(dep) && dep.length === 0)) { - meta.token = undefined; - meta.resolved = R3ResolvedDependencyType.Invalid; + meta.token = null; } else { - setTokenAndResolvedType(dep); + meta.token = dep; } return meta; } diff --git a/packages/core/src/render3/jit/directive.ts b/packages/core/src/render3/jit/directive.ts index f2f3a71489..c619b9c59f 100644 --- a/packages/core/src/render3/jit/directive.ts +++ b/packages/core/src/render3/jit/directive.ts @@ -210,9 +210,13 @@ function addDirectiveFactoryDef(type: Type, metadata: Directive|Component) if (ngFactoryDef === null) { const meta = getDirectiveMetadata(type, metadata); const compiler = getCompilerFacade(); - ngFactoryDef = compiler.compileFactory( - angularCoreEnv, `ng:///${type.name}/ɵfac.js`, - {...meta.metadata, target: compiler.R3FactoryTarget.Directive}); + ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${type.name}/ɵfac.js`, { + name: meta.metadata.name, + type: meta.metadata.type, + typeArgumentCount: 0, + deps: reflectDependencies(type), + target: compiler.R3FactoryTarget.Directive + }); } return ngFactoryDef; }, @@ -237,9 +241,7 @@ export function directiveMetadata(type: Type, metadata: Directive): R3Direc return { name: type.name, type: type, - typeArgumentCount: 0, selector: metadata.selector !== undefined ? metadata.selector : null, - deps: reflectDependencies(type), host: metadata.host || EMPTY_OBJ, propMetadata: propMetadata, inputs: metadata.inputs || EMPTY_ARRAY, diff --git a/packages/core/src/render3/jit/partial.ts b/packages/core/src/render3/jit/partial.ts index 27c09dcf86..320a6bbcfb 100644 --- a/packages/core/src/render3/jit/partial.ts +++ b/packages/core/src/render3/jit/partial.ts @@ -45,7 +45,7 @@ export function ɵɵngDeclareFactory(decl: R3DeclareFactoryFacade): unknown { /** * These enums are used in the partial factory declaration calls. */ -export {R3FactoryTarget, R3ResolvedDependencyType, R3FactoryDelegateType} from '../../compiler/compiler_facade'; +export {R3FactoryTarget} from '../../compiler/compiler_facade'; /** * Compiles a partial injector declaration object into a full injector definition object. diff --git a/packages/core/src/render3/jit/pipe.ts b/packages/core/src/render3/jit/pipe.ts index 1d419b75ee..34e3427cfe 100644 --- a/packages/core/src/render3/jit/pipe.ts +++ b/packages/core/src/render3/jit/pipe.ts @@ -23,9 +23,13 @@ export function compilePipe(type: Type, meta: Pipe): void { if (ngFactoryDef === null) { const metadata = getPipeMetadata(type, meta); const compiler = getCompilerFacade(); - ngFactoryDef = compiler.compileFactory( - angularCoreEnv, `ng:///${metadata.name}/ɵfac.js`, - {...metadata, target: compiler.R3FactoryTarget.Pipe}); + ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${metadata.name}/ɵfac.js`, { + name: metadata.name, + type: metadata.type, + typeArgumentCount: 0, + deps: reflectDependencies(type), + target: compiler.R3FactoryTarget.Pipe + }); } return ngFactoryDef; }, @@ -50,9 +54,7 @@ export function compilePipe(type: Type, meta: Pipe): void { function getPipeMetadata(type: Type, meta: Pipe): R3PipeMetadataFacade { return { type: type, - typeArgumentCount: 0, name: type.name, - deps: reflectDependencies(type), pipeName: meta.name, pure: meta.pure !== undefined ? meta.pure : true }; diff --git a/packages/core/test/render3/jit/declare_factory_spec.ts b/packages/core/test/render3/jit/declare_factory_spec.ts index 1eb0997f8e..4bf39a3022 100644 --- a/packages/core/test/render3/jit/declare_factory_spec.ts +++ b/packages/core/test/render3/jit/declare_factory_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Injector, ɵcreateInjector, ɵɵFactoryTarget, ɵɵngDeclareFactory, ɵɵResolvedDependencyType} from '@angular/core'; +import {Injector, ɵcreateInjector, ɵɵFactoryTarget, ɵɵngDeclareFactory} from '@angular/core'; import {ɵɵdefineInjector} from '@angular/core/src/di'; import {setCurrentInjector} from '@angular/core/src/di/injector_compatibility'; @@ -47,7 +47,7 @@ class DependingClass { constructor(readonly testClass: TestClass) {} static ɵfac = ɵɵngDeclareFactory({ type: DependingClass, - deps: [{token: TestClass, resolved: ɵɵResolvedDependencyType.Token}], + deps: [{token: TestClass}], target: ɵɵFactoryTarget.Injectable, }); } diff --git a/packages/core/test/render3/jit_environment_spec.ts b/packages/core/test/render3/jit_environment_spec.ts index 61b9459543..e3c12a83eb 100644 --- a/packages/core/test/render3/jit_environment_spec.ts +++ b/packages/core/test/render3/jit_environment_spec.ts @@ -34,8 +34,6 @@ const PARTIAL_ONLY = new Set([ 'ɵɵngDeclareNgModule', 'ɵɵngDeclarePipe', 'ɵɵFactoryTarget', - 'ɵɵResolvedDependencyType', - 'ɵɵFactoryDelegateType', 'ChangeDetectionStrategy', 'ViewEncapsulation', ]);