diff --git a/crates/settings_content/src/workspace.rs b/crates/settings_content/src/workspace.rs index 4a433a8aaaf148a3dabac8ba76a52d47f789c866..f3ac1f930ccc56f5a028136da78445d11ebfddab 100644 --- a/crates/settings_content/src/workspace.rs +++ b/crates/settings_content/src/workspace.rs @@ -805,6 +805,7 @@ pub struct ProjectPanelIndentGuidesSettings { MergeFrom, strum::VariantArray, strum::VariantNames, + strum::EnumMessage, )] #[serde(rename_all = "snake_case")] pub enum SemanticTokens { diff --git a/crates/settings_ui/src/page_data.rs b/crates/settings_ui/src/page_data.rs index 2e22b18e56ef8921c762b3eee3c076f13346c1fc..cb3a11317116c7965510490a6ce4f646be82f223 100644 --- a/crates/settings_ui/src/page_data.rs +++ b/crates/settings_ui/src/page_data.rs @@ -1,7 +1,8 @@ use gpui::{Action as _, App}; -use settings::{LanguageSettingsContent, SettingsContent}; -use std::sync::Arc; -use strum::IntoDiscriminant as _; +use itertools::Itertools as _; +use settings::{LanguageSettingsContent, SemanticTokens, SettingsContent}; +use std::sync::{Arc, OnceLock}; +use strum::{EnumMessage, IntoDiscriminant as _, VariantArray}; use ui::IntoElement; use crate::{ @@ -68,7 +69,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec { } fn general_page() -> SettingsPage { - fn general_settings_section() -> [SettingsPageItem; 9] { + fn general_settings_section() -> [SettingsPageItem; 8] { [ SettingsPageItem::SectionHeader("General Settings"), SettingsPageItem::SettingItem(SettingItem { @@ -187,30 +188,6 @@ fn general_page() -> SettingsPage { metadata: None, files: USER, }), - SettingsPageItem::SettingItem(SettingItem { - title: "Semantic Tokens", - description: "If semantic tokens from language servers should be rendered.", - field: Box::new(SettingField { - json_path: Some("semantic_tokens"), - pick: |settings_content| { - settings_content - .project - .all_languages - .defaults - .semantic_tokens - .as_ref() - }, - write: |settings_content, value| { - settings_content - .project - .all_languages - .defaults - .semantic_tokens = value; - }, - }), - metadata: None, - files: USER, - }), ] } fn security_section() -> [SettingsPageItem; 2] { @@ -8521,7 +8498,7 @@ fn language_settings_data() -> Box<[SettingsPageItem]> { /// LanguageSettings items that should be included in the "Languages & Tools" page /// not the "Editor" page fn non_editor_language_settings_data() -> Box<[SettingsPageItem]> { - fn lsp_section() -> [SettingsPageItem; 5] { + fn lsp_section() -> [SettingsPageItem; 6] { [ SettingsPageItem::SectionHeader("LSP"), SettingsPageItem::SettingItem(SettingItem { @@ -8603,6 +8580,41 @@ fn non_editor_language_settings_data() -> Box<[SettingsPageItem]> { metadata: None, files: USER, }), + SettingsPageItem::SettingItem(SettingItem { + title: "Semantic Tokens", + description: { + static DESCRIPTION: OnceLock<&'static str> = OnceLock::new(); + DESCRIPTION.get_or_init(|| { + SemanticTokens::VARIANTS + .iter() + .filter_map(|v| { + v.get_documentation().map(|doc| format!("{v:?}: {doc}")) + }) + .join("\n") + .leak() + }) + }, + field: Box::new(SettingField { + json_path: Some("languages.$(language).enable_language_server"), + pick: |settings_content| { + settings_content + .project + .all_languages + .defaults + .semantic_tokens + .as_ref() + }, + write: |settings_content, value| { + settings_content + .project + .all_languages + .defaults + .semantic_tokens = value; + }, + }), + metadata: None, + files: USER, + }), ] } diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index bed1fcc953eb95a76c11d039c3d10988eb985473..cb54f4fb7b3a7b6f20ac0b946218298448e40db5 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -1144,7 +1144,7 @@ fn render_settings_item( .child( v_flex() .relative() - .w_1_2() + .w_3_4() .child( h_flex() .w_full()