Class AccessTransformerRuleTranslator

java.lang.Object
dev.architectury.loom.forge.AccessTransformerRuleTranslator

public final class AccessTransformerRuleTranslator extends Object
把 Forge 的 access transformer 规则翻译到「目标 jar 所在的命名空间」.

为什么必须翻译

legacy Forge 的 forge_at.cfg 用的是 SRG 命名空间:类名是 MCP 名 (net.minecraft.util.ObjectIntIdentityMap),成员名是 SRG 名 (field_148749_a)。而 AT 工具(TransformerProcessor)是纯 ASM 重写器, 它按字面量匹配类名与成员名,自身不做任何名称翻译。

本仓库 legacy 链路上 AT 作用的对象是 merged-patched.jar,其内容是 official(notch)名 (fd.class 的字段 a)。把 SRG 形态的规则直接喂给 AT 工具,规则一条都匹配不上: AT 工具不报错、产物照常生成,表现为「AT 静默失效」,最终在运行期炸成 IllegalAccessError(如 Forge 读 ObjectIntIdentityMap.identityMap)。

因此必须在 AT 执行前把规则翻译到目标 jar 的命名空间。翻译是纯查表,无副作用。

规则形态

每行形如 <access> <类名> [成员名 [描述符]],# 之后是注释。翻译只改类名与成员名:
  • 类名:按 源命名空间 → 目标命名空间 查类映射;
  • 成员名:在该类的成员表里按名字(方法的签名一并参与)查映射;
  • 描述符、修饰符关键字原样保留。

失败即报错

与「静默跳过」相反,本类对无法翻译的规则直接抛异常,并汇总全部失败行。 AT 失效在生产上极难诊断(症状出现在运行期的 IllegalAccessError,与构建毫无关联), 因此宁可让构建在翻译阶段失败并列出具体规则,也不允许它带着残缺的 AT 继续产出 jar。