Skip to content

Commit eeae383

Browse files
authored
feat: add lsp config support (#24)
1 parent c3efa30 commit eeae383

3 files changed

Lines changed: 90 additions & 2 deletions

File tree

src/language_servers/scss_lsp.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::{env, fs};
22

3-
use zed_extension_api::{self as zed, LanguageServerId, Result};
3+
use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result};
44

55
const SERVER_PATH: &str =
66
"node_modules/vscode-langservers-extracted/bin/vscode-css-language-server";
@@ -90,4 +90,30 @@ impl SCSSLsp {
9090
self.did_find_server = true;
9191
Ok(SERVER_PATH.to_string())
9292
}
93+
94+
pub fn language_server_initialization_options(
95+
&mut self,
96+
language_server_id: &LanguageServerId,
97+
worktree: &zed::Worktree,
98+
) -> Result<Option<zed::serde_json::Value>> {
99+
let options = LspSettings::for_worktree(language_server_id.as_ref(), worktree)
100+
.ok()
101+
.and_then(|lsp_settings| lsp_settings.initialization_options);
102+
Ok(options)
103+
}
104+
105+
pub fn language_server_workspace_configuration(
106+
&mut self,
107+
language_server_id: &LanguageServerId,
108+
worktree: &zed::Worktree,
109+
) -> 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()))
117+
}
118+
}
93119
}

src/language_servers/some_sass.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::{env, fs};
22

3-
use zed_extension_api::{self as zed, LanguageServerId, Result};
3+
use zed_extension_api::{self as zed, settings::LspSettings, LanguageServerId, Result};
44

55
const SERVER_PATH: &str = "node_modules/some-sass-language-server/bin/some-sass-language-server";
66
const PACKAGE_NAME: &str = "some-sass-language-server";
@@ -89,4 +89,30 @@ impl SomeSass {
8989
self.did_find_server = true;
9090
Ok(SERVER_PATH.to_string())
9191
}
92+
93+
pub fn language_server_initialization_options(
94+
&mut self,
95+
language_server_id: &LanguageServerId,
96+
worktree: &zed::Worktree,
97+
) -> Result<Option<zed::serde_json::Value>> {
98+
let options = LspSettings::for_worktree(language_server_id.as_ref(), worktree)
99+
.ok()
100+
.and_then(|lsp_settings| lsp_settings.initialization_options);
101+
Ok(options)
102+
}
103+
104+
pub fn language_server_workspace_configuration(
105+
&mut self,
106+
language_server_id: &LanguageServerId,
107+
worktree: &zed::Worktree,
108+
) -> 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()))
116+
}
117+
}
92118
}

src/scss.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,41 @@ impl zed::Extension for SCSSExtension {
3434
language_server_id => Err(format!("unknown language server: {language_server_id}")),
3535
}
3636
}
37+
38+
fn language_server_initialization_options(
39+
&mut self,
40+
language_server_id: &LanguageServerId,
41+
worktree: &zed::Worktree,
42+
) -> Result<Option<zed::serde_json::Value>> {
43+
match language_server_id.as_ref() {
44+
SomeSass::LANGUAGE_SERVER_ID => {
45+
let some_sass = self.some_sass.get_or_insert_with(|| SomeSass::new());
46+
some_sass.language_server_initialization_options(language_server_id, worktree)
47+
}
48+
SCSSLsp::LANGUAGE_SERVER_ID => {
49+
let scss_lsp = self.scss_lsp.get_or_insert_with(|| SCSSLsp::new());
50+
scss_lsp.language_server_initialization_options(language_server_id, worktree)
51+
}
52+
_ => Ok(None),
53+
}
54+
}
55+
56+
fn language_server_workspace_configuration(
57+
&mut self,
58+
language_server_id: &LanguageServerId,
59+
worktree: &zed::Worktree,
60+
) -> Result<Option<zed::serde_json::Value>> {
61+
match language_server_id.as_ref() {
62+
SomeSass::LANGUAGE_SERVER_ID => {
63+
let some_sass = self.some_sass.get_or_insert_with(|| SomeSass::new());
64+
some_sass.language_server_workspace_configuration(language_server_id, worktree)
65+
}
66+
SCSSLsp::LANGUAGE_SERVER_ID => {
67+
let scss_lsp = self.scss_lsp.get_or_insert_with(|| SCSSLsp::new());
68+
scss_lsp.language_server_workspace_configuration(language_server_id, worktree)
69+
}
70+
_ => Ok(None),
71+
}
72+
}
3773
}
3874
zed::register_extension!(SCSSExtension);

0 commit comments

Comments
 (0)