Skip to content

Commit e72ce0f

Browse files
authored
feat: add completion for keywords (#13)
1 parent a2d2feb commit e72ce0f

File tree

4 files changed

+40
-20
lines changed

4 files changed

+40
-20
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sample/simple.proto

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,3 @@ enum EnumSample {
5454
STARTED = 1;
5555
RUNNING = 1;
5656
}
57-

src/lsp.rs

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::ops::ControlFlow;
22
use tracing::{error, info};
33

44
use async_lsp::lsp_types::{
5+
CompletionItem, CompletionItemKind, CompletionOptions, CompletionParams, CompletionResponse,
56
DidChangeTextDocumentParams, DidCloseTextDocumentParams, DidOpenTextDocumentParams,
67
DidSaveTextDocumentParams, DocumentSymbolParams, DocumentSymbolResponse, GotoDefinitionParams,
78
GotoDefinitionResponse, Hover, HoverContents, HoverParams, HoverProviderCapability,
@@ -40,6 +41,7 @@ impl LanguageServer for ServerState {
4041
definition_provider: Some(OneOf::Left(true)),
4142
hover_provider: Some(HoverProviderCapability::Simple(true)),
4243
document_symbol_provider: Some(OneOf::Left(true)),
44+
completion_provider: Some(CompletionOptions::default()),
4345
..ServerCapabilities::default()
4446
},
4547
server_info: Some(ServerInfo {
@@ -79,6 +81,26 @@ impl LanguageServer for ServerState {
7981
}
8082
}
8183
}
84+
fn completion(
85+
&mut self,
86+
_params: CompletionParams,
87+
) -> BoxFuture<'static, Result<Option<CompletionResponse>, Self::Error>> {
88+
let keywords = vec![
89+
"syntax", "package", "option", "import", "service", "rpc", "returns", "message",
90+
"enum", "oneof", "repeated", "reserved", "to",
91+
];
92+
93+
let keywords = keywords
94+
.into_iter()
95+
.map(|w| CompletionItem {
96+
label: w.to_string(),
97+
kind: Some(CompletionItemKind::KEYWORD),
98+
..CompletionItem::default()
99+
})
100+
.collect();
101+
102+
Box::pin(async move { Ok(Some(CompletionResponse::Array(keywords))) })
103+
}
82104

83105
fn definition(
84106
&mut self,
@@ -103,6 +125,23 @@ impl LanguageServer for ServerState {
103125
}
104126
}
105127

128+
fn document_symbol(
129+
&mut self,
130+
params: DocumentSymbolParams,
131+
) -> BoxFuture<'static, Result<Option<DocumentSymbolResponse>, Self::Error>> {
132+
let uri = params.text_document.uri;
133+
134+
match self.get_parsed_tree_and_content(&uri) {
135+
Err(e) => Box::pin(async move { Err(e) }),
136+
Ok((tree, content)) => {
137+
let locations = tree.find_document_locations(content.as_bytes());
138+
let response = DocumentSymbolResponse::Nested(locations);
139+
140+
Box::pin(async move { Ok(Some(response)) })
141+
}
142+
}
143+
}
144+
106145
fn did_save(&mut self, _: DidSaveTextDocumentParams) -> Self::NotifyResult {
107146
ControlFlow::Continue(())
108147
}
@@ -152,21 +191,4 @@ impl LanguageServer for ServerState {
152191
}
153192
ControlFlow::Continue(())
154193
}
155-
156-
fn document_symbol(
157-
&mut self,
158-
params: DocumentSymbolParams,
159-
) -> BoxFuture<'static, Result<Option<DocumentSymbolResponse>, Self::Error>> {
160-
let uri = params.text_document.uri;
161-
162-
match self.get_parsed_tree_and_content(&uri) {
163-
Err(e) => Box::pin(async move { Err(e) }),
164-
Ok((tree, content)) => {
165-
let locations = tree.find_document_locations(content.as_bytes());
166-
let response = DocumentSymbolResponse::Nested(locations);
167-
168-
Box::pin(async move { Ok(Some(response)) })
169-
}
170-
}
171-
}
172194
}

src/parser.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,6 @@ message Foo {
352352
assert_eq!(diagnostics.uri, Url::parse(url).unwrap());
353353
assert_eq!(diagnostics.diagnostics.len(), 0);
354354

355-
356355
let url = "file://foo/bar.proto";
357356
let contents = r#"syntax = "proto3";
358357

0 commit comments

Comments
 (0)