package openeye.asm;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import java.util.Collection;
import java.util.Map;
import net.minecraft.launchwrapper.IClassTransformer;
import openeye.asm.VisitorHelper.TransformProvider;
import openeye.asm.injectors.Injectors;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
public class MultiTransformer implements IClassTransformer {
private Multimap<String, MethodCodeInjector> injectors = HashMultimap.create();
public MultiTransformer() {
Injectors.setupInjectors(injectors);
}
@Override
public byte[] transform(final String name, String transformedName, byte[] bytes) {
if (bytes == null) return bytes;
for (Map.Entry<String, Collection<MethodCodeInjector>> clsInjectors : injectors.asMap().entrySet()) {
if (transformedName.equals(clsInjectors.getKey())) {
final Collection<MethodCodeInjector> methodInjector = clsInjectors.getValue();
bytes = VisitorHelper.apply(bytes, ClassWriter.COMPUTE_FRAMES, new TransformProvider() {
@Override
public ClassVisitor createVisitor(ClassVisitor cv) {
return new SingleClassTransformer(cv, name, methodInjector);
}
});
}
}
return bytes;
}
}