Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_assists/src/handlers/expand_glob_import.rs')
-rw-r--r--crates/ide_assists/src/handlers/expand_glob_import.rs58
1 files changed, 30 insertions, 28 deletions
diff --git a/crates/ide_assists/src/handlers/expand_glob_import.rs b/crates/ide_assists/src/handlers/expand_glob_import.rs
index 3abf06d588..72c17b674c 100644
--- a/crates/ide_assists/src/handlers/expand_glob_import.rs
+++ b/crates/ide_assists/src/handlers/expand_glob_import.rs
@@ -1,5 +1,5 @@
use either::Either;
-use hir::{AssocItem, HasVisibility, MacroDef, Module, ModuleDef, Name, PathResolution, ScopeDef};
+use hir::{AssocItem, HasVisibility, Module, ModuleDef, Name, PathResolution, ScopeDef};
use ide_db::{
defs::{Definition, NameRefClass},
search::SearchScope,
@@ -112,36 +112,27 @@ fn find_parent_and_path(
}
}
-#[derive(Debug, PartialEq, Clone)]
-enum Def {
- ModuleDef(ModuleDef),
- MacroDef(MacroDef),
-}
-
-impl Def {
- fn is_referenced_in(&self, ctx: &AssistContext) -> bool {
- let def = match self {
- Def::ModuleDef(def) => Definition::ModuleDef(*def),
- Def::MacroDef(def) => Definition::Macro(*def),
- };
-
- let search_scope = SearchScope::single_file(ctx.file_id());
- def.usages(&ctx.sema).in_scope(search_scope).at_least_one()
- }
+fn def_is_referenced_in(def: Definition, ctx: &AssistContext) -> bool {
+ let search_scope = SearchScope::single_file(ctx.file_id());
+ def.usages(&ctx.sema).in_scope(search_scope).at_least_one()
}
#[derive(Debug, Clone)]
struct Ref {
// could be alias
visible_name: Name,
- def: Def,
+ def: Definition,
}
impl Ref {
fn from_scope_def(name: Name, scope_def: ScopeDef) -> Option<Self> {
match scope_def {
- ScopeDef::ModuleDef(def) => Some(Ref { visible_name: name, def: Def::ModuleDef(def) }),
- ScopeDef::MacroDef(def) => Some(Ref { visible_name: name, def: Def::MacroDef(def) }),
+ ScopeDef::ModuleDef(def) => {
+ Some(Ref { visible_name: name, def: Definition::from(def) })
+ }
+ ScopeDef::MacroDef(def) => {
+ Some(Ref { visible_name: name, def: Definition::Macro(def) })
+ }
_ => None,
}
}
@@ -157,10 +148,10 @@ impl Refs {
.clone()
.into_iter()
.filter(|r| {
- if let Def::ModuleDef(ModuleDef::Trait(tr)) = r.def {
+ if let Definition::Trait(tr) = r.def {
if tr.items(ctx.db()).into_iter().any(|ai| {
if let AssocItem::Function(f) = ai {
- Def::ModuleDef(ModuleDef::Function(f)).is_referenced_in(ctx)
+ def_is_referenced_in(Definition::Function(f), ctx)
} else {
false
}
@@ -169,13 +160,13 @@ impl Refs {
}
}
- r.def.is_referenced_in(ctx)
+ def_is_referenced_in(r.def, ctx)
})
.collect(),
)
}
- fn filter_out_by_defs(&self, defs: Vec<Def>) -> Refs {
+ fn filter_out_by_defs(&self, defs: Vec<Definition>) -> Refs {
Refs(self.0.clone().into_iter().filter(|r| !defs.contains(&r.def)).collect())
}
}
@@ -220,7 +211,7 @@ fn is_mod_visible_from(ctx: &AssistContext, module: Module, from: Module) -> boo
// use foo::*$0;
// use baz::Baz;
// ↑ ---------------
-fn find_imported_defs(ctx: &AssistContext, star: SyntaxToken) -> Option<Vec<Def>> {
+fn find_imported_defs(ctx: &AssistContext, star: SyntaxToken) -> Option<Vec<Definition>> {
let parent_use_item_syntax =
star.ancestors().find_map(|n| if ast::Use::can_cast(n.kind()) { Some(n) } else { None })?;
@@ -234,8 +225,19 @@ fn find_imported_defs(ctx: &AssistContext, star: SyntaxToken) -> Option<Vec<Def>
})
.flat_map(|n| n.descendants().filter_map(ast::NameRef::cast))
.filter_map(|r| match NameRefClass::classify(&ctx.sema, &r)? {
- NameRefClass::Definition(Definition::ModuleDef(def)) => Some(Def::ModuleDef(def)),
- NameRefClass::Definition(Definition::Macro(def)) => Some(Def::MacroDef(def)),
+ NameRefClass::Definition(
+ def
+ @
+ (Definition::Macro(_)
+ | Definition::Module(_)
+ | Definition::Function(_)
+ | Definition::Adt(_)
+ | Definition::Variant(_)
+ | Definition::Const(_)
+ | Definition::Static(_)
+ | Definition::Trait(_)
+ | Definition::TypeAlias(_)),
+ ) => Some(def),
_ => None,
})
.collect(),
@@ -245,7 +247,7 @@ fn find_imported_defs(ctx: &AssistContext, star: SyntaxToken) -> Option<Vec<Def>
fn find_names_to_import(
ctx: &AssistContext,
refs_in_target: Refs,
- imported_defs: Vec<Def>,
+ imported_defs: Vec<Definition>,
) -> Vec<Name> {
let used_refs = refs_in_target.used_refs(ctx).filter_out_by_defs(imported_defs);
used_refs.0.iter().map(|r| r.visible_name.clone()).collect()