File: racket-bug-report.el

package info (click to toggle)
racket-mode 20250711~git.8a80578-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,024 kB
  • sloc: lisp: 17,215; makefile: 106
file content (130 lines) | stat: -rw-r--r-- 5,758 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
;;; racket-bug-report.el -*- lexical-binding: t; -*-

;; Copyright (c) 2013-2023 by Greg Hendershott.
;; Portions Copyright (C) 1985-1986, 1999-2013 Free Software Foundation, Inc.

;; Author: Greg Hendershott
;; URL: https://github.com/greghendershott/racket-mode

;; SPDX-License-Identifier: GPL-3.0-or-later

(require 'cl-macs)
(require 'cus-edit)
(require 'package)
(require 'seq)
(require 'racket-back-end)
(require 'racket-cmd)
(require 'racket-custom)

;;;###autoload
(defun racket-bug-report ()
  "Fill a buffer with details for a Racket Mode bug report."
  (interactive)
  (unless (string-match-p "^racket-" (symbol-name major-mode))
    (user-error "Please run from a Racket Mode buffer in which you're having a problem"))
  (let ((original-buffer (current-buffer))
        (help-window-select t)
        (print-length nil) ;for `pp'
        (print-level nil)) ;for `pp'
    (cl-flet* ((-section (label thunk)
                 (princ (format "<h2>%s</h2>\n" label))
                 (princ "<dl>\n")
                 (funcall thunk)
                 (princ "</dl>\n"))
               (show (label value)
                 (princ (format "<dt>%s</dt>" label))
                 (princ "<dd><pre>")
                 (pp value)
                 (princ "</pre></dd>\n"))
               (show-vars (syms)
                 (with-current-buffer original-buffer
                   (dolist (sym syms)
                     (ignore-errors (show sym (symbol-value sym))))))
               (symbol-less-p (a b)
                 (string-lessp (symbol-name a) (symbol-name b))))
      (cl-macrolet ((section (title &rest body)
                             `(-section ,title (lambda () ,@body))))
        (with-help-window "*racket-mode bug report*"
          (princ "Please copy all of the following lines and paste them into your bug report\n")
          (princ "at <https://github.com/greghendershott/racket-mode/issues/>.\n\n")

          (princ "<details>\n")
          (section "Package"
                   (show "metadata"
                         (let ((v (assq 'racket-mode package-alist)))
                           (and v (cdr v))))
                   (show-vars '(package-archives
                                racket--el-source-dir
                                racket--rkt-source-dir)))
          (section "System values"
                   (show-vars '(emacs-version
                                major-mode
                                system-type
                                x-gtk-use-system-tooltips))
                   (show 'display-graphic-p (display-graphic-p)))
          (section "Buffer values"
                   (show-vars '(after-change-functions
                                before-change-functions
                                completion-at-point-functions
                                eldoc-documentation-function
                                eldoc-documentation-strategy
                                eldoc-documentation-functions
                                font-lock-defaults
                                pre-command-hook
                                post-command-hook
                                post-self-insert-hook
                                xref-backend-functions)))
          (section "Racket Mode values"
                   (show 'racket--cmd-open-p (racket--cmd-open-p))
                   (show-vars
                    (sort
                     (seq-uniq
                      (append
                       (racket--bug-report-customs)
                       '(racket-mode-hook
                         racket-hash-lang-mode-hook
                         racket-hash-lang-module-language-hook
                         racket-repl-mode-hook
                         racket-back-end-configurations)))
                     #'symbol-less-p)))
          (section "Minor modes"
                   (let* ((minor-modes (seq-uniq
                                        (append minor-mode-list
                                                (mapcar #'car minor-mode-alist))))
                          (minor-modes (sort minor-modes #'symbol-less-p))
                          (enabled (with-current-buffer original-buffer
                                     (seq-filter (lambda (sym)
                                                   (when (ignore-errors (symbol-value sym))
                                                     sym))
                                                 minor-modes)))
                          (disabled (with-current-buffer original-buffer
                                      (seq-filter (lambda (sym)
                                                    (unless (ignore-errors (symbol-value sym))
                                                      sym))
                                                  minor-modes))))
                     (show 'enabled  (mapcar #'list enabled)) ;so pp line-breaks
                     (princ "<details><summary>Disabled minor modes</summary>\n")
                     (show 'disabled (mapcar #'list disabled))
                     (princ "</details>\n")))
          (princ "</details>\n\nSteps to reproduce: "))))
    (forward-line 2)))

(defun racket--bug-report-customs ()
  (let ((syms nil))
    (cl-labels ((item (v)
                  (pcase v
                    (`(,sym custom-variable) (push sym syms))
                    (`(,sym custom-group)    (group sym))))
                (group (sym)
                  (dolist (v (custom-group-members sym nil))
                    (item v))))
      (group 'racket)
      (group 'racket-xp)
      (group 'racket-repl)
      (group 'racket-hash-lang)
      (group 'racket-other)
      syms)))

(provide 'racket-bug-report)

;;; racket-bug-report.el ends here