Fix remap classes for inheritance (#204)
This commit is contained in:
parent
3fed903fac
commit
f31f8ec2ad
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user