/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */
package net.ranides.assira.asm;

import java.io.IOException;
import java.io.PrintWriter;
import net.ranides.asm.ClassReader;
import net.ranides.asm.ClassVisitor;
import net.ranides.asm.util.TraceClassVisitor;

/**
 * Generator kodu ASM. Dekompiluje podaną klasę i generuje kod potrzebny do
 * utworzenia klasy za pomocą ASM
 * @author ranides
 */
public final class Asmifier {

    private Asmifier() {
        // utility class
    }

    /**
     * Dekompiluje podaną klasę i zapisuje do {@code writer}-a wygenerowany kod ASM.
     * @param clazz
     * @param writer
     * @throws IOException
     */
    public static void fromClass(Class<?> clazz, PrintWriter writer) throws IOException {
        ClassReader reader = new ClassReader(clazz.getName());
        ClassVisitor visitor = new TraceClassVisitor(null, new AsmPrinter(AsmFormat.getDefault()), writer);
        reader.accept(visitor, ClassReader.SKIP_DEBUG);
    }

    /**
     * Dekompiluje podany bytecode i zapisuje do {@code writer}-a wygenerowany kod ASM.
     * @param bytecode
     * @param writer
     */
    public static void fromClass(byte[] bytecode, PrintWriter writer) {
        ClassReader reader = new ClassReader(bytecode);
        ClassVisitor visitor = new TraceClassVisitor(null, new AsmPrinter(AsmFormat.getDefault()), writer);
        reader.accept(visitor, ClassReader.SKIP_DEBUG);
    }

}
