From 157dec4432b8de5815f0f0bf6f42cc8ef2522040 Mon Sep 17 00:00:00 2001 From: Yao Jingxi <23722032@bjtu.edu.cn> Date: Sat, 7 Nov 2026 10:28:57 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(backend):=20=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=94=B1=E5=90=8E=E7=AB=AF=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=EF=BC=8C=E8=BF=90=E8=A1=8C/=E8=B0=83=E8=AF=95/?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=B1=E5=90=8E=E7=AB=AF=E7=BB=8F=E5=AE=BF?= =?UTF-8?q?=E4=B8=BB=E9=80=9A=E7=94=A8=20API=20=E6=8E=A5=E7=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `java.resolveLaunch`:语言服务器改为 `launch.kind: "backend"`,后端按包内布局解析 JDT LS、Lombok、java-debug、测试运行器与 JDK,去掉 `hostIntegration: jdt` - `backend/src/run.rs`:用 `editor/registerActions` 提供 `.java` 文件的行内 Run/Debug 动作;点击经 JDT LS 构建并解析类路径(main)或规划测试启动(JUnit/TestNG),再用 `run/start` 以清单 `requiresTools: ["java"]` 引用的 JDK 工具定义启动;调试时附 jdwp 代理并由宿主接到 `java` 调试适配器 - 测试结果:后端在回环端口监听 Eclipse JUnit 运行器,结束后用窗口消息显示计数,`run/didExit` 后停止 - `outputLinkMatchers`:堆栈行 `at pkg.Class.method(Class.java:12)` 经 `java.resolveOutputLink` 用 `workspace/findFiles` 解析为工作区文件 - 清单:`serverProcess: 4` + `requiresTools`、`debugAdapters: 3`(热替换 `redefineClasses` 与默认步进过滤 `$JDK`/`$Libraries`)、`outputLinkMatchers: 1`、新增权限与 `vscode.java.*` 命令白名单 - 文档:MIGRATION.md 第 5.8/5.9 节、第 6/10 节与 README 同步 --- MIGRATION.md | 89 +- README.md | 16 +- backend/src/launch.rs | 825 +++++++++++ backend/src/lib.rs | 113 +- backend/src/run.rs | 1320 +++++++++++++++++ backend/src/settings_session.rs | 140 +- backend/tests/repository_pins.rs | 72 +- .../src/jdt_integration/launch_resources.rs | 182 +-- crates/java-domain/src/jdt_integration/mod.rs | 5 +- crates/java-domain/src/lsp/languages/jdt.rs | 12 +- crates/java-domain/src/lsp/languages/mod.rs | 2 +- .../java-domain/src/testing/jdt_test_items.rs | 4 +- io.github.lithe-idea.java-support/plugin.json | 64 +- scripts/assemble-package.sh | 39 +- scripts/verify-package.sh | 25 +- 15 files changed, 2610 insertions(+), 298 deletions(-) create mode 100644 backend/src/launch.rs create mode 100644 backend/src/run.rs diff --git a/MIGRATION.md b/MIGRATION.md index 4b7fb69..0f278f7 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -27,8 +27,8 @@ - 领域代码的注释(`//!`、`///`)全部是英文。每个来自 Core 或 Swift 的模块在模块文档里写明来源。 - 宿主侧的接线是分步的:`plugin.json` 现在声明 `backend`(`backend.launch` 为 `packaged`,路径 `bin/lithe-java-backend`),后端把领域命令注册成插件函数, 并承担 API-35 的设置中转(第 5 节:调用方一侧发现并调用 `languageImport.settings`,导出方一侧接收 `languageImport.settingsChanged`, - 再用 `languageServer/notify` 推送给 JDT LS)。语言服务器仍由宿主的 JDT 集成启动(`launch.kind` 为 `runtime`,带 `hostIntegration`), - 改为后端启动要等第 6 节列出的 API-23 等宿主 API 就位,见第 10 节。 + 再用 `languageServer/notify` 推送给 JDT LS)。语言服务器由后端启动(`launch.kind` 为 `backend`,函数 `java.resolveLaunch`, + `requires.serverProcess` 3,不再有 `hostIntegration`),见第 5.8 节;运行/调试/测试的接管见第 10 节。 ## 2. 边界决定 @@ -222,7 +222,7 @@ API-30(调试适配器)、API-37(环境与 l10n)、API-42(内置 Git | 来源 | 新位置 | 状态 | 说明 | | --- | --- | --- | --- | -| `Plugins/mac/Official/JavaSupport/plugin.json@1daaeb525` | `io.github.lithe-idea.java-support/plugin.json` | 已移植并有测试 | 身份改为普通插件:id 从 `dev.lithe.plugin.java-support` 变为 `io.github.lithe-idea.java-support`,`vendor` 改为 `Lithe Community`(`signatureRequirement: none`),删除 `publisherPackage`、`bundledSignatureRequirement` 和 `requires.packageTrust`,见第 9 节;版本仍是 1.1.0。新增后端声明:顶层 `backend`、`pluginFunctions`,`requires.backend: 2`、`pluginFunctions: 1`、`languageServers: 3`,权限 `backend.launch`、`languageServer.request`、`workspace.metadata`,激活事件 `onWorkspaceOpen`,语言服务器的 `requestMethods` 与 `commands`(第 5.7 节);`launch` 和 `hostIntegration` 不变。`repository_pins.rs` 断言社区身份 | +| `Plugins/mac/Official/JavaSupport/plugin.json@1daaeb525` | `io.github.lithe-idea.java-support/plugin.json` | 已移植并有测试 | 身份改为普通插件:id 从 `dev.lithe.plugin.java-support` 变为 `io.github.lithe-idea.java-support`,`vendor` 改为 `Lithe Community`(`signatureRequirement: none`),删除 `publisherPackage`、`bundledSignatureRequirement` 和 `requires.packageTrust`,见第 9 节;版本仍是 1.1.0。新增后端声明:顶层 `backend`、`pluginFunctions`,`requires.backend: 2`、`pluginFunctions: 1`、`languageServers: 3`,权限 `backend.launch`、`languageServer.request`、`workspace.metadata`,激活事件 `onWorkspaceOpen`,语言服务器的 `requestMethods` 与 `commands`(第 5.7 节);`launch` 改为后端解析、删除 `hostIntegration`(第 5.8 节)。`repository_pins.rs` 断言社区身份和后端启动的形状 | | `Plugins/mac/Official/JavaSupport/{icons,templates}/**@1daaeb525` | `io.github.lithe-idea.java-support/{icons,templates}/` | 已移植并有测试 | `backend/tests/repository_pins.rs` 检查清单里每个文件都存在。Maven 图标(`icons/maven*.svg`)、Maven 与 Gradle 构建文件模板(`templates/java/{maven,gradle-kotlin,gradle-groovy,standard-*}`)已移交 Maven、Gradle 插件,本仓库只保留 `templates/java/plain*` 与 Java、Spring Boot 图标,见第 7 节 | | `Plugins/mac/Official/JavaSupport/assemble-package.sh@1daaeb525` | `scripts/assemble-package.sh` | 已移植无测试 | 新增后端二进制:按 `--arch` 用 `cargo build --release --locked -p lithe-java-backend --target ` 编译,`universal` 用 `lipo -create` 合并,放到 `plugin.json` 的 `backend.launch.path`(`bin/lithe-java-backend`)。由 `scripts/verify-package.sh` 校验产物,包括后端存在、可执行、架构与 `--arch` 一致 | | `scripts/macos/prepare/prepare-jdtls.sh@1daaeb525`、`prepare-jdk.sh@1daaeb525` | `scripts/prepare-jdtls.sh`、`scripts/prepare-jdk.sh` | 已移植无测试 | 来源地址和 SHA-256 固定在 `third_party/*/manifest.json`,`repository_pins.rs` 检查格式 | @@ -384,8 +384,25 @@ Java 的清单现在这样声明(以已合入的契约 README 为准): - `requires` 写 `backend: 2`、`pluginFunctions: 1`、`languageServers: 3` 和 `serverProcess: 1`,`pluginAPIVersion` 为 4; 后端运行时协商到插件函数协议 4 才能调用中转方法。 - 权限:`backend.launch`、`languageServer.request`(语言服务器列了 `requestMethods`)、`workspace.metadata`(读取工作区根路径需要 `backend` 2)。 -- `languageServers[0]` 声明 `requestMethods: ["workspace/executeCommand"]` 和 `commands: ["java.project.updateSettings"]`; - `launch`(`kind: "runtime"`)和 `hostIntegration`(`id: "jdt"`)保持不变,直到 API-23 就位(第 10 节)。 +- `languageServers[0]` 声明 `requestMethods: ["java/classFileContents", "workspace/executeCommand"]` 和 `commands: ["java.project.updateSettings"]`; + `launch` 是 `{ "kind": "backend", "function": "java.resolveLaunch", "timeoutMilliseconds": 60000 }`(`requires.serverProcess` 3), + 没有 `hostIntegration`、`arguments`、`runtimeDependencies` 和 `initializationOptions`,它们的值都由后端在第 5.8 节的回答里给出。 + +### 5.8 语言服务器启动(serverProcess 3) + +`backend/src/launch.rs` 注册 `java.resolveLaunch`。宿主按契约的 `resolveParams`(`serverID`、`platform.arch`、`stateDirectory`、 +`workspaceStateDirectory`、`logDirectory`、`temporaryDirectory`、`settings`)加工作区上下文调用它,后端: + +- 以后端二进制所在的 `bin/` 的上级为包根,按固定布局定位文件:`language-server/plugins/org.eclipse.equinox.launcher_*.jar`(恰好一个)、 + `language-server/configuration/`、`language-server/lombok/lombok.jar`、`language-server/java-debug` 与 `language-server/java-test/extensions` + 里的扩展包、`runtime//bin/java`。布局常量是 `pub`,`backend/tests/repository_pins.rs` 用它们约束 `scripts/assemble-package.sh` + 和 `scripts/verify-package.sh`,所以 `plugin.json` 不再写这些路径; +- 把 `heapMaxMB`、`logLevel` 两个设置和 `logDirectory/jdt.log` 拼进 JVM 参数(原 `runtimeArguments` 的 `${setting:…}` 与 `${logDir}` 展开), + 把每个工作区的 Equinox 配置复制到 `workspaceStateDirectory` 下再以 `-configuration` 传入,`-data` 指向其中的 `data/`; +- 回答 `executable: { kind: "packaged", path }`、`arguments`、`initializationOptions`(原 `hostIntegration` 的 bundles、设置与 + `java_configuration`)、`workspaceConfiguration`、`writablePaths`,以及一个 `language/status` 的就绪门(`service-ready`)。 + +错误码 `launch.invalid_params`、`launch.package_unavailable`、`launch.resource_missing`、`launch.configuration_failed` 与设置中转的错误码不重名。 - 激活事件加 `onWorkspaceOpen`:本插件要主动调用 `languageImport.settings` 并接收语言服务器的状态通知,只导出函数不足以启动后端。 后端是全机一个进程,所有工作区共享。 @@ -396,6 +413,34 @@ Java 的清单现在这样声明(以已合入的契约 README 为准): **信任边界。** 宿主只中转,不传递信任:Maven/Gradle 插件用自己的权限执行,Java 不因此获得权限;Java 只接受 `CONTRIBUTED_SETTINGS_KEYS` 里的键,所以一个提供方既不能改 `java.home`,也不能改别的插件的槽位。 +### 5.9 运行、调试与测试(API-27 / API-29,已实现) + +`backend/src/run.rs` 用三个宿主能力接管了主仓库 Core 与 macOS 原来写死的 Java 运行流程: + +- **行内动作**(`editor/registerActions`,权限 `editor.actions` + `documents.read`):后端在 `initialize` 之后与每次 + `didChangeContexts` 时列出工作区上下文,为每个上下文注册 `.java` 的收集函数 `java.collectActions`。宿主对每个打开的 Java 文档 + 调用它,后端向 JDT LS 请求 `vscode.java.resolveMainMethod` 与 `vscode.java.test.findTestTypesAndMethods`,经领域规则 + `java_run_markers` 得到标记,每个标记一条 `Run '