| /** |
| * ASM: a very small and fast Java bytecode manipulation framework |
| * Copyright (c) 2000,2002,2003 INRIA, France Telecom |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * 3. Neither the name of the copyright holders nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| * THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| package org.objectweb.asm.util.attrs; |
| |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.objectweb.asm.Attribute; |
| import org.objectweb.asm.ClassReader; |
| import org.objectweb.asm.Label; |
| import org.objectweb.asm.Type; |
| import org.objectweb.asm.attrs.Annotation; |
| import org.objectweb.asm.attrs.AnnotationDefaultAttribute; |
| import org.objectweb.asm.attrs.Annotation.EnumConstValue; |
| |
| /** |
| * An {@link ASMifiable} {@link AnnotationDefaultAttribute} sub class. |
| * |
| * @author Eugene Kuleshov |
| */ |
| |
| public class ASMAnnotationDefaultAttribute extends AnnotationDefaultAttribute |
| implements ASMifiable |
| { |
| |
| protected Attribute read (ClassReader cr, int off, |
| int len, char[] buf, int codeOff, Label[] labels) |
| { |
| AnnotationDefaultAttribute attr = |
| (AnnotationDefaultAttribute)super.read( |
| cr, off, len, buf, codeOff, labels); |
| |
| ASMAnnotationDefaultAttribute result = new ASMAnnotationDefaultAttribute(); |
| result.defaultValue = attr.defaultValue; |
| return result; |
| } |
| |
| public void asmify (StringBuffer buf, String varName, Map labelNames) { |
| buf.append("AnnotationDefaultAttribute ").append(varName) |
| .append(" = new AnnotationDefaultAttribute();\n"); |
| String val = asmify(defaultValue, buf, varName + "Val"); |
| buf.append(varName).append(".defaultValue = ") |
| .append(val).append(";\n"); |
| } |
| |
| static void asmifyAnnotations (StringBuffer buf, String varName, List annotations) { |
| if (annotations.size() > 0) { |
| buf.append("{\n"); |
| for (int i = 0; i < annotations.size(); i++) { |
| String val = varName + "ann" + i; |
| asmify((Annotation)annotations.get(i), buf, val); |
| buf.append(varName).append(".annotations.add( ").append(val).append(");\n"); |
| } |
| buf.append("}\n"); |
| } |
| } |
| |
| static void asmifyParameterAnnotations (StringBuffer buf, String varName, List parameters) { |
| if (parameters.size() > 0) { |
| buf.append("{\n"); |
| for (int i = 0; i < parameters.size(); i++) { |
| String val = varName + "param" + i; |
| buf.append( "List ").append( val).append( " = new ArrayList();\n"); |
| List annotations = (List)parameters.get(i); |
| if (annotations.size() > 0) { |
| buf.append("{\n"); |
| for (int i1 = 0; i1 < annotations.size(); i1++) { |
| String val1 = val + "ann" + i1; |
| asmify((Annotation)annotations.get(i1), buf, val1); |
| buf.append(val).append(".add( ").append(val1).append(");\n"); |
| } |
| buf.append("}\n"); |
| } |
| buf.append(varName).append(".parameters.add( ").append(val).append(");\n\n"); |
| } |
| buf.append("}\n"); |
| } |
| } |
| |
| static String asmify (Annotation a, StringBuffer buf, String varName) { |
| buf.append("Annotation ").append(varName) |
| .append(" = new Annotation(\"").append(a.type).append("\");\n"); |
| List elementValues = a.elementValues; |
| if (elementValues.size() > 0) { |
| // buf.append("{\n"); |
| for (int i = 0; i < elementValues.size(); i++) { |
| Object[] values = (Object[])elementValues.get(i); |
| String val = asmify(values[1], buf, varName + "val" + i); |
| buf.append(varName).append(".add( \"") |
| .append(values[0]).append("\", ").append(val).append(");\n"); |
| } |
| // buf.append("}\n"); |
| } |
| return varName; |
| } |
| |
| static String asmify (Object value, StringBuffer buf, String valName) { |
| if (value instanceof String) { |
| return "\""+value+"\""; |
| |
| } else if (value instanceof Integer) { |
| return "new Integer((int)"+value+")"; |
| |
| } else if (value instanceof Byte) { |
| return "new Byte("+value+")"; |
| |
| } else if (value instanceof Character) { |
| return "new Character((char)"+value+")"; |
| |
| } else if (value instanceof Double) { |
| return "new Double((double)"+value+")"; |
| |
| } else if (value instanceof Float) { |
| return "new Float((float)"+value+")"; |
| |
| } else if (value instanceof Long) { |
| return "new Long((long)"+value+")"; |
| |
| } else if (value instanceof Short) { |
| return "new Short((short)"+value+")"; |
| |
| } else if (value instanceof Boolean) { |
| return "new Boolean("+value+")"; |
| |
| } else if (value instanceof EnumConstValue) { |
| EnumConstValue e = (EnumConstValue) value; |
| return "new Annotation.EnumConstValue(\""+e.typeName+"\", \""+e.constName+"\")"; |
| |
| } else if (value instanceof Type) { |
| Type t = (Type)value; |
| return "Type.getType(\""+t.getDescriptor()+"\")"; |
| |
| } else if (value instanceof Annotation) { |
| return asmify((Annotation)value, buf, valName); |
| |
| } else if (value instanceof Object[]) { |
| Object[] v = (Object[])value; |
| buf.append("Object[] ").append(valName) |
| .append(" = new Object[").append(v.length).append("];\n"); |
| for (int i = 0; i < v.length; i++) { |
| String val = asmify(v[i], buf, valName+"Arr"+i); |
| buf.append(valName+"["+i+"] = ").append(val).append(";\n"); |
| } |
| return valName; |
| |
| } |
| return null; |
| } |
| } |