Skip to content

Commit e7197f4

Browse files
refactor: update vue.rs
add settings to explicitly specify the path to `@vue/language-server` and the parent directory of `package.json`
1 parent 28a6a4f commit e7197f4

File tree

1 file changed

+41
-14
lines changed

1 file changed

+41
-14
lines changed

src/vue.rs

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::collections::HashMap;
2+
use std::path::PathBuf;
23
use std::{env, fs};
34

45
use serde::Deserialize;
@@ -23,26 +24,53 @@ struct PackageJson {
2324
dev_dependencies: HashMap<String, String>,
2425
}
2526

27+
#[derive(Debug, Deserialize)]
28+
struct Settings {
29+
#[serde(default)]
30+
server_path: String,
31+
#[serde(default)]
32+
package_json_path: String,
33+
}
34+
2635
struct VueExtension {
2736
did_find_server: bool,
37+
settings: Settings,
2838
}
2939

3040
impl VueExtension {
3141
fn server_exists(&self) -> bool {
32-
fs::metadata(SERVER_PATH).map_or(false, |stat| stat.is_file())
42+
log::info!(
43+
"[vue] settings || server = {} pkg = {}",
44+
self.settings.server_path,
45+
self.settings.package_json_path
46+
);
47+
fs::metadata(self.settings.server_path.as_str()).map_or(false, |stat| stat.is_file())
3348
}
3449

3550
fn server_script_path(
3651
&mut self,
3752
language_server_id: &zed::LanguageServerId,
3853
worktree: &zed::Worktree,
3954
) -> Result<String> {
40-
let server_exists = self.server_exists();
55+
let mut server_exists = self.server_exists();
4156
if self.did_find_server && server_exists {
4257
self.install_typescript_if_needed(worktree)?;
4358
self.install_ts_plugin_if_needed()?;
44-
return Ok(SERVER_PATH.to_string());
59+
return Ok(self.settings.server_path.to_string());
4560
}
61+
let lsp_settings = LspSettings::for_worktree("vue", worktree)
62+
.ok()
63+
.and_then(|settings| settings.settings)
64+
.unwrap_or_else(|| json!({}));
65+
self.settings = serde_json::from_value(lsp_settings).unwrap_or(Settings {
66+
server_path: SERVER_PATH.to_string(),
67+
package_json_path: ".".to_string(),
68+
});
69+
println!(
70+
"settings ! server = {} ; pkg = {}",
71+
self.settings.server_path, self.settings.package_json_path
72+
);
73+
server_exists = self.server_exists();
4674

4775
zed::set_language_server_installation_status(
4876
language_server_id,
@@ -59,24 +87,18 @@ impl VueExtension {
5987
);
6088
let result = zed::npm_install_package(PACKAGE_NAME, &version);
6189
match result {
62-
Ok(()) => {
63-
if !self.server_exists() {
64-
Err(format!(
65-
"installed package '{PACKAGE_NAME}' did not contain expected path '{SERVER_PATH}'",
66-
))?;
67-
}
68-
}
6990
Err(error) => {
7091
if !self.server_exists() {
7192
Err(error)?;
7293
}
7394
}
95+
_ => {}
7496
}
7597
}
7698

7799
self.install_typescript_if_needed(worktree)?;
78100
self.did_find_server = true;
79-
Ok(SERVER_PATH.to_string())
101+
Ok(self.settings.server_path.to_string())
80102
}
81103

82104
/// Returns whether a local copy of TypeScript exists in the worktree.
@@ -132,7 +154,9 @@ impl VueExtension {
132154
}
133155

134156
fn get_ts_plugin_root_path(&self, worktree: &zed::Worktree) -> Result<Option<String>> {
135-
let package_json = worktree.read_text_file("package.json")?;
157+
let pbuf = PathBuf::from(self.settings.package_json_path.to_string()).join("package.json");
158+
159+
let package_json = worktree.read_text_file(pbuf.to_string_lossy().to_string().as_str())?;
136160
let package_json: PackageJson = serde_json::from_str(&package_json)
137161
.map_err(|err| format!("failed to parse package.json: {err}"))?;
138162

@@ -159,6 +183,10 @@ impl zed::Extension for VueExtension {
159183
fn new() -> Self {
160184
Self {
161185
did_find_server: false,
186+
settings: Settings {
187+
server_path: SERVER_PATH.to_string(),
188+
package_json_path: ".".to_string(),
189+
},
162190
}
163191
}
164192

@@ -171,8 +199,7 @@ impl zed::Extension for VueExtension {
171199
Ok(zed::Command {
172200
command: zed::node_binary_path()?,
173201
args: vec![
174-
env::current_dir()
175-
.unwrap()
202+
PathBuf::from(worktree.root_path())
176203
.join(&server_path)
177204
.to_string_lossy()
178205
.to_string(),

0 commit comments

Comments
 (0)