about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <lukas@zed.dev>2025-08-22 08:58:48 +0200
committerLukas Wirth <lukas@zed.dev>2025-08-22 09:00:25 +0200
commitcf478a02c74aac664cc2e2cfa7ce91e50be1d3a4 (patch)
treea1f3671415a7691ccb3ace2e7f0d1f43237d4408
parente90138632de9cec54f417b4712a8d1a7f5416ef8 (diff)
downloadrust-cf478a02c74aac664cc2e2cfa7ce91e50be1d3a4.tar.gz
rust-cf478a02c74aac664cc2e2cfa7ce91e50be1d3a4.zip
Fix panic in syntax_highlighting
-rw-r--r--src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs4
-rw-r--r--src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs52
2 files changed, 29 insertions, 27 deletions
diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs
index e3dc3ed3c74..f98770805a4 100644
--- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting.rs
@@ -452,10 +452,10 @@ fn traverse(
                 }
                 hl
             }
-            NodeOrToken::Token(token) => {
+            NodeOrToken::Token(token) => salsa::attach(sema.db, || {
                 highlight::token(sema, token, edition, &is_unsafe_node, tt_level > 0)
                     .zip(Some(None))
-            }
+            }),
         };
         if let Some((mut highlight, binding_hash)) = element {
             if is_unlinked && highlight.tag == HlTag::UnresolvedReference {
diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs
index fb33307249a..7785891169c 100644
--- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs
@@ -5,7 +5,7 @@ use std::mem;
 use either::Either;
 use hir::{EditionedFileId, HirFileId, InFile, Semantics, sym};
 use ide_db::{
-    SymbolKind, active_parameter::ActiveParameter, defs::Definition,
+    SymbolKind, active_parameter::ActiveParameter, base_db::salsa, defs::Definition,
     documentation::docs_with_rangemap, rust_doc::is_rust_fence,
 };
 use syntax::{
@@ -126,32 +126,34 @@ pub(super) fn doc_comment(
 
     // Extract intra-doc links and emit highlights for them.
     if let Some((docs, doc_mapping)) = docs_with_rangemap(sema.db, &attributes) {
-        extract_definitions_from_docs(&docs)
-            .into_iter()
-            .filter_map(|(range, link, ns)| {
-                doc_mapping
-                    .map(range)
-                    .filter(|(mapping, _)| mapping.file_id == src_file_id)
-                    .and_then(|(InFile { value: mapped_range, .. }, attr_id)| {
-                        Some(mapped_range).zip(resolve_doc_path_for_def(
-                            sema.db,
-                            def,
-                            &link,
-                            ns,
-                            attr_id.is_inner_attr(),
-                        ))
+        salsa::attach(sema.db, || {
+            extract_definitions_from_docs(&docs)
+                .into_iter()
+                .filter_map(|(range, link, ns)| {
+                    doc_mapping
+                        .map(range)
+                        .filter(|(mapping, _)| mapping.file_id == src_file_id)
+                        .and_then(|(InFile { value: mapped_range, .. }, attr_id)| {
+                            Some(mapped_range).zip(resolve_doc_path_for_def(
+                                sema.db,
+                                def,
+                                &link,
+                                ns,
+                                attr_id.is_inner_attr(),
+                            ))
+                        })
+                })
+                .for_each(|(range, def)| {
+                    hl.add(HlRange {
+                        range,
+                        highlight: module_def_to_hl_tag(def)
+                            | HlMod::Documentation
+                            | HlMod::Injected
+                            | HlMod::IntraDocLink,
+                        binding_hash: None,
                     })
-            })
-            .for_each(|(range, def)| {
-                hl.add(HlRange {
-                    range,
-                    highlight: module_def_to_hl_tag(def)
-                        | HlMod::Documentation
-                        | HlMod::Injected
-                        | HlMod::IntraDocLink,
-                    binding_hash: None,
                 })
-            });
+        });
     }
 
     // Extract doc-test sources from the docs and calculate highlighting for them.