package de.take_weiland.mods.commons.asm;
import de.take_weiland.mods.commons.asm.info.ClassInfo;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
/**
* <p>A {@code ClassWriter} that does not use {@code Class.forName} to determine the "common superclass" of two types but instead uses
* {@link de.take_weiland.mods.commons.asm.info.ClassInfo}. This way {@code COMPUTE_FRAMES} can be used reliably even in edge cases where
* the currently transformed class would have to be loaded has self-references.</p>
*/
public class ClassInfoClassWriter extends ClassWriter {
public ClassInfoClassWriter(int flags) {
super(flags);
}
public ClassInfoClassWriter(ClassReader classReader, int flags) {
super(classReader, flags);
}
@Override
protected String getCommonSuperClass(String type1, String type2) {
ClassInfo cl1 = ClassInfo.of(type1);
ClassInfo cl2 = ClassInfo.of(type2);
if (cl1.isAssignableFrom(cl2)) {
return type1;
}
if (cl2.isAssignableFrom(cl1)) {
return type2;
}
if (cl1.isInterface() || cl2.isInterface()) {
return "java/lang/Object";
} else {
do {
cl1 = ClassInfo.of(cl1.superName());
} while (!cl1.isAssignableFrom(cl2));
return cl1.internalName();
}
}
}