https://github.com/svaante/dape#

Given that eglot has been part of the core emacs, I believe this is a long lasting wish for a lot of emacsers that has finally been fulfilled. (a stand alone DAP implementation that does not rely on LSP-mode)

  • jakejxdev@alien.topB
    link
    fedilink
    English
    arrow-up
    1
    ·
    11 months ago

    Tried using dape recently with Go and managed to get it to debug Go tests. Sharing the snippet incase its helpful for others (requires go treesitter).

      (setq treesit-go-tests-query (treesit-query-compile 'go
                                                          '((function_declaration
                                                             name: (identifier) @testname
                                                             parameters: (parameter_list :anchor (parameter_declaration type: (pointer_type) @type :anchor))
                                                             (:match "*testing.\\(T\\|M\\)" @type) (:match "^Test.+$" @testname)) @parent)))
      (defun jake/query-go-test-nodes ()
        (when (treesit-ready-p 'go)
          (treesit-query-capture (treesit-buffer-root-node) treesit-go-tests-query)))
    
      (defun jake/completing-read-go-tests ()
        (let* ((test-matches (jake/query-go-test-nodes))
               (test-name-matches (cl-remove-if-not (lambda (match) (eq (car match) 'testname)) test-matches))
               (test-names (mapcar (lambda (match) (treesit-node-text (cdr match))) test-name-matches)))
          (completing-read "Test:" test-names nil t)))
    
    
      (defun jake/dape--select-go-test-args ()
        (when-let* ((test-name (jake/completing-read-go-tests))
                    (test-regexp (concat "^" test-name "$")))
          (if test-name
              `["-test.run" ,test-regexp]
            (error "No test selected"))))
    
      (defun jake/file-relative-dir ()
        "Return the file directory relative to dape's cwd. This is used by Delve debugger."
        (concat "./" (file-relative-name default-directory (funcall dape-cwd-fn))))
    
    ;; inside your dape-config
    (add-to-list 'dape-configs
                   `(test
                     modes (go-mode go-ts-mode)
                     command "dlv"
                     command-cwd dape-cwd-fn
                     command-args ("dap" "--listen" "127.0.0.1:55878")
                     host "127.0.0.1"
                     port 55878
                     :type "go"
                     :name "debug test"
                     :request "launch"
                     :mode "test"
                     :cwd dape-cwd-fn
                     :program jake/file-relative-dir
                     :args jake/dape--select-go-test-args))
    
    • noooit@alien.topB
      link
      fedilink
      English
      arrow-up
      1
      ·
      11 months ago

      Compared to gud, it’s a lot of config, it’s also nasty that it looks like you have to code the program path to your config.

      but, it’s a great effort in any case, both from you and the plugin author. Configuration snippets like this help a lot of people.

    • Grouchy_Ad_162@alien.topB
      link
      fedilink
      English
      arrow-up
      1
      ·
      11 months ago

      (defun go-func-name-at-point ()

      (interactive)

      (save-excursion

      (end-of-line)

      (beginning-of-defun)

      (when (re-search-forward “^func[[:space:]]+\\([[:alnum:]_]+\\)” nil t)

      (match-string 1))))

      (setq treesit-go-tests-query

      (treesit-query-compile

      'go

      '((function_declaration

      name: (identifier) u/testname

      parameters: (parameter_list :anchor (parameter_declaration type: (pointer_type) u/type :anchor))

      (:match “*testing.\\(T\\|M\\)” u/type) (:match “^Test.+$” u/testname)) u/parent)))

      (defun vmacs-query-go-test-nodes ()

      (when (treesit-ready-p 'go)

      (treesit-query-capture (treesit-buffer-root-node) treesit-go-tests-query)))

      (defvar vmacs-go-tests-hist nil)

      (defun vmacs-completing-read-go-tests ()

      (let* ((test-matches (vmacs-query-go-test-nodes))

      (test-name-matches (cl-remove-if-not (lambda (match) (eq (car match) 'testname)) test-matches))

      (test-names (mapcar (lambda (match) (treesit-node-text (cdr match))) test-name-matches)))

      (completing-read “Test:” test-names nil t nil vmacs-go-tests-hist (go-func-name-at-point))))

      (defun vmacs-dape–select-go-args ()

      (if (string-suffix-p “_test.go” (buffer-name))

      (when-let* ((test-name (vmacs-completing-read-go-tests))

      (test-regexp (concat “^” test-name “$”)))

      (if test-name

      `[“-test.run” ,test-regexp]

      (error “No test selected”)))

      (if current-prefix-arg

      (vconcat (split-string (read-shell-command "args: " nil

      (if (equal (car compile-history) “”)

      '(compile-history . 1)

      'compile-history))))

      [])))

      ;; https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_dap.md

      (defun vmacs-dape-test-p ()

      (if (string-suffix-p “_test.go” (buffer-name))

      “test” “debug”))

      (defun vmacs-dape-relative-dir ()

      “Return the file directory relative to dape’s cwd. This is used by Delve debugger.”

      (if (string-suffix-p “_test.go” (buffer-name))

      (concat “./” (file-relative-name

      default-directory (funcall dape-cwd-fn)))

      (funcall dape-cwd-fn)))

      ;; inside your dape-config

      (add-to-list 'dape-configs

      `(delve

      modes (go-mode go-ts-mode)

      command “dlv”

      command-cwd dape-cwd-fn

      command-args (“dap” “–listen” “127.0.0.1:55878”)

      host “127.0.0.1

      port 55878

      :type “go”

      :name “go-debug”

      :request “launch”

      :mode vmacs-dape-test-p

      :cwd dape-cwd-fn

      :program vmacs-dape-relative-dir

      :args vmacs-dape–select-go-args))