From 1a8eb1790b89d729c251fc59535ef85a982a4646 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 8 Dec 2025 17:03:17 +0000 Subject: [PATCH 1/2] Initial plan From ea001d9c703eadfbfd2c1b1895f27fe746ecc07b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 8 Dec 2025 17:12:46 +0000 Subject: [PATCH 2/2] Modify when/unless rules to only apply with multi-body loops - Add check to require at least 2 body forms before refactoring - Update test cases to test both multi-body (should refactor) and single-body (should not refactor) cases - All tests pass successfully Co-authored-by: jackfirth <8175575+jackfirth@users.noreply.github.com> --- .../loops/for-loop-shortcuts-test.rkt | 64 +++++++++++++++---- .../loops/for-loop-shortcuts.rkt | 2 + 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/default-recommendations/loops/for-loop-shortcuts-test.rkt b/default-recommendations/loops/for-loop-shortcuts-test.rkt index 8ec3c5b..92f97c3 100644 --- a/default-recommendations/loops/for-loop-shortcuts-test.rkt +++ b/default-recommendations/loops/for-loop-shortcuts-test.rkt @@ -341,51 +341,91 @@ test: "nested for/and forms can be flattened to a for*/and form" ------------------------------ -test: "(when ...) in a for loop refactored to #:when clause" +test: "(when ...) in a for loop refactored to #:when clause when multiple body forms" ------------------------------------------------------------ (for ([x (in-list (list 1 2 'a 3 'b 4))]) (when (number? x) - (displayln x))) + (displayln x) + (displayln (* x 2)))) ============================================================ (for ([x (in-list (list 1 2 'a 3 'b 4))] #:when (number? x)) - (displayln x)) + (displayln x) + (displayln (* x 2))) ------------------------------------------------------------ -test: "(when ...) in a for* loop refactored to #:when clause" +no-change-test: "(when ...) with single body form in a for loop not refactored" ------------------------------------------------------------ -(for* ([x (in-list (list 1 2 'a 3 'b 4))]) +(for ([x (in-list (list 1 2 'a 3 'b 4))]) (when (number? x) (displayln x))) +------------------------------------------------------------ + + +test: "(when ...) in a for* loop refactored to #:when clause when multiple body forms" +------------------------------------------------------------ +(for* ([x (in-list (list 1 2 'a 3 'b 4))]) + (when (number? x) + (displayln x) + (displayln (* x 2)))) ============================================================ (for* ([x (in-list (list 1 2 'a 3 'b 4))] #:when (number? x)) - (displayln x)) + (displayln x) + (displayln (* x 2))) +------------------------------------------------------------ + + +no-change-test: "(when ...) with single body form in a for* loop not refactored" +------------------------------------------------------------ +(for* ([x (in-list (list 1 2 'a 3 'b 4))]) + (when (number? x) + (displayln x))) ------------------------------------------------------------ -test: "(unless ...) in a for loop refactored to #:when clause" +test: "(unless ...) in a for loop refactored to #:unless clause when multiple body forms" ------------------------------------------------------------ (for ([x (in-list (list 1 2 'a 3 'b 4))]) (unless (number? x) - (displayln x))) + (displayln x) + (displayln "non-number"))) ============================================================ (for ([x (in-list (list 1 2 'a 3 'b 4))] #:unless (number? x)) - (displayln x)) + (displayln x) + (displayln "non-number")) ------------------------------------------------------------ -test: "(unless ...) in a for* loop refactored to #:when clause" +no-change-test: "(unless ...) with single body form in a for loop not refactored" ------------------------------------------------------------ -(for* ([x (in-list (list 1 2 'a 3 'b 4))]) +(for ([x (in-list (list 1 2 'a 3 'b 4))]) (unless (number? x) (displayln x))) +------------------------------------------------------------ + + +test: "(unless ...) in a for* loop refactored to #:unless clause when multiple body forms" +------------------------------------------------------------ +(for* ([x (in-list (list 1 2 'a 3 'b 4))]) + (unless (number? x) + (displayln x) + (displayln "non-number"))) ============================================================ (for* ([x (in-list (list 1 2 'a 3 'b 4))] #:unless (number? x)) - (displayln x)) + (displayln x) + (displayln "non-number")) +------------------------------------------------------------ + + +no-change-test: "(unless ...) with single body form in a for* loop not refactored" +------------------------------------------------------------ +(for* ([x (in-list (list 1 2 'a 3 'b 4))]) + (unless (number? x) + (displayln x))) ------------------------------------------------------------ diff --git a/default-recommendations/loops/for-loop-shortcuts.rkt b/default-recommendations/loops/for-loop-shortcuts.rkt index 75bc4b6..e919475 100644 --- a/default-recommendations/loops/for-loop-shortcuts.rkt +++ b/default-recommendations/loops/for-loop-shortcuts.rkt @@ -261,6 +261,7 @@ return just that result." #:description "Use the `#:when` keyword instead of `when` to reduce loop body indentation." #:literals (when for for*) ((~or for-id:for for-id:for*) (clause ...) (when condition body ...)) + #:when (>= (length (attribute body)) 2) (for-id (clause ... #:when condition) body ...)) @@ -268,6 +269,7 @@ return just that result." #:description "Use the `#:unless` keyword instead of `unless` to reduce loop body indentation." #:literals (unless for for*) ((~or for-id:for for-id:for*) (clause ...) (unless condition body ...)) + #:when (>= (length (attribute body)) 2) (for-id (clause ... #:unless condition) body ...))