com.googlecode.d2j.tools.jar.ScanBridgeAdapter Maven / Gradle / Ivy
package com.googlecode.d2j.tools.jar;
import com.googlecode.d2j.tools.jar.ClassInfo.MemberInfo;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import static com.googlecode.d2j.util.AccUtils.isBridge;
import static com.googlecode.d2j.util.AccUtils.isSynthetic;
public class ScanBridgeAdapter extends ClassVisitor implements Opcodes {
private Map bridge = new HashMap();
public ScanBridgeAdapter(ClassVisitor cv) {
super(ASM4, cv);
}
// private String currentName;
//
// @Override
// public void visit(int version, int access, String name, String signature,
// String superName, String[] interfaces) {
// super.visit(version, access, name, signature, superName, interfaces);
// this.currentName = name;
// }
public Map getBridge() {
return Collections.unmodifiableMap(bridge);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
if (isBridge(access) && isSynthetic(access)) {
if (mv == null) {
mv = new MethodVisitor(ASM4) {
};
}
final MemberInfo member = new MemberInfo();
member.access = access;
member.desc = desc;
member.name = name;
mv = new MethodVisitor(ASM4, mv) {
@Override
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
super.visitMethodInsn(opcode, owner, name, desc);
if (!name.equals(member.name)) {
bridge.put(owner + '.' + name + desc.substring(0, desc.lastIndexOf(')') + 1), member);
}
}
};
}
return mv;
}
}