branch: externals/dape commit 106d9d22d19dd183df74ca79a60c0aba0a919c00 Author: Daniel Pettersson <dan...@dpettersson.net> Commit: Daniel Pettersson <dan...@dpettersson.net>
Add disabling/enabling of source breakpoints By with additional breakpoint struct field source breakpoints possible to be disabled/enabled. --- dape.el | 192 +++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 93 insertions(+), 99 deletions(-) diff --git a/dape.el b/dape.el index d412dfdd3a..61c0115b1a 100644 --- a/dape.el +++ b/dape.el @@ -1401,7 +1401,7 @@ See `dape--connection-selected'." (cl-defstruct (dape--breakpoint (:constructor dape--breakpoint-make)) "Breakpoint object storing location and state." - overlay path-line type value hits verified id) + overlay path-line type value disabled hits verified id) (cl-defmethod jsonrpc-convert-to-endpoint ((conn dape-connection) message subtype) @@ -1568,34 +1568,34 @@ timeout period is configurable with `dape-request-timeout'" "Set breakpoints in SOURCE for adapter CONN. SOURCE is expected to be buffer or name of file. See `dape-request' for expected CB signature." - (cl-loop with breakpoints = (thread-last dape--breakpoints - (seq-group-by #'dape--breakpoint-source) - (assoc source) - (cdr)) + (cl-loop with breakpoints = + (alist-get source (seq-group-by #'dape--breakpoint-source + dape--breakpoints)) for breakpoint in breakpoints for line = (dape--breakpoint-line breakpoint) - collect breakpoint into response-breakpoints - collect (dape--breakpoint-line breakpoint) into lines - collect (let ((source-breakpoint `(:line ,line))) - (pcase (dape--breakpoint-type breakpoint) - ('log - (if (dape--capable-p conn :supportsLogPoints) - (plist-put source-breakpoint - :logMessage (dape--breakpoint-value breakpoint)) - (dape--warn "Adapter does not support `dape-breakpoint-log'"))) - ('expression - (if (dape--capable-p conn :supportsConditionalBreakpoints) - (plist-put source-breakpoint - :condition (dape--breakpoint-value breakpoint)) - (dape--warn "Adapter does not support `dape-breakpoint-expression'"))) - ('hits - (if (dape--capable-p conn :supportsHitConditionalBreakpoints) - (plist-put source-breakpoint - :hitCondition (dape--breakpoint-value breakpoint)) - (dape--warn "Adapter does not support `dape-breakpoint-hits'")))) - source-breakpoint) - into source-breakpoints - finally do + unless (dape--breakpoint-disabled breakpoint) + collect breakpoint into request-breakpoints and + collect line into lines and + collect + (let ((source-breakpoint `(:line ,line))) + (pcase (dape--breakpoint-type breakpoint) + ('log + (if (dape--capable-p conn :supportsLogPoints) + (plist-put source-breakpoint + :logMessage (dape--breakpoint-value breakpoint)) + (dape--warn "Adapter does not support `dape-breakpoint-log'"))) + ('expression + (if (dape--capable-p conn :supportsConditionalBreakpoints) + (plist-put source-breakpoint + :condition (dape--breakpoint-value breakpoint)) + (dape--warn "Adapter does not support `dape-breakpoint-expression'"))) + ('hits + (if (dape--capable-p conn :supportsHitConditionalBreakpoints) + (plist-put source-breakpoint + :hitCondition (dape--breakpoint-value breakpoint)) + (dape--warn "Adapter does not support `dape-breakpoint-hits'")))) + source-breakpoint) + into source-breakpoints finally do (dape--with-request-bind ((&key ((:breakpoints updates)) &allow-other-keys) error) (dape-request @@ -1616,7 +1616,7 @@ See `dape-request' for expected CB signature." (if error (dape--warn "Failed to set breakpoints in %s; %s" source error) (cl-loop for update across updates - for breakpoint in response-breakpoints do + for breakpoint in request-breakpoints do (dape--breakpoint-update conn breakpoint update)) (dape--request-continue cb error))))) @@ -2886,7 +2886,7 @@ of memory read." (defun dape--breakpoint-set-overlay (breakpoint) "Create and set overlay on BREAKPOINT." (add-hook 'kill-buffer-hook #'dape--breakpoint-buffer-kill nil t) - (with-slots (type value overlay) breakpoint + (with-slots (type value overlay disabled) breakpoint (cl-flet ((after-string (ov label face mouse-1-help mouse-1-def) (overlay-put ov 'after-string @@ -2899,23 +2899,25 @@ of memory read." 'keymap (let ((map (make-sparse-keymap))) (define-key map [mouse-1] mouse-1-def) map)))))) - (let ((ov (apply 'make-overlay (dape--overlay-region)))) + (let ((ov (apply 'make-overlay (dape--overlay-region))) + (disabled-face (when disabled 'shadow))) (overlay-put ov 'modification-hooks '(dape--breakpoint-freeze)) (overlay-put ov 'category 'dape-breakpoint) (overlay-put ov 'window t) (pcase type ('log - (after-string ov "Log" 'dape-log-face + (after-string ov "Log" (or disabled-face 'dape-log-face) "edit log message" #'dape-mouse-breakpoint-log)) ('expression - (after-string ov "Cond" 'dape-expression-face + (after-string ov "Cond" (or disabled-face 'dape-expression-face) "edit break condition" #'dape-mouse-breakpoint-log)) ('hits (after-string ov "Hits" 'dape-hits-face "edit break hit condition" #'dape-mouse-breakpoint-hits)) (_ - (dape--overlay-icon ov dape-breakpoint-margin-string - 'breakpoint 'dape-breakpoint-face 'in-margin))) + (overlay-put ov 'before-string + (dape--icon dape-breakpoint-margin-string 'breakpoint + (or disabled-face 'dape-breakpoint-face))))) (setf overlay ov))))) (dape--mouse-command dape-mouse-breakpoint-toggle @@ -2978,38 +2980,15 @@ Used as an hook on `find-file-hook'." (defvar dape--original-margin nil "Bookkeeping for buffer margin width.") -(defun dape--overlay-icon (overlay string bitmap face &optional in-margin) - "Put STRING or BITMAP on OVERLAY with FACE. -If IN-MARGING put STRING in margin, otherwise put overlay over buffer -contents." - (when-let ((buffer (overlay-buffer overlay))) - (let ((before-string - (cond - ((and (window-system) - (not (eql (frame-parameter (selected-frame) 'left-fringe) 0))) - (propertize " " 'display - `(left-fringe ,bitmap ,face))) - (in-margin - (with-current-buffer buffer - (unless dape--original-margin - (setq-local dape--original-margin left-margin-width) - (setq left-margin-width 2) - (when-let ((window (get-buffer-window))) - (set-window-buffer window buffer)))) - (propertize " " 'display `((margin left-margin) - ,(propertize string 'face face)))) - (t - (move-overlay overlay - (overlay-start overlay) - (+ (overlay-start overlay) - (min - (length string) - (with-current-buffer (overlay-buffer overlay) - (goto-char (overlay-start overlay)) - (- (line-end-position) (overlay-start overlay)))))) - (overlay-put overlay 'display "") - (propertize string 'face face))))) - (overlay-put overlay 'before-string before-string)))) +(defun dape--icon (string bitmap face) + (if (and (window-system) + (not (eql (frame-parameter (selected-frame) 'left-fringe) 0))) + (propertize " " 'display `(left-fringe ,bitmap ,face)) + (unless dape--original-margin + (setq-local dape--original-margin left-margin-width + left-margin-width 2)) + (propertize " " 'display `((margin left-margin) + ,(propertize string 'face face))))) (defun dape--breakpoint-freeze (overlay _after _begin _end &optional _len) "Make sure that OVERLAY region covers line." @@ -3113,34 +3092,35 @@ The source is either a buffer or a file path." (defun dape--breakpoint-update (conn breakpoint update) "Update BREAKPOINT with UPDATE plist from CONN." - (with-slots (id verified type value) breakpoint - ;; Update `dape--breakpoint' - (setf id (plist-put id conn (plist-get update :id)) - verified (plist-put verified conn - (eq (plist-get update :verified) t))) - ;; Move breakpoints - (let ((buffer (dape--breakpoint-buffer breakpoint)) - (line (dape--breakpoint-line breakpoint)) - (new-line (plist-get update :line))) - ;; XXX Breakpoint overlay might have been killed by another - ;; invocation of `dape--breakpoint-update'. That is why - ;; need to check `line'. - (when (and (numberp line) (numberp new-line) (not (eq line new-line))) - (dape--breakpoint-delete-overlay breakpoint) - (if buffer - (dape--with-line buffer new-line - (dape-breakpoint-remove-at-point 'skip-update) - (dape--breakpoint-set-overlay breakpoint) - (pulse-momentary-highlight-region - (line-beginning-position) (line-beginning-position 2) 'next-error)) - (setcdr (dape--breakpoint-path-line breakpoint) new-line)) - ;; Sync breakpoint state with all connections (even the event - ;; originator) - (dape--breakpoint-broadcast-update (dape--breakpoint-source breakpoint)) - (dape--message "Breakpoint in %s moved from line %s to %s" - (if buffer (buffer-name buffer) - (dape--breakpoint-path breakpoint)) - line new-line)))) + (with-slots (id verified type value disabled) breakpoint + (unless disabled + ;; Update `dape--breakpoint' + (setf id (plist-put id conn (plist-get update :id)) + verified (plist-put verified conn + (eq (plist-get update :verified) t))) + ;; Move breakpoints + (let ((buffer (dape--breakpoint-buffer breakpoint)) + (line (dape--breakpoint-line breakpoint)) + (new-line (plist-get update :line))) + ;; XXX Breakpoint overlay might have been killed by another + ;; invocation of `dape--breakpoint-update'. That is why + ;; need to check `line'. + (when (and (numberp line) (numberp new-line) (not (eq line new-line))) + (dape--breakpoint-delete-overlay breakpoint) + (if buffer + (dape--with-line buffer new-line + (dape-breakpoint-remove-at-point 'skip-update) + (dape--breakpoint-set-overlay breakpoint) + (pulse-momentary-highlight-region + (line-beginning-position) (line-beginning-position 2) 'next-error)) + (setcdr (dape--breakpoint-path-line breakpoint) new-line)) + ;; Sync breakpoint state with all connections (even the event + ;; originator) + (dape--breakpoint-broadcast-update (dape--breakpoint-source breakpoint)) + (dape--message "Breakpoint in %s moved from line %s to %s" + (if buffer (buffer-name buffer) + (dape--breakpoint-path breakpoint)) + line new-line))))) (run-hooks 'dape-update-ui-hook)) (defun dape-breakpoint-load (&optional file) @@ -3562,6 +3542,20 @@ buffers get displayed and how they are grouped." ;;; Info breakpoints buffer +(dape--command-at-line dape-info-breakpoint-disabled (dape--info-breakpoint) + "Enable/disable breakpoint at line in dape info buffer." + (let ((breakpoint dape--info-breakpoint)) + (setf (dape--breakpoint-disabled breakpoint) + (not (dape--breakpoint-disabled breakpoint))) + (when-let* ((buffer (dape--breakpoint-source breakpoint)) + (line (dape--breakpoint-line breakpoint)) + ((bufferp buffer))) + (dape--breakpoint-delete-overlay breakpoint) + (dape--with-line buffer line (dape--breakpoint-set-overlay breakpoint))) + (dape--breakpoint-broadcast-update (dape--breakpoint-source breakpoint))) + (revert-buffer) + (run-hooks 'dape-update-ui-hook)) + (dape--command-at-line dape-info-breakpoint-goto (dape--info-breakpoint) "Goto breakpoint at line in dape info buffer." (with-selected-window @@ -3595,7 +3589,7 @@ buffers get displayed and how they are grouped." without log or expression breakpoint")))))) (dape--buffer-map dape-info-breakpoints-line-map dape-info-breakpoint-goto - (define-key map "D" 'dape-info-breakpoint-delete) + (define-key map "D" 'dape-info-breakpoint-disabled) (define-key map "d" 'dape-info-breakpoint-delete) (define-key map "e" 'dape-info-breakpoint-log-edit)) @@ -3610,7 +3604,6 @@ without log or expression breakpoint")))))) (run-hooks 'dape-update-ui-hook)) (dape--buffer-map dape-info-data-breakpoints-line-map nil - (define-key map "D" 'dape-info-data-breakpoint-delete) (define-key map "d" 'dape-info-data-breakpoint-delete)) (dape--command-at-line dape-info-exceptions-toggle (dape--info-exception) @@ -3651,9 +3644,10 @@ without log or expression breakpoint")))))) (gdb-table-add-row table (list - (if-let ((hits (dape--breakpoint-hits breakpoint))) - (format "%s" hits) - (if verified-p y n)) + (cond ((dape--breakpoint-disabled breakpoint) n) + ((when-let ((hits (dape--breakpoint-hits breakpoint))) + (format "%s" hits))) + (y)) (pcase (dape--breakpoint-type breakpoint) ('log "Log ") ('hits "Hits ")