修复 Mojang 运行时类名转译#714
Conversation
Code Review — #714 修复 Mojang 运行时类名转译改动很小(+18/-4),但动的是 有两点建议在合并前处理:一是 fallback 的线性扫描开销(实测单次 60.6 微秒,而仓库里已有现成的 HashMap 可用),二是PR 缺少描述正文,看不出具体修的是什么场景。 审阅方式:读 patch + 对照仓库源码 + 用 Mojang 官方 1.21.4 映射表实测规模与冲突率、JMH 风格微基准测扫描开销。未实跑 gradle 测试(改动路径需要真实 Paper 环境)。 🟡 问题 1 — fallback 的短名线性扫描可以换成现成的
|
| 项 | 结论 |
|---|---|
| 改动影响范围 | RemapTranslation.translate 的 isUniversal && isMojangMapping && !startsWith("net/minecraft/server/v1_") 分支。RemapTranslationTabooLib(:79)完全覆盖了 translate,所以 TabooLib 自身类不受影响;RemapTranslationLegacy / RemapTranslationUnobfuscated 同理 |
| 生效条件 | AsmClassTranslation.kt:72-80 确认:只有 isUniversalCraftBukkit 且转译对象不是 TabooLib 类时才用 RemapTranslation 基类。即只影响插件本体类在 Paper 1.20.5+ 上的转译,与类文档描述一致 |
classMapSpigotToMojang 的方向 |
Mapping.kt:186 确认是 <Spigot.FullName, Mojang.FullName>。新代码用 [runtimeName] 查,处理的是「key 是 Spigot 全名」的情况,方向正确 |
| 保守性 | 三处 return key 兜底:运行时已有该类、映射表查不到、映射目标在运行时不存在。任何不确定的情况都保持原样,不会把正确的名字改坏。这个设计是对的 |
hasRuntimeClass 优先 |
与既有 translateMojangToSpigotOrKeepRuntime(:127-138)的策略一致——运行时已存在就不动。:142-145 的注释解释了原因(1.17-1.20.4 存在 Mojang 与 Spigot 同名但语义不同的类,如 MobEffect),新方法沿用同一原则 |
singleOrNull 的保守语义 |
短名冲突时返回 null → return key,不会误转译。我用 1.21.4 官方映射实测:6317 个 net.minecraft.* 类中 6049 个短名唯一,真正冲突的只有 10 个短名 / 21 个类(其余 247 个是 package-info)。所以这个 fallback 的命中率高且误判风险低 |
package-info 不会误命中 |
虽然有 247 个 package-info,但它们短名相同 → singleOrNull 返回 null → return key。而且 package-info 不会作为类型引用出现在字节码里 |
与 RemapReflex* 的关系 |
本 PR 只改 ASM 静态转译路径,未触及 RemapReflexPaper / RemapReflexSpigot 的运行时反射转译,两条路径互不干扰 |
extraTransformers 机制未受影响 |
applyExtraTransforms(:51-63)与 incision 模块的 PipelineBackend(通过反射注册)逻辑未变 |
总结
修复方向对——原来在 Mojang Mapping 环境下直接 return key,完全依赖 Paper PluginRemapper,新代码补了「运行时找不到就查映射表」这一层兜底,而且三处 return key 的保守设计让它不会把正确的名字改坏。
建议合并前处理:
- 问题 1:fallback 的
values.singleOrNull { ... }换成 O(1) 查找。仓库里Mapping.kt:32的classMapMojangS2F就是为此准备的(MinecraftServerUtil.kt:67已在用)。若要保留「短名冲突时不动」的保守语义,建议预建一张过滤掉冲突短名的表。实测线性扫描单次 60.6 微秒 vs HashMap 0.070 微秒。 - 问题 2:补 PR 描述。remap 改动难以本地复现,缺少触发场景和错误现象会让后续维护者无法判断这段逻辑为何存在。
- 🔵 里那行多余的
extraTransformersimport 建议删掉。
说明:本次审阅未实跑 gradle 测试——该改动路径需要真实 Paper 1.20.5+ Mojang Mapping 环境才能触发,本地无法验证。映射表规模、短名冲突率与扫描开销为本机实测(Mojang 官方 1.21.4 server mappings,6329 条类映射);其余结论基于 patch 与仓库源码推导,已逐条注明依据位置。
No description provided.