From 71ab11ccf0f0daaffb49779d5f90b9e2da76dbd5 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 6 Nov 2025 12:01:16 +0100 Subject: [PATCH] fix(compiler-cli): make field detection logic more robust Currently the logic for detecting `Field` directives only works if it's imported from `@angular/forms/signals` which doesn't cover our own tests. These changes make the check more robust. (cherry picked from commit 0b6b78ca74d8fb8c32ddf3c0c11d5b36198710e4) --- .../ngtsc/typecheck/src/type_check_block.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts index 4c36f9b3028..49c8eccb0dc 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts @@ -4095,8 +4095,25 @@ function getComponentTagName(node: TmplAstComponent): string { } function isFieldDirective(meta: TypeCheckableDirectiveMeta): boolean { + if (meta.name !== 'Field') { + return false; + } + + // Fast path, relevant for all external users. + if (meta.ref.bestGuessOwningModule?.specifier === '@angular/forms/signals') { + return true; + } + + // Slightly slower, but more accurate path. return ( - meta.name === 'Field' && meta.ref.bestGuessOwningModule?.specifier === '@angular/forms/signals' + ts.isClassDeclaration(meta.ref.node) && + meta.ref.node.members.some( + (member) => + ts.isPropertyDeclaration(member) && + ts.isComputedPropertyName(member.name) && + ts.isIdentifier(member.name.expression) && + member.name.expression.text === 'ɵCONTROL', + ) ); }