diff options
Diffstat (limited to 'rust-mode.el')
| -rw-r--r-- | rust-mode.el | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/rust-mode.el b/rust-mode.el index 7a7b78c..df7e93c 100644 --- a/rust-mode.el +++ b/rust-mode.el @@ -218,6 +218,21 @@ function or trait. When nil, where will be aligned with fn or trait." (rust-in-macro)) ))) +(defun rust-looking-at-where () + "Return T when looking at the \"where\" keyword." + (and (looking-at-p "\\bwhere\\b") + (not (rust-in-str-or-cmnt)))) + +(defun rust-rewind-to-where (&optional limit) + "Rewind the point to the closest occurrence of the \"where\" keyword. +Return T iff a where-clause was found. Does not rewind past +LIMIT when passed, otherwise only stops at the beginning of the +buffer." + (when (re-search-backward "\\bwhere\\b" limit t) + (if (rust-in-str-or-cmnt) + (rust-rewind-to-where limit) + t))) + (defun rust-align-to-expr-after-brace () (save-excursion (forward-char) @@ -248,18 +263,12 @@ function or trait. When nil, where will be aligned with fn or trait." (setq function-start (point) function-level (rust-paren-level))) ;; On a where clause - (when (or (looking-at "\\bwhere\\b") + (when (or (rust-looking-at-where) ;; or in one of the following lines, e.g. ;; where A: Eq ;; B: Hash <- on this line (and (save-excursion - (and - ;; There is a where clause, - (re-search-backward "\\bwhere\\b" function-start t) - ;; but not inside a string, - (not (nth 3 (syntax-ppss))) - ;; nor inside a comment - (not (nth 4 (syntax-ppss))))) + (rust-rewind-to-where function-start)) (= current-level function-level))) (goto-char function-start))))) @@ -398,7 +407,8 @@ function or trait. When nil, where will be aligned with fn or trait." ;; When the user chose not to indent the start of the where ;; clause, put it on the baseline. - ((and (not rust-indent-where-clause) (looking-at "\\bwhere\\b")) + ((and (not rust-indent-where-clause) + (rust-looking-at-where)) baseline) ;; If we're in any other token-tree / sexp, then: @@ -431,17 +441,16 @@ function or trait. When nil, where will be aligned with fn or trait." ;; When we're not on a line starting with "where ", but ;; still on a where-clause line, go to "where " (when (and - (not (looking-at "\\bwhere\\b")) + (not (rust-looking-at-where)) ;; We're looking at something like "F: ..." - (and (looking-at (concat rust-re-ident ":")) - ;; There is a "where " somewhere after the - ;; start of the function. - (re-search-backward "\\bwhere\\b" - function-start t) - ;; Make sure we're not inside the function - ;; already (e.g. initializing a struct) by - ;; checking we are the same level. - (= function-level level))) + (looking-at (concat rust-re-ident ":")) + ;; There is a "where " somewhere after the + ;; start of the function. + (rust-rewind-to-where function-start) + ;; Make sure we're not inside the function + ;; already (e.g. initializing a struct) by + ;; checking we are the same level. + (= function-level level)) ;; skip over "where" (forward-char 5) ;; Unless "where" is at the end of the line |
