Skip to content

Commit 5964750

Browse files
bors[bot]iDawer
andauthored
Merge #10264
10264: fix: Don't seek outside of character boundaries in completion handler r=Veykril a=iDawer Fixes #10219 panic when entering `:` in `$0` places: ```rust fn main() { "⊞$0"; } ``` ```rust struct S { д$0 u8 } ``` Co-authored-by: Dawer <[email protected]>
2 parents 00b1984 + 0ff271d commit 5964750

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

crates/rust-analyzer/src/handlers.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use lsp_types::{
2727
use project_model::TargetKind;
2828
use serde_json::json;
2929
use stdx::{format_to, never};
30-
use syntax::{algo, ast, AstNode, TextRange, TextSize};
30+
use syntax::{algo, ast, AstNode, TextRange, TextSize, T};
3131

3232
use crate::{
3333
cargo_target_spec::CargoTargetSpec,
@@ -727,16 +727,13 @@ pub(crate) fn handle_completion(
727727
let completion_triggered_after_single_colon = {
728728
let mut res = false;
729729
if let Some(ctx) = params.context {
730-
if ctx.trigger_character.unwrap_or_default() == ":" {
730+
if ctx.trigger_character.as_deref() == Some(":") {
731731
let source_file = snap.analysis.parse(position.file_id)?;
732-
let syntax = source_file.syntax();
733-
let text = syntax.text();
734-
if let Some(next_char) = text.char_at(position.offset) {
735-
let diff = TextSize::of(next_char) + TextSize::of(':');
736-
let prev_char = position.offset - diff;
737-
if text.char_at(prev_char) != Some(':') {
738-
res = true;
739-
}
732+
let left_token =
733+
source_file.syntax().token_at_offset(position.offset).left_biased();
734+
match left_token {
735+
Some(left_token) => res = left_token.kind() == T![:],
736+
None => res = true,
740737
}
741738
}
742739
}

0 commit comments

Comments
 (0)