diff options
Diffstat (limited to 'crates/ra_ide_api_light')
-rw-r--r-- | crates/ra_ide_api_light/src/formatting.rs | 10 | ||||
-rw-r--r-- | crates/ra_ide_api_light/src/typing.rs | 32 |
2 files changed, 41 insertions, 1 deletions
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::{ | |||
2 | AstNode, | 2 | AstNode, |
3 | SyntaxNode, SyntaxKind::*, | 3 | SyntaxNode, SyntaxKind::*, |
4 | ast::{self, AstToken}, | 4 | ast::{self, AstToken}, |
5 | algo::generate, | ||
5 | }; | 6 | }; |
6 | 7 | ||
7 | /// If the node is on the begining of the line, calculate indent. | 8 | /// If the node is on the begining of the line, calculate indent. |
8 | pub(crate) fn leading_indent(node: &SyntaxNode) -> Option<&str> { | 9 | pub(crate) fn leading_indent(node: &SyntaxNode) -> Option<&str> { |
9 | let prev = node.prev_sibling()?; | 10 | let prev = prev_leaf(node)?; |
10 | let ws_text = ast::Whitespace::cast(prev)?.text(); | 11 | let ws_text = ast::Whitespace::cast(prev)?.text(); |
11 | ws_text.rfind('\n').map(|pos| &ws_text[pos + 1..]) | 12 | ws_text.rfind('\n').map(|pos| &ws_text[pos + 1..]) |
12 | } | 13 | } |
13 | 14 | ||
15 | fn prev_leaf(node: &SyntaxNode) -> Option<&SyntaxNode> { | ||
16 | generate(node.ancestors().find_map(SyntaxNode::prev_sibling), |it| { | ||
17 | it.last_child() | ||
18 | }) | ||
19 | .last() | ||
20 | } | ||
21 | |||
14 | pub(crate) fn extract_trivial_expression(block: &ast::Block) -> Option<&ast::Expr> { | 22 | pub(crate) fn extract_trivial_expression(block: &ast::Block) -> Option<&ast::Expr> { |
15 | let expr = block.expr()?; | 23 | let expr = block.expr()?; |
16 | if expr.syntax().text().contains('\n') { | 24 | 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 | |||
@@ -228,6 +228,38 @@ fn foo() { | |||
228 | } | 228 | } |
229 | 229 | ||
230 | #[test] | 230 | #[test] |
231 | fn indents_new_chain_call_with_semi() { | ||
232 | type_dot( | ||
233 | r" | ||
234 | pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> { | ||
235 | self.child_impl(db, name) | ||
236 | <|>; | ||
237 | } | ||
238 | ", | ||
239 | r" | ||
240 | pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> { | ||
241 | self.child_impl(db, name) | ||
242 | .; | ||
243 | } | ||
244 | ", | ||
245 | ); | ||
246 | type_dot( | ||
247 | r" | ||
248 | pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> { | ||
249 | self.child_impl(db, name) | ||
250 | <|>; | ||
251 | } | ||
252 | ", | ||
253 | r" | ||
254 | pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> { | ||
255 | self.child_impl(db, name) | ||
256 | .; | ||
257 | } | ||
258 | ", | ||
259 | ) | ||
260 | } | ||
261 | |||
262 | #[test] | ||
231 | fn indents_continued_chain_call() { | 263 | fn indents_continued_chain_call() { |
232 | type_dot( | 264 | type_dot( |
233 | r" | 265 | r" |