3 use std::{collections::HashMap, time::Instant};
6 CodeActionContext, DidOpenTextDocumentParams, DocumentFormattingParams, FormattingOptions,
7 Position, Range, TextDocumentItem, TextDocumentPositionParams,
9 use ra_lsp_server::req::{
10 CodeActionParams, CodeActionRequest, Completion, CompletionParams, DidOpenTextDocument,
11 Formatting, OnEnter, Runnables, RunnablesParams,
14 use tempfile::TempDir;
16 use crate::support::{project, Project};
18 const LOG: &'static str = "";
19 const PROFILE: &'static str = "";
20 // const PROFILE: &'static str = "*@3>100";
23 fn completes_items_from_standard_library() {
24 let project_start = Instant::now();
25 let server = Project::with_fixture(
33 use std::collections::Spam;
38 server.wait_until_workspace_is_loaded();
39 eprintln!("loading took {:?}", project_start.elapsed());
40 let completion_start = Instant::now();
41 let res = server.send_request::<Completion>(CompletionParams {
42 text_document_position: TextDocumentPositionParams::new(
43 server.doc_id("src/lib.rs"),
48 assert!(format!("{}", res).contains("HashMap"));
49 eprintln!("completion took {:?}", completion_start.elapsed());
53 fn test_runnables_no_project() {
62 server.wait_until_workspace_is_loaded();
63 server.request::<Runnables>(
64 RunnablesParams { text_document: server.doc_id("lib.rs"), position: None },
67 "args": [ "test", "--", "foo", "--nocapture" ],
69 "env": { "RUST_BACKTRACE": "short" },
73 "end": { "character": 1, "line": 2 },
74 "start": { "character": 0, "line": 0 }
85 "label": "cargo check --all",
102 fn test_runnables_project() {
112 //- foo/tests/spam.rs
125 let server = Project::with_fixture(code).root("foo").root("bar").server();
127 server.wait_until_workspace_is_loaded();
128 server.request::<Runnables>(
130 text_document: server.doc_id("foo/tests/spam.rs"),
135 "args": [ "test", "--package", "foo", "--test", "spam", "--", "test_eggs", "--nocapture" ],
137 "env": { "RUST_BACKTRACE": "short" },
138 "label": "test test_eggs",
140 "end": { "character": 17, "line": 1 },
141 "start": { "character": 0, "line": 0 }
143 "cwd": server.path().join("foo")
155 "cwd": server.path().join("foo"),
156 "label": "cargo check -p foo",
173 fn test_format_document() {
174 let server = project(
186 pub use std::collections::HashMap;
189 server.wait_until_workspace_is_loaded();
191 server.request::<Formatting>(
192 DocumentFormattingParams {
193 text_document: server.doc_id("src/lib.rs"),
194 options: FormattingOptions {
196 insert_spaces: false,
197 properties: HashMap::new(),
202 "newText": r#"mod bar;
206 pub use std::collections::HashMap;
224 fn test_missing_module_code_action() {
225 let server = project(
238 server.wait_until_workspace_is_loaded();
239 let empty_context = || CodeActionContext { diagnostics: Vec::new(), only: None };
240 server.request::<CodeActionRequest>(
242 text_document: server.doc_id("src/lib.rs"),
243 range: Range::new(Position::new(0, 4), Position::new(0, 7)),
244 context: empty_context(),
251 "cursorPosition": null,
252 "label": "create module",
257 "uri": "file:///[..]/src/bar.rs"
263 "command": "rust-analyzer.applySourceChange",
264 "title": "create module"
266 "title": "create module"
271 server.request::<CodeActionRequest>(
273 text_document: server.doc_id("src/lib.rs"),
274 range: Range::new(Position::new(2, 4), Position::new(2, 7)),
275 context: empty_context(),
282 fn test_missing_module_code_action_in_json_project() {
283 let tmp_dir = TempDir::new().unwrap();
285 let path = tmp_dir.path();
287 let project = json!({
289 "crates": [ { "root_module": path.join("src/lib.rs"), "deps": [], "edition": "2015" } ]
294 //- rust-project.json
302 PROJECT = project.to_string(),
305 let server = Project::with_fixture(&code).tmp_dir(tmp_dir).server();
307 server.wait_until_workspace_is_loaded();
308 let empty_context = || CodeActionContext { diagnostics: Vec::new(), only: None };
309 server.request::<CodeActionRequest>(
311 text_document: server.doc_id("src/lib.rs"),
312 range: Range::new(Position::new(0, 4), Position::new(0, 7)),
313 context: empty_context(),
320 "cursorPosition": null,
321 "label": "create module",
326 "uri": "file:///[..]/src/bar.rs"
332 "command": "rust-analyzer.applySourceChange",
333 "title": "create module"
335 "title": "create module"
340 server.request::<CodeActionRequest>(
342 text_document: server.doc_id("src/lib.rs"),
343 range: Range::new(Position::new(2, 4), Position::new(2, 7)),
344 context: empty_context(),
351 fn diagnostics_dont_block_typing() {
352 let librs: String = (0..10).map(|i| format!("mod m{};", i)).collect();
353 let libs: String = (0..10).map(|i| format!("//- src/m{}.rs\nfn foo() {{}}\n\n", i)).collect();
354 let server = Project::with_fixture(&format!(
373 server.wait_until_workspace_is_loaded();
375 server.notification::<DidOpenTextDocument>(DidOpenTextDocumentParams {
376 text_document: TextDocumentItem {
377 uri: server.doc_id(&format!("src/m{}.rs", i)).uri,
378 language_id: "rust".to_string(),
380 text: "/// Docs\nfn foo() {}".to_string(),
384 let start = std::time::Instant::now();
385 server.request::<OnEnter>(
386 TextDocumentPositionParams {
387 text_document: server.doc_id("src/m0.rs"),
388 position: Position { line: 0, character: 5 },
392 "position": { "character": 4, "line": 1 },
393 "textDocument": { "uri": "file:///[..]src/m0.rs" }
403 "end": { "character": 5, "line": 0 },
404 "start": { "character": 5, "line": 0 }
408 "textDocument": { "uri": "file:///[..]src/m0.rs", "version": null }
414 let elapsed = start.elapsed();
415 assert!(elapsed.as_millis() < 2000, "typing enter took {:?}", elapsed);
419 fn preserves_dos_line_endings() {
420 let server = Project::with_fixture(
428 /// Some Docs\r\nfn main() {}
433 server.request::<OnEnter>(
434 TextDocumentPositionParams {
435 text_document: server.doc_id("src/main.rs"),
436 position: Position { line: 0, character: 8 },
440 "position": { "line": 1, "character": 4 },
441 "textDocument": { "uri": "file:///[..]src/main.rs" }
449 "newText": "\r\n/// ",
451 "end": { "line": 0, "character": 8 },
452 "start": { "line": 0, "character": 8 }
456 "textDocument": { "uri": "file:///[..]src/main.rs", "version": null }