summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrBliss <dewinant@gmail.com>2016-10-22 12:39:17 +0200
committermrBliss <dewinant@gmail.com>2016-10-22 12:42:03 +0200
commitfba77143c009b7b11839c77259f3b1f7a9c88bb8 (patch)
tree7034ebfe8cd8ab84275bc33288b8bb93c9325d71
parent1587839ba493b5ab98fb8415338172a9a22f224b (diff)
downloadrust-mode-fba77143c009b7b11839c77259f3b1f7a9c88bb8.tar.gz
Handle comments when indenting method chains
Previously, indentation went wrong when the comment on the line above looked like a method call/member access: fn main() { // Lorem ipsum lorem ipsum lorem ipsum lorem.ipsum foo.bar() } With this patch: fn main() { // Lorem ipsum lorem ipsum lorem ipsum lorem.ipsum foo.bar() } Also, a blank line or a comment broke method-chain indentation: fn main() { something.a.do_it // A comment .aligned .more_alignment(); } With this patch: fn main() { something.a.do_it // A comment .aligned .more_alignment(); } Note that comments interleaving a method chain are not aligned with the '.' of the method chain.
-rw-r--r--rust-mode-tests.el24
-rw-r--r--rust-mode.el11
2 files changed, 35 insertions, 0 deletions
diff --git a/rust-mode-tests.el b/rust-mode-tests.el
index 35a1cbd..2585237 100644
--- a/rust-mode-tests.el
+++ b/rust-mode-tests.el
@@ -1599,6 +1599,19 @@ fn main() {
"
)))
+(ert-deftest indent-method-chains-look-over-comment ()
+ (let ((rust-indent-method-chain t)) (test-indent
+ "
+fn main() {
+ thing.a.do_it
+ // A comment
+ .aligned
+ // Another comment
+ .more_alignment();
+}
+"
+ )))
+
(ert-deftest indent-method-chains-comment ()
(let ((rust-indent-method-chain t)) (test-indent
"
@@ -1627,6 +1640,17 @@ fn main() { // comment here should not push next line out
"
)))
+(ert-deftest indent-method-chains-after-comment2 ()
+ (let ((rust-indent-method-chain t)) (test-indent
+ "
+fn main() {
+ // Lorem ipsum lorem ipsum lorem ipsum lorem.ipsum
+ foo.bar()
+}
+"
+ )))
+
+
(ert-deftest test-for-issue-36-syntax-corrupted-state ()
"This is a test for a issue #36, which involved emacs's
internal state getting corrupted when actions were done in a
diff --git a/rust-mode.el b/rust-mode.el
index 2c97433..3f6e279 100644
--- a/rust-mode.el
+++ b/rust-mode.el
@@ -301,6 +301,17 @@ buffer."
(when (looking-at (concat "\s*\." rust-re-ident))
(forward-line -1)
(end-of-line)
+ ;; Keep going up (looking for a line that could contain a method chain)
+ ;; while we're in a comment or on a blank line. Stop when the paren
+ ;; level changes.
+ (let ((level (rust-paren-level)))
+ (while (and (or (rust-in-str-or-cmnt)
+ ;; Only whitespace (or nothing) from the beginning to
+ ;; the end of the line.
+ (looking-back "^\s*" (point-at-bol)))
+ (= (rust-paren-level) level))
+ (forward-line -1)
+ (end-of-line)))
(let
;; skip-dot-identifier is used to position the point at the