aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api_light/src/formatting.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_api_light/src/formatting.rs')
-rw-r--r--crates/ra_ide_api_light/src/formatting.rs10
1 files changed, 9 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.
8pub(crate) fn leading_indent(node: &SyntaxNode) -> Option<&str> { 9pub(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
15fn 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
14pub(crate) fn extract_trivial_expression(block: &ast::Block) -> Option<&ast::Expr> { 22pub(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') {