Home | History | Annotate | Download | only in util
      1 /***
      2  * ASM: a very small and fast Java bytecode manipulation framework
      3  * Copyright (c) 2000-2005 INRIA, France Telecom
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. Neither the name of the copyright holders nor the names of its
     15  *    contributors may be used to endorse or promote products derived from
     16  *    this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     28  * THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 package org.objectweb.asm.util;
     31 
     32 import org.objectweb.asm.AnnotationVisitor;
     33 
     34 /**
     35  * An {@link AnnotationVisitor} that prints the ASM code that generates the
     36  * annotations it visits.
     37  *
     38  * @author Eric Bruneton
     39  */
     40 public class ASMifierAnnotationVisitor extends AbstractVisitor implements
     41         AnnotationVisitor
     42 {
     43 
     44     /**
     45      * Identifier of the annotation visitor variable in the produced code.
     46      */
     47     protected final int id;
     48 
     49     /**
     50      * Constructs a new {@link ASMifierAnnotationVisitor}.
     51      *
     52      * @param id identifier of the annotation visitor variable in the produced
     53      *        code.
     54      */
     55     public ASMifierAnnotationVisitor(final int id) {
     56         this.id = id;
     57     }
     58 
     59     // ------------------------------------------------------------------------
     60     // Implementation of the AnnotationVisitor interface
     61     // ------------------------------------------------------------------------
     62 
     63     public void visit(final String name, final Object value) {
     64         buf.setLength(0);
     65         buf.append("av").append(id).append(".visit(");
     66         ASMifierAbstractVisitor.appendConstant(buf, name);
     67         buf.append(", ");
     68         ASMifierAbstractVisitor.appendConstant(buf, value);
     69         buf.append(");\n");
     70         text.add(buf.toString());
     71     }
     72 
     73     public void visitEnum(
     74         final String name,
     75         final String desc,
     76         final String value)
     77     {
     78         buf.setLength(0);
     79         buf.append("av").append(id).append(".visitEnum(");
     80         ASMifierAbstractVisitor.appendConstant(buf, name);
     81         buf.append(", ");
     82         ASMifierAbstractVisitor.appendConstant(buf, desc);
     83         buf.append(", ");
     84         ASMifierAbstractVisitor.appendConstant(buf, value);
     85         buf.append(");\n");
     86         text.add(buf.toString());
     87     }
     88 
     89     public AnnotationVisitor visitAnnotation(
     90         final String name,
     91         final String desc)
     92     {
     93         buf.setLength(0);
     94         buf.append("{\n");
     95         buf.append("AnnotationVisitor av").append(id + 1).append(" = av");
     96         buf.append(id).append(".visitAnnotation(");
     97         ASMifierAbstractVisitor.appendConstant(buf, name);
     98         buf.append(", ");
     99         ASMifierAbstractVisitor.appendConstant(buf, desc);
    100         buf.append(");\n");
    101         text.add(buf.toString());
    102         ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(id + 1);
    103         text.add(av.getText());
    104         text.add("}\n");
    105         return av;
    106     }
    107 
    108     public AnnotationVisitor visitArray(final String name) {
    109         buf.setLength(0);
    110         buf.append("{\n");
    111         buf.append("AnnotationVisitor av").append(id + 1).append(" = av");
    112         buf.append(id).append(".visitArray(");
    113         ASMifierAbstractVisitor.appendConstant(buf, name);
    114         buf.append(");\n");
    115         text.add(buf.toString());
    116         ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(id + 1);
    117         text.add(av.getText());
    118         text.add("}\n");
    119         return av;
    120     }
    121 
    122     public void visitEnd() {
    123         buf.setLength(0);
    124         buf.append("av").append(id).append(".visitEnd();\n");
    125         text.add(buf.toString());
    126     }
    127 }
    128