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.rs58
1 files changed, 53 insertions, 5 deletions
diff --git a/crates/ide-db/src/defs.rs b/crates/ide-db/src/defs.rs
index 73b73736ce..91d5cf2945 100644
--- a/crates/ide-db/src/defs.rs
+++ b/crates/ide-db/src/defs.rs
@@ -13,10 +13,10 @@ use either::Either;
use hir::{
Adt, AsAssocItem, AsExternAssocItem, AssocItem, AttributeTemplate, BuiltinAttr, BuiltinType,
Const, Crate, DefWithBody, DeriveHelper, DocLinkDef, ExternAssocItem, ExternCrateDecl, Field,
- Function, GenericParam, GenericSubstitution, HasVisibility, HirDisplay, Impl, InlineAsmOperand,
- Label, Local, Macro, Module, ModuleDef, Name, PathResolution, Semantics, Static,
- StaticLifetime, Struct, ToolModule, Trait, TraitAlias, TupleField, TypeAlias, Variant,
- VariantDef, Visibility,
+ Function, GenericDef, GenericParam, GenericSubstitution, HasContainer, HasVisibility,
+ HirDisplay, Impl, InlineAsmOperand, ItemContainer, Label, Local, Macro, Module, ModuleDef,
+ Name, PathResolution, Semantics, Static, StaticLifetime, Struct, ToolModule, Trait, TraitAlias,
+ TupleField, TypeAlias, Variant, VariantDef, Visibility,
};
use span::Edition;
use stdx::{format_to, impl_from};
@@ -98,8 +98,30 @@ impl Definition {
pub fn enclosing_definition(&self, db: &RootDatabase) -> Option<Definition> {
match self {
+ Definition::Macro(it) => Some(it.module(db).into()),
+ Definition::Module(it) => it.parent(db).map(Definition::Module),
+ Definition::Field(it) => Some(it.parent_def(db).into()),
+ Definition::Function(it) => it.container(db).try_into().ok(),
+ Definition::Adt(it) => Some(it.module(db).into()),
+ Definition::Const(it) => it.container(db).try_into().ok(),
+ Definition::Static(it) => it.container(db).try_into().ok(),
+ Definition::Trait(it) => it.container(db).try_into().ok(),
+ Definition::TraitAlias(it) => it.container(db).try_into().ok(),
+ Definition::TypeAlias(it) => it.container(db).try_into().ok(),
+ Definition::Variant(it) => Some(Adt::Enum(it.parent_enum(db)).into()),
+ Definition::SelfType(it) => Some(it.module(db).into()),
Definition::Local(it) => it.parent(db).try_into().ok(),
- _ => None,
+ Definition::GenericParam(it) => Some(it.parent().into()),
+ Definition::Label(it) => it.parent(db).try_into().ok(),
+ Definition::ExternCrateDecl(it) => it.container(db).try_into().ok(),
+ Definition::DeriveHelper(it) => Some(it.derive().module(db).into()),
+ Definition::InlineAsmOperand(it) => it.parent(db).try_into().ok(),
+ Definition::BuiltinAttr(_)
+ | Definition::BuiltinType(_)
+ | Definition::BuiltinLifetime(_)
+ | Definition::TupleField(_)
+ | Definition::ToolModule(_)
+ | Definition::InlineAsmRegOrRegClass(_) => None,
}
}
@@ -932,3 +954,29 @@ impl TryFrom<DefWithBody> for Definition {
}
}
}
+
+impl TryFrom<ItemContainer> for Definition {
+ type Error = ();
+ fn try_from(container: ItemContainer) -> Result<Self, Self::Error> {
+ match container {
+ ItemContainer::Trait(it) => Ok(it.into()),
+ ItemContainer::Impl(it) => Ok(it.into()),
+ ItemContainer::Module(it) => Ok(it.into()),
+ ItemContainer::ExternBlock() | ItemContainer::Crate(_) => Err(()),
+ }
+ }
+}
+
+impl From<GenericDef> for Definition {
+ fn from(def: GenericDef) -> Self {
+ match def {
+ GenericDef::Function(it) => it.into(),
+ GenericDef::Adt(it) => it.into(),
+ GenericDef::Trait(it) => it.into(),
+ GenericDef::TraitAlias(it) => it.into(),
+ GenericDef::TypeAlias(it) => it.into(),
+ GenericDef::Impl(it) => it.into(),
+ GenericDef::Const(it) => it.into(),
+ }
+ }
+}