From e5a69d89497e37cca1a7e7407225d3b0c142d5b0 Mon Sep 17 00:00:00 2001
From: ozacod <47009516+ozacod@users.noreply.github.com>
Date: Mon, 16 Mar 2026 10:35:29 +0300
Subject: [PATCH] lsp: Add clangd readonly token modifier to semantic token
rules to highlight constant variables as constant (#49065)
Clangd uses the "readonly" token modifier instead of "constant".
Therefore, "readonly" should be mapped to highlight constant variables
as constants.
Before:
After:
- [x] Code Reviewed
- [x] Manual QA
Release Notes:
- Added clangd readonly token modifier to semantic token rules to
highlight constant variables as constant.
Co-authored-by: ozacod
---
crates/languages/src/cpp.rs | 12 ++++++++++++
crates/languages/src/cpp/semantic_token_rules.json | 7 +++++++
crates/languages/src/lib.rs | 1 +
3 files changed, 20 insertions(+)
create mode 100644 crates/languages/src/cpp/semantic_token_rules.json
diff --git a/crates/languages/src/cpp.rs b/crates/languages/src/cpp.rs
index 85a3fb5045275648282c7a8cbad58779491ad7dc..3207b492f4b11be345cd67a989f9667d025d6660 100644
--- a/crates/languages/src/cpp.rs
+++ b/crates/languages/src/cpp.rs
@@ -1,3 +1,15 @@
+use settings::SemanticTokenRules;
+
+use crate::LanguageDir;
+
+pub(crate) fn semantic_token_rules() -> SemanticTokenRules {
+ let content = LanguageDir::get("cpp/semantic_token_rules.json")
+ .expect("missing cpp/semantic_token_rules.json");
+ let json = std::str::from_utf8(&content.data).expect("invalid utf-8 in semantic_token_rules");
+ settings::parse_json_with_comments::(json)
+ .expect("failed to parse cpp semantic_token_rules.json")
+}
+
#[cfg(test)]
mod tests {
use gpui::{AppContext as _, BorrowAppContext, TestAppContext};
diff --git a/crates/languages/src/cpp/semantic_token_rules.json b/crates/languages/src/cpp/semantic_token_rules.json
new file mode 100644
index 0000000000000000000000000000000000000000..627a5c5f187b47918e6a56069c5ed1bda8583aa6
--- /dev/null
+++ b/crates/languages/src/cpp/semantic_token_rules.json
@@ -0,0 +1,7 @@
+[
+ {
+ "token_type": "variable",
+ "token_modifiers": ["readonly"],
+ "style": ["constant"]
+ }
+]
diff --git a/crates/languages/src/lib.rs b/crates/languages/src/lib.rs
index 275b8c58ecde831c8f89ae688dc236583b135c07..240935d2f817b43b2aae03dfdff4321de6522bf3 100644
--- a/crates/languages/src/lib.rs
+++ b/crates/languages/src/lib.rs
@@ -125,6 +125,7 @@ pub fn init(languages: Arc, fs: Arc, node: NodeRuntime
LanguageInfo {
name: "cpp",
adapters: vec![c_lsp_adapter],
+ semantic_token_rules: Some(cpp::semantic_token_rules()),
..Default::default()
},
LanguageInfo {