test: lsp exportable completion

This commit is contained in:
blindfs 2025-03-08 21:08:18 +08:00
parent a65b6eff74
commit ecb28096f2
6 changed files with 114 additions and 0 deletions

1
Cargo.lock generated
View File

@ -3828,6 +3828,7 @@ dependencies = [
"nu-glob",
"nu-parser",
"nu-protocol",
"nu-std",
"nu-test-support",
"nucleo-matcher",
"serde",

View File

@ -27,6 +27,7 @@ url = { workspace = true }
nu-cmd-lang = { path = "../nu-cmd-lang", version = "0.102.1" }
nu-command = { path = "../nu-command", version = "0.102.1" }
nu-engine = { path = "../nu-engine", version = "0.102.1" }
nu-std = { path = "../nu-std", version = "0.102.1" }
nu-test-support = { path = "../nu-test-support", version = "0.102.1" }
assert-json-diff = "2.0"

View File

@ -547,4 +547,96 @@ mod tests {
])
);
}
#[test]
fn complete_use_arguments() {
let (client_connection, _recv) = initialize_language_server(None, None);
let mut script = fixtures();
script.push("lsp");
script.push("completion");
script.push("use.nu");
let script = path_to_uri(&script);
open_unchecked(&client_connection, script.clone());
let resp = send_complete_request(&client_connection, script.clone(), 4, 17);
assert_json_include!(
actual: result_from_message(resp),
expected: serde_json::json!([
{
"label": "std-rfc",
"labelDetails": { "description": "module" },
"textEdit": {
"newText": "std-rfc",
"range": { "start": { "character": 11, "line": 4 }, "end": { "character": 17, "line": 4 } }
},
"kind": 9 // module kind
}
])
);
let resp = send_complete_request(&client_connection, script.clone(), 5, 22);
assert_json_include!(
actual: result_from_message(resp),
expected: serde_json::json!([
{
"label": "clip",
"labelDetails": { "description": "module" },
"textEdit": {
"newText": "clip",
"range": { "start": { "character": 19, "line": 5 }, "end": { "character": 23, "line": 5 } }
},
"kind": 9 // module kind
}
])
);
let resp = send_complete_request(&client_connection, script.clone(), 5, 35);
assert_json_include!(
actual: result_from_message(resp),
expected: serde_json::json!([
{
"label": "paste",
"labelDetails": { "description": "custom" },
"textEdit": {
"newText": "paste",
"range": { "start": { "character": 32, "line": 5 }, "end": { "character": 37, "line": 5 } }
},
"kind": 2
}
])
);
let resp = send_complete_request(&client_connection, script.clone(), 6, 14);
assert_json_include!(
actual: result_from_message(resp),
expected: serde_json::json!([
{
"label": "null_device ",
"labelDetails": { "description": "variable" },
"textEdit": {
"newText": "null_device ",
"range": { "start": { "character": 8, "line": 6 }, "end": { "character": 14, "line": 6 } }
},
"kind": 6 // variable kind
}
])
);
let resp = send_complete_request(&client_connection, script, 7, 13);
assert_json_include!(
actual: result_from_message(resp),
expected: serde_json::json!([
{
"label": "foo",
"labelDetails": { "description": "variable" },
"textEdit": {
"newText": "foo",
"range": { "start": { "character": 11, "line": 7 }, "end": { "character": 14, "line": 7 } }
},
"kind": 6 // variable kind
}
])
);
}
}

View File

@ -655,6 +655,7 @@ mod tests {
TextDocumentPositionParams, WorkDoneProgressParams,
};
use nu_protocol::{debugger::WithoutDebug, engine::Stack, PipelineData, ShellError, Value};
use nu_std::load_standard_library;
use nu_test_support::fs::fixtures;
use std::sync::mpsc::{self, Receiver};
use std::time::Duration;
@ -671,6 +672,7 @@ mod tests {
let engine_state = nu_cmd_lang::create_default_context();
let mut engine_state = nu_command::add_shell_command_context(engine_state);
engine_state.generate_nu_constant();
assert!(load_standard_library(&mut engine_state).is_ok());
let cwd = std::env::current_dir().expect("Could not get current working directory.");
engine_state.add_env_var(
"PWD".into(),

View File

@ -80,7 +80,17 @@ impl LanguageServer {
if sp < last_span {
continue;
}
<<<<<<< HEAD
let mut delta_start = range.start.character;
=======
// in case the start position is at the end of last line
let real_start_char = if range.end.line != range.start.line {
0
} else {
range.start.character
};
let mut delta_start = real_start_char;
>>>>>>> 5fa8f68d0 (test: lsp exportable completion)
if range.end.line == last_token_line {
delta_start -= last_token_char;
}

8
tests/fixtures/lsp/completion/use.nu vendored Normal file
View File

@ -0,0 +1,8 @@
export module "🤔🐘" {
export const foo = "🤔🐘";
}
export use std-rf
export use std-rfc/clip [ copy, paste ]
use std null_d
use 🤔🐘 [ foo, ]