[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/dape 61ff3b61a8 2/5: Added batteries for Java debugging
From: |
ELPA Syncer |
Subject: |
[elpa] externals/dape 61ff3b61a8 2/5: Added batteries for Java debugging with JDTLS + plugin. (#34) |
Date: |
Sat, 30 Dec 2023 18:57:37 -0500 (EST) |
branch: externals/dape
commit 61ff3b61a86ae04a1dd5c74ecc04f4caaa419d7f
Author: Magiel Bruntink <magiel.bruntink@icloud.com>
Commit: GitHub <noreply@github.com>
Added batteries for Java debugging with JDTLS + plugin. (#34)
* Added batteries for Java debugging with JDTLS + plugin.
* Fix typo and remove some blank lines.
* Fix indentation.
* Added ensure function for jdtls config.
---
README.org | 13 +++++++++++++
dape.el | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 69 insertions(+), 1 deletion(-)
diff --git a/README.org b/README.org
index 45de516275..ef2a44a7bd 100644
--- a/README.org
+++ b/README.org
@@ -129,6 +129,19 @@ Install with ~gem install debug~.
See https://github.com/ruby/debug for more information
+** Java - JDTLS with Java Debug Server plugin
+See https://github.com/eclipse-jdtls/eclipse.jdt.ls for installation of JDTLS.
+See https://github.com/microsoft/java-debug for installation of the Java Debug
Server plugin.
+The Java config depends on Eglot running JDTLS with the plugin prior to
starting Dape.
+Extend ~eglot-server-programs~ as follows to have JDTLS load the plugin:
+#+begin_src emacs-lisp
+ (add-to-list 'eglot-server-programs
+ `((java-mode java-ts-mode) .
+ ("jdtls"
+ :initializationOptions
+ (:bundles
["/PATH/TO/java-debug/com.microsoft.java.debug.plugin/target/com.microsoft.java.debug.plugin-VERSION.jar"]))))
+#+end_src
+
** Other untested adapters
If you find a working configuration for any other debug adapter please submit
a PR.
diff --git a/dape.el b/dape.el
index 6aedbc14fc..aa5435d0d5 100644
--- a/dape.el
+++ b/dape.el
@@ -226,7 +226,62 @@
;; rails server
;; bundle exec ruby foo.rb
;; bundle exec rake test
- -c (lambda () (read-string "Invoke command: "))))
+ -c (lambda () (read-string "Invoke command: ")))
+ (jdtls
+ modes (java-mode java-ts-mode)
+ ensure (lambda (config)
+ (require 'eglot)
+ (let* ((target (plist-get config 'target))
+ (target-file (cond ((functionp target) (funcall target))
+ ((stringp target) target))))
+ (unless target-file
+ (error "No debug target specified"))
+ (with-current-buffer (find-file target-file)
+ (unless (eglot-current-server)
+ (eglot-ensure)
+ (error "No running eglot server, starting one. Try again
when eglot server is running"))
+ (unless (seq-contains-p (eglot--server-capable
:executeCommandProvider :commands)
+ "vscode.java.resolveClasspath")
+ (error "jdtls instance does not bundle java-debug-server,
please install")))))
+ fn (lambda (config)
+ (pcase-let* ((target (plist-get config 'target))
+ (default-directory (project-root (project-current)))
+ (server (with-current-buffer (find-file target)
+ (eglot-current-server)))
+ (`(,project-name ,main-class)
+ (split-string (plist-get config 'entrypoint) ":"))
+ (`[,module-paths ,class-paths]
+ (eglot-execute-command server
"vscode.java.resolveClasspath"
+ (vector main-class
project-name))))
+ (thread-first config
+ (plist-put :mainClass main-class)
+ (plist-put :projectName project-name)
+ (plist-put :modulePaths module-paths)
+ (plist-put :classPaths class-paths))))
+ port (lambda () (eglot-execute-command (eglot-current-server)
+ "vscode.java.startDebugSession"
nil))
+ entrypoint (lambda ()
+ (completing-read
+ "Main class: "
+ (cl-map 'list
+ (lambda (candidate)
+ (concat (plist-get candidate :projectName) ":"
+ (plist-get candidate :mainClass)))
+ (eglot-execute-command (eglot-current-server)
+ "vscode.java.resolveMainClass"
+ (project-name
(project-current))))
+ nil t))
+ target (lambda () (when (buffer-file-name)
+ (file-relative-name (buffer-file-name)
+ (project-root (project-current)))))
+ :args ""
+ :stopOnEntry nil
+ :type "java"
+ :request "launch"
+ :vmArgs " -XX:+ShowCodeDetailsInExceptionMessages"
+ :console "integratedConsole"
+ :internalConsoleOptions "neverOpen"))
+
"This variable holds the Dape configurations as an alist.
In this alist, the car element serves as a symbol identifying each
configuration. Each configuration, in turn, is a property list (plist)