From 5ef04082040202c48ff4623701a6971e955ac749 Mon Sep 17 00:00:00 2001 From: bendn Date: Tue, 4 Aug 2026 16:03:32 +0700 Subject: [PATCH] return both matching braces --- crates/ide/src/lib.rs | 5 ++++- crates/ide/src/matching_brace.rs | 13 +++++++------ crates/rust-analyzer/src/handlers/request.rs | 8 ++++---- crates/rust-analyzer/src/lsp/ext.rs | 2 +- docs/book/src/contributing/lsp-extensions.md | 4 ++-- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs index bd09cb11ec05..7c778e52ca92 100644 --- a/crates/ide/src/lib.rs +++ b/crates/ide/src/lib.rs @@ -385,7 +385,10 @@ impl Analysis { /// Returns position of the matching brace (all types of braces are /// supported). - pub fn matching_brace(&self, position: FilePosition) -> Cancellable> { + pub fn matching_brace( + &self, + position: FilePosition, + ) -> Cancellable> { self.with_db(|db| { let file_id = EditionedFileId::current_edition(&self.db, position.file_id); let parse = file_id.parse(db); diff --git a/crates/ide/src/matching_brace.rs b/crates/ide/src/matching_brace.rs index 5079b0c4f917..27f63f6daa17 100644 --- a/crates/ide/src/matching_brace.rs +++ b/crates/ide/src/matching_brace.rs @@ -14,7 +14,7 @@ use syntax::{ // | VS Code | **rust-analyzer: Find matching brace** | // // ![Matching Brace](https://user-images.githubusercontent.com/48062697/113065573-04298180-91b1-11eb-8dec-d4e2a202f304.gif) -pub(crate) fn matching_brace(file: &SourceFile, offset: TextSize) -> Option { +pub(crate) fn matching_brace(file: &SourceFile, offset: TextSize) -> Option<(TextSize, TextSize)> { const BRACES: &[SyntaxKind] = &[T!['{'], T!['}'], T!['['], T![']'], T!['('], T![')'], T![<], T![>], T![|], T![|]]; let current = file.syntax().token_at_offset(offset); @@ -36,16 +36,17 @@ pub(crate) fn matching_brace(file: &SourceFile, offset: TextSize) -> Option pos, - Some(pos) => pos, + Some(pos) => pos.1, }; let actual = add_cursor(&before, new_pos); assert_eq_text!(after, &actual); diff --git a/crates/rust-analyzer/src/handlers/request.rs b/crates/rust-analyzer/src/handlers/request.rs index d88eb358d385..34f4c81e1637 100644 --- a/crates/rust-analyzer/src/handlers/request.rs +++ b/crates/rust-analyzer/src/handlers/request.rs @@ -396,7 +396,7 @@ pub(crate) fn handle_selection_range( pub(crate) fn handle_matching_brace( snap: GlobalStateSnapshot, params: lsp_ext::MatchingBraceParams, -) -> anyhow::Result> { +) -> anyhow::Result> { let _p = tracing::info_span!("handle_matching_brace").entered(); let file_id = try_default!(from_proto::file_id(&snap, ¶ms.text_document.uri)?); let line_index = snap.file_line_index(file_id)?; @@ -407,10 +407,10 @@ pub(crate) fn handle_matching_brace( let offset = from_proto::offset(&line_index, *position); offset.map(|offset| { let offset = match snap.analysis.matching_brace(FilePosition { file_id, offset }) { - Ok(Some(matching_brace_offset)) => matching_brace_offset, - Err(_) | Ok(None) => offset, + Ok(Some(matching_brace_offset)) => matching_brace_offset.into(), + Err(_) | Ok(None) => [offset; 2], }; - to_proto::position(&line_index, offset) + offset.map(|offset| to_proto::position(&line_index, offset)) }) }) .collect() diff --git a/crates/rust-analyzer/src/lsp/ext.rs b/crates/rust-analyzer/src/lsp/ext.rs index 8e0bb285c231..ceacdad4cceb 100644 --- a/crates/rust-analyzer/src/lsp/ext.rs +++ b/crates/rust-analyzer/src/lsp/ext.rs @@ -415,7 +415,7 @@ pub enum MatchingBraceRequest {} impl Request for MatchingBraceRequest { type Params = MatchingBraceParams; - type Result = Vec; + type Result = Vec<[Position; 2]>; const METHOD: LspRequestMethod<'_> = LspRequestMethod::new("experimental/matchingBrace"); const MESSAGE_DIRECTION: MessageDirection = MessageDirection::ClientToServer; } diff --git a/docs/book/src/contributing/lsp-extensions.md b/docs/book/src/contributing/lsp-extensions.md index da4a5aaa686c..cbdc1d6a33a0 100644 --- a/docs/book/src/contributing/lsp-extensions.md +++ b/docs/book/src/contributing/lsp-extensions.md @@ -1,5 +1,5 @@