1
1
mirror of https://github.com/tweag/nickel.git synced 2024-10-06 16:18:08 +03:00

Add support for completion requests to the lsp harness (#1404)

* Add support for completion requests to the lsp harness

* Fix warning

* Add missing tests

* Apparently completion order is non-deterministic
This commit is contained in:
jneem 2023-06-30 19:37:18 +07:00 committed by GitHub
parent 6d6a74381a
commit 99531e68ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 79 additions and 3 deletions

View File

@ -4,8 +4,8 @@ mod output;
pub use jsonrpc::Server;
use log::error;
use lsp_types::{
GotoDefinitionParams, Location, Position, Range, TextDocumentIdentifier,
TextDocumentPositionParams, Url,
CompletionContext, CompletionParams, GotoDefinitionParams, Location, Position, Range,
TextDocumentIdentifier, TextDocumentPositionParams, Url,
};
pub use output::LspDebug;
@ -34,6 +34,7 @@ pub struct TestFile {
/// A subset of LSP requests that our harness supports.
pub enum Request {
GotoDefinition(GotoDefinitionParams),
Completion(CompletionParams),
}
/// A private FromStr, with simpler error handling and (because it's
@ -92,6 +93,28 @@ impl Parse for Request {
work_done_progress_params: Default::default(),
partial_result_params: Default::default(),
})),
// The format of a Completion request is the file:line:char location,
// followed by an optional trigger character.
"Completion" => {
let (pos, context) = if let Some((pos, trigger)) = params.split_once(' ') {
(
pos,
Some(CompletionContext {
trigger_kind: lsp_types::CompletionTriggerKind::TriggerCharacter,
trigger_character: Some(trigger.to_owned()),
}),
)
} else {
(params, None)
};
Some(Request::Completion(CompletionParams {
text_document_position: TextDocumentPositionParams::parse(pos)?,
work_done_progress_params: Default::default(),
partial_result_params: Default::default(),
context,
}))
}
_ => None,
}
}

View File

@ -85,3 +85,27 @@ impl LspDebug for lsp_types::GotoDefinitionResponse {
}
}
}
impl LspDebug for lsp_types::CompletionItem {
fn debug(&self, mut w: impl Write) -> std::io::Result<()> {
write!(w, "{}", self.label)
}
}
impl LspDebug for lsp_types::CompletionResponse {
fn debug(&self, w: impl Write) -> std::io::Result<()> {
match self {
lsp_types::CompletionResponse::Array(items) => {
// The order of completions is non-deterministic, so sort them.
let mut items = items.clone();
items.sort_by_key(|i| i.label.clone());
Iter(items.iter()).debug(w)
}
lsp_types::CompletionResponse::List(list) => {
let mut items = list.items.clone();
items.sort_by_key(|i| i.label.clone());
Iter(list.items.iter()).debug(w)
}
}
}
}

View File

@ -0,0 +1,17 @@
### /completion-basic.ncl
let config = {
version = "1.2",
verified = { really = true },
foo = "bar",
}
in
{
a = config.version,
b = config.verified.really,
}
### Completion /completion-basic.ncl:7:12
### Completion /completion-basic.ncl:7:15 .
### Completion /completion-basic.ncl:8:15 .
### Completion /completion-basic.ncl:8:23
### Completion /completion-basic.ncl:8:24 .
### Completion /completion-basic.ncl:8:27

View File

@ -1,5 +1,5 @@
use assert_cmd::cargo::CommandCargoExt;
use lsp_types::request::{GotoDefinition, Request as LspRequest};
use lsp_types::request::{Completion, GotoDefinition, Request as LspRequest};
use nickel_lang_utils::project_root::project_root;
use test_generator::test_resources;
@ -32,6 +32,7 @@ impl TestHarness {
fn request_dyn(&mut self, req: Request) {
match req {
Request::GotoDefinition(d) => self.request::<GotoDefinition>(d),
Request::Completion(c) => self.request::<Completion>(c),
}
}

View File

@ -0,0 +1,11 @@
---
source: lsp/nls/tests/main.rs
expression: output
---
[a, b, config]
[foo, verified, version]
[foo, verified, version]
[foo, verified, version]
[really]
[really]