Skip to content

Commit d2f69ee

Browse files
committed
demonstrate race condition
1 parent 4a41883 commit d2f69ee

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

crates/rust-analyzer/src/global_state.rs

+5
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,11 @@ impl GlobalState {
552552
}
553553

554554
pub(crate) fn respond(&mut self, response: lsp_server::Response) {
555+
if let Some(err) = &response.error {
556+
if err.message.starts_with("TEST") {
557+
return;
558+
}
559+
}
555560
if let Some((method, start)) = self.req_queue.incoming.complete(&response.id) {
556561
if let Some(err) = &response.error {
557562
if err.message.starts_with("server panicked") {

crates/rust-analyzer/src/handlers/request.rs

+15-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use std::{
88
process::{self, Stdio},
99
};
1010

11-
use anyhow::Context;
11+
use anyhow::{bail, Context};
1212

1313
use ide::{
1414
AnnotationConfig, AssistKind, AssistResolveStrategy, Cancellable, CompletionFieldsToResolve,
@@ -21,11 +21,12 @@ use lsp_server::ErrorCode;
2121
use lsp_types::{
2222
CallHierarchyIncomingCall, CallHierarchyIncomingCallsParams, CallHierarchyItem,
2323
CallHierarchyOutgoingCall, CallHierarchyOutgoingCallsParams, CallHierarchyPrepareParams,
24-
CodeLens, CompletionItem, FoldingRange, FoldingRangeParams, HoverContents, InlayHint,
25-
InlayHintParams, Location, LocationLink, Position, PrepareRenameResponse, Range, RenameParams,
26-
ResourceOp, ResourceOperationKind, SemanticTokensDeltaParams, SemanticTokensFullDeltaResult,
27-
SemanticTokensParams, SemanticTokensRangeParams, SemanticTokensRangeResult,
28-
SemanticTokensResult, SymbolInformation, SymbolTag, TextDocumentIdentifier, Url, WorkspaceEdit,
24+
CodeLens, CompletionItem, CompletionTriggerKind, FoldingRange, FoldingRangeParams,
25+
HoverContents, InlayHint, InlayHintParams, Location, LocationLink, Position,
26+
PrepareRenameResponse, Range, RenameParams, ResourceOp, ResourceOperationKind,
27+
SemanticTokensDeltaParams, SemanticTokensFullDeltaResult, SemanticTokensParams,
28+
SemanticTokensRangeParams, SemanticTokensRangeResult, SemanticTokensResult, SymbolInformation,
29+
SymbolTag, TextDocumentIdentifier, Url, WorkspaceEdit,
2930
};
3031
use paths::Utf8PathBuf;
3132
use project_model::{CargoWorkspace, ManifestPath, ProjectWorkspaceKind, TargetKind};
@@ -1068,6 +1069,7 @@ pub(crate) fn handle_completion(
10681069
let _p = tracing::info_span!("handle_completion").entered();
10691070
let mut position = from_proto::file_position(&snap, text_document_position.clone())?;
10701071
let line_index = snap.file_line_index(position.file_id)?;
1072+
let context2 = context.clone();
10711073
let completion_trigger_character =
10721074
context.and_then(|ctx| ctx.trigger_character).and_then(|s| s.chars().next());
10731075

@@ -1083,6 +1085,11 @@ pub(crate) fn handle_completion(
10831085
None => return Ok(None),
10841086
Some(items) => items,
10851087
};
1088+
if context2.is_some_and(|ctx| {
1089+
ctx.trigger_kind == CompletionTriggerKind::TRIGGER_FOR_INCOMPLETE_COMPLETIONS
1090+
}) {
1091+
bail!("TEST")
1092+
}
10861093

10871094
let items = to_proto::completion_items(
10881095
&snap.config,
@@ -1145,12 +1152,14 @@ pub(crate) fn handle_completion_resolve(
11451152
resolved_completions,
11461153
);
11471154

1155+
tracing::error!("resolve {:?}", resolve_data.completion_item_index);
11481156
let mut resolved_completion =
11491157
if resolved_completions.get(resolve_data.completion_item_index).is_some() {
11501158
resolved_completions.swap_remove(resolve_data.completion_item_index)
11511159
} else {
11521160
return Ok(original_completion);
11531161
};
1162+
tracing::error!("resolve {:?}", resolved_completion.label);
11541163

11551164
if !resolve_data.imports.is_empty() {
11561165
let additional_edits = snap

crates/rust-analyzer/src/lsp/to_proto.rs

+6
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,12 @@ pub(crate) fn completion_items(
259259
res.sort_by(|item1, item2| item1.sort_text.cmp(&item2.sort_text));
260260
res.truncate(limit);
261261
}
262+
let len = res.len();
263+
264+
if len != 0 {
265+
tracing::error!("{}, {}", version.unwrap_or(0), version.unwrap_or(0) as usize % len);
266+
res.rotate_right(version.unwrap_or(0) as usize % len);
267+
}
262268

263269
res
264270
}

0 commit comments

Comments
 (0)