Adds "replace with guarded return" assist

This commit is contained in:
Mikhail Modin 2019-10-20 19:00:09 +01:00
parent 6b9bd7bdd2
commit fb215dc192
4 changed files with 314 additions and 0 deletions

View file

@ -284,6 +284,34 @@ impl IndentLevel {
.collect();
algo::replace_descendants(&node, &replacements)
}
pub fn decrease_indent<N: AstNode>(self, node: N) -> N {
N::cast(self._decrease_indent(node.syntax().clone())).unwrap()
}
fn _decrease_indent(self, node: SyntaxNode) -> SyntaxNode {
let replacements: FxHashMap<SyntaxElement, SyntaxElement> = node
.descendants_with_tokens()
.filter_map(|el| el.into_token())
.filter_map(ast::Whitespace::cast)
.filter(|ws| {
let text = ws.syntax().text();
text.contains('\n')
})
.map(|ws| {
(
ws.syntax().clone().into(),
make::tokens::whitespace(
&ws.syntax()
.text()
.replace(&format!("\n{:1$}", "", self.0 as usize * 4), "\n"),
)
.into(),
)
})
.collect();
algo::replace_descendants(&node, &replacements)
}
}
// FIXME: replace usages with IndentLevel above

View file

@ -128,6 +128,14 @@ pub fn where_clause(preds: impl Iterator<Item = ast::WherePred>) -> ast::WhereCl
}
}
pub fn if_expression(condition: &ast::Expr, statement: &str) -> ast::IfExpr {
return ast_from_text(&format!(
"fn f() {{ if !{} {{\n {}\n}}\n}}",
condition.syntax().text(),
statement
));
}
fn ast_from_text<N: AstNode>(text: &str) -> N {
let parse = SourceFile::parse(text);
let res = parse.tree().syntax().descendants().find_map(N::cast).unwrap();