From 8f071289b00a7a6d0bacd18df63d57bd015851a1 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sat, 3 Apr 2021 17:34:28 +0800 Subject: [PATCH] Remap classes for inheritance (#204) --- .../mod/util/remapper/ClassLoaderRemapper.java | 5 ++++- .../mod/util/remapper/ClassLoaderRepo.java | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java index a7e7ab11..65b3d874 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java @@ -362,7 +362,10 @@ public class ClassLoaderRemapper extends LenientJarRemapper { private String getSuper(final String typeName) { ClassNode node = GlobalClassRepo.INSTANCE.findClass(typeName); - if (node == null) return "java/lang/Object"; + if (node == null) { + LOGGER.warn("Failed to find class {}", typeName); + return "java/lang/Object"; + } return node.superName; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRepo.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRepo.java index 2a434fef..a9eb7eab 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRepo.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRepo.java @@ -2,6 +2,9 @@ package io.izzel.arclight.common.mod.util.remapper; import net.md_5.specialsource.repo.ClassRepo; import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.commons.ClassRemapper; +import org.objectweb.asm.commons.Remapper; import org.objectweb.asm.tree.ClassNode; import java.io.IOException; @@ -29,7 +32,18 @@ public class ClassLoaderRepo implements ClassRepo { try (InputStream inputStream = connection.getInputStream()) { ClassReader reader = new ClassReader(inputStream); ClassNode classNode = new ClassNode(); - reader.accept(classNode, ClassReader.SKIP_CODE); + ClassVisitor cv; + if (classLoader instanceof RemappingClassLoader) { + cv = new ClassRemapper(classNode, new Remapper() { + @Override + public String map(String internalName) { + return ((RemappingClassLoader) classLoader).getRemapper().map(internalName); + } + }); + } else { + cv = classNode; + } + reader.accept(cv, ClassReader.SKIP_CODE); return classNode; } } catch (IOException ignored) {