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 | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/crates/ide-db/src/defs.rs b/crates/ide-db/src/defs.rs index 2d30bb4127..49d26dfe25 100644 --- a/crates/ide-db/src/defs.rs +++ b/crates/ide-db/src/defs.rs @@ -32,6 +32,7 @@ pub enum Definition { Field(Field), TupleField(TupleField), Module(Module), + Crate(Crate), Function(Function), Adt(Adt), Variant(Variant), @@ -62,14 +63,19 @@ impl Definition { pub fn krate(&self, db: &RootDatabase) -> Option<Crate> { Some(match self { Definition::Module(m) => m.krate(), + &Definition::Crate(it) => it, _ => self.module(db)?.krate(), }) } + /// Returns the module this definition resides in. + /// + /// As such, for modules themselves this will return the parent module. pub fn module(&self, db: &RootDatabase) -> Option<Module> { let module = match self { Definition::Macro(it) => it.module(db), Definition::Module(it) => it.parent(db)?, + Definition::Crate(_) => return None, Definition::Field(it) => it.parent_def(db).module(db), Definition::Function(it) => it.module(db), Definition::Adt(it) => it.module(db), @@ -86,11 +92,11 @@ impl Definition { Definition::ExternCrateDecl(it) => it.module(db), Definition::DeriveHelper(it) => it.derive().module(db), Definition::InlineAsmOperand(it) => it.parent(db).module(db), + Definition::ToolModule(t) => t.krate().root_module(), Definition::BuiltinAttr(_) | Definition::BuiltinType(_) | Definition::BuiltinLifetime(_) | Definition::TupleField(_) - | Definition::ToolModule(_) | Definition::InlineAsmRegOrRegClass(_) => return None, }; Some(module) @@ -108,6 +114,7 @@ impl Definition { match self { Definition::Macro(it) => Some(it.module(db).into()), Definition::Module(it) => it.parent(db).map(Definition::Module), + Definition::Crate(_) => None, Definition::Field(it) => Some(it.parent_def(db).into()), Definition::Function(it) => container_to_definition(it.container(db)), Definition::Adt(it) => Some(it.module(db).into()), @@ -137,6 +144,7 @@ impl Definition { let vis = match self { Definition::Field(sf) => sf.visibility(db), Definition::Module(it) => it.visibility(db), + Definition::Crate(_) => return None, Definition::Function(it) => it.visibility(db), Definition::Adt(it) => it.visibility(db), Definition::Const(it) => it.visibility(db), @@ -146,8 +154,8 @@ impl Definition { Definition::TypeAlias(it) => it.visibility(db), Definition::Variant(it) => it.visibility(db), Definition::ExternCrateDecl(it) => it.visibility(db), + Definition::Macro(it) => it.visibility(db), Definition::BuiltinType(_) | Definition::TupleField(_) => Visibility::Public, - Definition::Macro(_) => return None, Definition::BuiltinAttr(_) | Definition::BuiltinLifetime(_) | Definition::ToolModule(_) @@ -167,6 +175,9 @@ impl Definition { Definition::Macro(it) => it.name(db), Definition::Field(it) => it.name(db), Definition::Module(it) => it.name(db)?, + Definition::Crate(it) => { + Name::new_symbol_root(it.display_name(db)?.crate_name().symbol().clone()) + } Definition::Function(it) => it.name(db), Definition::Adt(it) => it.name(db), Definition::Variant(it) => it.name(db), @@ -202,6 +213,7 @@ impl Definition { Definition::Macro(it) => it.docs(db), Definition::Field(it) => it.docs(db), Definition::Module(it) => it.docs(db), + Definition::Crate(it) => it.docs(db), Definition::Function(it) => it.docs(db), Definition::Adt(it) => it.docs(db), Definition::Variant(it) => it.docs(db), @@ -282,6 +294,7 @@ impl Definition { Definition::Field(it) => it.display(db, edition).to_string(), Definition::TupleField(it) => it.display(db, edition).to_string(), Definition::Module(it) => it.display(db, edition).to_string(), + Definition::Crate(it) => it.display(db, edition).to_string(), Definition::Function(it) => it.display(db, edition).to_string(), Definition::Adt(it) => it.display(db, edition).to_string(), Definition::Variant(it) => it.display(db, edition).to_string(), @@ -415,7 +428,7 @@ impl IdentClass { } IdentClass::NameRefClass(NameRefClass::ExternCrateShorthand { decl, krate }) => { res.push((Definition::ExternCrateDecl(decl), None)); - res.push((Definition::Module(krate.root_module()), None)); + res.push((Definition::Crate(krate), None)); } IdentClass::Operator( OperatorClass::Await(func) @@ -456,7 +469,7 @@ impl IdentClass { } IdentClass::NameRefClass(NameRefClass::ExternCrateShorthand { decl, krate }) => { res.push(Definition::ExternCrateDecl(decl)); - res.push(Definition::Module(krate.root_module())); + res.push(Definition::Crate(krate)); } IdentClass::Operator(_) => (), } @@ -800,7 +813,7 @@ impl NameRefClass { let extern_crate = sema.to_def(&extern_crate_ast)?; let krate = extern_crate.resolved_crate(sema.db)?; Some(if extern_crate_ast.rename().is_some() { - NameRefClass::Definition(Definition::Module(krate.root_module()), None) + NameRefClass::Definition(Definition::Crate(krate), None) } else { NameRefClass::ExternCrateShorthand { krate, decl: extern_crate } }) @@ -976,3 +989,19 @@ impl From<GenericDef> for Definition { } } } + +impl TryFrom<Definition> for GenericDef { + type Error = (); + fn try_from(def: Definition) -> Result<Self, Self::Error> { + match def { + Definition::Function(it) => Ok(it.into()), + Definition::Adt(it) => Ok(it.into()), + Definition::Trait(it) => Ok(it.into()), + Definition::TraitAlias(it) => Ok(it.into()), + Definition::TypeAlias(it) => Ok(it.into()), + Definition::SelfType(it) => Ok(it.into()), + Definition::Const(it) => Ok(it.into()), + _ => Err(()), + } + } +} |