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;
private final List<PluginTransformer> 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<PluginTransformer> getTransformerList() {
return transformerList;
}

View File

@ -347,11 +347,11 @@ public class ClassLoaderRemapper extends LenientJarRemapper {
@Override
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)) {
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);
}
}

View File

@ -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) {

View File

@ -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<String, ClassNode> 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;
}
}

View File

@ -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<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());
}
}
}