Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics/source_to_def.rs')
| -rw-r--r-- | crates/hir/src/semantics/source_to_def.rs | 124 |
1 files changed, 58 insertions, 66 deletions
diff --git a/crates/hir/src/semantics/source_to_def.rs b/crates/hir/src/semantics/source_to_def.rs index 6f93f8ac94..1d8c984d11 100644 --- a/crates/hir/src/semantics/source_to_def.rs +++ b/crates/hir/src/semantics/source_to_def.rs @@ -102,7 +102,7 @@ use smallvec::SmallVec; use stdx::impl_from; use syntax::{ ast::{self, HasName}, - match_ast, AstNode, SyntaxNode, + AstNode, SyntaxNode, }; use crate::{db::HirDatabase, InFile}; @@ -132,13 +132,10 @@ impl SourceToDefCtx<'_, '_> { pub(super) fn module_to_def(&mut self, src: InFile<ast::Module>) -> Option<ModuleId> { let _p = profile::span("module_to_def"); - let parent_declaration = - src.syntax().ancestors_with_macros_skip_attr_item(self.db.upcast()).skip(1).find_map( - |it| { - let m = ast::Module::cast(it.value.clone())?; - Some(it.with_value(m)) - }, - ); + let parent_declaration = src + .syntax() + .ancestors_with_macros_skip_attr_item(self.db.upcast()) + .find_map(|it| it.map(ast::Module::cast).transpose()); let parent_module = match parent_declaration { Some(parent_declaration) => self.module_to_def(parent_declaration), @@ -150,7 +147,7 @@ impl SourceToDefCtx<'_, '_> { let child_name = src.value.name()?.as_name(); let def_map = parent_module.def_map(self.db.upcast()); - let child_id = *def_map[parent_module.local_id].children.get(&child_name)?; + let &child_id = def_map[parent_module.local_id].children.get(&child_name)?; Some(def_map.module_id(child_id)) } @@ -337,7 +334,7 @@ impl SourceToDefCtx<'_, '_> { } pub(super) fn find_container(&mut self, src: InFile<&SyntaxNode>) -> Option<ChildContainer> { - for container in src.ancestors_with_macros_skip_attr_item(self.db.upcast()).skip(1) { + for container in src.ancestors_with_macros_skip_attr_item(self.db.upcast()) { if let Some(res) = self.container_to_def(container) { return Some(res); } @@ -348,70 +345,62 @@ impl SourceToDefCtx<'_, '_> { } fn container_to_def(&mut self, container: InFile<SyntaxNode>) -> Option<ChildContainer> { - let cont = match_ast! { - match (container.value) { - ast::Module(it) => { - let def = self.module_to_def(container.with_value(it))?; - def.into() - }, - ast::Trait(it) => { - let def = self.trait_to_def(container.with_value(it))?; - def.into() - }, - ast::Impl(it) => { - let def = self.impl_to_def(container.with_value(it))?; - def.into() - }, - ast::Fn(it) => { - let def = self.fn_to_def(container.with_value(it))?; - DefWithBodyId::from(def).into() - }, - ast::Struct(it) => { + let cont = if let Some(item) = ast::Item::cast(container.value.clone()) { + match item { + ast::Item::Module(it) => self.module_to_def(container.with_value(it))?.into(), + ast::Item::Trait(it) => self.trait_to_def(container.with_value(it))?.into(), + ast::Item::Impl(it) => self.impl_to_def(container.with_value(it))?.into(), + ast::Item::Enum(it) => self.enum_to_def(container.with_value(it))?.into(), + ast::Item::TypeAlias(it) => { + self.type_alias_to_def(container.with_value(it))?.into() + } + ast::Item::Struct(it) => { let def = self.struct_to_def(container.with_value(it))?; VariantId::from(def).into() - }, - ast::Enum(it) => { - let def = self.enum_to_def(container.with_value(it))?; - def.into() - }, - ast::Union(it) => { + } + ast::Item::Union(it) => { let def = self.union_to_def(container.with_value(it))?; VariantId::from(def).into() - }, - ast::Static(it) => { + } + ast::Item::Fn(it) => { + let def = self.fn_to_def(container.with_value(it))?; + DefWithBodyId::from(def).into() + } + ast::Item::Static(it) => { let def = self.static_to_def(container.with_value(it))?; DefWithBodyId::from(def).into() - }, - ast::Const(it) => { + } + ast::Item::Const(it) => { let def = self.const_to_def(container.with_value(it))?; DefWithBodyId::from(def).into() - }, - ast::TypeAlias(it) => { - let def = self.type_alias_to_def(container.with_value(it))?; - def.into() - }, - ast::Variant(it) => { - let def = self.enum_variant_to_def(container.with_value(it))?; - VariantId::from(def).into() - }, + } _ => return None, } + } else { + let it = ast::Variant::cast(container.value)?; + let def = self.enum_variant_to_def(InFile::new(container.file_id, it))?; + VariantId::from(def).into() }; Some(cont) } fn find_generic_param_container(&mut self, src: InFile<&SyntaxNode>) -> Option<GenericDefId> { - for container in src.ancestors_with_macros_skip_attr_item(self.db.upcast()).skip(1) { - let res: GenericDefId = match_ast! { - match (container.value) { - ast::Fn(it) => self.fn_to_def(container.with_value(it))?.into(), - ast::Struct(it) => self.struct_to_def(container.with_value(it))?.into(), - ast::Enum(it) => self.enum_to_def(container.with_value(it))?.into(), - ast::Trait(it) => self.trait_to_def(container.with_value(it))?.into(), - ast::TypeAlias(it) => self.type_alias_to_def(container.with_value(it))?.into(), - ast::Impl(it) => self.impl_to_def(container.with_value(it))?.into(), - _ => continue, + let ancestors = src.ancestors_with_macros_skip_attr_item(self.db.upcast()); + for InFile { file_id, value } in ancestors { + let item = match ast::Item::cast(value) { + Some(it) => it, + None => continue, + }; + let res: GenericDefId = match item { + ast::Item::Fn(it) => self.fn_to_def(InFile::new(file_id, it))?.into(), + ast::Item::Struct(it) => self.struct_to_def(InFile::new(file_id, it))?.into(), + ast::Item::Enum(it) => self.enum_to_def(InFile::new(file_id, it))?.into(), + ast::Item::Trait(it) => self.trait_to_def(InFile::new(file_id, it))?.into(), + ast::Item::TypeAlias(it) => { + self.type_alias_to_def(InFile::new(file_id, it))?.into() } + ast::Item::Impl(it) => self.impl_to_def(InFile::new(file_id, it))?.into(), + _ => continue, }; return Some(res); } @@ -419,14 +408,17 @@ impl SourceToDefCtx<'_, '_> { } fn find_pat_or_label_container(&mut self, src: InFile<&SyntaxNode>) -> Option<DefWithBodyId> { - for container in src.ancestors_with_macros_skip_attr_item(self.db.upcast()).skip(1) { - let res: DefWithBodyId = match_ast! { - match (container.value) { - ast::Const(it) => self.const_to_def(container.with_value(it))?.into(), - ast::Static(it) => self.static_to_def(container.with_value(it))?.into(), - ast::Fn(it) => self.fn_to_def(container.with_value(it))?.into(), - _ => continue, - } + let ancestors = src.ancestors_with_macros_skip_attr_item(self.db.upcast()); + for InFile { file_id, value } in ancestors { + let item = match ast::Item::cast(value) { + Some(it) => it, + None => continue, + }; + let res: DefWithBodyId = match item { + ast::Item::Const(it) => self.const_to_def(InFile::new(file_id, it))?.into(), + ast::Item::Static(it) => self.static_to_def(InFile::new(file_id, it))?.into(), + ast::Item::Fn(it) => self.fn_to_def(InFile::new(file_id, it))?.into(), + _ => continue, }; return Some(res); } |