Fix remap classes for inheritance (#204)

This commit is contained in:
IzzelAliz 2021-04-04 14:14:26 +08:00
parent 3fed903fac
commit f31f8ec2ad
5 changed files with 36 additions and 18 deletions

View File

@ -52,6 +52,7 @@ public class ArclightRemapper {
public final InheritanceMap inheritanceMap; public final InheritanceMap inheritanceMap;
private final List<PluginTransformer> transformerList = new ArrayList<>(); private final List<PluginTransformer> transformerList = new ArrayList<>();
private final JarRemapper toBukkitRemapper; private final JarRemapper toBukkitRemapper;
private final JarRemapper toNmsRemapper;
public ArclightRemapper() throws Exception { public ArclightRemapper() throws Exception {
this.toNmsMapping = new JarMapping(); this.toNmsMapping = new JarMapping();
@ -80,6 +81,7 @@ public class ArclightRemapper {
ArclightPluginPatcher.load(this.transformerList); ArclightPluginPatcher.load(this.transformerList);
toBukkitMapping.setFallbackInheritanceProvider(GlobalClassRepo.inheritanceProvider()); toBukkitMapping.setFallbackInheritanceProvider(GlobalClassRepo.inheritanceProvider());
this.toBukkitRemapper = new LenientJarRemapper(toBukkitMapping); this.toBukkitRemapper = new LenientJarRemapper(toBukkitMapping);
this.toNmsRemapper = new LenientJarRemapper(toNmsMapping);
RemapSourceHandler.register(); RemapSourceHandler.register();
} }
@ -91,6 +93,10 @@ public class ArclightRemapper {
return INSTANCE.toBukkitRemapper; return INSTANCE.toBukkitRemapper;
} }
public static JarRemapper getNmsMapper() {
return INSTANCE.toNmsRemapper;
}
public List<PluginTransformer> getTransformerList() { public List<PluginTransformer> getTransformerList() {
return transformerList; return transformerList;
} }

View File

@ -347,11 +347,11 @@ public class ClassLoaderRemapper extends LenientJarRemapper {
@Override @Override
protected String getCommonSuperClass(String type1, String type2) { protected String getCommonSuperClass(String type1, String type2) {
Collection<String> parents = GlobalClassRepo.inheritanceProvider().getAll(type2); Collection<String> parents = GlobalClassRepo.remappingProvider().getAll(type2);
if (parents.contains(type1)) { if (parents.contains(type1)) {
return type1; return type1;
} }
if (GlobalClassRepo.inheritanceProvider().getAll(type1).contains(type2)) { if (GlobalClassRepo.remappingProvider().getAll(type1).contains(type2)) {
return type2; return type2;
} }
do { do {
@ -366,7 +366,7 @@ public class ClassLoaderRemapper extends LenientJarRemapper {
LOGGER.warn("Failed to find class {}", typeName); LOGGER.warn("Failed to find class {}", typeName);
return "java/lang/Object"; return "java/lang/Object";
} }
return node.superName; return ArclightRemapper.getNmsMapper().map(node.superName);
} }
} }

View File

@ -2,9 +2,6 @@ package io.izzel.arclight.common.mod.util.remapper;
import net.md_5.specialsource.repo.ClassRepo; import net.md_5.specialsource.repo.ClassRepo;
import org.objectweb.asm.ClassReader; 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 org.objectweb.asm.tree.ClassNode;
import java.io.IOException; import java.io.IOException;
@ -32,18 +29,7 @@ public class ClassLoaderRepo implements ClassRepo {
try (InputStream inputStream = connection.getInputStream()) { try (InputStream inputStream = connection.getInputStream()) {
ClassReader reader = new ClassReader(inputStream); ClassReader reader = new ClassReader(inputStream);
ClassNode classNode = new ClassNode(); ClassNode classNode = new ClassNode();
ClassVisitor cv; reader.accept(classNode, ClassReader.SKIP_CODE);
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; return classNode;
} }
} catch (IOException ignored) { } catch (IOException ignored) {

View File

@ -17,6 +17,7 @@ public class GlobalClassRepo implements ClassRepo {
public static final GlobalClassRepo INSTANCE = new GlobalClassRepo(); public static final GlobalClassRepo INSTANCE = new GlobalClassRepo();
private static final PluginInheritanceProvider PROVIDER = new PluginInheritanceProvider(INSTANCE); private static final PluginInheritanceProvider PROVIDER = new PluginInheritanceProvider(INSTANCE);
private static final PluginInheritanceProvider REMAPPING = new PluginInheritanceProvider.Remapping(INSTANCE, PROVIDER);
private final LoadingCache<String, ClassNode> cache = CacheBuilder.newBuilder().maximumSize(256) private final LoadingCache<String, ClassNode> cache = CacheBuilder.newBuilder().maximumSize(256)
.expireAfterAccess(1, TimeUnit.MINUTES).build(CacheLoader.from(this::findParallel)); .expireAfterAccess(1, TimeUnit.MINUTES).build(CacheLoader.from(this::findParallel));
@ -61,4 +62,8 @@ public class GlobalClassRepo implements ClassRepo {
public static PluginInheritanceProvider inheritanceProvider() { public static PluginInheritanceProvider inheritanceProvider() {
return PROVIDER; return PROVIDER;
} }
public static PluginInheritanceProvider remappingProvider() {
return REMAPPING;
}
} }

View File

@ -10,6 +10,7 @@ import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
public class PluginInheritanceProvider implements InheritanceProvider { public class PluginInheritanceProvider implements InheritanceProvider {
@ -52,4 +53,24 @@ public class PluginInheritanceProvider implements InheritanceProvider {
SHARED_INHERITANCE_MAP.put(className, parents); SHARED_INHERITANCE_MAP.put(className, parents);
return 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<String> getAll(String className) {
return provider.getAll(className).stream().map(ArclightRemapper.getNmsMapper()::map).collect(Collectors.toSet());
}
@Override
public Collection<String> getParents(String className) {
return provider.getParents(className).stream().map(ArclightRemapper.getNmsMapper()::map).collect(Collectors.toSet());
}
}
} }