aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-05-27 12:45:41 +0100
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-05-27 12:45:41 +0100
commitb2bf41b2bac48edd53e3059adfba4a12b3c96aa0 (patch)
tree35b1737a82c1ae207fa9288341c82fb0e8a5cfd4
parent0d1c6076073c73f57340e256dc25da9d37311ef0 (diff)
parenta2845bb1f59e5f3d9f41012ace70037b783468ce (diff)
Merge #1334
1334: check for cancellation during macro expansion r=matklad a=matklad closes #1331 Co-authored-by: Aleksey Kladov <[email protected]>
-rw-r--r--crates/ra_hir/src/ids.rs1
-rw-r--r--crates/ra_ide_api/src/change.rs4
-rw-r--r--crates/ra_lsp_server/tests/heavy_tests/main.rs69
-rw-r--r--crates/ra_lsp_server/tests/heavy_tests/support.rs14
4 files changed, 87 insertions, 1 deletions
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs
index 2eb7f0da0..5c3799e95 100644
--- a/crates/ra_hir/src/ids.rs
+++ b/crates/ra_hir/src/ids.rs
@@ -61,6 +61,7 @@ impl HirFileId {
61 db: &impl DefDatabase, 61 db: &impl DefDatabase,
62 file_id: HirFileId, 62 file_id: HirFileId,
63 ) -> Option<TreeArc<SyntaxNode>> { 63 ) -> Option<TreeArc<SyntaxNode>> {
64 db.check_canceled();
64 let _p = profile("parse_or_expand_query"); 65 let _p = profile("parse_or_expand_query");
65 match file_id.0 { 66 match file_id.0 {
66 HirFileIdRepr::File(file_id) => Some(db.parse(file_id).syntax().to_owned()), 67 HirFileIdRepr::File(file_id) => Some(db.parse(file_id).syntax().to_owned()),
diff --git a/crates/ra_ide_api/src/change.rs b/crates/ra_ide_api/src/change.rs
index 2434f428f..0e64abdbd 100644
--- a/crates/ra_ide_api/src/change.rs
+++ b/crates/ra_ide_api/src/change.rs
@@ -156,6 +156,10 @@ impl RootDatabase {
156 pub(crate) fn apply_change(&mut self, change: AnalysisChange) { 156 pub(crate) fn apply_change(&mut self, change: AnalysisChange) {
157 let _p = profile("RootDatabase::apply_change"); 157 let _p = profile("RootDatabase::apply_change");
158 log::info!("apply_change {:?}", change); 158 log::info!("apply_change {:?}", change);
159 {
160 let _p = profile("RootDatabase::apply_change/cancellation");
161 self.salsa_runtime().next_revision();
162 }
159 if !change.new_roots.is_empty() { 163 if !change.new_roots.is_empty() {
160 let mut local_roots = Vec::clone(&self.local_roots()); 164 let mut local_roots = Vec::clone(&self.local_roots());
161 for (root_id, is_local) in change.new_roots { 165 for (root_id, is_local) in change.new_roots {
diff --git a/crates/ra_lsp_server/tests/heavy_tests/main.rs b/crates/ra_lsp_server/tests/heavy_tests/main.rs
index 6f37a980d..f61048aaf 100644
--- a/crates/ra_lsp_server/tests/heavy_tests/main.rs
+++ b/crates/ra_lsp_server/tests/heavy_tests/main.rs
@@ -6,10 +6,11 @@ use std::{
6}; 6};
7 7
8use lsp_types::{ 8use lsp_types::{
9 CodeActionContext, DocumentFormattingParams, FormattingOptions, Position, Range, 9 CodeActionContext, DocumentFormattingParams, FormattingOptions, Position, Range, DidOpenTextDocumentParams, TextDocumentItem, TextDocumentPositionParams
10}; 10};
11use ra_lsp_server::req::{ 11use ra_lsp_server::req::{
12 CodeActionParams, CodeActionRequest, Formatting, Runnables, RunnablesParams, CompletionParams, Completion, 12 CodeActionParams, CodeActionRequest, Formatting, Runnables, RunnablesParams, CompletionParams, Completion,
13 DidOpenTextDocument, OnEnter,
13}; 14};
14use serde_json::json; 15use serde_json::json;
15use tempfile::TempDir; 16use tempfile::TempDir;
@@ -17,6 +18,7 @@ use tempfile::TempDir;
17use crate::support::{project, Project}; 18use crate::support::{project, Project};
18 19
19const LOG: &'static str = ""; 20const LOG: &'static str = "";
21const PROFILE: &'static str = "*@3>100";
20 22
21#[test] 23#[test]
22fn completes_items_from_standard_library() { 24fn completes_items_from_standard_library() {
@@ -341,3 +343,68 @@ fn main() {{}}
341 json!([]), 343 json!([]),
342 ); 344 );
343} 345}
346
347#[test]
348fn 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]
355name = "foo"
356version = "0.0.0"
357
358//- src/lib.rs
359{}
360
361{}
362
363fn 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}
diff --git a/crates/ra_lsp_server/tests/heavy_tests/support.rs b/crates/ra_lsp_server/tests/heavy_tests/support.rs
index d68182174..729067395 100644
--- a/crates/ra_lsp_server/tests/heavy_tests/support.rs
+++ b/crates/ra_lsp_server/tests/heavy_tests/support.rs
@@ -52,6 +52,11 @@ impl<'a> Project<'a> {
52 static INIT: Once = Once::new(); 52 static INIT: Once = Once::new();
53 INIT.call_once(|| { 53 INIT.call_once(|| {
54 let _ = Logger::with_env_or_str(crate::LOG).start().unwrap(); 54 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 });
55 }); 60 });
56 61
57 let mut paths = vec![]; 62 let mut paths = vec![];
@@ -121,6 +126,15 @@ impl Server {
121 TextDocumentIdentifier { uri: Url::from_file_path(path).unwrap() } 126 TextDocumentIdentifier { uri: Url::from_file_path(path).unwrap() }
122 } 127 }
123 128
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
124 pub fn request<R>(&self, params: R::Params, expected_resp: Value) 138 pub fn request<R>(&self, params: R::Params, expected_resp: Value)
125 where 139 where
126 R: Request, 140 R: Request,