feat(lsp): add Java and Vue language server defaults
This commit is contained in:
@@ -140,10 +140,10 @@ transcripts stay behind bounded handles through `agent_eval`. See
|
||||
[docs/SUBAGENTS.md](docs/SUBAGENTS.md).
|
||||
|
||||
The rest of the surface: LSP diagnostics after every edit (rust-analyzer,
|
||||
pyright, typescript-language-server, gopls, clangd), RLM sessions for
|
||||
batched analysis, MCP protocol, HTTP/SSE runtime API, persistent task
|
||||
queue, ACP adapter for Zed, SWE-bench export, and live cost tracking with
|
||||
cache hit/miss breakdowns.
|
||||
pyright, typescript-language-server, gopls, clangd, jdtls,
|
||||
vue-language-server), RLM sessions for batched analysis, MCP protocol,
|
||||
HTTP/SSE runtime API, persistent task queue, ACP adapter for Zed,
|
||||
SWE-bench export, and live cost tracking with cache hit/miss breakdowns.
|
||||
|
||||
---
|
||||
|
||||
|
||||
+1
-1
@@ -103,7 +103,7 @@ Fin——关闭思考的廉价 Flash 调用——每轮处理模型自动路由
|
||||
|
||||
子智能体并发运行(最多 20 个)。`agent_open` 立即返回;结果以内联完成哨兵形式到达,携带摘要。完整对话记录通过 `agent_eval` 的有界句柄保存。详见 [docs/SUBAGENTS.md](docs/SUBAGENTS.md)。
|
||||
|
||||
其余功能面:每次编辑后的 LSP 诊断(rust-analyzer、pyright、typescript-language-server、gopls、clangd)、RLM 会话批量分析、MCP 协议、HTTP/SSE 运行时 API、持久化任务队列、Zed 的 ACP 适配器、SWE-bench 导出、以及带缓存命中/未命中明细的实时成本追踪。
|
||||
其余功能面:每次编辑后的 LSP 诊断(rust-analyzer、pyright、typescript-language-server、gopls、clangd、jdtls、vue-language-server)、RLM 会话批量分析、MCP 协议、HTTP/SSE 运行时 API、持久化任务队列、Zed 的 ACP 适配器、SWE-bench 导出、以及带缓存命中/未命中明细的实时成本追踪。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -543,8 +543,13 @@ default_text_model = "deepseek-ai/deepseek-v4-pro"
|
||||
# go → gopls serve
|
||||
# python → pyright-langserver --stdio
|
||||
# typescript → typescript-language-server --stdio
|
||||
# java → jdtls
|
||||
# vue → vue-language-server --stdio
|
||||
# c, cpp → clangd
|
||||
#
|
||||
# Java support uses Eclipse JDT LS via the `jdtls` command. IntelliJ IDEA is
|
||||
# not required, and installing IntelliJ IDEA alone does not install `jdtls`.
|
||||
#
|
||||
# Override the defaults via the `servers` table below.
|
||||
[lsp]
|
||||
# enabled = true
|
||||
@@ -554,6 +559,8 @@ default_text_model = "deepseek-ai/deepseek-v4-pro"
|
||||
# [lsp.servers]
|
||||
# rust = ["rust-analyzer"]
|
||||
# go = ["gopls", "serve"]
|
||||
# java = ["jdtls"]
|
||||
# vue = ["vue-language-server", "--stdio"]
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────────
|
||||
# Hooks (optional)
|
||||
|
||||
@@ -18,6 +18,8 @@ pub enum Language {
|
||||
Python,
|
||||
TypeScript,
|
||||
JavaScript,
|
||||
Java,
|
||||
Vue,
|
||||
C,
|
||||
Cpp,
|
||||
Other,
|
||||
@@ -34,6 +36,8 @@ impl Language {
|
||||
Language::Python => "python",
|
||||
Language::TypeScript => "typescript",
|
||||
Language::JavaScript => "javascript",
|
||||
Language::Java => "java",
|
||||
Language::Vue => "vue",
|
||||
Language::C => "c",
|
||||
Language::Cpp => "cpp",
|
||||
Language::Other => "other",
|
||||
@@ -42,7 +46,7 @@ impl Language {
|
||||
|
||||
/// LSP `languageId` value used in `textDocument/didOpen`. We follow the
|
||||
/// LSP-spec values: `rust`, `go`, `python`, `typescript`, `javascript`,
|
||||
/// `c`, `cpp`.
|
||||
/// `java`, `vue`, `c`, `cpp`.
|
||||
#[must_use]
|
||||
pub fn language_id(self) -> &'static str {
|
||||
match self {
|
||||
@@ -51,6 +55,8 @@ impl Language {
|
||||
Language::Python => "python",
|
||||
Language::TypeScript => "typescript",
|
||||
Language::JavaScript => "javascript",
|
||||
Language::Java => "java",
|
||||
Language::Vue => "vue",
|
||||
Language::C => "c",
|
||||
Language::Cpp => "cpp",
|
||||
Language::Other => "plaintext",
|
||||
@@ -73,6 +79,8 @@ pub fn detect_language(path: &Path) -> Language {
|
||||
"py" | "pyi" => Language::Python,
|
||||
"ts" | "tsx" => Language::TypeScript,
|
||||
"js" | "jsx" | "mjs" | "cjs" => Language::JavaScript,
|
||||
"java" => Language::Java,
|
||||
"vue" => Language::Vue,
|
||||
"c" | "h" => Language::C,
|
||||
"cpp" | "cc" | "cxx" | "hpp" | "hxx" | "hh" => Language::Cpp,
|
||||
_ => Language::Other,
|
||||
@@ -91,6 +99,8 @@ pub fn server_for(lang: Language) -> Option<(&'static str, &'static [&'static st
|
||||
Language::TypeScript | Language::JavaScript => {
|
||||
Some(("typescript-language-server", &["--stdio"]))
|
||||
}
|
||||
Language::Java => Some(("jdtls", &[])),
|
||||
Language::Vue => Some(("vue-language-server", &["--stdio"])),
|
||||
Language::C | Language::Cpp => Some(("clangd", &[])),
|
||||
Language::Other => None,
|
||||
}
|
||||
@@ -132,6 +142,38 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn detects_java_extension() {
|
||||
assert_eq!(
|
||||
detect_language(&PathBuf::from("App.java")),
|
||||
Language::Java
|
||||
);
|
||||
assert_eq!(
|
||||
detect_language(&PathBuf::from("APP.JAVA")),
|
||||
Language::Java
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn detects_vue_extension() {
|
||||
assert_eq!(
|
||||
detect_language(&PathBuf::from("Component.vue")),
|
||||
Language::Vue
|
||||
);
|
||||
assert_eq!(
|
||||
detect_language(&PathBuf::from("COMPONENT.VUE")),
|
||||
Language::Vue
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn language_ids_for_java_and_vue_match_lsp_values() {
|
||||
assert_eq!(Language::Java.as_key(), "java");
|
||||
assert_eq!(Language::Java.language_id(), "java");
|
||||
assert_eq!(Language::Vue.as_key(), "vue");
|
||||
assert_eq!(Language::Vue.language_id(), "vue");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn server_for_rust_is_rust_analyzer() {
|
||||
let (cmd, args) = server_for(Language::Rust).expect("rust has a server");
|
||||
@@ -139,6 +181,20 @@ mod tests {
|
||||
assert!(args.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn server_for_java_is_jdtls() {
|
||||
let (cmd, args) = server_for(Language::Java).expect("java has a server");
|
||||
assert_eq!(cmd, "jdtls");
|
||||
assert!(args.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn server_for_vue_is_vue_language_server() {
|
||||
let (cmd, args) = server_for(Language::Vue).expect("vue has a server");
|
||||
assert_eq!(cmd, "vue-language-server");
|
||||
assert_eq!(args, &["--stdio"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn server_for_other_is_none() {
|
||||
assert!(server_for(Language::Other).is_none());
|
||||
|
||||
@@ -156,7 +156,7 @@ drives turns through Chat Completions.
|
||||
- `mod.rs` - `LspManager` — lazy per-language transport pool + config
|
||||
- `client.rs` - `StdioLspTransport` — JSON-RPC over stdio with `didOpen`/`didChange`/`publishDiagnostics`
|
||||
- `diagnostics.rs` - Diagnostic types, severity, and HTML-block renderer
|
||||
- `registry.rs` - Language detection and default server map (rust-analyzer, pyright, gopls, clangd, typescript-language-server)
|
||||
- `registry.rs` - Language detection and default server map (rust-analyzer, pyright, gopls, clangd, typescript-language-server, jdtls, vue-language-server)
|
||||
- Wired into the engine via `core/engine/lsp_hooks.rs` — called after every successful edit
|
||||
|
||||
### Security
|
||||
|
||||
Reference in New Issue
Block a user