1 30 package com.tc.asm.tree; 31 32 import java.util.ArrayList ; 33 import java.util.List ; 34 35 import com.tc.asm.AnnotationVisitor; 36 37 42 public class AnnotationNode implements AnnotationVisitor { 43 44 47 public String desc; 48 49 60 public List values; 61 62 67 public AnnotationNode(final String desc) { 68 this.desc = desc; 69 } 70 71 76 AnnotationNode(final List values) { 77 this.values = values; 78 } 79 80 84 public void visit(final String name, final Object value) { 85 if (values == null) { 86 values = new ArrayList (this.desc != null ? 2 : 1); 87 } 88 if (this.desc != null) { 89 values.add(name); 90 } 91 values.add(value); 92 } 93 94 public void visitEnum( 95 final String name, 96 final String desc, 97 final String value) 98 { 99 if (values == null) { 100 values = new ArrayList (this.desc != null ? 2 : 1); 101 } 102 if (this.desc != null) { 103 values.add(name); 104 } 105 values.add(new String [] { desc, value }); 106 } 107 108 public AnnotationVisitor visitAnnotation( 109 final String name, 110 final String desc) 111 { 112 if (values == null) { 113 values = new ArrayList (this.desc != null ? 2 : 1); 114 } 115 if (this.desc != null) { 116 values.add(name); 117 } 118 AnnotationNode annotation = new AnnotationNode(desc); 119 values.add(annotation); 120 return annotation; 121 } 122 123 public AnnotationVisitor visitArray(final String name) { 124 if (values == null) { 125 values = new ArrayList (this.desc != null ? 2 : 1); 126 } 127 if (this.desc != null) { 128 values.add(name); 129 } 130 List array = new ArrayList (); 131 values.add(array); 132 return new AnnotationNode(array); 133 } 134 135 public void visitEnd() { 136 } 137 138 142 147 public void accept(final AnnotationVisitor av) { 148 if (values != null) { 149 for (int i = 0; i < values.size(); i += 2) { 150 String name = (String ) values.get(i); 151 Object value = values.get(i + 1); 152 accept(av, name, value); 153 } 154 } 155 av.visitEnd(); 156 } 157 158 165 static void accept( 166 final AnnotationVisitor av, 167 final String name, 168 final Object value) 169 { 170 if (value instanceof String []) { 171 String [] typeconst = (String []) value; 172 av.visitEnum(name, typeconst[0], typeconst[1]); 173 } else if (value instanceof AnnotationNode) { 174 AnnotationNode an = (AnnotationNode) value; 175 an.accept(av.visitAnnotation(name, an.desc)); 176 } else if (value instanceof List ) { 177 AnnotationVisitor v = av.visitArray(name); 178 List array = (List ) value; 179 for (int j = 0; j < array.size(); ++j) { 180 accept(v, null, array.get(j)); 181 } 182 v.visitEnd(); 183 } else { 184 av.visit(name, value); 185 } 186 } 187 } 188 | Popular Tags |