diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts index fa75646407..fcabb15032 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts @@ -11,7 +11,7 @@ import * as ts from 'typescript'; import {Reference} from '../../imports'; import {OwningModule} from '../../imports/src/references'; import {DependencyTracker} from '../../incremental/api'; -import {Declaration, DeclarationNode, EnumMember, FunctionDefinition, isConcreteDeclaration, ReflectionHost, SpecialDeclarationKind} from '../../reflection'; +import {Declaration, DeclarationKind, DeclarationNode, EnumMember, FunctionDefinition, isConcreteDeclaration, ReflectionHost, SpecialDeclarationKind} from '../../reflection'; import {isDeclaration} from '../../util/src/typescript'; import {ArrayConcatBuiltinFn, ArraySliceBuiltinFn} from './builtin'; @@ -231,7 +231,7 @@ export class StaticInterpreter { return this.getResolvedEnum(decl.node, decl.identity.enumMembers, context); } const declContext = {...context, ...joinModuleContext(context, node, decl)}; - const result = this.visitDeclaration(decl.node, declContext); + const result = this.visitAmbiguousDeclaration(decl, declContext); if (result instanceof Reference) { // Only record identifiers to non-synthetic references. Synthetic references may not have the // same value at runtime as they do at compile time, so it's not legal to refer to them by the @@ -337,10 +337,18 @@ export class StaticInterpreter { }; // Visit both concrete and inline declarations. - return this.visitDeclaration(decl.node, declContext); + return this.visitAmbiguousDeclaration(decl, declContext); }); } + private visitAmbiguousDeclaration(decl: Declaration, declContext: Context) { + return decl.kind === DeclarationKind.Inline && decl.implementation !== undefined ? + // Inline declarations with an `implementation` should be visited as expressions + this.visitExpression(decl.implementation, declContext) : + // Otherwise just visit the declaration `node` + this.visitDeclaration(decl.node, declContext); + } + private accessHelper(node: ts.Node, lhs: ResolvedValue, rhs: string|number, context: Context): ResolvedValue { const strIndex = `${rhs}`; diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts index af979422ff..3ae572f5c8 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts @@ -625,6 +625,7 @@ export interface DownleveledEnum { export interface InlineDeclaration extends BaseDeclaration> { kind: DeclarationKind.Inline; + implementation?: ts.Expression; } /**