Skip to content

Commit dbb677d

Browse files
authored
Merge pull request rust-lang#237 from Xanewok/fill-completion-item-kind-from-racer
Provide CompletionItem.kind for Racer completions
2 parents c8c1af9 + 4f006f3 commit dbb677d

File tree

3 files changed

+45
-7
lines changed

3 files changed

+45
-7
lines changed

src/actions/mod.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,10 +240,7 @@ impl ActionHandler {
240240
let location = pos_to_racer_location(params.position);
241241
let results = racer::complete_from_file(file_path, location, &session);
242242

243-
results.map(|comp| CompletionItem::new_simple(
244-
comp.matchstr.clone(),
245-
comp.contextstr.clone(),
246-
)).collect()
243+
results.map(|comp| completion_item_from_racer_match(comp)).collect()
247244
}).unwrap_or_else(|_| vec![]);
248245

249246
out.success(id, ResponseData::CompletionItems(result));

src/lsp_data.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use analysis::raw;
1616
use hyper::Url;
1717
use serde::Serialize;
1818
use span;
19+
use racer;
1920

2021
pub use ls_types::*;
2122

@@ -122,6 +123,39 @@ pub fn source_kind_from_def_kind(k: raw::DefKind) -> SymbolKind {
122123
}
123124
}
124125

126+
pub fn completion_kind_from_match_type(m : racer::MatchType) -> CompletionItemKind {
127+
match m {
128+
racer::MatchType::Crate |
129+
racer::MatchType::Module => CompletionItemKind::Module,
130+
racer::MatchType::Struct => CompletionItemKind::Class,
131+
racer::MatchType::Enum => CompletionItemKind::Enum,
132+
racer::MatchType::StructField |
133+
racer::MatchType::EnumVariant => CompletionItemKind::Field,
134+
racer::MatchType::Macro |
135+
racer::MatchType::Function |
136+
racer::MatchType::FnArg |
137+
racer::MatchType::Impl => CompletionItemKind::Function,
138+
racer::MatchType::Type |
139+
racer::MatchType::Trait |
140+
racer::MatchType::TraitImpl => CompletionItemKind::Interface,
141+
racer::MatchType::Let |
142+
racer::MatchType::IfLet |
143+
racer::MatchType::WhileLet |
144+
racer::MatchType::For |
145+
racer::MatchType::MatchArm |
146+
racer::MatchType::Const |
147+
racer::MatchType::Static => CompletionItemKind::Variable,
148+
racer::MatchType::Builtin => CompletionItemKind::Keyword,
149+
}
150+
}
151+
152+
pub fn completion_item_from_racer_match(m : racer::Match) -> CompletionItem {
153+
let mut item = CompletionItem::new_simple(m.matchstr.clone(), m.contextstr.clone());
154+
item.kind = Some(completion_kind_from_match_type(m.mtype));
155+
156+
item
157+
}
158+
125159
/* ----------------- JSON-RPC protocol types ----------------- */
126160

127161
/// An event-like (no response needed) notification message.

src/test/mod.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,11 @@ fn test_completion() {
398398
("capabilities", "null".to_owned()),
399399
("rootPath", root_path)]),
400400
Message::new("textDocument/completion",
401-
vec![("textDocument", text_doc),
402-
("position", cache.mk_ls_position(src(&source_file_path, 22, "rld")))])];
401+
vec![("textDocument", text_doc.to_owned()),
402+
("position", cache.mk_ls_position(src(&source_file_path, 22, "rld")))]),
403+
Message::new("textDocument/completion",
404+
vec![("textDocument", text_doc.to_owned()),
405+
("position", cache.mk_ls_position(src(&source_file_path, 25, "x)")))])];
403406
let (server, results) = mock_server(messages);
404407
// Initialise and build.
405408
assert_eq!(ls_server::LsService::handle_message(server.clone()),
@@ -410,7 +413,11 @@ fn test_completion() {
410413

411414
assert_eq!(ls_server::LsService::handle_message(server.clone()),
412415
ls_server::ServerStateChange::Continue);
413-
expect_messages(results.clone(), &[ExpectedMessage::new(Some(42)).expect_contains("[{\"label\":\"world\",\"detail\":\"let world = \\\"world\\\";\"}]")]);
416+
expect_messages(results.clone(), &[ExpectedMessage::new(Some(42)).expect_contains("[{\"label\":\"world\",\"kind\":6,\"detail\":\"let world = \\\"world\\\";\"}]")]);
417+
418+
assert_eq!(ls_server::LsService::handle_message(server.clone()),
419+
ls_server::ServerStateChange::Continue);
420+
expect_messages(results.clone(), &[ExpectedMessage::new(Some(42)).expect_contains("[{\"label\":\"x\",\"kind\":5,\"detail\":\"u64\"}]")]);
414421
}
415422

416423
#[test]

0 commit comments

Comments
 (0)