List<String> superDescs = jsoSuperDescs.get(desc);
assert (superDescs != null);
assert (superDescs.size() > 0);
// The ASM model is to chain a bunch of visitors together.
ClassWriter writer = new ClassWriter(0);
final ClassVisitor v = writer;
// v = new CheckClassAdapter(v);
// v = new TraceClassVisitor(v, new PrintWriter(System.out));
String[] interfaces;
// TODO(bov): something better than linear?
if (superDescs.contains("java/lang/Object")) {
interfaces = null;
} else {
interfaces = superDescs.toArray(new String[superDescs.size()]);
}
v.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC | Opcodes.ACC_INTERFACE, desc,
null, "java/lang/Object", interfaces);
if (classBytes != null) {
// Java7 enforces innerclass/outerclass consistency. In order to fix this, copy from original
ClassVisitor cv = new EmptyVisitor() {
@Override
public void visitInnerClass(String name, String outerName, String innerName,
int access) {
// copy inner class table from original JSO to synthetic interface
v.visitInnerClass(name, outerName, innerName, access);
}
@Override
public void visitOuterClass(String owner, String name, String desc) {
// copy outer class table from original JSO to synthetic interface
v.visitOuterClass(owner, name, desc);
}
};
new ClassReader(classBytes).accept(cv, 0);
}
v.visitEnd();
return writer.toByteArray();
}