Skip to content

Commit 5b3c259

Browse files
committed
w2-idris-filename-to-load
1 parent 330837c commit 5b3c259

File tree

2 files changed

+52
-8
lines changed

2 files changed

+52
-8
lines changed

idris-commands.el

+7-8
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,13 @@
168168
(defun idris-filename-to-load ()
169169
"Compute the working directory and filename to load in Idris.
170170
Returning these as a cons."
171-
(let* ((fn (buffer-file-name))
172-
(ipkg-srcdir (idris-ipkg-find-src-dir))
173-
(srcdir (or ipkg-srcdir (file-name-directory fn))))
174-
(when (and ;; check that srcdir is prefix of filename - then load relative
175-
(> (length fn) (length srcdir))
176-
(string= (substring fn 0 (length srcdir)) srcdir))
177-
(setq fn (file-relative-name fn srcdir)))
178-
(cons srcdir fn)))
171+
(let* ((ipkg-file (car-safe (idris-find-file-upwards "ipkg")))
172+
(file-name (buffer-file-name))
173+
(work-dir (directory-file-name (file-name-parent-directory (or ipkg-file file-name))))
174+
(source-dir (or (idris-ipkg-find-src-dir) work-dir)))
175+
(if (> idris-protocol-version 1)
176+
(cons work-dir (file-relative-name file-name work-dir))
177+
(cons source-dir (file-relative-name file-name source-dir)))))
179178

180179
(defun idris-load-file (&optional set-line)
181180
"Pass the current buffer's file to the inferior Idris process.

test/idris-commands-test.el

+45
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,51 @@ myReverse xs = revAcc [] xs where
313313
(delete-directory mock-directory-name t)
314314
(idris-quit))))
315315

316+
(defun idris-file-to-load-alist (file-name)
317+
"Return FILE-NAME as an alist with keys: source-dir, work-dir and path."
318+
(let* ((ipkg-file (car-safe (idris-find-file-upwards "ipkg")))
319+
(work-dir (directory-file-name (file-name-parent-directory (or ipkg-file file-name))))
320+
(source-dir (or (idris-ipkg-find-src-dir) work-dir)))
321+
(list
322+
(cons 'work-dir work-dir)
323+
(cons 'source-dir source-dir)
324+
(cons 'path (file-relative-name file-name source-dir)))))
325+
326+
(ert-deftest idris-test-idris-file-to-load-alist ()
327+
"Test that `idris-file-to-load-alist' returns expected data structure."
328+
(cl-flet ((idris-ipkg-find-src-dir-stub () src-dir)
329+
(idris-find-file-upwards-stub (_ex) ipkg-files))
330+
(advice-add 'idris-ipkg-find-src-dir :override #'idris-ipkg-find-src-dir-stub)
331+
(advice-add 'idris-find-file-upwards :override #'idris-find-file-upwards-stub)
332+
(let* ((default-directory "/some/path/to/idris-project/src/Component")
333+
(file "Foo.idr")
334+
(file-name (file-name-concat default-directory file))
335+
ipkg-files
336+
src-dir)
337+
(unwind-protect
338+
(progn
339+
;; it contains all expected keys
340+
(let ((result (idris-file-to-load-alist file-name)))
341+
(should (equal "Foo.idr" (alist-get 'path result)))
342+
(should (equal default-directory (alist-get 'source-dir result)))
343+
(should (equal default-directory (alist-get 'work-dir result))))
344+
345+
(let* ((src-dir "/some/path/to/idris-project/src")
346+
(result (idris-file-to-load-alist file-name)))
347+
(should (equal "Component/Foo.idr" (alist-get 'path result)))
348+
(should (equal src-dir (alist-get 'source-dir result)))
349+
(should (equal default-directory (alist-get 'work-dir result))))
350+
351+
(let* ((ipkg-files '("/some/path/to/idris-project/foo.ipkg"))
352+
(src-dir "/some/path/to/idris-project/src")
353+
(result (idris-file-to-load-alist file-name)))
354+
(should (equal "Component/Foo.idr" (alist-get 'path result)))
355+
(should (equal src-dir (alist-get 'source-dir result)))
356+
(should (equal "/some/path/to/idris-project" (alist-get 'work-dir result)))))
357+
358+
(advice-remove 'idris-ipkg-find-src-dir #'idris-ipkg-find-src-dir-stub)
359+
(advice-remove 'idris-find-file-upwards #'idris-find-file-upwards-stub)))))
360+
316361
;; Tests by Yasuhiko Watanabe
317362
;; https://github.com/idris-hackers/idris-mode/pull/537/files
318363
(idris-ert-command-action "test-data/CaseSplit.idr" idris-case-split idris-test-eq-buffer)

0 commit comments

Comments
 (0)