From 0f9c350812e37b3cf2a1fcfb3c60a78122d60bf7 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 11 Jan 2019 20:28:10 +0300 Subject: add missing def kinds --- crates/ra_hir/src/code_model_api.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'crates') diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index 098c7f40b..3f882a736 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs @@ -328,3 +328,23 @@ impl Function { db.infer(self.def_id) } } + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Const { + pub(crate) def_id: DefId, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Static { + pub(crate) def_id: DefId, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Trait { + pub(crate) def_id: DefId, +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Type { + pub(crate) def_id: DefId, +} -- cgit v1.2.3 From 19136cde000c2c227e79bf44febde990fe265cb7 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 11 Jan 2019 20:43:10 +0300 Subject: uncopypaste def sources --- crates/ra_hir/src/code_model_api.rs | 29 ++++++--------------------- crates/ra_hir/src/code_model_impl.rs | 15 ++++++++++++++ crates/ra_hir/src/code_model_impl/function.rs | 22 +++++--------------- 3 files changed, 26 insertions(+), 40 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index 3f882a736..5f61bb589 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use relative_path::RelativePathBuf; use ra_db::{CrateId, Cancelable, FileId}; -use ra_syntax::{ast, TreeArc, SyntaxNode, AstNode}; +use ra_syntax::{ast, TreeArc, SyntaxNode}; use crate::{ Name, DefId, Path, PerNs, ScopesWithSyntaxMapping, Ty, HirFileId, @@ -12,6 +12,7 @@ use crate::{ expr::BodySyntaxMapping, ty::InferenceResult, adt::VariantData, + code_model_impl::def_id_to_ast, }; /// hir::Crate describes a single crate. It's the main interface with which @@ -186,13 +187,7 @@ impl Struct { &self, db: &impl HirDatabase, ) -> Cancelable<(HirFileId, TreeArc)> { - let (file_id, syntax) = self.def_id.source(db); - Ok(( - file_id, - ast::StructDef::cast(&syntax) - .expect("struct def should point to StructDef node") - .to_owned(), - )) + Ok(def_id_to_ast(db, self.def_id)) } } @@ -219,13 +214,7 @@ impl Enum { } pub fn source(&self, db: &impl HirDatabase) -> Cancelable<(HirFileId, TreeArc)> { - let (file_id, syntax) = self.def_id.source(db); - Ok(( - file_id, - ast::EnumDef::cast(&syntax) - .expect("enum def should point to EnumDef node") - .to_owned(), - )) + Ok(def_id_to_ast(db, self.def_id)) } } @@ -259,13 +248,7 @@ impl EnumVariant { &self, db: &impl HirDatabase, ) -> Cancelable<(HirFileId, TreeArc)> { - let (file_id, syntax) = self.def_id.source(db); - Ok(( - file_id, - ast::EnumVariant::cast(&syntax) - .expect("variant def should point to EnumVariant node") - .to_owned(), - )) + Ok(def_id_to_ast(db, self.def_id)) } } @@ -304,7 +287,7 @@ impl Function { } pub fn source(&self, db: &impl HirDatabase) -> Cancelable<(HirFileId, TreeArc)> { - Ok(self.source_impl(db)) + Ok(def_id_to_ast(db, self.def_id)) } pub fn body_syntax_mapping(&self, db: &impl HirDatabase) -> Cancelable> { diff --git a/crates/ra_hir/src/code_model_impl.rs b/crates/ra_hir/src/code_model_impl.rs index 1f28fab74..0cea9f7b6 100644 --- a/crates/ra_hir/src/code_model_impl.rs +++ b/crates/ra_hir/src/code_model_impl.rs @@ -1,3 +1,18 @@ mod krate; // `crate` is invalid ident :( mod module; pub(crate) mod function; + +use ra_syntax::{AstNode, TreeArc}; + +use crate::{HirDatabase, DefId, HirFileId}; + +pub(crate) fn def_id_to_ast( + db: &impl HirDatabase, + def_id: DefId, +) -> (HirFileId, TreeArc) { + let (file_id, syntax) = def_id.source(db); + let ast = N::cast(&syntax) + .unwrap_or_else(|| panic!("def points to wrong source {:?} {:?}", def_id, syntax)) + .to_owned(); + (file_id, ast) +} diff --git a/crates/ra_hir/src/code_model_impl/function.rs b/crates/ra_hir/src/code_model_impl/function.rs index daf49e791..1ce939e05 100644 --- a/crates/ra_hir/src/code_model_impl/function.rs +++ b/crates/ra_hir/src/code_model_impl/function.rs @@ -3,16 +3,14 @@ mod scope; use std::sync::Arc; use ra_db::Cancelable; -use ra_syntax::{ - TreeArc, - ast::{self, AstNode, NameOwner}, -}; +use ra_syntax::{TreeArc, ast::{self, NameOwner}}; use crate::{ - DefId, DefKind, HirDatabase, Name, AsName, Function, FnSignature, Module, HirFileId, + DefId, HirDatabase, Name, AsName, Function, FnSignature, Module, type_ref::{TypeRef, Mutability}, expr::Body, impl_block::ImplBlock, + code_model_impl::def_id_to_ast, }; pub use self::scope::{FnScopes, ScopesWithSyntaxMapping, ScopeEntryWithSyntax}; @@ -22,16 +20,6 @@ impl Function { Function { def_id } } - pub(crate) fn source_impl(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { - let def_loc = self.def_id.loc(db); - assert!(def_loc.kind == DefKind::Function); - let syntax = db.file_item(def_loc.source_item_id); - ( - def_loc.source_item_id.file_id, - ast::FnDef::cast(&syntax).unwrap().to_owned(), - ) - } - pub(crate) fn body(&self, db: &impl HirDatabase) -> Cancelable> { db.body_hir(self.def_id) } @@ -48,8 +36,8 @@ impl Function { impl FnSignature { pub(crate) fn fn_signature_query(db: &impl HirDatabase, def_id: DefId) -> Arc { - let func = Function::new(def_id); - let node = func.source_impl(db).1; // TODO we're using source_impl here to avoid returning Cancelable... this is a bit hacky + // FIXME: we're using def_id_to_ast here to avoid returning Cancelable... this is a bit hacky + let node: TreeArc = def_id_to_ast(db, def_id).1; let name = node .name() .map(|n| n.as_name()) -- cgit v1.2.3 From f193fbcbae0783953cfaa88aaec6a8d4e1255007 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 11 Jan 2019 21:02:12 +0300 Subject: actually produce missing def kinds --- crates/ra_hir/src/code_model_api.rs | 48 ++++++++++++++++++++++ crates/ra_hir/src/ids.rs | 32 ++++++++++++--- crates/ra_hir/src/lib.rs | 2 + crates/ra_hir/src/ty.rs | 8 +++- .../ra_ide_api/src/completion/completion_item.rs | 20 +++++++++ crates/ra_ide_api/src/navigation_target.rs | 16 ++++++++ crates/ra_lsp_server/src/conv.rs | 4 ++ 7 files changed, 122 insertions(+), 8 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index 5f61bb589..d4244f70c 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs @@ -41,12 +41,17 @@ impl Crate { } } +#[derive(Debug)] pub enum Def { Module(Module), Struct(Struct), Enum(Enum), EnumVariant(EnumVariant), Function(Function), + Const(Const), + Static(Static), + Trait(Trait), + Type(Type), Item, } @@ -317,17 +322,60 @@ pub struct Const { pub(crate) def_id: DefId, } +impl Const { + pub(crate) fn new(def_id: DefId) -> Const { + Const { def_id } + } + + pub fn source(&self, db: &impl HirDatabase) -> Cancelable<(HirFileId, TreeArc)> { + Ok(def_id_to_ast(db, self.def_id)) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Static { pub(crate) def_id: DefId, } +impl Static { + pub(crate) fn new(def_id: DefId) -> Static { + Static { def_id } + } + + pub fn source( + &self, + db: &impl HirDatabase, + ) -> Cancelable<(HirFileId, TreeArc)> { + Ok(def_id_to_ast(db, self.def_id)) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Trait { pub(crate) def_id: DefId, } +impl Trait { + pub(crate) fn new(def_id: DefId) -> Trait { + Trait { def_id } + } + + pub fn source(&self, db: &impl HirDatabase) -> Cancelable<(HirFileId, TreeArc)> { + Ok(def_id_to_ast(db, self.def_id)) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Type { pub(crate) def_id: DefId, } + +impl Type { + pub(crate) fn new(def_id: DefId) -> Type { + Type { def_id } + } + + pub fn source(&self, db: &impl HirDatabase) -> Cancelable<(HirFileId, TreeArc)> { + Ok(def_id_to_ast(db, self.def_id)) + } +} diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index 0805fd3db..316896dce 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs @@ -4,11 +4,10 @@ use ra_arena::{Arena, RawId, impl_arena_id}; use crate::{ HirDatabase, PerNs, Def, Function, Struct, Enum, EnumVariant, ImplBlock, Crate, + Module, Trait, Type, Static, Const, module_tree::ModuleId, }; -use crate::code_model_api::Module; - /// hir makes heavy use of ids: integer (u32) handlers to various things. You /// can think of id as a pointer (but without a lifetime) or a file descriptor /// (but for hir objects). @@ -146,6 +145,10 @@ pub(crate) enum DefKind { Struct, Enum, EnumVariant, + Const, + Static, + Trait, + Type, Item, StructCtor, @@ -173,6 +176,23 @@ impl DefId { } DefKind::Enum => Def::Enum(Enum::new(self)), DefKind::EnumVariant => Def::EnumVariant(EnumVariant::new(self)), + DefKind::Const => { + let def = Const::new(self); + Def::Const(def) + } + DefKind::Static => { + let def = Static::new(self); + Def::Static(def) + } + DefKind::Trait => { + let def = Trait::new(self); + Def::Trait(def) + } + DefKind::Type => { + let def = Type::new(self); + Def::Type(def) + } + DefKind::StructCtor => Def::Item, DefKind::Item => Def::Item, }; @@ -218,10 +238,10 @@ impl DefKind { SyntaxKind::STRUCT_DEF => PerNs::both(DefKind::Struct, DefKind::StructCtor), SyntaxKind::ENUM_DEF => PerNs::types(DefKind::Enum), // These define items, but don't have their own DefKinds yet: - SyntaxKind::TRAIT_DEF => PerNs::types(DefKind::Item), - SyntaxKind::TYPE_DEF => PerNs::types(DefKind::Item), - SyntaxKind::CONST_DEF => PerNs::values(DefKind::Item), - SyntaxKind::STATIC_DEF => PerNs::values(DefKind::Item), + SyntaxKind::TRAIT_DEF => PerNs::types(DefKind::Trait), + SyntaxKind::TYPE_DEF => PerNs::types(DefKind::Type), + SyntaxKind::CONST_DEF => PerNs::values(DefKind::Const), + SyntaxKind::STATIC_DEF => PerNs::values(DefKind::Static), _ => PerNs::none(), } } diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index fe8be5700..45dda4f7f 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -60,4 +60,6 @@ pub use self::code_model_api::{ Module, ModuleSource, Problem, Struct, Enum, EnumVariant, Function, FnSignature, ScopeEntryWithSyntax, + Static, Const, + Trait, Type, }; diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index 18c41a015..0c24a0652 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs @@ -470,8 +470,12 @@ pub(super) fn type_for_def(db: &impl HirDatabase, def_id: DefId) -> Cancelable type_for_struct(db, s), Def::Enum(e) => type_for_enum(db, e), Def::EnumVariant(ev) => type_for_enum_variant(db, ev), - Def::Item => { - log::debug!("trying to get type for item of unknown type {:?}", def_id); + _ => { + log::debug!( + "trying to get type for item of unknown type {:?} {:?}", + def_id, + def + ); Ok(Ty::Unknown) } } diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs index 6a9770429..e7fa967a0 100644 --- a/crates/ra_ide_api/src/completion/completion_item.rs +++ b/crates/ra_ide_api/src/completion/completion_item.rs @@ -33,6 +33,10 @@ pub enum CompletionItemKind { EnumVariant, Binding, Field, + Static, + Const, + Trait, + TypeAlias, } #[derive(Debug, PartialEq, Eq)] @@ -153,6 +157,22 @@ impl Builder { types: Some(hir::Def::Enum(..)), .. } => CompletionItemKind::Enum, + PerNs { + types: Some(hir::Def::Trait(..)), + .. + } => CompletionItemKind::Trait, + PerNs { + types: Some(hir::Def::Type(..)), + .. + } => CompletionItemKind::TypeAlias, + PerNs { + values: Some(hir::Def::Const(..)), + .. + } => CompletionItemKind::Const, + PerNs { + values: Some(hir::Def::Static(..)), + .. + } => CompletionItemKind::Static, PerNs { values: Some(hir::Def::Function(function)), .. diff --git a/crates/ra_ide_api/src/navigation_target.rs b/crates/ra_ide_api/src/navigation_target.rs index b955bbe42..b0d0a3e8b 100644 --- a/crates/ra_ide_api/src/navigation_target.rs +++ b/crates/ra_ide_api/src/navigation_target.rs @@ -108,6 +108,22 @@ impl NavigationTarget { let (file_id, node) = f.source(db)?; NavigationTarget::from_named(file_id.original_file(db), &*node) } + Def::Trait(f) => { + let (file_id, node) = f.source(db)?; + NavigationTarget::from_named(file_id.original_file(db), &*node) + } + Def::Type(f) => { + let (file_id, node) = f.source(db)?; + NavigationTarget::from_named(file_id.original_file(db), &*node) + } + Def::Static(f) => { + let (file_id, node) = f.source(db)?; + NavigationTarget::from_named(file_id.original_file(db), &*node) + } + Def::Const(f) => { + let (file_id, node) = f.source(db)?; + NavigationTarget::from_named(file_id.original_file(db), &*node) + } Def::Module(m) => NavigationTarget::from_module(db, m)?, Def::Item => return Ok(None), }; diff --git a/crates/ra_lsp_server/src/conv.rs b/crates/ra_lsp_server/src/conv.rs index 76fa98cbe..7ca2f437d 100644 --- a/crates/ra_lsp_server/src/conv.rs +++ b/crates/ra_lsp_server/src/conv.rs @@ -65,6 +65,10 @@ impl Conv for CompletionItemKind { CompletionItemKind::EnumVariant => EnumMember, CompletionItemKind::Binding => Variable, CompletionItemKind::Field => Field, + CompletionItemKind::Trait => Interface, + CompletionItemKind::TypeAlias => Struct, + CompletionItemKind::Const => Constant, + CompletionItemKind::Static => Value, } } } -- cgit v1.2.3