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.rs28
1 files changed, 24 insertions, 4 deletions
diff --git a/crates/ide-db/src/defs.rs b/crates/ide-db/src/defs.rs
index ded5d4e3db..1b9e10e30f 100644
--- a/crates/ide-db/src/defs.rs
+++ b/crates/ide-db/src/defs.rs
@@ -7,10 +7,10 @@
use arrayvec::ArrayVec;
use hir::{
- Adt, AsAssocItem, AssocItem, BuiltinAttr, BuiltinType, Const, Crate, DeriveHelper, DocLinkDef,
- ExternCrateDecl, Field, Function, GenericParam, HasVisibility, Impl, Label, Local, Macro,
- Module, ModuleDef, Name, PathResolution, Semantics, Static, ToolModule, Trait, TraitAlias,
- TypeAlias, Variant, Visibility,
+ Adt, AsAssocItem, AssocItem, BuiltinAttr, BuiltinType, Const, Crate, DefWithBody, DeriveHelper,
+ DocLinkDef, ExternCrateDecl, Field, Function, GenericParam, HasVisibility, Impl, Label, Local,
+ Macro, Module, ModuleDef, Name, PathResolution, Semantics, Static, ToolModule, Trait,
+ TraitAlias, TypeAlias, Variant, Visibility,
};
use stdx::impl_from;
use syntax::{
@@ -83,6 +83,13 @@ impl Definition {
Some(module)
}
+ pub fn enclosing_definition(&self, db: &RootDatabase) -> Option<Definition> {
+ match self {
+ Definition::Local(it) => it.parent(db).try_into().ok(),
+ _ => None,
+ }
+ }
+
pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> {
let vis = match self {
Definition::Field(sf) => sf.visibility(db),
@@ -662,3 +669,16 @@ impl From<DocLinkDef> for Definition {
}
}
}
+
+impl TryFrom<DefWithBody> for Definition {
+ type Error = ();
+ fn try_from(def: DefWithBody) -> Result<Self, Self::Error> {
+ match def {
+ DefWithBody::Function(it) => Ok(it.into()),
+ DefWithBody::Static(it) => Ok(it.into()),
+ DefWithBody::Const(it) => Ok(it.into()),
+ DefWithBody::Variant(it) => Ok(it.into()),
+ DefWithBody::InTypeConst(_) => Err(()),
+ }
+ }
+}