mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 20:42:04 +00:00
minor: Simplify
This commit is contained in:
parent
97076c074d
commit
c1f91c93b2
4 changed files with 77 additions and 83 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue