diff --git a/default-recommendations/definition-shortcuts-test.rkt b/default-recommendations/definition-shortcuts-test.rkt index fbebd9e..9b2d007 100644 --- a/default-recommendations/definition-shortcuts-test.rkt +++ b/default-recommendations/definition-shortcuts-test.rkt @@ -220,3 +220,19 @@ test: "begin0 in right hand side of definition can be removed" (displayln "foo") (* x 2)) -------------------- + + +test: "begin inside begin0 in definition context should be extractable" +-------------------- +(define (f x) + (displayln "starting") + (begin0 (begin (displayln "before") (* x 2)) + (displayln "after"))) +-------------------- +-------------------- +(define (f x) + (displayln "starting") + (displayln "before") + (begin0 (* x 2) + (displayln "after"))) +-------------------- diff --git a/default-recommendations/definition-shortcuts.rkt b/default-recommendations/definition-shortcuts.rkt index c7197a7..d964f75 100644 --- a/default-recommendations/definition-shortcuts.rkt +++ b/default-recommendations/definition-shortcuts.rkt @@ -68,8 +68,22 @@ (body-before ... replacement ... body-after ...)) +(define-definition-context-refactoring-rule begin0-begin-extraction + #:description + "The `begin` form inside this `begin0` form can be extracted into the surrounding definition\ + context." + #:literals (begin0 begin) + (~seq body-before ... + (~and outer-form (begin0 (begin pre-body ... expr) post-body ...))) + #:with (replacement ...) + #'(~focus-replacement-on + (~splicing-replacement (pre-body ... (begin0 expr post-body ...)) #:original outer-form)) + (body-before ... replacement ...)) + + (define-refactoring-suite definition-shortcuts - #:rules (define-begin-extraction + #:rules (begin0-begin-extraction + define-begin-extraction define-begin0-extraction define-values-values-to-define inline-unnecessary-define))