From c0f5d21a888aa49f3b8e5633ffe72547b134d308 Mon Sep 17 00:00:00 2001 From: Nianyu Shen Date: Wed, 4 Mar 2026 20:41:47 -0800 Subject: [PATCH] lsp: Add semantic token rules for Go (#50641) gopls reports Go `const` declarations as `variable` with the `readonly` modifier. Add a Go-specific semantic token rule to map this to the `constant` theme style, matching VS Code's behavior. image Closes #50642 Before you mark this PR as ready for review, make sure that you have: - [x] Added a solid test coverage and/or screenshots from doing manual testing - [x] Done a self-review taking into account security and performance aspects - [x] Aligned any UI changes with the [UI checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) Release Notes: - N/A *or* Added/Fixed/Improved ... --- crates/languages/src/go.rs | 11 +++++++++++ crates/languages/src/go/semantic_token_rules.json | 7 +++++++ crates/languages/src/lib.rs | 1 + 3 files changed, 19 insertions(+) create mode 100644 crates/languages/src/go/semantic_token_rules.json diff --git a/crates/languages/src/go.rs b/crates/languages/src/go.rs index 581159503ce8aaf642b62789cb895858f1f963c2..5942a51f2a481b66cc8ba46072bd28c8285cbc07 100644 --- a/crates/languages/src/go.rs +++ b/crates/languages/src/go.rs @@ -11,6 +11,7 @@ use lsp::{LanguageServerBinary, LanguageServerName}; use project::lsp_store::language_server_settings; use regex::Regex; use serde_json::{Value, json}; +use settings::SemanticTokenRules; use smol::fs; use std::{ borrow::Cow, @@ -27,6 +28,16 @@ use std::{ use task::{TaskTemplate, TaskTemplates, TaskVariables, VariableName}; use util::{ResultExt, fs::remove_matching, maybe, merge_json_value_into}; +use crate::LanguageDir; + +pub(crate) fn semantic_token_rules() -> SemanticTokenRules { + let content = LanguageDir::get("go/semantic_token_rules.json") + .expect("missing go/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 go semantic_token_rules.json") +} + fn server_binary_arguments() -> Vec { vec!["-mode=stdio".into()] } diff --git a/crates/languages/src/go/semantic_token_rules.json b/crates/languages/src/go/semantic_token_rules.json new file mode 100644 index 0000000000000000000000000000000000000000..627a5c5f187b47918e6a56069c5ed1bda8583aa6 --- /dev/null +++ b/crates/languages/src/go/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 4c291b86982a8cb1aa153aa0c036b3d169621339..275b8c58ecde831c8f89ae688dc236583b135c07 100644 --- a/crates/languages/src/lib.rs +++ b/crates/languages/src/lib.rs @@ -141,6 +141,7 @@ pub fn init(languages: Arc, fs: Arc, node: NodeRuntime name: "go", adapters: vec![go_lsp_adapter.clone()], context: Some(go_context_provider.clone()), + semantic_token_rules: Some(go::semantic_token_rules()), ..Default::default() }, LanguageInfo {