Skip to content

feat(java): 支持依赖类源码导航并容忍缺失内部类 - #14

Merged
1lck merged 2 commits into
mainfrom
codex/java-binary-navigation
Nov 14, 2026
Merged

1lck merged 2 commits into
mainfrom
codex/java-binary-navigation

Conversation

@1lck

@1lck 1lck commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

关联 Issue / Linked issue

PR 类型 / Type

  • feat:新功能或用户可见的改进

改动说明 / What changes

背景 / Why

JDT 能返回二进制依赖的定义 URI,但此前插件没有注册内容提供者,用户无法打开只读类源码。残缺旧库另有上游缺陷:外部类引用未提供的内部类时,JDT 1.61 的 FernFlower 集成放弃整个外部类。公开 1.1.3 明确不支持该路径,新增能力按 SemVer 准备 1.2.0 预发布,不修改已公开包。

改动 / Changes

  • 导出 java.classFileContents,在返回有效 JDT 启动方案前以既有文档 API 注册 jdt: 提供者,随后按工作区代际同步/释放订阅。注册失败诊断降级,保留已有项目工作流。
  • 复用 JDT 的源码附加、反编译和行号映射;原始 URI 不重编码。验证参数、取消、服务器代际、25 秒期限、1 MiB 上限及非空结果,无新增源码缓存、磁盘源码或轮询。
  • 对锁定的开源 JDT 1.61 集成作一个“内部 class 不存在则跳过”的构建期修正,不恢复不存在的内容,不另写反编译器或 Java 模型。
  • 包装脚本锁定上游源码/JAR、修改源码、Temurin 编译器和完整替换 class 集合,临时编译输出始终删除,只修改新 staging。下载缓存与已安装包只读。
  • 修改过的 core JAR 移除失效 Eclipse JAR 签名及条目摘要,保留 OSGi 主清单;随包提供修改的 EPL-2.0 源码和全部哈希。原生 JVM 签名不变,插件 ZIP 仍不带发布者签名。
  • macOS/Windows 打包和验证均检查补丁;Node 完整性测试纳入 Linux CI/Release。增加 Rust URI/结果边界与真实后端导出回归。
  • 更新 README、补丁运维说明、双语 1.2.0 发布说明及清单版本;新增能力不提高 API/能力版本、权限或外部工具要求。

不在本 PR 范围内 / Out of scope

JSP Java 补全/跳转、缺失第三方依赖或内部类恢复、原生窗口、完整日志 UI、全部测试运行器/Spring/MyBatis 验收、内存整体优化。旧客户端仍可运行已支持工作流,但新类视图连续导航需配套 Viva 修复。既有长 module-path 等限制继续保留。

类型专属:feat

多平台对齐

  • 两端都具备:macOS 与 Windows 共用后端和 JDT 字节码补丁,两端真实插件 ZIP/JDT 无头流程验证。

范围检查 / Scope checks

逻辑归属 / Logic placement

  • Java URI、JDT 请求和上游集成属于插件;宿主只处理通用只读文档、语言/URI 同步与焦点。
  • 复用成熟上游完整反编译/语义/源码映射,不自建模型。小补丁的证据、代价、替代与移除条件记录在配套 root Note 和补丁说明。

多平台功能矩阵 / Platform feature matrix

  • 配套 Lithe PR 更新 java-support-plugin 能力与测试证据,整体仍为 partial/pending,不把单项无头当完整原生验收。

统一日志系统 / Unified logging

  • 函数失败复用 SDK 结构化诊断,成功内容读取关闭成功日志;注册失败只记录受控分类/计数,不记录 URI、源码或上游结果。上游缺失内部类只写静态降级消息。
  • Viva 日志类型生成/使用门禁尚未恢复(Lithe #1802),完整 UI/所有取消分支未验收,明确未完成。

界面文案 / i18n

N/A:没有新增界面贡献;协议错误使用插件既有错误模型,宿主沿用共享本地化错误提示。

性能与内存 / Performance and memory

  • 不新增常驻服务、后台轮询或源码缓存;现有 JVM 上限保持 Xms256/Xmx2048。
  • 本地残缺类只读导航成功;JDT RSS 约 774→993 MiB、整棵无头进程树约 913→1154 MiB,项目关闭 JVM 退出。只是单点观测,未宣称内存下降。
  • 固定客户端 71f48ff6d / Core 29b35bf、VM 关闭,新旧 ZIP 六对 AB/BA 共 12 轮通过:就绪 JDT 中位 788.38→792.14 MiB,流程结束 815.80→814.48 MiB;打开到动作 6537.93→6465.54 ms,热补全中位 12.14→11.51 ms。基本持平,不宣称优化。

设置 / Settings

N/A:没有新增设置。

插件契约 / Plugin contract

N/A:使用既有 documents/registerContentProvider、插件函数和语言服务器请求。SDK 固定 65cf823,API/能力版本 0 不变,无新宿主方法或协议。

发行包与资源 / Bundle and resources

  • 源码和签名边界在补丁说明中公开;三平台包检查补丁哈希与许可清单。私有输入从未进入源码、fixture、日志附件或包。
  • 配套 root PR 同步资源清单、拒绝路由、测试与 ci-builds;编译临时目录/组装输出均不可跨 worktree 复用,下载仍走原始锁定输入。
  • 实际工作流比较安装目录全量哈希,runtime bundle immutability 静态检查通过。

无用代码与重构 / Dead code and refactoring

  • 无本次新增无用路径。既有宿主纯校验归属 Lithe #1892、旧 Java 打包资源文档 Lithe #1905 独立建单,未夹带重构。

验证 / Verification

命令或操作 平台 结果
cargo fmt / clippy -D warnings / test --workspace --locked macOS 通过
cargo test --workspace --locked,GNU backend 实际 ZIP Windows ARM 上 x64 工具 通过;最终发布另外由工作流构建静态 MSVC
Rust 新增类内容单元/后端导出逐项计时 macOS 3 / 5 / 4 ms,HTML/JUnit
Node notices + patch 完整性 macOS 7 个测试通过;无工具依赖的 fixture 验证 source/JAR/class/签名/编译器篡改拒绝
两个 macOS 架构组装/验证,Windows 组装/验证 macOS 通过
真实 ZIP 二进制导航 / Gradle / Maven macOS 13.60 / 41.08 / 21.58 秒
同组三流程 Windows 49.77 / 119.18 / 68.18 秒
真实二进制导航 -race macOS 47.55 秒通过
actionlint / SDK lock --download / committed test-stability gate macOS 通过

残缺内部类回归在未打补丁的原始 JDT 包上失败(外部类为空),补丁后通过;公开回归仅由自建 Java 源码编译 JAR,故意不打包一个内部 class。另用本地私有旧库验证类型和方法落点、类间连续导航,内容仅保留在忽略的私有诊断目录。

未能执行的检查和原因: Intel macOS 包做交叉构建和结构验证,没有 Intel 真机;Windows 是 ARM 来宾运行 x64 工具,其耗时不代表原生 AMD64;原生 UI 与全部日志路径未验收。

提交前确认 / Final checks

  • 从当前独立插件 main 6706d3c 创建;目标 main。
  • 默认 Draft,本地验证完成后 ready;最终发布工作流生成 draft,下载实际资产验证后才公开。
  • 无构建产物、私有输入、凭据和个人路径;本次拥有的应用/Java 进程关闭,Windows VM 停止。

最终发布

已压缩合并为 5c13e96,发布 v1.2.0 预览版(6 个资产),release workflow 43568101378 全部成功。下载 ZIP 的 SHA-256、两个 macOS 包的布局/许可/原生 JVM 签名/补丁哈希,以及 Windows 包的许可和补丁完整性均通过。实际 macOS 下载包通过二进制导航 / Gradle / Maven(12.07 / 38.07 / 20.43 秒);最新客户端 b358654ec / Core 2c1fed1 搭配发布工作流的静态 MSVC 后端,在 Windows 通过同组三流程(46.32 / 111.67 / 67.86 秒)。Windows 测试组装包与最终下载包全部运行文件内容相同,只有 JDT JAR 容器条目时间戳及记录其摘要的 patch.json 字节不同,JAR 内所有文件逐项内容一致。插件安装目录哈希不变,测试进程退出且 VM 已停止。配套客户端 #1906 压缩合并为 7c036b3,完整客户端 preview CI 43568818336 仍在运行;没有把它记为已通过。

@1lck
1lck marked this pull request as ready for review November 14, 2026 06:44
@1lck
1lck merged commit 5c13e96 into main Nov 14, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant