diff --git a/crates/ide_assists/src/assist_context.rs b/crates/ide_assists/src/assist_context.rs
index 36a2bf89ae0..1474505971f 100644
--- a/crates/ide_assists/src/assist_context.rs
+++ b/crates/ide_assists/src/assist_context.rs
@@ -100,10 +100,6 @@ impl<'a> AssistContext<'a> {
pub(crate) fn covering_element(&self) -> SyntaxElement {
self.source_file.syntax().covering_element(self.frange.range)
}
- // FIXME: remove
- pub(crate) fn covering_node_for_range(&self, range: TextRange) -> SyntaxElement {
- self.source_file.syntax().covering_element(range)
- }
}
pub(crate) struct Assists {
diff --git a/crates/ide_assists/src/handlers/inline_local_variable.rs b/crates/ide_assists/src/handlers/inline_local_variable.rs
index f78099adf6e..dec8c320fdc 100644
--- a/crates/ide_assists/src/handlers/inline_local_variable.rs
+++ b/crates/ide_assists/src/handlers/inline_local_variable.rs
@@ -1,10 +1,12 @@
use either::Either;
use hir::PathResolution;
-use ide_db::{base_db::FileId, defs::Definition, search::FileReference};
-use rustc_hash::FxHashMap;
+use ide_db::{
+ defs::Definition,
+ search::{FileReference, UsageSearchResult},
+};
use syntax::{
ast::{self, AstNode, AstToken, NameOwner},
- TextRange,
+ SyntaxElement, TextRange,
};
use crate::{
@@ -14,7 +16,7 @@ use crate::{
// Assist: inline_local_variable
//
-// Inlines local variable.
+// Inlines a local variable.
//
// ```
// fn main() {
@@ -29,76 +31,77 @@ use crate::{
// }
// ```
pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
- let InlineData { let_stmt, delete_let, replace_usages, target } =
+ let InlineData { let_stmt, delete_let, references, target } =
inline_let(ctx).or_else(|| inline_usage(ctx))?;
let initializer_expr = let_stmt.initializer()?;
- let delete_range = if delete_let {
+ let delete_range = delete_let.then(|| {
if let Some(whitespace) = let_stmt
.syntax()
.next_sibling_or_token()
- .and_then(|it| ast::Whitespace::cast(it.as_token()?.clone()))
+ .and_then(SyntaxElement::into_token)
+ .and_then(ast::Whitespace::cast)
{
- Some(TextRange::new(
+ TextRange::new(
let_stmt.syntax().text_range().start(),
whitespace.syntax().text_range().end(),
- ))
+ )
} else {
- Some(let_stmt.syntax().text_range())
+ let_stmt.syntax().text_range()
}
- } else {
- None
- };
+ });
- let wrap_in_parens = replace_usages
- .iter()
- .map(|(&file_id, refs)| {
- refs.iter()
- .map(|&FileReference { range, .. }| {
- let usage_node = ctx
- .covering_node_for_range(range)
- .ancestors()
- .find_map(ast::PathExpr::cast)?;
- let usage_parent_option =
- usage_node.syntax().parent().and_then(ast::Expr::cast);
- let usage_parent = match usage_parent_option {
- Some(u) => u,
- None => return Some(false),
- };
- let initializer = matches!(
- initializer_expr,
- ast::Expr::CallExpr(_)
- | ast::Expr::IndexExpr(_)
- | ast::Expr::MethodCallExpr(_)
- | ast::Expr::FieldExpr(_)
- | ast::Expr::TryExpr(_)
- | ast::Expr::RefExpr(_)
- | ast::Expr::Literal(_)
- | ast::Expr::TupleExpr(_)
- | ast::Expr::ArrayExpr(_)
- | ast::Expr::ParenExpr(_)
- | ast::Expr::PathExpr(_)
- | ast::Expr::BlockExpr(_)
- | ast::Expr::EffectExpr(_),
- );
- let parent = matches!(
- usage_parent,
- ast::Expr::CallExpr(_)
- | ast::Expr::TupleExpr(_)
- | ast::Expr::ArrayExpr(_)
- | ast::Expr::ParenExpr(_)
- | ast::Expr::ForExpr(_)
- | ast::Expr::WhileExpr(_)
- | ast::Expr::BreakExpr(_)
- | ast::Expr::ReturnExpr(_)
- | ast::Expr::MatchExpr(_)
- );
- Some(!(initializer || parent))
- })
- .collect::