Commit5da82310Recorded9 Jul 2026Repositorysigil-nrepl
Fix macroexpand module context
Changed
src/sigil/nrepl.sgl | 17 +++++++++++------
test/test-server.sgl | 19 +++++++++++++++++++
2 files changed, 30 insertions(+), 6 deletions(-)Diff
src/sigil/nrepl.sglmodified
@@ -577,12 +577,17 @@
577
(let ((code (get-arg args ':code ""))) 578
(if (string=? code "") 579
(make-error-response* client id "missing-code" "No :code provided")−580
(guard (exn−581
(else (make-error-response* client id "expand-error"−582
(if (string? exn) exn (format "~s" exn)))))−583
(let ((expanded (macroexpand (read-expr code))))−584
(make-response* client id 'ok−585
':expansion (format "~s" expanded)))))))+580
(let ((saved-module (current-module)))+581
(set-current-module! (client-module client))+582
(guard (exn+583
(else+584
(set-current-module! saved-module)+585
(make-error-response* client id "expand-error"+586
(if (string? exn) exn (format "~s" exn)))))+587
(let ((expanded (macroexpand (read-expr code))))+588
(set-current-module! saved-module)+589
(make-response* client id 'ok+590
':expansion (format "~s" expanded)))))))) 591
592
;; modules - list available modules 593
(define (handle-modules client id args)test/test-server.sglmodified
@@ -274,6 +274,25 @@
274
:code "(nrepl-getcell-add-base 5)")))) 275
(assert-eq (response-ref closure-resp ':status #f) 'ok) 276
(assert-equal (response-ref closure-resp ':value #f) "47"))+277
(socket-close sock)))))+278
+279
(test "macroexpand uses request module context"+280
(with-server+281
(lambda (server)+282
(let ((sock (tcp-connect "127.0.0.1" *test-port*)))+283
(pump server 5)+284
(let ((load-resp (request-response server sock+285
'(request :id "load-fixture" :op eval+286
:code "(load-module '(sigil nrepl getcell-fixture))"))))+287
(assert-eq (response-ref load-resp ':status #f) 'ok))+288
(let ((macro-resp (request-response server sock+289
'(request :id "fixture-module-macro" :op macroexpand+290
:module "(sigil nrepl getcell-fixture)"+291
:code "(nrepl-getcell-match '(1 2 3) ((a b c) (+ a b c)) (_ 0))"))))+292
(assert-eq (response-ref macro-resp ':status #f) 'ok)+293
(assert-true (string? (response-ref macro-resp ':expansion #f)))+294
(assert-false (string-contains? (response-ref macro-resp ':expansion "")+295
"nrepl-getcell-match"))) 296
(socket-close sock)))))) 297
298
(run-tests)