Skip to content

Commit 46e8619

Browse files
committed
fix: normalize SCSS/Sass workspace configuration
Ensure vscode-css-language-server and some-sass receive non-null, root-keyed workspace config payloads to prevent missing diagnostics and config lookup failures. Fixes #31
1 parent 67e7390 commit 46e8619

4 files changed

Lines changed: 72 additions & 14 deletions

File tree

src/language_servers.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
mod config;
12
mod scss_lsp;
23
mod some_sass;
34

5+
pub use config::*;
46
pub use scss_lsp::*;
57
pub use some_sass::*;

src/language_servers/config.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId};
2+
3+
pub fn merge_json_value(target: &mut zed::serde_json::Value, source: zed::serde_json::Value) {
4+
match (target, source) {
5+
(zed::serde_json::Value::Object(target), zed::serde_json::Value::Object(source)) => {
6+
for (key, value) in source {
7+
merge_json_value(
8+
target.entry(key).or_insert(zed::serde_json::Value::Null),
9+
value,
10+
);
11+
}
12+
}
13+
(target, source) => *target = source,
14+
}
15+
}
16+
17+
pub fn settings_from_worktree(
18+
language_server_id: &LanguageServerId,
19+
worktree: &zed::Worktree,
20+
) -> Option<zed::serde_json::Value> {
21+
LspSettings::for_worktree(language_server_id.as_ref(), worktree)
22+
.ok()
23+
.and_then(|lsp_settings| {
24+
lsp_settings.settings.or_else(|| {
25+
lsp_settings
26+
.initialization_options
27+
.and_then(|opts| opts.get("settings").cloned())
28+
})
29+
})
30+
}

src/language_servers/scss_lsp.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use std::{env, fs};
22

33
use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result};
44

5+
use super::{merge_json_value, settings_from_worktree};
6+
57
const SERVER_PATH: &str =
68
"node_modules/vscode-langservers-extracted/bin/vscode-css-language-server";
79
const PACKAGE_NAME: &str = "vscode-langservers-extracted";
@@ -107,13 +109,30 @@ impl SCSSLsp {
107109
language_server_id: &LanguageServerId,
108110
worktree: &zed::Worktree,
109111
) -> Result<Option<zed::serde_json::Value>> {
110-
if let Ok(Some(settings)) = LspSettings::for_worktree(language_server_id.as_ref(), worktree)
111-
.map(|lsp_settings| lsp_settings.settings)
112-
{
113-
Ok(Some(settings))
114-
} else {
115-
self.language_server_initialization_options(language_server_id, worktree)
116-
.map(|init_options| init_options.and_then(|opts| opts.get("settings").cloned()))
112+
let mut config = zed::serde_json::json!({
113+
"css": {
114+
"lint": {}
115+
},
116+
"less": {
117+
"lint": {}
118+
},
119+
"scss": {
120+
"lint": {}
121+
}
122+
});
123+
124+
if let Some(settings) = settings_from_worktree(language_server_id, worktree) {
125+
let has_css_roots = settings.get("scss").is_some()
126+
|| settings.get("css").is_some()
127+
|| settings.get("less").is_some();
128+
129+
if has_css_roots {
130+
merge_json_value(&mut config, settings);
131+
} else if let Some(scss_config) = config.get_mut("scss") {
132+
merge_json_value(scss_config, settings);
133+
}
117134
}
135+
136+
Ok(Some(config))
118137
}
119138
}

src/language_servers/some_sass.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use std::{env, fs};
22

33
use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result};
44

5+
use super::{merge_json_value, settings_from_worktree};
6+
57
const SERVER_PATH: &str = "node_modules/some-sass-language-server/bin/some-sass-language-server";
68
const PACKAGE_NAME: &str = "some-sass-language-server";
79

@@ -106,13 +108,18 @@ impl SomeSass {
106108
language_server_id: &LanguageServerId,
107109
worktree: &zed::Worktree,
108110
) -> Result<Option<zed::serde_json::Value>> {
109-
if let Ok(Some(settings)) = LspSettings::for_worktree(language_server_id.as_ref(), worktree)
110-
.map(|lsp_settings| lsp_settings.settings)
111-
{
112-
Ok(Some(settings))
113-
} else {
114-
self.language_server_initialization_options(language_server_id, worktree)
115-
.map(|init_options| init_options.and_then(|opts| opts.get("settings").cloned()))
111+
let mut config = zed::serde_json::json!({
112+
"somesass": {}
113+
});
114+
115+
if let Some(settings) = settings_from_worktree(language_server_id, worktree) {
116+
if settings.get("somesass").is_some() {
117+
merge_json_value(&mut config, settings);
118+
} else if let Some(somesass_config) = config.get_mut("somesass") {
119+
merge_json_value(somesass_config, settings);
120+
}
116121
}
122+
123+
Ok(Some(config))
117124
}
118125
}

0 commit comments

Comments
 (0)