From 6a6ce2bc959c346aed7a98c8509d1aa3d19ec8a9 Mon Sep 17 00:00:00 2001 From: "Jeremy A. Kolb" Date: Wed, 23 Jan 2019 15:59:19 -0500 Subject: Make EnumVariant a DocCommentsOwner --- crates/ra_syntax/src/ast/generated.rs | 1 + crates/ra_syntax/src/grammar.ron | 2 +- crates/ra_syntax/src/parser_impl/event.rs | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 9fe946172..ac6c8a835 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs @@ -632,6 +632,7 @@ impl AstNode for EnumVariant { impl ast::NameOwner for EnumVariant {} +impl ast::DocCommentsOwner for EnumVariant {} impl EnumVariant { pub fn expr(&self) -> Option<&Expr> { super::child_opt(self) diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index 0385183fd..c5297e46d 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron @@ -279,7 +279,7 @@ Grammar( "DocCommentsOwner" ], options: [["variant_list", "EnumVariantList"]] ), "EnumVariantList": ( collections: [["variants", "EnumVariant"]] ), - "EnumVariant": ( traits: ["NameOwner"], options: ["Expr"] ), + "EnumVariant": ( traits: ["NameOwner", "DocCommentsOwner"], options: ["Expr"] ), "TraitDef": ( traits: ["VisibilityOwner", "NameOwner", "AttrsOwner", "DocCommentsOwner"] ), "Module": ( traits: ["VisibilityOwner", "NameOwner", "AttrsOwner", "DocCommentsOwner" ], diff --git a/crates/ra_syntax/src/parser_impl/event.rs b/crates/ra_syntax/src/parser_impl/event.rs index 73dd6e02b..bd77fee89 100644 --- a/crates/ra_syntax/src/parser_impl/event.rs +++ b/crates/ra_syntax/src/parser_impl/event.rs @@ -249,7 +249,8 @@ fn n_attached_trivias<'a>( trivias: impl Iterator, ) -> usize { match kind { - CONST_DEF | TYPE_DEF | STRUCT_DEF | ENUM_DEF | FN_DEF | TRAIT_DEF | MODULE => { + CONST_DEF | TYPE_DEF | STRUCT_DEF | ENUM_DEF | ENUM_VARIANT | FN_DEF | TRAIT_DEF + | MODULE => { let mut res = 0; for (i, (kind, text)) in trivias.enumerate() { match kind { -- cgit v1.2.3 From 576625f0a1c6e54075d173db7e691d75077ca677 Mon Sep 17 00:00:00 2001 From: "Jeremy A. Kolb" Date: Wed, 23 Jan 2019 16:22:10 -0500 Subject: Add way of getting docs from the code model and use for completion --- crates/ra_hir/src/code_model_api.rs | 37 ++++++++++++++-------- crates/ra_hir/src/docs.rs | 35 ++++++++++++++++++++ crates/ra_hir/src/lib.rs | 2 ++ crates/ra_ide_api/src/completion/complete_path.rs | 5 ++- .../ra_ide_api/src/completion/completion_item.rs | 13 ++++---- 5 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 crates/ra_hir/src/docs.rs diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index 9ae620efd..333d117f1 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, FileId}; -use ra_syntax::{ast::{self, AstNode, DocCommentsOwner}, TreeArc, SyntaxNode}; +use ra_syntax::{ast::self, TreeArc, SyntaxNode}; use crate::{ Name, DefId, Path, PerNs, ScopesWithSyntaxMapping, Ty, HirFileId, @@ -14,6 +14,7 @@ use crate::{ adt::VariantData, generics::GenericParams, code_model_impl::def_id_to_ast, + docs::{Documentation, Docs, docs_from_ast} }; /// hir::Crate describes a single crate. It's the main interface with which @@ -208,6 +209,12 @@ impl Struct { } } +impl Docs for Struct { + fn docs(&self, db: &impl HirDatabase) -> Option { + docs_from_ast(&*self.source(db).1) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Enum { pub(crate) def_id: DefId, @@ -239,6 +246,12 @@ impl Enum { } } +impl Docs for Enum { + fn docs(&self, db: &impl HirDatabase) -> Option { + docs_from_ast(&*self.source(db).1) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct EnumVariant { pub(crate) def_id: DefId, @@ -281,6 +294,12 @@ impl EnumVariant { } } +impl Docs for EnumVariant { + fn docs(&self, db: &impl HirDatabase) -> Option { + docs_from_ast(&*self.source(db).1) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Function { pub(crate) def_id: DefId, @@ -352,19 +371,11 @@ impl Function { pub fn generic_params(&self, db: &impl HirDatabase) -> Arc { db.generic_params(self.def_id) } +} - pub fn docs(&self, db: &impl HirDatabase) -> Option { - let def_loc = self.def_id.loc(db); - let syntax = db.file_item(def_loc.source_item_id); - let fn_def = ast::FnDef::cast(&syntax).expect("fn def should point to FnDef node"); - - // doc_comment_text unconditionally returns a String - let comments = fn_def.doc_comment_text(); - if comments.is_empty() { - None - } else { - Some(comments) - } +impl Docs for Function { + fn docs(&self, db: &impl HirDatabase) -> Option { + docs_from_ast(&*self.source(db).1) } } diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs new file mode 100644 index 000000000..330d8f8f4 --- /dev/null +++ b/crates/ra_hir/src/docs.rs @@ -0,0 +1,35 @@ +use ra_syntax::ast; + +use crate::HirDatabase; + +#[derive(Debug, Clone)] +pub struct Documentation(String); + +impl Documentation { + pub fn new(s: &str) -> Self { + Self(s.into()) + } + + pub fn contents(&self) -> &str { + &self.0 + } +} + +impl Into for Documentation { + fn into(self) -> String { + self.contents().into() + } +} + +pub trait Docs { + fn docs(&self, db: &impl HirDatabase) -> Option; +} + +pub(crate) fn docs_from_ast(node: &impl ast::DocCommentsOwner) -> Option { + let comments = node.doc_comment_text(); + if comments.is_empty() { + None + } else { + Some(Documentation::new(&comments)) + } +} diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index a861ee88e..f517f71e0 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -23,6 +23,7 @@ mod ty; mod impl_block; mod expr; mod generics; +mod docs; mod code_model_api; mod code_model_impl; @@ -45,6 +46,7 @@ pub use self::{ ty::Ty, impl_block::{ImplBlock, ImplItem}, code_model_impl::function::{FnScopes, ScopesWithSyntaxMapping}, + docs::{Docs, Documentation} }; pub use self::code_model_api::{ diff --git a/crates/ra_ide_api/src/completion/complete_path.rs b/crates/ra_ide_api/src/completion/complete_path.rs index 6bed299d2..aeb226847 100644 --- a/crates/ra_ide_api/src/completion/complete_path.rs +++ b/crates/ra_ide_api/src/completion/complete_path.rs @@ -2,6 +2,8 @@ use crate::{ completion::{CompletionItem, CompletionItemKind, Completions, CompletionKind, CompletionContext}, }; +use hir::Docs; + pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) { let (path, module) = match (&ctx.path_prefix, &ctx.module) { (Some(path), Some(module)) => (path.clone(), module), @@ -27,13 +29,14 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) { hir::Def::Enum(e) => { e.variants(ctx.db) .into_iter() - .for_each(|(variant_name, _variant)| { + .for_each(|(variant_name, variant)| { CompletionItem::new( CompletionKind::Reference, ctx.source_range(), variant_name.to_string(), ) .kind(CompletionItemKind::EnumVariant) + .set_documentation(variant.docs(ctx.db)) .add_to(acc) }); } diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs index e3bf82304..8e0be4c4b 100644 --- a/crates/ra_ide_api/src/completion/completion_item.rs +++ b/crates/ra_ide_api/src/completion/completion_item.rs @@ -1,4 +1,4 @@ -use hir::PerNs; +use hir::{Docs, Documentation, PerNs}; use crate::completion::completion_context::CompletionContext; use ra_syntax::{ @@ -19,7 +19,7 @@ pub struct CompletionItem { label: String, kind: Option, detail: Option, - documentation: Option, + documentation: Option, lookup: Option, insert_text: Option, insert_text_format: InsertTextFormat, @@ -98,7 +98,7 @@ impl CompletionItem { } /// A doc-comment pub fn documentation(&self) -> Option<&str> { - self.documentation.as_ref().map(|it| it.as_str()) + self.documentation.as_ref().map(|it| it.contents()) } /// What string is used for filtering. pub fn lookup(&self) -> &str { @@ -137,7 +137,7 @@ pub(crate) struct Builder { insert_text: Option, insert_text_format: InsertTextFormat, detail: Option, - documentation: Option, + documentation: Option, lookup: Option, kind: Option, text_edit: Option, @@ -197,10 +197,10 @@ impl Builder { self } #[allow(unused)] - pub(crate) fn documentation(self, docs: impl Into) -> Builder { + pub(crate) fn documentation(self, docs: Documentation) -> Builder { self.set_documentation(Some(docs)) } - pub(crate) fn set_documentation(mut self, docs: Option>) -> Builder { + pub(crate) fn set_documentation(mut self, docs: Option) -> Builder { self.documentation = docs.map(Into::into); self } @@ -265,6 +265,7 @@ impl Builder { } self.insert_text_format = InsertTextFormat::Snippet; } + if let Some(docs) = function.docs(ctx.db) { self.documentation = Some(docs); } -- cgit v1.2.3 From 7b548de63405a07c1a4aa6aedb3e1993fe6b1e6c Mon Sep 17 00:00:00 2001 From: "Jeremy A. Kolb" Date: Wed, 23 Jan 2019 17:46:14 -0500 Subject: Add a bunch of new documentation to completions --- crates/ra_hir/src/code_model_api.rs | 24 +++++++++++++++++ .../ra_ide_api/src/completion/completion_item.rs | 30 ++++++++++++---------- .../completion_item__reference_completion.snap | 20 ++++++++++----- 3 files changed, 54 insertions(+), 20 deletions(-) diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index 333d117f1..3ff07bd60 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs @@ -394,6 +394,12 @@ impl Const { } } +impl Docs for Const { + fn docs(&self, db: &impl HirDatabase) -> Option { + docs_from_ast(&*self.source(db).1) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Static { pub(crate) def_id: DefId, @@ -409,6 +415,12 @@ impl Static { } } +impl Docs for Static { + fn docs(&self, db: &impl HirDatabase) -> Option { + docs_from_ast(&*self.source(db).1) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Trait { pub(crate) def_id: DefId, @@ -428,6 +440,12 @@ impl Trait { } } +impl Docs for Trait { + fn docs(&self, db: &impl HirDatabase) -> Option { + docs_from_ast(&*self.source(db).1) + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Type { pub(crate) def_id: DefId, @@ -446,3 +464,9 @@ impl Type { db.generic_params(self.def_id) } } + +impl Docs for Type { + fn docs(&self, db: &impl HirDatabase) -> Option { + docs_from_ast(&*self.source(db).1) + } +} diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs index 8e0be4c4b..18c151932 100644 --- a/crates/ra_ide_api/src/completion/completion_item.rs +++ b/crates/ra_ide_api/src/completion/completion_item.rs @@ -210,35 +210,35 @@ impl Builder { resolution: &hir::Resolution, ) -> Builder { let resolved = resolution.def_id.map(|d| d.resolve(ctx.db)); - let kind = match resolved { + let (kind, docs) = match resolved { PerNs { types: Some(hir::Def::Module(..)), .. - } => CompletionItemKind::Module, + } => (CompletionItemKind::Module, None), PerNs { - types: Some(hir::Def::Struct(..)), + types: Some(hir::Def::Struct(s)), .. - } => CompletionItemKind::Struct, + } => (CompletionItemKind::Struct, s.docs(ctx.db)), PerNs { - types: Some(hir::Def::Enum(..)), + types: Some(hir::Def::Enum(e)), .. - } => CompletionItemKind::Enum, + } => (CompletionItemKind::Enum, e.docs(ctx.db)), PerNs { - types: Some(hir::Def::Trait(..)), + types: Some(hir::Def::Trait(t)), .. - } => CompletionItemKind::Trait, + } => (CompletionItemKind::Trait, t.docs(ctx.db)), PerNs { - types: Some(hir::Def::Type(..)), + types: Some(hir::Def::Type(t)), .. - } => CompletionItemKind::TypeAlias, + } => (CompletionItemKind::TypeAlias, t.docs(ctx.db)), PerNs { - values: Some(hir::Def::Const(..)), + values: Some(hir::Def::Const(c)), .. - } => CompletionItemKind::Const, + } => (CompletionItemKind::Const, c.docs(ctx.db)), PerNs { - values: Some(hir::Def::Static(..)), + values: Some(hir::Def::Static(s)), .. - } => CompletionItemKind::Static, + } => (CompletionItemKind::Static, s.docs(ctx.db)), PerNs { values: Some(hir::Def::Function(function)), .. @@ -246,6 +246,8 @@ impl Builder { _ => return self, }; self.kind = Some(kind); + self.documentation = docs; + self } diff --git a/crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap b/crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap index 0180a4f44..9779541b3 100644 --- a/crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap +++ b/crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap @@ -1,6 +1,6 @@ --- -created: "2019-01-22T14:45:00.717917+00:00" -creator: insta@0.4.0 +created: "2019-01-23T21:14:09.186661600+00:00" +creator: insta@0.5.1 expression: kind_completions source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs" --- @@ -12,11 +12,15 @@ source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs" EnumVariant ), detail: None, - documentation: None, + documentation: Some( + Documentation( + "This is foo" + ) + ), lookup: None, insert_text: None, insert_text_format: PlainText, - source_range: [47; 47), + source_range: [109; 109), text_edit: None }, CompletionItem { @@ -26,11 +30,15 @@ source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs" EnumVariant ), detail: None, - documentation: None, + documentation: Some( + Documentation( + "Use when we need an `i32`" + ) + ), lookup: None, insert_text: None, insert_text_format: PlainText, - source_range: [47; 47), + source_range: [109; 109), text_edit: None } ] -- cgit v1.2.3 From 30f0736e646fe7cf4e133c78f0417e5bd844c525 Mon Sep 17 00:00:00 2001 From: "Jeremy A. Kolb" Date: Wed, 23 Jan 2019 18:50:46 -0500 Subject: Fix snap --- crates/ra_ide_api/src/completion/complete_path.rs | 8 +++++++- .../snapshots/completion_item__reference_completion.snap | 10 +++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/ra_ide_api/src/completion/complete_path.rs b/crates/ra_ide_api/src/completion/complete_path.rs index aeb226847..e44b76c4a 100644 --- a/crates/ra_ide_api/src/completion/complete_path.rs +++ b/crates/ra_ide_api/src/completion/complete_path.rs @@ -119,7 +119,13 @@ mod tests { "reference_completion", " //- /lib.rs - enum E { Foo, Bar(i32) } + /// An enum + enum E { + /// Foo Variant + Foo, + /// Bar Variant with i32 + Bar(i32) + } fn foo() { let _ = E::<|> } ", ); diff --git a/crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap b/crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap index 9779541b3..e46f7807b 100644 --- a/crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap +++ b/crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap @@ -1,5 +1,5 @@ --- -created: "2019-01-23T21:14:09.186661600+00:00" +created: "2019-01-23T23:49:43.278245900+00:00" creator: insta@0.5.1 expression: kind_completions source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs" @@ -14,13 +14,13 @@ source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs" detail: None, documentation: Some( Documentation( - "This is foo" + "Foo Variant" ) ), lookup: None, insert_text: None, insert_text_format: PlainText, - source_range: [109; 109), + source_range: [116; 116), text_edit: None }, CompletionItem { @@ -32,13 +32,13 @@ source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs" detail: None, documentation: Some( Documentation( - "Use when we need an `i32`" + "Bar Variant with i32" ) ), lookup: None, insert_text: None, insert_text_format: PlainText, - source_range: [109; 109), + source_range: [116; 116), text_edit: None } ] -- cgit v1.2.3 From f87ce73579759fdb623f1d8d82880c0d6306746e Mon Sep 17 00:00:00 2001 From: Jeremy Kolb Date: Wed, 23 Jan 2019 20:13:36 -0500 Subject: Add a comment --- crates/ra_hir/src/docs.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index 330d8f8f4..b1b47af9e 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -2,6 +2,7 @@ use ra_syntax::ast; use crate::HirDatabase; +/// Holds documentation #[derive(Debug, Clone)] pub struct Documentation(String); -- cgit v1.2.3