Compare commits

...

4 Commits

Author SHA1 Message Date
Smit Barmase
63416ab343 add vue to ts as lang 2025-09-22 10:52:54 +05:30
Smit Barmase
e736865c61 vue 3 comms initial idea working 2025-09-20 15:41:17 +05:30
Smit Barmase
feb9a84048 vtsls on vue 2025-09-20 15:28:46 +05:30
Smit Barmase
2029c9a0ef pass tsserver req from via to ts servers
Co-authored-by: MrSubidubi <dev@bahn.sh>
2025-09-20 15:28:46 +05:30
4 changed files with 86 additions and 1 deletions

View File

@@ -1769,7 +1769,7 @@
"use_on_type_format": false
},
"Vue.js": {
"language_servers": ["vue-language-server", "..."],
"language_servers": ["vue-language-server", "vtsls", "..."],
"prettier": {
"allowed": true
}

View File

@@ -753,6 +753,7 @@ impl LspAdapter for TypeScriptLspAdapter {
(LanguageName::new("TypeScript"), "typescript".into()),
(LanguageName::new("JavaScript"), "javascript".into()),
(LanguageName::new("TSX"), "typescriptreact".into()),
(LanguageName::new("Vue.js"), "vue".into()),
])
}
}

View File

@@ -14,6 +14,7 @@ pub mod json_language_server_ext;
pub mod log_store;
pub mod lsp_ext_command;
pub mod rust_analyzer_ext;
pub mod vue_language_server_ext;
use crate::{
CodeAction, ColorPresentation, Completion, CompletionDisplayOptions, CompletionResponse,
@@ -992,6 +993,7 @@ impl LocalLspStore {
})
.detach();
vue_language_server_ext::register_requests(this.clone(), language_server);
json_language_server_ext::register_requests(this.clone(), language_server);
rust_analyzer_ext::register_notifications(this.clone(), language_server);
clangd_ext::register_notifications(this, language_server, adapter);

View File

@@ -0,0 +1,82 @@
use anyhow::Context as _;
use gpui::{AppContext, WeakEntity};
use lsp::{LanguageServer, LanguageServerName};
use serde_json::json;
use crate::LspStore;
struct VueServerRequest;
struct TypescriptServerResponse;
impl lsp::notification::Notification for VueServerRequest {
type Params = [(u64, String, serde_json::Value); 1];
const METHOD: &'static str = "tsserver/request";
}
impl lsp::notification::Notification for TypescriptServerResponse {
type Params = serde_json::Value;
const METHOD: &'static str = "tsserver/response";
}
const VUE_SERVER_NAME: LanguageServerName = LanguageServerName::new_static("vue-language-server");
const VTSLS: LanguageServerName = LanguageServerName::new_static("vtsls");
const TS_LS: LanguageServerName = LanguageServerName::new_static("typescript-language-server");
pub fn register_requests(lsp_store: WeakEntity<LspStore>, language_server: &LanguageServer) {
let language_server_name = language_server.name();
if language_server_name == VUE_SERVER_NAME {
let vue_server_id = language_server.server_id();
language_server
.on_notification::<VueServerRequest, _>({
let this = lsp_store.clone();
move |params, cx| {
let this = this.clone();
let Ok(target_server) = this
.read_with(cx, |this, _| {
let language_server_id = this
.as_local()
.and_then(|local| {
local.language_server_ids.iter().find_map(|(seed, v)| {
[VTSLS, TS_LS].contains(&seed.name).then_some(v.id)
})
})
.context("Could not find language server")?;
this.language_server_for_id(language_server_id)
.context("language server not found")
})
.flatten()
else {
return;
};
let Some(vue_server) = this
.read_with(cx, |this, _| this.language_server_for_id(vue_server_id))
.ok()
.flatten()
else {
return;
};
let cx = cx.clone();
cx.background_spawn(async move {
let (request_id, command, arguments) = params[0].clone();
let tsserver_response = target_server
.request::<lsp::request::ExecuteCommand>(lsp::ExecuteCommandParams {
command: "typescript.tsserverRequest".to_owned(),
arguments: vec![serde_json::Value::String(command), arguments],
..Default::default()
})
.await;
if let util::ConnectionResult::Result(Ok(result)) = tsserver_response {
_ = vue_server.notify::<TypescriptServerResponse>(
&json!({ "id": request_id, "response": result }),
);
}
})
.detach();
}
})
.detach();
}
}