-
-
Notifications
You must be signed in to change notification settings - Fork 645
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Also match friendly sessions based on the buffer's ns form #3424
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1746,6 +1746,87 @@ constructs." | |
(mapconcat #'identity (cider-repl--available-shortcuts) ", ")))) | ||
(error "No command selected"))))) | ||
|
||
|
||
(defun cider--sesman-friendly-session-p (session &optional debug) | ||
"Check if SESSION is a friendly session, DEBUG optionally. | ||
|
||
The checking is done as follows: | ||
|
||
* Consider the buffer's filename, strip any Docker/TRAMP details from it | ||
* Check if that filename belongs to the classpath, | ||
or to the classpath roots (e.g. the project root dir) | ||
* As a fallback, check if the buffer's ns form | ||
matches any of the loaded namespaces." | ||
(setcdr session (seq-filter #'buffer-live-p (cdr session))) | ||
(when-let* ((repl (cadr session)) | ||
(proc (get-buffer-process repl)) | ||
(file (file-truename (or (buffer-file-name) default-directory)))) | ||
;; With avfs paths look like /path/to/.avfs/path/to/some.jar#uzip/path/to/file.clj | ||
(when (string-match-p "#uzip" file) | ||
(let ((avfs-path (directory-file-name (expand-file-name (or (getenv "AVFSBASE") "~/.avfs/"))))) | ||
(setq file (replace-regexp-in-string avfs-path "" file t t)))) | ||
(when-let ((tp (cider-tramp-prefix (current-buffer)))) | ||
(setq file (string-remove-prefix tp file))) | ||
(when (process-live-p proc) | ||
(let* ((classpath (or (process-get proc :cached-classpath) | ||
(let ((cp (with-current-buffer repl | ||
(cider-classpath-entries)))) | ||
(process-put proc :cached-classpath cp) | ||
cp))) | ||
(ns-list (or (process-get proc :all-namespaces) | ||
(let ((ns-list (with-current-buffer repl | ||
(cider-sync-request:ns-list)))) | ||
(process-put proc :all-namespaces ns-list) | ||
ns-list))) | ||
Comment on lines
+1776
to
+1780
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This section is new. |
||
(classpath-roots (or (process-get proc :cached-classpath-roots) | ||
(let ((cp (thread-last | ||
classpath | ||
(seq-filter (lambda (path) (not (string-match-p "\\.jar$" path)))) | ||
(mapcar #'file-name-directory) | ||
(seq-remove #'null) | ||
(seq-uniq)))) | ||
(process-put proc :cached-classpath-roots cp) | ||
cp)))) | ||
(or (seq-find (lambda (path) (string-prefix-p path file)) | ||
classpath) | ||
(seq-find (lambda (path) (string-prefix-p path file)) | ||
classpath-roots) | ||
(when-let* ((cider-path-translations (cider--all-path-translations)) | ||
(translated (cider--translate-path file 'to-nrepl :return-all))) | ||
(seq-find (lambda (translated-path) | ||
(or (seq-find (lambda (path) | ||
(string-prefix-p path translated-path)) | ||
classpath) | ||
(seq-find (lambda (path) | ||
(string-prefix-p path translated-path)) | ||
classpath-roots))) | ||
translated)) | ||
(when-let ((ns (condition-case nil | ||
(substring-no-properties (cider-current-ns :no-default)) | ||
(error nil)))) | ||
;; if the ns form matches with a ns of all runtime namespaces, we can consider the buffer to match | ||
;; (this is a bit lax, but also quite useful) | ||
(with-current-buffer repl | ||
(or (when cider-repl-ns-cache ;; may be nil on repl startup | ||
(member ns (nrepl-dict-keys cider-repl-ns-cache))) | ||
(member ns ns-list)))) | ||
Comment on lines
+1804
to
+1812
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This section is new. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looks good to me. At some point it'd be nice to comment all the cases for a friendly session as the function is now huge and it's kind of hard to follow. |
||
(when debug | ||
(list file "was not determined to belong to classpath:" classpath "or classpath-roots:" classpath-roots))))))) | ||
|
||
(defun cider-debug-sesman-friendly-session-p () | ||
"`message's debugging information relative to friendly sessions. | ||
|
||
This is useful for when one sees 'No linked CIDER sessions' | ||
in an unexpected place." | ||
(interactive) | ||
(message (prin1-to-string (mapcar (lambda (session) | ||
(cider--sesman-friendly-session-p session t)) | ||
(sesman--all-system-sessions 'CIDER))))) | ||
|
||
(cl-defmethod sesman-friendly-session-p ((_system (eql CIDER)) session) | ||
"Check if SESSION is a friendly session." | ||
(cider--sesman-friendly-session-p session)) | ||
|
||
|
||
;;;;; CIDER REPL mode | ||
(defvar cider-repl-mode-hook nil | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because the new impl uses misc variables/defuns like cider-repl-ns-cache, cider-sync-request:ns-list, I had to move it, keeping the linter happy.
tbh it makes sense to me that if this code now uses more repl-based capabilities, it's defined in cider-repl.el.
An alternative possibly being
declare-function
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not a big fan of
declare-function
, so let's keep it moved.