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)