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 | 28 |
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(()), + } + } +} |