From 07a22a929e51a1be6de3b5c9c8568397624e2acb Mon Sep 17 00:00:00 2001 From: Tommy Carter Date: Fri, 3 Apr 2026 13:04:33 -0500 Subject: [PATCH 1/4] Test cases for no-unused-block-params --- .../lib/rules/template-no-unused-block-params.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/lib/rules/template-no-unused-block-params.js b/tests/lib/rules/template-no-unused-block-params.js index b2063b8a81..6713eeb10e 100644 --- a/tests/lib/rules/template-no-unused-block-params.js +++ b/tests/lib/rules/template-no-unused-block-params.js @@ -11,6 +11,21 @@ const validHbs = [ '{{#each cats as |cat|}}{{meow cat}}{{/each}}', '{{#each cats as |cat index|}}{{index}}{{/each}}', '{{#each cats as |cat index|}}{{#each cat.lives as |life|}}{{index}}: {{life}}{{/each}}{{/each}}', + ` + {{#each cats as |cat|}} +
+ {{/each}} + `, + ` + {{#each cats as |cat|}} +
+ {{/each}} + `, + ` + {{#each cats as |cat|}} +
+ {{/each}} + `, ` {{! template-lint-disable }} From 4ec102b6954ed49300d46ce3b9ff310199d571bb Mon Sep 17 00:00:00 2001 From: Tommy Carter Date: Fri, 3 Apr 2026 14:18:55 -0500 Subject: [PATCH 2/4] Additional test case for no-unused-block-params --- tests/lib/rules/template-no-unused-block-params.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/lib/rules/template-no-unused-block-params.js b/tests/lib/rules/template-no-unused-block-params.js index 6713eeb10e..c0d76d05db 100644 --- a/tests/lib/rules/template-no-unused-block-params.js +++ b/tests/lib/rules/template-no-unused-block-params.js @@ -113,6 +113,11 @@ const invalidHbs = [ output: null, errors: [{ messageId: 'unusedBlockParam', data: { param: 'life' } }], }, + { + code: `{{#each cats as |cat|}}plain cat text{{/each}}`, + output: null, + errors: [{ messageId: 'unusedBlockParam', data: { param: 'cat' } }], + }, ]; function wrapTemplate(entry) { From caf46da3e4f9fa15286acc0942c9733064c8bdcf Mon Sep 17 00:00:00 2001 From: Tommy Carter Date: Fri, 3 Apr 2026 14:33:31 -0500 Subject: [PATCH 3/4] Fix collectChildNodes to include parts during node traversal --- lib/rules/template-no-unused-block-params.js | 5 +++++ tests/lib/rules/template-no-unused-block-params.js | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/lib/rules/template-no-unused-block-params.js b/lib/rules/template-no-unused-block-params.js index 2525f342ff..a0e043d0d6 100644 --- a/lib/rules/template-no-unused-block-params.js +++ b/lib/rules/template-no-unused-block-params.js @@ -24,6 +24,11 @@ function collectChildNodes(n) { if (n.children) { children.push(...n.children); } + // GlimmerPathExpression also has 'parts', so make sure we're not treating + // concat'd path string parts as AST nodes. + if (n.type === 'GlimmerConcatStatement' && n.parts) { + children.push(...n.parts); + } return children; } diff --git a/tests/lib/rules/template-no-unused-block-params.js b/tests/lib/rules/template-no-unused-block-params.js index c0d76d05db..c546100d31 100644 --- a/tests/lib/rules/template-no-unused-block-params.js +++ b/tests/lib/rules/template-no-unused-block-params.js @@ -118,6 +118,11 @@ const invalidHbs = [ output: null, errors: [{ messageId: 'unusedBlockParam', data: { param: 'cat' } }], }, + { + code: `{{#each cats as |cat|}}{{a.different.cat}}{{/each}}`, + output: null, + errors: [{ messageId: 'unusedBlockParam', data: { param: 'cat' } }], + }, ]; function wrapTemplate(entry) { From 05ae98fee51421ff4d92f4e92e84938306b5fe96 Mon Sep 17 00:00:00 2001 From: Tommy Carter Date: Fri, 3 Apr 2026 15:10:40 -0500 Subject: [PATCH 4/4] Change quotes to pass lint --- tests/lib/rules/template-no-unused-block-params.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lib/rules/template-no-unused-block-params.js b/tests/lib/rules/template-no-unused-block-params.js index c546100d31..84ac8840e6 100644 --- a/tests/lib/rules/template-no-unused-block-params.js +++ b/tests/lib/rules/template-no-unused-block-params.js @@ -114,12 +114,12 @@ const invalidHbs = [ errors: [{ messageId: 'unusedBlockParam', data: { param: 'life' } }], }, { - code: `{{#each cats as |cat|}}plain cat text{{/each}}`, + code: '{{#each cats as |cat|}}plain cat text{{/each}}', output: null, errors: [{ messageId: 'unusedBlockParam', data: { param: 'cat' } }], }, { - code: `{{#each cats as |cat|}}{{a.different.cat}}{{/each}}`, + code: '{{#each cats as |cat|}}{{a.different.cat}}{{/each}}', output: null, errors: [{ messageId: 'unusedBlockParam', data: { param: 'cat' } }], },