aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists')
-rw-r--r--crates/ra_assists/src/handlers/replace_if_let_with_match.rs6
-rw-r--r--crates/ra_assists/src/handlers/unwrap_block.rs3
-rw-r--r--crates/ra_assists/src/utils.rs38
3 files changed, 43 insertions, 4 deletions
diff --git a/crates/ra_assists/src/handlers/replace_if_let_with_match.rs b/crates/ra_assists/src/handlers/replace_if_let_with_match.rs
index 2442f049b..79097621e 100644
--- a/crates/ra_assists/src/handlers/replace_if_let_with_match.rs
+++ b/crates/ra_assists/src/handlers/replace_if_let_with_match.rs
@@ -1,4 +1,3 @@
1use ra_fmt::unwrap_trivial_block;
2use syntax::{ 1use syntax::{
3 ast::{ 2 ast::{
4 self, 3 self,
@@ -8,7 +7,10 @@ use syntax::{
8 AstNode, 7 AstNode,
9}; 8};
10 9
11use crate::{utils::TryEnum, AssistContext, AssistId, AssistKind, Assists}; 10use crate::{
11 utils::{unwrap_trivial_block, TryEnum},
12 AssistContext, AssistId, AssistKind, Assists,
13};
12 14
13// Assist: replace_if_let_with_match 15// Assist: replace_if_let_with_match
14// 16//
diff --git a/crates/ra_assists/src/handlers/unwrap_block.rs b/crates/ra_assists/src/handlers/unwrap_block.rs
index 2879090b8..3851aeb3e 100644
--- a/crates/ra_assists/src/handlers/unwrap_block.rs
+++ b/crates/ra_assists/src/handlers/unwrap_block.rs
@@ -1,4 +1,3 @@
1use ra_fmt::unwrap_trivial_block;
2use syntax::{ 1use syntax::{
3 ast::{ 2 ast::{
4 self, 3 self,
@@ -7,7 +6,7 @@ use syntax::{
7 AstNode, TextRange, T, 6 AstNode, TextRange, T,
8}; 7};
9 8
10use crate::{AssistContext, AssistId, AssistKind, Assists}; 9use crate::{utils::unwrap_trivial_block, AssistContext, AssistId, AssistKind, Assists};
11 10
12// Assist: unwrap_block 11// Assist: unwrap_block
13// 12//
diff --git a/crates/ra_assists/src/utils.rs b/crates/ra_assists/src/utils.rs
index 6d85661c4..a20453dd8 100644
--- a/crates/ra_assists/src/utils.rs
+++ b/crates/ra_assists/src/utils.rs
@@ -4,6 +4,7 @@ pub(crate) mod insert_use;
4use std::{iter, ops}; 4use std::{iter, ops};
5 5
6use hir::{Adt, Crate, Enum, ScopeDef, Semantics, Trait, Type}; 6use hir::{Adt, Crate, Enum, ScopeDef, Semantics, Trait, Type};
7use itertools::Itertools;
7use ra_ide_db::RootDatabase; 8use ra_ide_db::RootDatabase;
8use rustc_hash::FxHashSet; 9use rustc_hash::FxHashSet;
9use syntax::{ 10use syntax::{
@@ -17,6 +18,43 @@ use crate::assist_config::SnippetCap;
17 18
18pub(crate) use insert_use::{find_insert_use_container, insert_use_statement}; 19pub(crate) use insert_use::{find_insert_use_container, insert_use_statement};
19 20
21pub(crate) fn unwrap_trivial_block(block: ast::BlockExpr) -> ast::Expr {
22 extract_trivial_expression(&block)
23 .filter(|expr| !expr.syntax().text().contains_char('\n'))
24 .unwrap_or_else(|| block.into())
25}
26
27pub fn extract_trivial_expression(block: &ast::BlockExpr) -> Option<ast::Expr> {
28 let has_anything_else = |thing: &SyntaxNode| -> bool {
29 let mut non_trivial_children =
30 block.syntax().children_with_tokens().filter(|it| match it.kind() {
31 WHITESPACE | T!['{'] | T!['}'] => false,
32 _ => it.as_node() != Some(thing),
33 });
34 non_trivial_children.next().is_some()
35 };
36
37 if let Some(expr) = block.expr() {
38 if has_anything_else(expr.syntax()) {
39 return None;
40 }
41 return Some(expr);
42 }
43 // Unwrap `{ continue; }`
44 let (stmt,) = block.statements().next_tuple()?;
45 if let ast::Stmt::ExprStmt(expr_stmt) = stmt {
46 if has_anything_else(expr_stmt.syntax()) {
47 return None;
48 }
49 let expr = expr_stmt.expr()?;
50 match expr.syntax().kind() {
51 CONTINUE_EXPR | BREAK_EXPR | RETURN_EXPR => return Some(expr),
52 _ => (),
53 }
54 }
55 None
56}
57
20#[derive(Clone, Copy, Debug)] 58#[derive(Clone, Copy, Debug)]
21pub(crate) enum Cursor<'a> { 59pub(crate) enum Cursor<'a> {
22 Replace(&'a SyntaxNode), 60 Replace(&'a SyntaxNode),