diff --git a/assets/settings/default.json b/assets/settings/default.json index fd6362eba1e9216d123898761ea2f5d95f676de9..d3fb32fd438eddd42ca5bf69815cf66d618ad570 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -2029,6 +2029,9 @@ "remove_trailing_whitespace_on_save": false, "ensure_final_newline_on_save": false, }, + "EEx": { + "language_servers": ["elixir-ls", "!expert", "!next-ls", "!lexical", "..."], + }, "Elixir": { "language_servers": ["elixir-ls", "!expert", "!next-ls", "!lexical", "..."], }, @@ -2055,7 +2058,7 @@ "allowed": true, }, }, - "HEEX": { + "HEEx": { "language_servers": ["elixir-ls", "!expert", "!next-ls", "!lexical", "..."], }, "HTML": { diff --git a/crates/extensions_ui/src/extension_suggest.rs b/crates/extensions_ui/src/extension_suggest.rs index 47d1092eacabb8f49593cb266ece7c8401cf3f3e..c78db92c2fd3b24ceb78c7a33b4ab177be483b9d 100644 --- a/crates/extensions_ui/src/extension_suggest.rs +++ b/crates/extensions_ui/src/extension_suggest.rs @@ -22,7 +22,7 @@ const SUGGESTIONS_BY_EXTENSION_ID: &[(&str, &[&str])] = &[ ("dart", &["dart"]), ("dockerfile", &["Dockerfile"]), ("elisp", &["el"]), - ("elixir", &["ex", "exs", "heex"]), + ("elixir", &["eex", "ex", "exs", "heex", "leex", "neex"]), ("elm", &["elm"]), ("erlang", &["erl", "hrl"]), ("fish", &["fish"]), diff --git a/crates/languages/src/lib.rs b/crates/languages/src/lib.rs index 071a288d79c3afd467944106fd3535be94db0f0f..9987e7bfab327b39e639036ae68d6dedb5d548d9 100644 --- a/crates/languages/src/lib.rs +++ b/crates/languages/src/lib.rs @@ -299,7 +299,7 @@ pub fn init(languages: Arc, fs: Arc, node: NodeRuntime "CSS", "ERB", "HTML+ERB", - "HEEX", + "HEEx", "HTML", "JavaScript", "TypeScript", diff --git a/crates/languages/src/tailwind.rs b/crates/languages/src/tailwind.rs index a74275af9631eea603cc957d44867d7d53327682..c78790b74c81c9a7fce89425f4499d41f343189e 100644 --- a/crates/languages/src/tailwind.rs +++ b/crates/languages/src/tailwind.rs @@ -197,11 +197,8 @@ impl LspAdapter for TailwindLspAdapter { "typescriptreact".to_string(), ), (LanguageName::new_static("Svelte"), "svelte".to_string()), - ( - LanguageName::new_static("Elixir"), - "phoenix-heex".to_string(), - ), - (LanguageName::new_static("HEEX"), "phoenix-heex".to_string()), + (LanguageName::new_static("Elixir"), "elixir".to_string()), + (LanguageName::new_static("HEEx"), "heex".to_string()), (LanguageName::new_static("ERB"), "erb".to_string()), (LanguageName::new_static("HTML+ERB"), "erb".to_string()), (LanguageName::new_static("PHP"), "php".to_string()), diff --git a/crates/migrator/src/migrations.rs b/crates/migrator/src/migrations.rs index 2b4a9e6219e009116e313271c17b0eb2dd2b1723..d554ee1dd887d6048f55a584ed2534db944b3c08 100644 --- a/crates/migrator/src/migrations.rs +++ b/crates/migrator/src/migrations.rs @@ -305,6 +305,12 @@ pub(crate) mod m_2026_02_25 { pub(crate) use settings::migrate_builtin_agent_servers_to_registry; } +pub(crate) mod m_2026_03_16 { + mod settings; + + pub(crate) use settings::SETTINGS_PATTERNS; +} + pub(crate) mod m_2026_03_23 { mod keymap; diff --git a/crates/migrator/src/migrations/m_2026_03_16/settings.rs b/crates/migrator/src/migrations/m_2026_03_16/settings.rs new file mode 100644 index 0000000000000000000000000000000000000000..203d29df904d110d8c7b5ffdb257bb28d3eee601 --- /dev/null +++ b/crates/migrator/src/migrations/m_2026_03_16/settings.rs @@ -0,0 +1,50 @@ +use std::ops::Range; +use tree_sitter::{Query, QueryMatch}; + +use crate::MigrationPatterns; +use crate::patterns::SETTINGS_NESTED_KEY_VALUE_PATTERN; + +pub const SETTINGS_PATTERNS: MigrationPatterns = + &[(SETTINGS_NESTED_KEY_VALUE_PATTERN, rename_heex_settings)]; + +fn rename_heex_settings( + contents: &str, + mat: &QueryMatch, + query: &Query, +) -> Option<(Range, String)> { + if !is_heex_settings(contents, mat, query) { + return None; + } + + let setting_name_ix = query.capture_index_for_name("setting_name")?; + let setting_name_range = mat + .nodes_for_capture_index(setting_name_ix) + .next()? + .byte_range(); + + Some((setting_name_range, "HEEx".to_string())) +} + +fn is_heex_settings(contents: &str, mat: &QueryMatch, query: &Query) -> bool { + let parent_key_ix = match query.capture_index_for_name("parent_key") { + Some(ix) => ix, + None => return false, + }; + let parent_range = match mat.nodes_for_capture_index(parent_key_ix).next() { + Some(node) => node.byte_range(), + None => return false, + }; + if contents.get(parent_range) != Some("languages") { + return false; + } + + let setting_name_ix = match query.capture_index_for_name("setting_name") { + Some(ix) => ix, + None => return false, + }; + let setting_name_range = match mat.nodes_for_capture_index(setting_name_ix).next() { + Some(node) => node.byte_range(), + None => return false, + }; + contents.get(setting_name_range) == Some("HEEX") +} diff --git a/crates/migrator/src/migrator.rs b/crates/migrator/src/migrator.rs index 0f84e3761a63af3d959f6a49b907090cd4376dca..ceb6ec2e0e35f0dd3bbd23174637bba00baab6b3 100644 --- a/crates/migrator/src/migrator.rs +++ b/crates/migrator/src/migrator.rs @@ -243,6 +243,10 @@ pub fn migrate_settings(text: &str) -> Result> { MigrationType::Json(migrations::m_2026_02_03::migrate_experimental_sweep_mercury), MigrationType::Json(migrations::m_2026_02_04::migrate_tool_permission_defaults), MigrationType::Json(migrations::m_2026_02_25::migrate_builtin_agent_servers_to_registry), + MigrationType::TreeSitter( + migrations::m_2026_03_16::SETTINGS_PATTERNS, + &SETTINGS_QUERY_2026_03_16, + ), ]; run_migrations(text, migrations) } @@ -377,6 +381,10 @@ define_query!( SETTINGS_QUERY_2025_12_15, migrations::m_2025_12_15::SETTINGS_PATTERNS ); +define_query!( + SETTINGS_QUERY_2026_03_16, + migrations::m_2026_03_16::SETTINGS_PATTERNS +); define_query!( KEYMAP_QUERY_2026_03_23, migrations::m_2026_03_23::KEYMAP_PATTERNS diff --git a/crates/theme/src/icon_theme.rs b/crates/theme/src/icon_theme.rs index 121ff9d7d4fbd841315b89e631606c7e67bc5cde..c073442c46b1a52a14e09056e8aaa2c9b22e7d11 100644 --- a/crates/theme/src/icon_theme.rs +++ b/crates/theme/src/icon_theme.rs @@ -115,7 +115,7 @@ const FILE_SUFFIXES_BY_ICON_KEY: &[(&str, &[&str])] = &[ "xlsx", ], ), - ("elixir", &["eex", "ex", "exs", "heex"]), + ("elixir", &["eex", "ex", "exs", "heex", "leex", "neex"]), ("elm", &["elm"]), ( "erlang",