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: before After: 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 {