File: rust-utils.el

package info (click to toggle)
elpa-rust-mode 1.0.6-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 336 kB
  • sloc: lisp: 4,953; makefile: 38; sh: 8
file content (122 lines) | stat: -rw-r--r-- 3,624 bytes parent folder | download
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
;;; rust-utils.el --- Various Rust utilities        -*- lexical-binding:t -*-
;;; Commentary:

;; This library implements various utilities for dealing with Rust
;; code.

;;; Code:

(require 'thingatpt)

(require 'rust-mode) ; for `rust-in-str' and `rust-looking-back-str'

;;; Promote module

(defun rust-promote-module-into-dir ()
  "Promote the module file visited by the current buffer into its own directory.

For example, if the current buffer is visiting the file `foo.rs',
then this function creates the directory `foo' and renames the
file to `foo/mod.rs'.  The current buffer will be updated to
visit the new file."
  (interactive)
  (let ((filename (buffer-file-name)))
    (if (not filename)
        (message "Buffer is not visiting a file.")
      (if (string-equal (file-name-nondirectory filename) "mod.rs")
          (message "Won't promote a module file already named mod.rs.")
        (let* ((basename (file-name-sans-extension
                          (file-name-nondirectory filename)))
               (mod-dir (file-name-as-directory
                         (concat (file-name-directory filename) basename)))
               (new-name (concat mod-dir "mod.rs")))
          (mkdir mod-dir t)
          (rename-file filename new-name 1)
          (set-visited-file-name new-name))))))

;;; dbg! macro

(defun rust-insert-dbg-sexp ()
  "Insert the dbg! macro around a sexp if possible, insert at current position
if not. Move cursor to the end of macro."
  (when (rust-in-str)
    (up-list -1 t t))
  (let ((safe-to-forward t))
    (save-excursion
      (condition-case nil
          (forward-sexp)
        (error (setq safe-to-forward nil)
               nil)))
    (cond
     ((not safe-to-forward)
      (rust-insert-dbg-alone))
     (t
      (insert "(")
      (forward-sexp)
      (insert ")")
      (backward-sexp)
      (insert "dbg!")
      (forward-sexp)))))

(defun rust-insert-dbg-region ()
  "Insert the dbg! macro around a region. Move cursor to the end of macro."
  (when (< (mark) (point))
    (exchange-point-and-mark))
  (let ((old-point (point)))
    (insert-parentheses)
    (goto-char old-point))
  (insert "dbg!")
  (forward-sexp))

(defun rust-insert-dbg-alone ()
  "Insert the dbg! macro alone. Move cursor in between the brackets."
  (insert "dbg!()")
  (backward-char))

;;;###autoload
(defun rust-dbg-wrap-or-unwrap ()
  "Either remove or add the dbg! macro."
  (interactive)

  (cond

   ;; region
   ((region-active-p)
    (rust-insert-dbg-region))

   ;; alone
   ((or (looking-at-p " *$") (looking-at-p " *//.*"))
    (rust-insert-dbg-alone))

   ;; symbol
   (t
    (let ((beginning-of-symbol (ignore-errors (beginning-of-thing 'symbol))))
      (when beginning-of-symbol
        (goto-char beginning-of-symbol)))

    (let ((dbg-point (save-excursion
                       (or (and (looking-at-p "dbg!") (+ 4 (point)))
                           (ignore-errors
                             (while (not (rust-looking-back-str "dbg!"))
                               (backward-up-list))
                             (point))))))
      (cond (dbg-point
             (goto-char dbg-point)
             (delete-char -4)
             (delete-pair))
            (t (rust-insert-dbg-sexp)))))
   )
  )

(defun rust-toggle-mutability ()
  "Toggles the mutability of the variable defined on the current line"
  (interactive)
  (save-excursion
    (back-to-indentation)
    (forward-word)
    (if (string= " mut" (buffer-substring (point) (+ (point) 4)))
        (delete-region (point) (+ (point) 4))
      (insert " mut"))))
;;; _
(provide 'rust-utils)
;;; rust-utils.el ends here