Use owner and type for fields, fix #8
This commit is contained in:
parent
63dfded45f
commit
8488701057
@ -81,7 +81,7 @@ public class PluginRemapper extends JarRemapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BiMap: srg -> bukkit
|
// BiMap: srg -> bukkit
|
||||||
private final Map<String, BiMap<String, String>> cacheFields = new ConcurrentHashMap<>();
|
private final Map<String, BiMap<WrappedField, String>> cacheFields = new ConcurrentHashMap<>();
|
||||||
private final Map<String, Map.Entry<Map<Method, String>, Map<WrappedMethod, Method>>> cacheMethods = new ConcurrentHashMap<>();
|
private final Map<String, Map.Entry<Map<Method, String>, Map<WrappedMethod, Method>>> cacheMethods = new ConcurrentHashMap<>();
|
||||||
private final Map<String, Boolean> cacheRemap = new ConcurrentHashMap<>();
|
private final Map<String, Boolean> cacheRemap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@ -114,19 +114,19 @@ public class PluginRemapper extends JarRemapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private BiMap<String, String> getFields(Class<?> cl, String internalName) {
|
private BiMap<WrappedField, String> getFields(Class<?> cl, String internalName) {
|
||||||
return cacheFields.computeIfAbsent(internalName, k -> this.tryGetFields(cl, k));
|
return cacheFields.computeIfAbsent(internalName, k -> this.tryGetFields(cl, k));
|
||||||
}
|
}
|
||||||
|
|
||||||
private BiMap<String, String> tryGetFields(Class<?> cl, String internalName) {
|
private BiMap<WrappedField, String> tryGetFields(Class<?> cl, String internalName) {
|
||||||
try {
|
try {
|
||||||
HashBiMap<String, String> map = HashBiMap.create();
|
HashBiMap<WrappedField, String> map = HashBiMap.create();
|
||||||
ArclightReflectionHandler.remapper = this;
|
ArclightReflectionHandler.remapper = this;
|
||||||
for (Field field : cl.getFields()) {
|
for (Field field : cl.getFields()) {
|
||||||
map.put(field.getName(), mapField(field));
|
map.put(WrappedField.of(field), mapField(field));
|
||||||
}
|
}
|
||||||
for (Field field : cl.getDeclaredFields()) {
|
for (Field field : cl.getDeclaredFields()) {
|
||||||
map.put(field.getName(), mapField(field));
|
map.put(WrappedField.of(field), mapField(field));
|
||||||
}
|
}
|
||||||
ArclightReflectionHandler.remapper = null;
|
ArclightReflectionHandler.remapper = null;
|
||||||
return map;
|
return map;
|
||||||
@ -165,21 +165,24 @@ public class PluginRemapper extends JarRemapper {
|
|||||||
public String tryMapDecFieldToSrg(Class<?> cl, String bukkitName) {
|
public String tryMapDecFieldToSrg(Class<?> cl, String bukkitName) {
|
||||||
String internalName = Type.getInternalName(cl);
|
String internalName = Type.getInternalName(cl);
|
||||||
if (internalName.startsWith(PREFIX)) {
|
if (internalName.startsWith(PREFIX)) {
|
||||||
return getFields(cl, internalName).inverse().getOrDefault(bukkitName, bukkitName);
|
WrappedField field = getFields(cl, internalName).inverse().get(bukkitName);
|
||||||
|
return field == null ? bukkitName : field.name;
|
||||||
} else return bukkitName;
|
} else return bukkitName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String tryMapFieldToSrg(Class<?> cl, String bukkitName) {
|
public String tryMapFieldToSrg(Class<?> cl, String bukkitName) {
|
||||||
String internalName = Type.getInternalName(cl);
|
String internalName = Type.getInternalName(cl);
|
||||||
if (shouldRemap(internalName)) {
|
if (shouldRemap(internalName)) {
|
||||||
return getFields(cl, internalName).inverse().getOrDefault(bukkitName, bukkitName);
|
WrappedField field = getFields(cl, internalName).inverse().get(bukkitName);
|
||||||
|
return field == null ? bukkitName : field.name;
|
||||||
} else return bukkitName;
|
} else return bukkitName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String tryMapFieldToBukkit(Class<?> cl, String srgName) {
|
public String tryMapFieldToBukkit(Class<?> cl, String srgName, Field field) {
|
||||||
String internalName = Type.getInternalName(cl);
|
String internalName = Type.getInternalName(cl);
|
||||||
if (internalName.startsWith(PREFIX)) {
|
if (internalName.startsWith(PREFIX)) {
|
||||||
return getFields(cl, internalName).getOrDefault(srgName, srgName);
|
BiMap<WrappedField, String> fields = getFields(cl, internalName);
|
||||||
|
return fields.getOrDefault(WrappedField.of(field), srgName);
|
||||||
} else return srgName;
|
} else return srgName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,6 +340,38 @@ public class PluginRemapper extends JarRemapper {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class WrappedField {
|
||||||
|
|
||||||
|
private final Class<?> owner;
|
||||||
|
private final String name;
|
||||||
|
private final Class<?> type;
|
||||||
|
|
||||||
|
private WrappedField(Class<?> owner, String name, Class<?> type) {
|
||||||
|
this.owner = owner;
|
||||||
|
this.name = name;
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
WrappedField that = (WrappedField) o;
|
||||||
|
return Objects.equals(owner, that.owner) &&
|
||||||
|
Objects.equals(name, that.name) &&
|
||||||
|
Objects.equals(type, that.type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(owner, name, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static WrappedField of(Field field) {
|
||||||
|
return new WrappedField(field.getDeclaringClass(), field.getName(), field.getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class WrappedMethod {
|
private static class WrappedMethod {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|||||||
@ -66,7 +66,7 @@ public class ArclightReflectionHandler {
|
|||||||
|
|
||||||
// srg -> bukkit
|
// srg -> bukkit
|
||||||
public static String redirectFieldGetName(Field field) {
|
public static String redirectFieldGetName(Field field) {
|
||||||
return remapper.tryMapFieldToBukkit(field.getDeclaringClass(), field.getName());
|
return remapper.tryMapFieldToBukkit(field.getDeclaringClass(), field.getName(), field);
|
||||||
}
|
}
|
||||||
|
|
||||||
// bukkit -> srg
|
// bukkit -> srg
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user