|
89 | 89 | (backward-word 1))
|
90 | 90 | (current-column))))
|
91 | 91 |
|
92 |
| -(defun rust-align-to-method-chain () |
93 |
| - (save-excursion |
94 |
| - (previous-line) |
95 |
| - (end-of-line) |
96 |
| - (backward-word 1) |
97 |
| - (backward-char) |
98 |
| - (when (looking-at "\\..+\(.*\)\n") |
99 |
| - (- (current-column) rust-indent-offset)))) |
100 |
| - |
101 | 92 | (defun rust-rewind-to-beginning-of-current-level-expr ()
|
102 | 93 | (let ((current-level (rust-paren-level)))
|
103 | 94 | (back-to-indentation)
|
104 | 95 | (while (> (rust-paren-level) current-level)
|
105 | 96 | (backward-up-list)
|
106 | 97 | (back-to-indentation))))
|
107 | 98 |
|
| 99 | +(defun rust-align-to-method-chain () |
| 100 | + (save-excursion |
| 101 | + ;; for method-chain alignment to apply, we must be looking at |
| 102 | + ;; another method call or field access or something like |
| 103 | + ;; that. This avoids rather "eager" jumps in situations like: |
| 104 | + ;; |
| 105 | + ;; { |
| 106 | + ;; something.foo() |
| 107 | + ;; <indent> |
| 108 | + ;; |
| 109 | + ;; Without this check, we would wind up with the cursor under the |
| 110 | + ;; `.`. In an older version, I had the inverse of the current |
| 111 | + ;; check, where we checked for situations that should NOT indent, |
| 112 | + ;; vs checking for the one situation where we SHOULD. It should be |
| 113 | + ;; clear that this is more robust, but also I find it mildly less |
| 114 | + ;; annoying to have to press tab again to align to a method chain |
| 115 | + ;; than to have an over-eager indent in all other cases which must |
| 116 | + ;; be undone via tab. |
| 117 | + |
| 118 | + (when (looking-at (concat "\s*\." rust-re-ident)) |
| 119 | + (previous-line) |
| 120 | + (end-of-line) |
| 121 | + |
| 122 | + (let |
| 123 | + ;; skip-dot-identifier is used to position the point at the |
| 124 | + ;; `.` when looking at something like |
| 125 | + ;; |
| 126 | + ;; foo.bar |
| 127 | + ;; ^ ^ |
| 128 | + ;; | | |
| 129 | + ;; | position of point |
| 130 | + ;; returned offset |
| 131 | + ;; |
| 132 | + ((skip-dot-identifier |
| 133 | + (lambda () |
| 134 | + (when (looking-back (concat "\." rust-re-ident)) |
| 135 | + (backward-word 1) |
| 136 | + (backward-char) |
| 137 | + (- (current-column) rust-indent-offset))))) |
| 138 | + (cond |
| 139 | + ;; foo.bar(...) |
| 140 | + ((looking-back ")") |
| 141 | + (backward-list 1) |
| 142 | + (funcall skip-dot-identifier)) |
| 143 | + |
| 144 | + ;; foo.bar |
| 145 | + (t (funcall skip-dot-identifier))))))) |
| 146 | + |
108 | 147 | (defun rust-mode-indent-line ()
|
109 | 148 | (interactive)
|
110 | 149 | (let ((indent
|
|
123 | 162 | (or
|
124 | 163 | (when rust-indent-method-chain
|
125 | 164 | (rust-align-to-method-chain))
|
126 |
| - (save-excursion |
127 |
| - (backward-up-list) |
128 |
| - (rust-rewind-to-beginning-of-current-level-expr) |
129 |
| - (+ (current-column) rust-indent-offset)))))) |
| 165 | + (save-excursion |
| 166 | + (backward-up-list) |
| 167 | + (rust-rewind-to-beginning-of-current-level-expr) |
| 168 | + (+ (current-column) rust-indent-offset)))))) |
130 | 169 | (cond
|
131 | 170 | ;; A function return type is indented to the corresponding function arguments
|
132 | 171 | ((looking-at "->")
|
|
137 | 176 |
|
138 | 177 | ;; A closing brace is 1 level unindended
|
139 | 178 | ((looking-at "}") (- baseline rust-indent-offset))
|
140 |
| - |
141 |
| - ;;Line up method chains by their .'s |
142 |
| - ((when (and rust-indent-method-chain |
143 |
| - (looking-at "\..+\(.*\);?\n")) |
144 |
| - (or |
145 |
| - (let ((method-indent (rust-align-to-method-chain))) |
146 |
| - (when method-indent |
147 |
| - (+ method-indent rust-indent-offset))) |
148 |
| - (+ baseline rust-indent-offset)))) |
149 |
| - |
150 | 179 |
|
151 | 180 | ;; Doc comments in /** style with leading * indent to line up the *s
|
152 | 181 | ((and (nth 4 (syntax-ppss)) (looking-at "*"))
|
|
0 commit comments