package net.bytebuddy.test.utility; import net.bytebuddy.asm.AsmVisitorWrapper; import net.bytebuddy.description.field.FieldDescription; import net.bytebuddy.description.field.FieldList; import net.bytebuddy.description.method.MethodList; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.implementation.Implementation; import net.bytebuddy.pool.TypePool; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.util.CheckClassAdapter; import org.objectweb.asm.util.Printer; import org.objectweb.asm.util.Textifier; import org.objectweb.asm.util.TraceClassVisitor; import java.io.OutputStream; import java.io.PrintWriter; import java.io.Writer; @SuppressWarnings("unused") public class DebuggingWrapper implements AsmVisitorWrapper { private final PrintWriter printWriter; private final Printer printer; private final boolean check; public DebuggingWrapper(Writer writer, Printer printer, boolean check) { this.check = check; printWriter = new PrintWriter(writer); this.printer = printer; } public DebuggingWrapper(OutputStream outputStream, Printer printer, boolean check) { this.check = check; printWriter = new PrintWriter(outputStream); this.printer = printer; } public static AsmVisitorWrapper makeDefault() { return makeDefault(true); } public static AsmVisitorWrapper makeDefault(boolean check) { return new DebuggingWrapper(System.out, new Textifier(), check); } @Override public int mergeWriter(int flags) { return flags; } @Override public int mergeReader(int flags) { return flags; } @Override public ClassVisitor wrap(TypeDescription instrumentedType, ClassVisitor classVisitor, Implementation.Context implementationContext, TypePool typePool, FieldList<FieldDescription.InDefinedShape> fields, MethodList<?> methods, int writerFlags, int readerFlags) { return check ? new CheckClassAdapter(new TraceClassVisitor(classVisitor, printer, printWriter)) : new TraceClassVisitor(classVisitor, printer, printWriter); } }