Skip to content

Commit b2bf41b

Browse files
bors[bot]matklad
andcommitted
Merge #1334
1334: check for cancellation during macro expansion r=matklad a=matklad closes #1331 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 0d1c607 + a2845bb commit b2bf41b

File tree

4 files changed

+87
-1
lines changed

4 files changed

+87
-1
lines changed

crates/ra_hir/src/ids.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ impl HirFileId {
6161
db: &impl DefDatabase,
6262
file_id: HirFileId,
6363
) -> Option<TreeArc<SyntaxNode>> {
64+
db.check_canceled();
6465
let _p = profile("parse_or_expand_query");
6566
match file_id.0 {
6667
HirFileIdRepr::File(file_id) => Some(db.parse(file_id).syntax().to_owned()),

crates/ra_ide_api/src/change.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ impl RootDatabase {
156156
pub(crate) fn apply_change(&mut self, change: AnalysisChange) {
157157
let _p = profile("RootDatabase::apply_change");
158158
log::info!("apply_change {:?}", change);
159+
{
160+
let _p = profile("RootDatabase::apply_change/cancellation");
161+
self.salsa_runtime().next_revision();
162+
}
159163
if !change.new_roots.is_empty() {
160164
let mut local_roots = Vec::clone(&self.local_roots());
161165
for (root_id, is_local) in change.new_roots {

crates/ra_lsp_server/tests/heavy_tests/main.rs

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@ use std::{
66
};
77

88
use lsp_types::{
9-
CodeActionContext, DocumentFormattingParams, FormattingOptions, Position, Range,
9+
CodeActionContext, DocumentFormattingParams, FormattingOptions, Position, Range, DidOpenTextDocumentParams, TextDocumentItem, TextDocumentPositionParams
1010
};
1111
use ra_lsp_server::req::{
1212
CodeActionParams, CodeActionRequest, Formatting, Runnables, RunnablesParams, CompletionParams, Completion,
13+
DidOpenTextDocument, OnEnter,
1314
};
1415
use serde_json::json;
1516
use tempfile::TempDir;
1617

1718
use crate::support::{project, Project};
1819

1920
const LOG: &'static str = "";
21+
const PROFILE: &'static str = "*@3>100";
2022

2123
#[test]
2224
fn completes_items_from_standard_library() {
@@ -341,3 +343,68 @@ fn main() {{}}
341343
json!([]),
342344
);
343345
}
346+
347+
#[test]
348+
fn diagnostics_dont_block_typing() {
349+
let librs: String = (0..10).map(|i| format!("mod m{};", i)).collect();
350+
let libs: String = (0..10).map(|i| format!("//- src/m{}.rs\nfn foo() {{}}\n\n", i)).collect();
351+
let server = project(&format!(
352+
r#"
353+
//- Cargo.toml
354+
[package]
355+
name = "foo"
356+
version = "0.0.0"
357+
358+
//- src/lib.rs
359+
{}
360+
361+
{}
362+
363+
fn main() {{}}
364+
"#,
365+
librs, libs
366+
));
367+
server.wait_until_workspace_is_loaded();
368+
for i in 0..10 {
369+
server.notification::<DidOpenTextDocument>(DidOpenTextDocumentParams {
370+
text_document: TextDocumentItem {
371+
uri: server.doc_id(&format!("src/m{}.rs", i)).uri,
372+
language_id: "rust".to_string(),
373+
version: 0,
374+
text: "/// Docs\nfn foo() {}".to_string(),
375+
},
376+
});
377+
}
378+
let start = std::time::Instant::now();
379+
server.request::<OnEnter>(
380+
TextDocumentPositionParams {
381+
text_document: server.doc_id("src/m0.rs"),
382+
position: Position { line: 0, character: 5 },
383+
},
384+
json!({
385+
"cursorPosition": {
386+
"position": { "character": 4, "line": 1 },
387+
"textDocument": { "uri": "file:///[..]src/m0.rs" }
388+
},
389+
"label": "on enter",
390+
"workspaceEdit": {
391+
"documentChanges": [
392+
{
393+
"edits": [
394+
{
395+
"newText": "\n/// ",
396+
"range": {
397+
"end": { "character": 5, "line": 0 },
398+
"start": { "character": 5, "line": 0 }
399+
}
400+
}
401+
],
402+
"textDocument": { "uri": "file:///[..]src/m0.rs", "version": null }
403+
}
404+
]
405+
}
406+
}),
407+
);
408+
let elapsed = start.elapsed();
409+
assert!(elapsed.as_millis() < 2000, "typing enter took {:?}", elapsed);
410+
}

crates/ra_lsp_server/tests/heavy_tests/support.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ impl<'a> Project<'a> {
5252
static INIT: Once = Once::new();
5353
INIT.call_once(|| {
5454
let _ = Logger::with_env_or_str(crate::LOG).start().unwrap();
55+
ra_prof::set_filter(if crate::PROFILE.is_empty() {
56+
ra_prof::Filter::disabled()
57+
} else {
58+
ra_prof::Filter::from_spec(&crate::PROFILE)
59+
});
5560
});
5661

5762
let mut paths = vec![];
@@ -121,6 +126,15 @@ impl Server {
121126
TextDocumentIdentifier { uri: Url::from_file_path(path).unwrap() }
122127
}
123128

129+
pub fn notification<N>(&self, params: N::Params)
130+
where
131+
N: Notification,
132+
N::Params: Serialize,
133+
{
134+
let r = RawNotification::new::<N>(&params);
135+
self.send_notification(r)
136+
}
137+
124138
pub fn request<R>(&self, params: R::Params, expected_resp: Value)
125139
where
126140
R: Request,

0 commit comments

Comments
 (0)