001: /*
002: * ASM: a very small and fast Java bytecode manipulation framework
003: * Copyright (c) 2000-2005 INRIA, France Telecom
004: * All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: * 1. Redistributions of source code must retain the above copyright
010: * notice, this list of conditions and the following disclaimer.
011: * 2. Redistributions in binary form must reproduce the above copyright
012: * notice, this list of conditions and the following disclaimer in the
013: * documentation and/or other materials provided with the distribution.
014: * 3. Neither the name of the copyright holders nor the names of its
015: * contributors may be used to endorse or promote products derived from
016: * this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
021: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
022: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
023: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
024: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
025: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
026: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
027: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
028: * THE POSSIBILITY OF SUCH DAMAGE.
029: */
030: package org.objectweb.asm.util;
031:
032: import org.objectweb.asm.AnnotationVisitor;
033:
034: /**
035: * An {@link AnnotationVisitor} that prints the ASM code that generates the
036: * annotations it visits.
037: *
038: * @author Eric Bruneton
039: */
040: @SuppressWarnings("unchecked")
041: public class ASMifierAnnotationVisitor extends AbstractVisitor
042: implements AnnotationVisitor {
043:
044: /**
045: * Identifier of the annotation visitor variable in the produced code.
046: */
047: protected final int id;
048:
049: /**
050: * Constructs a new {@link ASMifierAnnotationVisitor}.
051: *
052: * @param id identifier of the annotation visitor variable in the produced
053: * code.
054: */
055: public ASMifierAnnotationVisitor(final int id) {
056: this .id = id;
057: }
058:
059: // ------------------------------------------------------------------------
060: // Implementation of the AnnotationVisitor interface
061: // ------------------------------------------------------------------------
062:
063: public void visit(final String name, final Object value) {
064: buf.setLength(0);
065: buf.append("av").append(id).append(".visit(");
066: ASMifierAbstractVisitor.appendConstant(buf, name);
067: buf.append(", ");
068: ASMifierAbstractVisitor.appendConstant(buf, value);
069: buf.append(");\n");
070: text.add(buf.toString());
071: }
072:
073: public void visitEnum(final String name, final String desc,
074: final String value) {
075: buf.setLength(0);
076: buf.append("av").append(id).append(".visitEnum(");
077: ASMifierAbstractVisitor.appendConstant(buf, name);
078: buf.append(", ");
079: ASMifierAbstractVisitor.appendConstant(buf, desc);
080: buf.append(", ");
081: ASMifierAbstractVisitor.appendConstant(buf, value);
082: buf.append(");\n");
083: text.add(buf.toString());
084: }
085:
086: public AnnotationVisitor visitAnnotation(final String name,
087: final String desc) {
088: buf.setLength(0);
089: buf.append("{\n");
090: buf.append("AnnotationVisitor av").append(id + 1).append(
091: " = av");
092: buf.append(id).append(".visitAnnotation(");
093: ASMifierAbstractVisitor.appendConstant(buf, name);
094: buf.append(", ");
095: ASMifierAbstractVisitor.appendConstant(buf, desc);
096: buf.append(");\n");
097: text.add(buf.toString());
098: ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(
099: id + 1);
100: text.add(av.getText());
101: text.add("}\n");
102: return av;
103: }
104:
105: public AnnotationVisitor visitArray(final String name) {
106: buf.setLength(0);
107: buf.append("{\n");
108: buf.append("AnnotationVisitor av").append(id + 1).append(
109: " = av");
110: buf.append(id).append(".visitArray(");
111: ASMifierAbstractVisitor.appendConstant(buf, name);
112: buf.append(");\n");
113: text.add(buf.toString());
114: ASMifierAnnotationVisitor av = new ASMifierAnnotationVisitor(
115: id + 1);
116: text.add(av.getText());
117: text.add("}\n");
118: return av;
119: }
120:
121: public void visitEnd() {
122: buf.setLength(0);
123: buf.append("av").append(id).append(".visitEnd();\n");
124: text.add(buf.toString());
125: }
126: }
|