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

/**
 * Klasa zawierająca ustawienia formatowania, używana przez {@link AsmPrinter}.
 * Używana do generowania syntetycznych nazw zmiennych używanych w generowanym
 * kodzie, komentarzy, etc
 * @author ranides
 */
public final class AsmFormat {

    private boolean comments;

    private AsmFormat() {
        // do nothing
    }

    /**
     * Zwraca domyślne ustawienia dla {@link AsmPrinter}-a
     * @return
     */
    public static AsmFormat getDefault() {
        AsmFormat result = new AsmFormat();

        result.comments = false;

        return result;
    }

    /**
     * Czy AsmPrinter powinien wstawiać komentarze w generowanym kodzie
     * @return
     */
    public boolean writeComments() {
        return comments;
    }

    /**
     * Generuje na podstawie FQPName klasy prostą nazwę, zawierającą nazwę klasy
     * z suffixem "Asm".
     * @param name
     * @return
     */
    public String getSimpleName(String name) {
        return name.substring(name.lastIndexOf('/')+1)+"Asm";
    }

    /**
     * Wyciąga z FQPName klasy nazwę pakietu.
     * @param name
     * @return
     */
    public String getPackageName(String name) {
        int n = name.lastIndexOf('/');
        return (n == -1) ? null : name.substring(0, n).replace('/', '.');
    }

    /**
     * Zwraca syntetyczną nazwę zmiennej, która wskazuje na ClassWriter-a
     * używanego w kodzie wygenerowanym przez AsmPrinter.
     * @return
     */
    public String getClassWriter() {
        return "writer";
    }

    /**
     * Zwraca syntetyczną nazwę zmiennej, która wskazuje na MethodWriter-a
     * używanego w kodzie wygenerowanym przez AsmPrinter.
     * @return
     */
    public String getMethodVisitor() {
        return "method";
    }

    /**
     * Zwraca syntetyczną nazwę zmiennej, która wskazuje na FieldWriter-a
     * używanego w kodzie wygenerowanym przez AsmPrinter.
     * @return
     */
    public String getFieldVisitor() {
        return "field";
    }

    /**
     * Generuje syntetyczną nazwę dla etykiety o podanym indeksie.
     * @param index
     * @return
     */
    public String getLabelName(int index) {
        return "local" + index;
    }

    /**
     * Generuje syntetyczną nazwę dla annotacji o podanym indeksie.
     * @param index
     * @return
     */
    public String getAnnotationVisitor(int index) {
        return "annotation" + index;
    }

}
