Skip to content
This repository was archived by the owner on Dec 29, 2022. It is now read-only.

Commit 5479c16

Browse files
authored
Merge pull request #661 from alexheretic/fix-rustc-cwd
Add `test_hover_after_src_line_change` and fix rustc-cwd
2 parents 3486c78 + 47dc8a8 commit 5479c16

File tree

4 files changed

+135
-16
lines changed

4 files changed

+135
-16
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.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ env_logger = "0.4"
1515
failure = "0.1.1"
1616
jsonrpc-core = "8.0.1"
1717
languageserver-types = "0.27"
18-
lazy_static = "0.2"
18+
lazy_static = "1"
1919
log = "0.3"
2020
racer = "2.0.12"
2121
rls-analysis = "0.10"

src/build/plan.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -331,17 +331,13 @@ impl JobQueue {
331331
// to Cargo (which we do currently) in `prepare_work`
332332
assert!(self.0.is_empty() == false);
333333

334-
let build_dir = internals
335-
.compilation_cx
336-
.lock()
337-
.unwrap()
338-
.build_dir
339-
.clone()
340-
.unwrap();
341-
342334
let mut compiler_messages = vec![];
343335
let mut analyses = vec![];
344-
let mut cwd = PathBuf::from(".");
336+
let (build_dir, mut cwd) = {
337+
let comp_cx = internals.compilation_cx.lock().unwrap();
338+
(comp_cx.build_dir.clone().unwrap(), comp_cx.cwd.clone())
339+
};
340+
345341
// Go through cached compiler invocations sequentially, collecting each
346342
// invocation's compiler messages for diagnostics and analysis data
347343
while let Some(job) = self.dequeue() {
@@ -358,22 +354,26 @@ impl JobQueue {
358354
&internals.vfs,
359355
&args,
360356
job.get_envs(),
361-
None,
357+
cwd.as_ref().map(|p| &**p),
362358
&build_dir,
363359
internals.config.clone(),
364360
internals.env_lock.as_facade(),
365361
) {
366362
BuildResult::Success(c, mut messages, mut analysis) => {
367363
compiler_messages.append(&mut messages);
368364
analyses.append(&mut analysis);
369-
cwd = c;
365+
cwd = Some(c);
370366
}
371367
BuildResult::Err => return BuildResult::Err,
372368
_ => {}
373369
}
374370
}
375371

376-
BuildResult::Success(cwd, compiler_messages, analyses)
372+
BuildResult::Success(
373+
cwd.unwrap_or_else(|| PathBuf::from(".")),
374+
compiler_messages,
375+
analyses,
376+
)
377377
}
378378
}
379379

src/test/mod.rs

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ extern crate json;
1717
mod harness;
1818

1919
use analysis;
20-
use actions::requests;
20+
use actions::{requests, notifications};
2121
use config::{Config, Inferrable};
22-
use server::{self as ls_server, Request, ShutdownRequest};
22+
use server::{self as ls_server, Request, ShutdownRequest, Notification};
2323
use jsonrpc_core;
2424
use vfs;
2525

@@ -90,6 +90,13 @@ pub fn request<'a, T: ls_server::RequestAction>(id: usize, params: T::Params) ->
9090
}
9191
}
9292

93+
fn notification<'a, A: ls_server::BlockingNotificationAction>(params: A::Params) -> Notification<A> {
94+
Notification {
95+
params,
96+
_action: PhantomData,
97+
}
98+
}
99+
93100
#[test]
94101
fn test_shutdown() {
95102
let mut env = Environment::new("common");
@@ -226,6 +233,118 @@ fn test_hover() {
226233
);
227234
}
228235

236+
/// Test hover continues to work after the source has moved line
237+
#[test]
238+
fn test_hover_after_src_line_change() {
239+
let mut env = Environment::new("common");
240+
241+
let source_file_path = Path::new("src").join("main.rs");
242+
243+
let root_path = env.cache.abs_path(Path::new("."));
244+
let url = Url::from_file_path(env.cache.abs_path(&source_file_path))
245+
.expect("couldn't convert file path to URL");
246+
247+
let world_src_pos = env.cache.mk_ls_position(src(&source_file_path, 21, "world"));
248+
let world_src_pos_after = Position {
249+
line: world_src_pos.line + 1,
250+
..world_src_pos
251+
};
252+
253+
let messages = vec![
254+
initialize(0, root_path.as_os_str().to_str().map(|x| x.to_owned())).to_string(),
255+
256+
request::<requests::Hover>(
257+
11,
258+
TextDocumentPositionParams {
259+
text_document: TextDocumentIdentifier::new(url.clone()),
260+
position: world_src_pos,
261+
},
262+
).to_string(),
263+
264+
notification::<notifications::DidChangeTextDocument>(
265+
DidChangeTextDocumentParams {
266+
text_document: VersionedTextDocumentIdentifier {
267+
uri: url.clone(),
268+
version: Some(2),
269+
},
270+
content_changes: vec![TextDocumentContentChangeEvent {
271+
range: Some(Range {
272+
start: Position { line: 19, character: 15 },
273+
end: Position { line: 19, character: 15 },
274+
}),
275+
range_length: Some(0),
276+
text: "\n ".into(),
277+
}],
278+
},
279+
).to_string(),
280+
281+
request::<requests::Hover>(
282+
13,
283+
TextDocumentPositionParams {
284+
text_document: TextDocumentIdentifier::new(url),
285+
position: world_src_pos_after,
286+
},
287+
).to_string(),
288+
];
289+
290+
let (mut server, results) = env.mock_server(messages);
291+
// Initialize and build.
292+
assert_eq!(
293+
ls_server::LsService::handle_message(&mut server),
294+
ls_server::ServerStateChange::Continue
295+
);
296+
expect_messages(
297+
results.clone(),
298+
&[
299+
ExpectedMessage::new(Some(0)).expect_contains("capabilities"),
300+
ExpectedMessage::new(None).expect_contains("beginBuild"),
301+
ExpectedMessage::new(None).expect_contains("diagnosticsBegin"),
302+
ExpectedMessage::new(None).expect_contains("diagnosticsEnd"),
303+
],
304+
);
305+
306+
// first hover over unmodified
307+
assert_eq!(
308+
ls_server::LsService::handle_message(&mut server),
309+
ls_server::ServerStateChange::Continue
310+
);
311+
expect_messages(
312+
results.clone(),
313+
&[
314+
ExpectedMessage::new(Some(11))
315+
.expect_contains(r#"[{"language":"rust","value":"&str"}]"#),
316+
],
317+
);
318+
319+
// handle didChange notification and wait for rebuild
320+
assert_eq!(
321+
ls_server::LsService::handle_message(&mut server),
322+
ls_server::ServerStateChange::Continue
323+
);
324+
325+
expect_messages(
326+
results.clone(),
327+
&[
328+
ExpectedMessage::new(None).expect_contains("beginBuild"),
329+
ExpectedMessage::new(None).expect_contains("diagnosticsBegin"),
330+
ExpectedMessage::new(None).expect_contains("diagnosticsEnd"),
331+
],
332+
);
333+
334+
// hover after line change should work at the new line
335+
assert_eq!(
336+
ls_server::LsService::handle_message(&mut server),
337+
ls_server::ServerStateChange::Continue
338+
);
339+
expect_messages(
340+
results.clone(),
341+
&[
342+
ExpectedMessage::new(Some(13))
343+
.expect_contains(r#"[{"language":"rust","value":"&str"}]"#),
344+
],
345+
);
346+
}
347+
229348
#[test]
230349
fn test_workspace_symbol() {
231350
let mut env = Environment::new("workspace_symbol");

0 commit comments

Comments
 (0)