From 0ea27f4e652ddcf444b4c22a3b9643b7cc645926 Mon Sep 17 00:00:00 2001 From: tmpln Date: Thu, 30 Apr 2026 14:11:28 +0000 Subject: [PATCH] fix(core): visit ng-let expression value in signal migration schematics Before this fix, references to inputs inside @let statements were not accounted for. --- .../template_reference_visitor.ts | 5 +++++ .../test/golden-test/template_ng_let.ts | 16 ++++++++++++++++ .../signal-migration/test/golden.txt | 18 ++++++++++++++++++ .../test/golden_best_effort.txt | 18 ++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/template_ng_let.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/reference_resolution/template_reference_visitor.ts b/packages/core/schematics/migrations/signal-migration/src/passes/reference_resolution/template_reference_visitor.ts index a872daeeb18..c22b6d2c0f2 100644 --- a/packages/core/schematics/migrations/signal-migration/src/passes/reference_resolution/template_reference_visitor.ts +++ b/packages/core/schematics/migrations/signal-migration/src/passes/reference_resolution/template_reference_visitor.ts @@ -26,6 +26,7 @@ import { TmplAstDeferredBlock, TmplAstForLoopBlock, TmplAstIfBlockBranch, + TmplAstLetDeclaration, TmplAstNode, TmplAstRecursiveVisitor, TmplAstSwitchBlock, @@ -223,6 +224,10 @@ export class TemplateReferenceVisitor< this.templateAttributeReferencedFields.push(...referencedFields); } } + + override visitLetDeclaration(decl: TmplAstLetDeclaration): void { + this.checkExpressionForReferencedFields(decl, decl.value); + } } /** diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/template_ng_let.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/template_ng_let.ts new file mode 100644 index 00000000000..3e79990b410 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/template_ng_let.ts @@ -0,0 +1,16 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({ + template: ` + @let sum = one + two; + @let three = this.three; + {{ sum }} {{ three }} + `, +}) +export class MyComp { + @Input() one = 1; + @Input() two = 2; + @Input() three = 3; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden.txt b/packages/core/schematics/migrations/signal-migration/test/golden.txt index c32b912a120..aae75a00109 100644 --- a/packages/core/schematics/migrations/signal-migration/test/golden.txt +++ b/packages/core/schematics/migrations/signal-migration/test/golden.txt @@ -1257,6 +1257,24 @@ export class MyComp { readonly fourth = input(true); readonly fifth = input(true); } +@@@@@@ template_ng_let.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +@Component({ + template: ` + @let sum = one() + two(); + @let three = this.three(); + {{ sum }} {{ three }} + `, +}) +export class MyComp { + readonly one = input(1); + readonly two = input(2); + readonly three = input(3); +} @@@@@@ template_object_shorthand.ts @@@@@@ // tslint:disable diff --git a/packages/core/schematics/migrations/signal-migration/test/golden_best_effort.txt b/packages/core/schematics/migrations/signal-migration/test/golden_best_effort.txt index eb04d2ab325..aff417ca873 100644 --- a/packages/core/schematics/migrations/signal-migration/test/golden_best_effort.txt +++ b/packages/core/schematics/migrations/signal-migration/test/golden_best_effort.txt @@ -1211,6 +1211,24 @@ export class MyComp { readonly fourth = input(true); readonly fifth = input(true); } +@@@@@@ template_ng_let.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +@Component({ + template: ` + @let sum = one() + two(); + @let three = this.three(); + {{ sum }} {{ three }} + `, +}) +export class MyComp { + readonly one = input(1); + readonly two = input(2); + readonly three = input(3); +} @@@@@@ template_object_shorthand.ts @@@@@@ // tslint:disable