Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_db/src/search.rs')
-rw-r--r--crates/ide_db/src/search.rs65
1 files changed, 29 insertions, 36 deletions
diff --git a/crates/ide_db/src/search.rs b/crates/ide_db/src/search.rs
index 65deaf4d7d..c23a9ee257 100644
--- a/crates/ide_db/src/search.rs
+++ b/crates/ide_db/src/search.rs
@@ -8,8 +8,7 @@ use std::{convert::TryInto, mem};
use base_db::{FileId, FileRange, SourceDatabase, SourceDatabaseExt};
use hir::{
- AsAssocItem, DefWithBody, HasAttrs, HasSource, InFile, ModuleDef, ModuleSource, Semantics,
- Visibility,
+ AsAssocItem, DefWithBody, HasAttrs, HasSource, InFile, ModuleSource, Semantics, Visibility,
};
use once_cell::unsync::Lazy;
use rustc_hash::FxHashMap;
@@ -217,13 +216,13 @@ impl Definition {
fn search_scope(&self, db: &RootDatabase) -> SearchScope {
let _p = profile::span("search_scope");
- if let Definition::ModuleDef(hir::ModuleDef::BuiltinType(_)) = self {
+ if let Definition::BuiltinType(_) = self {
return SearchScope::crate_graph(db);
}
// def is crate root
// FIXME: We don't do searches for crates currently, as a crate does not actually have a single name
- if let &Definition::ModuleDef(hir::ModuleDef::Module(module)) = self {
+ if let &Definition::Module(module) = self {
if module.crate_root(db) == module {
return SearchScope::reverse_dependencies(db, module.krate());
}
@@ -431,7 +430,7 @@ impl<'a> FindUsages<'a> {
// search for module `self` references in our module's definition source
match self.def {
- Definition::ModuleDef(hir::ModuleDef::Module(module)) if self.search_self_mod => {
+ Definition::Module(module) if self.search_self_mod => {
let src = module.definition_source(sema.db);
let file_id = src.file_id.original_file(sema.db);
let (file_id, search_range) = match src.value {
@@ -491,7 +490,7 @@ impl<'a> FindUsages<'a> {
sink: &mut dyn FnMut(FileId, FileReference) -> bool,
) -> bool {
match NameRefClass::classify(self.sema, name_ref) {
- Some(NameRefClass::Definition(def @ Definition::ModuleDef(_))) if def == self.def => {
+ Some(NameRefClass::Definition(def @ Definition::Module(_))) if def == self.def => {
let FileRange { file_id, range } = self.sema.original_range(name_ref.syntax());
let reference = FileReference {
range,
@@ -604,30 +603,27 @@ impl<'a> FindUsages<'a> {
sink(file_id, reference)
}
// Resolve trait impl function definitions to the trait definition's version if self.def is the trait definition's
- Some(NameClass::Definition(Definition::ModuleDef(mod_def))) => {
+ Some(NameClass::Definition(def)) if def != self.def => {
/* poor man's try block */
(|| {
- let this = match self.def {
- Definition::ModuleDef(this) if this != mod_def => this,
- _ => return None,
- };
- let this_trait = this
+ let this_trait = self
+ .def
.as_assoc_item(self.sema.db)?
.containing_trait_or_trait_impl(self.sema.db)?;
- let trait_ = mod_def
+ let trait_ = def
.as_assoc_item(self.sema.db)?
.containing_trait_or_trait_impl(self.sema.db)?;
- (trait_ == this_trait
- && self.def.name(self.sema.db) == mod_def.name(self.sema.db))
- .then(|| {
- let FileRange { file_id, range } = self.sema.original_range(name.syntax());
- let reference = FileReference {
- range,
- name: ast::NameLike::Name(name.clone()),
- category: None,
- };
- sink(file_id, reference)
- })
+ (trait_ == this_trait && self.def.name(self.sema.db) == def.name(self.sema.db))
+ .then(|| {
+ let FileRange { file_id, range } =
+ self.sema.original_range(name.syntax());
+ let reference = FileReference {
+ range,
+ name: ast::NameLike::Name(name.clone()),
+ category: None,
+ };
+ sink(file_id, reference)
+ })
})()
.unwrap_or(false)
}
@@ -638,18 +634,15 @@ impl<'a> FindUsages<'a> {
fn def_to_ty(sema: &Semantics<RootDatabase>, def: &Definition) -> Option<hir::Type> {
match def {
- Definition::ModuleDef(def) => match def {
- ModuleDef::Adt(adt) => Some(adt.ty(sema.db)),
- ModuleDef::TypeAlias(it) => Some(it.ty(sema.db)),
- ModuleDef::BuiltinType(it) => {
- let graph = sema.db.crate_graph();
- let krate = graph.iter().next()?;
- let root_file = graph[krate].root_file_id;
- let module = sema.to_module_def(root_file)?;
- Some(it.ty(sema.db, module))
- }
- _ => None,
- },
+ Definition::Adt(adt) => Some(adt.ty(sema.db)),
+ Definition::TypeAlias(it) => Some(it.ty(sema.db)),
+ Definition::BuiltinType(it) => {
+ let graph = sema.db.crate_graph();
+ let krate = graph.iter().next()?;
+ let root_file = graph[krate].root_file_id;
+ let module = sema.to_module_def(root_file)?;
+ Some(it.ty(sema.db, module))
+ }
Definition::SelfType(it) => Some(it.self_ty(sema.db)),
_ => None,
}