aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_api/src
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-01-24 01:22:29 +0000
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-01-24 01:22:29 +0000
commit6a0a4a564accb12b48e703245655e3e3a0637445 (patch)
tree248097d8ceaded63601e3d663ef795e3bae55bfe /crates/ra_ide_api/src
parentbf9cd6ee30b3044b61e99e24e82fad56d3965417 (diff)
parentf87ce73579759fdb623f1d8d82880c0d6306746e (diff)
Merge #621
621: Completion docs for code model r=kjeremy a=kjeremy Adds a way to access documentation through the code model and exposes it to completions. Also allows us to document enum variants. Co-authored-by: Jeremy A. Kolb <[email protected]> Co-authored-by: Jeremy Kolb <[email protected]>
Diffstat (limited to 'crates/ra_ide_api/src')
-rw-r--r--crates/ra_ide_api/src/completion/complete_path.rs13
-rw-r--r--crates/ra_ide_api/src/completion/completion_item.rs43
-rw-r--r--crates/ra_ide_api/src/completion/snapshots/completion_item__reference_completion.snap20
3 files changed, 48 insertions, 28 deletions
diff --git a/crates/ra_ide_api/src/completion/complete_path.rs b/crates/ra_ide_api/src/completion/complete_path.rs
index 6bed299d2..e44b76c4a 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::{
2 completion::{CompletionItem, CompletionItemKind, Completions, CompletionKind, CompletionContext}, 2 completion::{CompletionItem, CompletionItemKind, Completions, CompletionKind, CompletionContext},
3}; 3};
4 4
5use hir::Docs;
6
5pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) { 7pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) {
6 let (path, module) = match (&ctx.path_prefix, &ctx.module) { 8 let (path, module) = match (&ctx.path_prefix, &ctx.module) {
7 (Some(path), Some(module)) => (path.clone(), module), 9 (Some(path), Some(module)) => (path.clone(), module),
@@ -27,13 +29,14 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) {
27 hir::Def::Enum(e) => { 29 hir::Def::Enum(e) => {
28 e.variants(ctx.db) 30 e.variants(ctx.db)
29 .into_iter() 31 .into_iter()
30 .for_each(|(variant_name, _variant)| { 32 .for_each(|(variant_name, variant)| {
31 CompletionItem::new( 33 CompletionItem::new(
32 CompletionKind::Reference, 34 CompletionKind::Reference,
33 ctx.source_range(), 35 ctx.source_range(),
34 variant_name.to_string(), 36 variant_name.to_string(),
35 ) 37 )
36 .kind(CompletionItemKind::EnumVariant) 38 .kind(CompletionItemKind::EnumVariant)
39 .set_documentation(variant.docs(ctx.db))
37 .add_to(acc) 40 .add_to(acc)
38 }); 41 });
39 } 42 }
@@ -116,7 +119,13 @@ mod tests {
116 "reference_completion", 119 "reference_completion",
117 " 120 "
118 //- /lib.rs 121 //- /lib.rs
119 enum E { Foo, Bar(i32) } 122 /// An enum
123 enum E {
124 /// Foo Variant
125 Foo,
126 /// Bar Variant with i32
127 Bar(i32)
128 }
120 fn foo() { let _ = E::<|> } 129 fn foo() { let _ = E::<|> }
121 ", 130 ",
122 ); 131 );
diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs
index e3bf82304..18c151932 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 @@
1use hir::PerNs; 1use hir::{Docs, Documentation, PerNs};
2 2
3use crate::completion::completion_context::CompletionContext; 3use crate::completion::completion_context::CompletionContext;
4use ra_syntax::{ 4use ra_syntax::{
@@ -19,7 +19,7 @@ pub struct CompletionItem {
19 label: String, 19 label: String,
20 kind: Option<CompletionItemKind>, 20 kind: Option<CompletionItemKind>,
21 detail: Option<String>, 21 detail: Option<String>,
22 documentation: Option<String>, 22 documentation: Option<Documentation>,
23 lookup: Option<String>, 23 lookup: Option<String>,
24 insert_text: Option<String>, 24 insert_text: Option<String>,
25 insert_text_format: InsertTextFormat, 25 insert_text_format: InsertTextFormat,
@@ -98,7 +98,7 @@ impl CompletionItem {
98 } 98 }
99 /// A doc-comment 99 /// A doc-comment
100 pub fn documentation(&self) -> Option<&str> { 100 pub fn documentation(&self) -> Option<&str> {
101 self.documentation.as_ref().map(|it| it.as_str()) 101 self.documentation.as_ref().map(|it| it.contents())
102 } 102 }
103 /// What string is used for filtering. 103 /// What string is used for filtering.
104 pub fn lookup(&self) -> &str { 104 pub fn lookup(&self) -> &str {
@@ -137,7 +137,7 @@ pub(crate) struct Builder {
137 insert_text: Option<String>, 137 insert_text: Option<String>,
138 insert_text_format: InsertTextFormat, 138 insert_text_format: InsertTextFormat,
139 detail: Option<String>, 139 detail: Option<String>,
140 documentation: Option<String>, 140 documentation: Option<Documentation>,
141 lookup: Option<String>, 141 lookup: Option<String>,
142 kind: Option<CompletionItemKind>, 142 kind: Option<CompletionItemKind>,
143 text_edit: Option<TextEdit>, 143 text_edit: Option<TextEdit>,
@@ -197,10 +197,10 @@ impl Builder {
197 self 197 self
198 } 198 }
199 #[allow(unused)] 199 #[allow(unused)]
200 pub(crate) fn documentation(self, docs: impl Into<String>) -> Builder { 200 pub(crate) fn documentation(self, docs: Documentation) -> Builder {
201 self.set_documentation(Some(docs)) 201 self.set_documentation(Some(docs))
202 } 202 }
203 pub(crate) fn set_documentation(mut self, docs: Option<impl Into<String>>) -> Builder { 203 pub(crate) fn set_documentation(mut self, docs: Option<Documentation>) -> Builder {
204 self.documentation = docs.map(Into::into); 204 self.documentation = docs.map(Into::into);
205 self 205 self
206 } 206 }
@@ -210,35 +210,35 @@ impl Builder {
210 resolution: &hir::Resolution, 210 resolution: &hir::Resolution,
211 ) -> Builder { 211 ) -> Builder {
212 let resolved = resolution.def_id.map(|d| d.resolve(ctx.db)); 212 let resolved = resolution.def_id.map(|d| d.resolve(ctx.db));
213 let kind = match resolved { 213 let (kind, docs) = match resolved {
214 PerNs { 214 PerNs {
215 types: Some(hir::Def::Module(..)), 215 types: Some(hir::Def::Module(..)),
216 .. 216 ..
217 } => CompletionItemKind::Module, 217 } => (CompletionItemKind::Module, None),
218 PerNs { 218 PerNs {
219 types: Some(hir::Def::Struct(..)), 219 types: Some(hir::Def::Struct(s)),
220 .. 220 ..
221 } => CompletionItemKind::Struct, 221 } => (CompletionItemKind::Struct, s.docs(ctx.db)),
222 PerNs { 222 PerNs {
223 types: Some(hir::Def::Enum(..)), 223 types: Some(hir::Def::Enum(e)),
224 .. 224 ..
225 } => CompletionItemKind::Enum, 225 } => (CompletionItemKind::Enum, e.docs(ctx.db)),
226 PerNs { 226 PerNs {
227 types: Some(hir::Def::Trait(..)), 227 types: Some(hir::Def::Trait(t)),
228 .. 228 ..
229 } => CompletionItemKind::Trait, 229 } => (CompletionItemKind::Trait, t.docs(ctx.db)),
230 PerNs { 230 PerNs {
231 types: Some(hir::Def::Type(..)), 231 types: Some(hir::Def::Type(t)),
232 .. 232 ..
233 } => CompletionItemKind::TypeAlias, 233 } => (CompletionItemKind::TypeAlias, t.docs(ctx.db)),
234 PerNs { 234 PerNs {
235 values: Some(hir::Def::Const(..)), 235 values: Some(hir::Def::Const(c)),
236 .. 236 ..
237 } => CompletionItemKind::Const, 237 } => (CompletionItemKind::Const, c.docs(ctx.db)),
238 PerNs { 238 PerNs {
239 values: Some(hir::Def::Static(..)), 239 values: Some(hir::Def::Static(s)),
240 .. 240 ..
241 } => CompletionItemKind::Static, 241 } => (CompletionItemKind::Static, s.docs(ctx.db)),
242 PerNs { 242 PerNs {
243 values: Some(hir::Def::Function(function)), 243 values: Some(hir::Def::Function(function)),
244 .. 244 ..
@@ -246,6 +246,8 @@ impl Builder {
246 _ => return self, 246 _ => return self,
247 }; 247 };
248 self.kind = Some(kind); 248 self.kind = Some(kind);
249 self.documentation = docs;
250
249 self 251 self
250 } 252 }
251 253
@@ -265,6 +267,7 @@ impl Builder {
265 } 267 }
266 self.insert_text_format = InsertTextFormat::Snippet; 268 self.insert_text_format = InsertTextFormat::Snippet;
267 } 269 }
270
268 if let Some(docs) = function.docs(ctx.db) { 271 if let Some(docs) = function.docs(ctx.db) {
269 self.documentation = Some(docs); 272 self.documentation = Some(docs);
270 } 273 }
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..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,6 +1,6 @@
1--- 1---
2created: "2019-01-22T14:45:00.717917+00:00" 2created: "2019-01-23T23:49:43.278245900+00:00"
3creator: insta@0.4.0 3creator: insta@0.5.1
4expression: kind_completions 4expression: kind_completions
5source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs" 5source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs"
6--- 6---
@@ -12,11 +12,15 @@ source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs"
12 EnumVariant 12 EnumVariant
13 ), 13 ),
14 detail: None, 14 detail: None,
15 documentation: None, 15 documentation: Some(
16 Documentation(
17 "Foo Variant"
18 )
19 ),
16 lookup: None, 20 lookup: None,
17 insert_text: None, 21 insert_text: None,
18 insert_text_format: PlainText, 22 insert_text_format: PlainText,
19 source_range: [47; 47), 23 source_range: [116; 116),
20 text_edit: None 24 text_edit: None
21 }, 25 },
22 CompletionItem { 26 CompletionItem {
@@ -26,11 +30,15 @@ source: "crates\\ra_ide_api\\src\\completion\\completion_item.rs"
26 EnumVariant 30 EnumVariant
27 ), 31 ),
28 detail: None, 32 detail: None,
29 documentation: None, 33 documentation: Some(
34 Documentation(
35 "Bar Variant with i32"
36 )
37 ),
30 lookup: None, 38 lookup: None,
31 insert_text: None, 39 insert_text: None,
32 insert_text_format: PlainText, 40 insert_text_format: PlainText,
33 source_range: [47; 47), 41 source_range: [116; 116),
34 text_edit: None 42 text_edit: None
35 } 43 }
36] 44]