about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSebastian Ziebell <sebastian.ziebell@ferrous-systems.com>2023-05-26 13:43:12 +0200
committerSebastian Ziebell <sebastian.ziebell@ferrous-systems.com>2023-05-26 13:43:12 +0200
commite78df83e2fb89b475187f7d4b631a68619b590b5 (patch)
treea90e8d997ecd89e3c312cbadc31988518c80abfa
parentce1c85317f80b96b5fdc65fa2e76d4150f26abfa (diff)
downloadrust-e78df83e2fb89b475187f7d4b631a68619b590b5.tar.gz
rust-e78df83e2fb89b475187f7d4b631a68619b590b5.zip
Integrate feedback
* pass in existing `Semantics` object to function
* pass in `Definition` for param type
* refactor iterator to use `flatten`
-rw-r--r--crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs21
1 files changed, 8 insertions, 13 deletions
diff --git a/crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs b/crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs
index 4e7011b5ca3..f32ceb42654 100644
--- a/crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs
+++ b/crates/ide-assists/src/handlers/replace_named_generic_with_impl.rs
@@ -1,4 +1,4 @@
-use hir::{Semantics, TypeParam};
+use hir::Semantics;
 use ide_db::{
     base_db::{FileId, FileRange},
     defs::Definition,
@@ -60,7 +60,9 @@ pub(crate) fn replace_named_generic_with_impl(
     }
 
     let type_param_hir_def = ctx.sema.to_def(&type_param)?;
-    if is_referenced_outside(ctx.db(), type_param_hir_def, &fn_, ctx.file_id()) {
+    let type_param_def = Definition::GenericParam(hir::GenericParam::TypeParam(type_param_hir_def));
+
+    if is_referenced_outside(&ctx.sema, type_param_def, &fn_, ctx.file_id()) {
         return None;
     }
 
@@ -100,27 +102,20 @@ pub(crate) fn replace_named_generic_with_impl(
 }
 
 fn is_referenced_outside(
-    db: &RootDatabase,
-    type_param: TypeParam,
+    sema: &Semantics<'_, RootDatabase>,
+    type_param_def: Definition,
     fn_: &ast::Fn,
     file_id: FileId,
 ) -> bool {
-    let semantics = Semantics::new(db);
-    let type_param_def = Definition::GenericParam(hir::GenericParam::TypeParam(type_param));
-
     // limit search scope to function body & return type
     let search_ranges = vec![
         fn_.body().map(|body| body.syntax().text_range()),
         fn_.ret_type().map(|ret_type| ret_type.syntax().text_range()),
     ];
 
-    search_ranges.into_iter().filter_map(|search_range| search_range).any(|search_range| {
+    search_ranges.into_iter().flatten().any(|search_range| {
         let file_range = FileRange { file_id, range: search_range };
-        !type_param_def
-            .usages(&semantics)
-            .in_scope(SearchScope::file_range(file_range))
-            .all()
-            .is_empty()
+        !type_param_def.usages(sema).in_scope(SearchScope::file_range(file_range)).all().is_empty()
     })
 }