Class AccessWidenerUtils

java.lang.Object
net.fabricmc.loom.configuration.mods.AccessWidenerUtils

public class AccessWidenerUtils extends Object
  • Constructor Details

    • AccessWidenerUtils

      public AccessWidenerUtils()
  • Method Details

    • remapAccessWidener

      public static byte[] remapAccessWidener(byte[] input, org.objectweb.asm.commons.Remapper remapper, String fromNamespace, String toNamespace)
      Remap a mods access widener from intermediary to named, so that loader can apply it in our dev-env.
    • readAccessWideners

      public static List<AccessWidenerUtils.AccessWidenerData> readAccessWideners(Path inputJar, ModPlatform platform) throws IOException
      读取一个 mod jar 里声明的**全部** class tweaker(access widener).

      返回空列表表示「这个 jar 不需要处理」——不是 mod jar、Forge 系上不是 mods.toml 形态, 或压根没有声明。调用方因此不必再区分 null 与空集合,只需判断是否为空。

      为什么是列表而不是单条:schema v2 的 classTweakers 本来就是 「jar 内路径 → 生效环境」的映射,一个 mod 声明多条是合法的(见 FabricModJsonV2#getClassTweakers)。把多条压成一条只有两种下场:要么丢掉后面的 文件(它们的声音直接被忽略),要么把内容拼成一份(环境随之丢失,只在客户端生效的规则 会跑到服务端去)。所以这里逐条返回,环境随条目一起带出。

      Parameters:
      inputJar - 待读取的 mod jar
      platform - 平台;决定「什么算 mod jar」以及是否接受 fabric.mod.json
      Returns:
      各条声明;有序(按 jar 内路径),无声明时为空列表
      Throws:
      IOException
    • readClassTweakers

      public static List<AccessWidenerUtils.AccessWidenerData> readClassTweakers(FabricModJson fabricModJson) throws IOException
      把元数据里的 classTweakers 声明逐条展开成「路径 + 环境 + 头 + 内容」.

      结果按 jar 内路径排序:schema v2 的声明表是 HashMap(见 FabricModJsonV2#getConditionalConfigs),按迭代顺序处理会让同一份元数据在不同 JVM 上得到不同顺序——写回 jar 的结果虽然等价,但任何按顺序展示或比较的输出都会抖动。

      刻意保持 public:读取逻辑是本次改动的主体,单元测试要能在不落地真实 mod jar 的 前提下直接覆盖它(与 RemapModsTask#collectRemapClasspath 同一种做法)。

      Parameters:
      fabricModJson - 已解析的元数据
      Returns:
      各条声明;有序(按 jar 内路径),无声明时为空列表
      Throws:
      IOException