Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_db/src/defs.rs')
| -rw-r--r-- | crates/ide_db/src/defs.rs | 94 |
1 files changed, 46 insertions, 48 deletions
diff --git a/crates/ide_db/src/defs.rs b/crates/ide_db/src/defs.rs index ffef33b6c8..c9b8c94205 100644 --- a/crates/ide_db/src/defs.rs +++ b/crates/ide_db/src/defs.rs @@ -359,18 +359,6 @@ impl NameRefClass { let parent = name_ref.syntax().parent()?; - if let Some(method_call) = ast::MethodCallExpr::cast(parent.clone()) { - if let Some(func) = sema.resolve_method_call(&method_call) { - return Some(NameRefClass::Definition(Definition::Function(func))); - } - } - - if let Some(field_expr) = ast::FieldExpr::cast(parent.clone()) { - if let Some(field) = sema.resolve_field(&field_expr) { - return Some(NameRefClass::Definition(Definition::Field(field))); - } - } - if let Some(record_field) = ast::RecordExprField::for_field_name(name_ref) { if let Some((field, local, _)) = sema.resolve_record_field(&record_field) { let res = match local { @@ -383,38 +371,6 @@ impl NameRefClass { } } - if let Some(record_pat_field) = ast::RecordPatField::cast(parent.clone()) { - if let Some(field) = sema.resolve_record_pat_field(&record_pat_field) { - let field = Definition::Field(field); - return Some(NameRefClass::Definition(field)); - } - } - - if let Some(assoc_type_arg) = ast::AssocTypeArg::cast(parent.clone()) { - if assoc_type_arg.name_ref().as_ref() == Some(name_ref) { - // `Trait<Assoc = Ty>` - // ^^^^^ - let path = name_ref.syntax().ancestors().find_map(ast::Path::cast)?; - let resolved = sema.resolve_path(&path)?; - if let PathResolution::Def(ModuleDef::Trait(tr)) = resolved { - // FIXME: resolve in supertraits - if let Some(ty) = tr - .items(sema.db) - .iter() - .filter_map(|assoc| match assoc { - hir::AssocItem::TypeAlias(it) => Some(*it), - _ => None, - }) - .find(|alias| alias.name(sema.db).to_smol_str() == name_ref.text().as_str()) - { - return Some(NameRefClass::Definition(Definition::TypeAlias(ty))); - } - } - - return None; - } - } - if let Some(path) = ast::PathSegment::cast(parent.clone()).map(|it| it.parent_path()) { if path.parent_path().is_none() { if let Some(macro_call) = path.syntax().parent().and_then(ast::MacroCall::cast) { @@ -428,10 +384,52 @@ impl NameRefClass { return sema.resolve_path(&path).map(Into::into).map(NameRefClass::Definition); } - let extern_crate = ast::ExternCrate::cast(parent)?; - let krate = sema.resolve_extern_crate(&extern_crate)?; - let root_module = krate.root_module(sema.db); - Some(NameRefClass::Definition(Definition::Module(root_module))) + match_ast! { + match parent { + ast::MethodCallExpr(method_call) => { + sema.resolve_method_call(&method_call) + .map(Definition::Function) + .map(NameRefClass::Definition) + }, + ast::FieldExpr(field_expr) => { + sema.resolve_field(&field_expr) + .map(Definition::Field) + .map(NameRefClass::Definition) + }, + ast::RecordPatField(record_pat_field) => { + sema.resolve_record_pat_field(&record_pat_field) + .map(Definition::Field) + .map(NameRefClass::Definition) + }, + ast::AssocTypeArg(_) => { + // `Trait<Assoc = Ty>` + // ^^^^^ + let containing_path = name_ref.syntax().ancestors().find_map(ast::Path::cast)?; + let resolved = sema.resolve_path(&containing_path)?; + if let PathResolution::Def(ModuleDef::Trait(tr)) = resolved { + // FIXME: resolve in supertraits + if let Some(ty) = tr + .items(sema.db) + .iter() + .filter_map(|&assoc| match assoc { + hir::AssocItem::TypeAlias(it) => Some(it), + _ => None, + }) + .find(|alias| alias.name(sema.db).to_smol_str() == name_ref.text().as_str()) + { + return Some(NameRefClass::Definition(Definition::TypeAlias(ty))); + } + } + None + }, + ast::ExternCrate(extern_crate) => { + let krate = sema.resolve_extern_crate(&extern_crate)?; + let root_module = krate.root_module(sema.db); + Some(NameRefClass::Definition(Definition::Module(root_module))) + }, + _ => None + } + } } pub fn classify_lifetime( |