diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java index 482924ab..36920b1b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java @@ -52,6 +52,7 @@ public class ArclightRemapper { public final InheritanceMap inheritanceMap; private final List transformerList = new ArrayList<>(); private final JarRemapper toBukkitRemapper; + private final JarRemapper toNmsRemapper; public ArclightRemapper() throws Exception { this.toNmsMapping = new JarMapping(); @@ -80,6 +81,7 @@ public class ArclightRemapper { ArclightPluginPatcher.load(this.transformerList); toBukkitMapping.setFallbackInheritanceProvider(GlobalClassRepo.inheritanceProvider()); this.toBukkitRemapper = new LenientJarRemapper(toBukkitMapping); + this.toNmsRemapper = new LenientJarRemapper(toNmsMapping); RemapSourceHandler.register(); } @@ -91,6 +93,10 @@ public class ArclightRemapper { return INSTANCE.toBukkitRemapper; } + public static JarRemapper getNmsMapper() { + return INSTANCE.toNmsRemapper; + } + public List getTransformerList() { return transformerList; } 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 65b3d874..016115c4 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 @@ -347,11 +347,11 @@ public class ClassLoaderRemapper extends LenientJarRemapper { @Override protected String getCommonSuperClass(String type1, String type2) { - Collection parents = GlobalClassRepo.inheritanceProvider().getAll(type2); + Collection parents = GlobalClassRepo.remappingProvider().getAll(type2); if (parents.contains(type1)) { return type1; } - if (GlobalClassRepo.inheritanceProvider().getAll(type1).contains(type2)) { + if (GlobalClassRepo.remappingProvider().getAll(type1).contains(type2)) { return type2; } do { @@ -366,7 +366,7 @@ public class ClassLoaderRemapper extends LenientJarRemapper { LOGGER.warn("Failed to find class {}", typeName); return "java/lang/Object"; } - return node.superName; + return ArclightRemapper.getNmsMapper().map(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 a9eb7eab..2a434fef 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,9 +2,6 @@ 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; @@ -32,18 +29,7 @@ public class ClassLoaderRepo implements ClassRepo { try (InputStream inputStream = connection.getInputStream()) { ClassReader reader = new ClassReader(inputStream); ClassNode classNode = new ClassNode(); - 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); + reader.accept(classNode, ClassReader.SKIP_CODE); return classNode; } } catch (IOException ignored) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/GlobalClassRepo.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/GlobalClassRepo.java index b924faf6..e215bccd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/GlobalClassRepo.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/GlobalClassRepo.java @@ -17,6 +17,7 @@ public class GlobalClassRepo implements ClassRepo { public static final GlobalClassRepo INSTANCE = new GlobalClassRepo(); private static final PluginInheritanceProvider PROVIDER = new PluginInheritanceProvider(INSTANCE); + private static final PluginInheritanceProvider REMAPPING = new PluginInheritanceProvider.Remapping(INSTANCE, PROVIDER); private final LoadingCache cache = CacheBuilder.newBuilder().maximumSize(256) .expireAfterAccess(1, TimeUnit.MINUTES).build(CacheLoader.from(this::findParallel)); @@ -61,4 +62,8 @@ public class GlobalClassRepo implements ClassRepo { public static PluginInheritanceProvider inheritanceProvider() { return PROVIDER; } + + public static PluginInheritanceProvider remappingProvider() { + return REMAPPING; + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/PluginInheritanceProvider.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/PluginInheritanceProvider.java index a422f66b..ea359434 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/PluginInheritanceProvider.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/PluginInheritanceProvider.java @@ -10,6 +10,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; public class PluginInheritanceProvider implements InheritanceProvider { @@ -52,4 +53,24 @@ public class PluginInheritanceProvider implements InheritanceProvider { SHARED_INHERITANCE_MAP.put(className, parents); return parents; } + + static class Remapping extends PluginInheritanceProvider { + + private final PluginInheritanceProvider provider; + + public Remapping(ClassRepo classRepo, PluginInheritanceProvider provider) { + super(classRepo); + this.provider = provider; + } + + @Override + public Collection getAll(String className) { + return provider.getAll(className).stream().map(ArclightRemapper.getNmsMapper()::map).collect(Collectors.toSet()); + } + + @Override + public Collection getParents(String className) { + return provider.getParents(className).stream().map(ArclightRemapper.getNmsMapper()::map).collect(Collectors.toSet()); + } + } }