From 884ce4a4207ca68a5299b3a2e4e33b8f1f158001 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Sun, 13 Jan 2019 18:21:23 +0300
Subject: fix indent caclulation

---
 crates/ra_ide_api_light/src/formatting.rs | 10 +++++++++-
 crates/ra_ide_api_light/src/typing.rs     | 32 +++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)

(limited to 'crates/ra_ide_api_light/src')

diff --git a/crates/ra_ide_api_light/src/formatting.rs b/crates/ra_ide_api_light/src/formatting.rs
index 4635fbd60..599e3cdcb 100644
--- a/crates/ra_ide_api_light/src/formatting.rs
+++ b/crates/ra_ide_api_light/src/formatting.rs
@@ -2,15 +2,23 @@ use ra_syntax::{
     AstNode,
     SyntaxNode, SyntaxKind::*,
     ast::{self, AstToken},
+    algo::generate,
 };
 
 /// If the node is on the begining of the line, calculate indent.
 pub(crate) fn leading_indent(node: &SyntaxNode) -> Option<&str> {
-    let prev = node.prev_sibling()?;
+    let prev = prev_leaf(node)?;
     let ws_text = ast::Whitespace::cast(prev)?.text();
     ws_text.rfind('\n').map(|pos| &ws_text[pos + 1..])
 }
 
+fn prev_leaf(node: &SyntaxNode) -> Option<&SyntaxNode> {
+    generate(node.ancestors().find_map(SyntaxNode::prev_sibling), |it| {
+        it.last_child()
+    })
+    .last()
+}
+
 pub(crate) fn extract_trivial_expression(block: &ast::Block) -> Option<&ast::Expr> {
     let expr = block.expr()?;
     if expr.syntax().text().contains('\n') {
diff --git a/crates/ra_ide_api_light/src/typing.rs b/crates/ra_ide_api_light/src/typing.rs
index c8f3dfe44..5ff2b7c1f 100644
--- a/crates/ra_ide_api_light/src/typing.rs
+++ b/crates/ra_ide_api_light/src/typing.rs
@@ -227,6 +227,38 @@ fn foo() {
         )
     }
 
+    #[test]
+    fn indents_new_chain_call_with_semi() {
+        type_dot(
+            r"
+            pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
+                self.child_impl(db, name)
+                <|>;
+            }
+            ",
+            r"
+            pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
+                self.child_impl(db, name)
+                    .;
+            }
+            ",
+        );
+        type_dot(
+            r"
+            pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
+                self.child_impl(db, name)
+                    <|>;
+            }
+            ",
+            r"
+            pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
+                self.child_impl(db, name)
+                    .;
+            }
+            ",
+        )
+    }
+
     #[test]
     fn indents_continued_chain_call() {
         type_dot(
-- 
cgit v1.2.3