1 /* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2014 Eric Lafortune (eric (at) graphics.cornell.edu) 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the Free 9 * Software Foundation; either version 2 of the License, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15 * more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 package proguard.classfile.attribute.visitor; 22 23 import proguard.classfile.*; 24 import proguard.classfile.attribute.*; 25 import proguard.classfile.attribute.annotation.*; 26 import proguard.classfile.attribute.preverification.*; 27 28 /** 29 * This AttributeVisitor delegates its visits another AttributeVisitor, but 30 * only when the visited attribute is not empty. For instance, a local variable 31 * table without variables is empty. 32 * 33 * @author Eric Lafortune 34 */ 35 public class NonEmptyAttributeFilter 36 implements AttributeVisitor 37 { 38 private final AttributeVisitor attributeVisitor; 39 40 41 /** 42 * Creates a new NonEmptyAttributeFilter. 43 * @param attributeVisitor the <code>AttributeVisitor</code> to which 44 * visits will be delegated. 45 */ 46 public NonEmptyAttributeFilter(AttributeVisitor attributeVisitor) 47 { 48 this.attributeVisitor = attributeVisitor; 49 } 50 51 52 // Implementations for AttributeVisitor. 53 54 public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) 55 { 56 attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute); 57 } 58 59 60 public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) 61 { 62 if (bootstrapMethodsAttribute.u2bootstrapMethodsCount > 0) 63 { 64 attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute); 65 } 66 } 67 68 69 public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) 70 { 71 attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute); 72 } 73 74 75 public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) 76 { 77 attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute); 78 } 79 80 81 public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) 82 { 83 if (innerClassesAttribute.u2classesCount > 0) 84 { 85 attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute); 86 } 87 } 88 89 90 public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) 91 { 92 attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute); 93 } 94 95 96 public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) 97 { 98 attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute); 99 } 100 101 102 public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) 103 { 104 attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute); 105 } 106 107 108 public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) 109 { 110 attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute); 111 } 112 113 114 public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) 115 { 116 attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute); 117 } 118 119 120 public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) 121 { 122 attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute); 123 } 124 125 126 public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) 127 { 128 attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute); 129 } 130 131 132 public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) 133 { 134 attributeVisitor.visitSignatureAttribute(clazz, signatureAttribute); 135 } 136 137 138 public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) 139 { 140 attributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute); 141 } 142 143 144 public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) 145 { 146 attributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute); 147 } 148 149 150 public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) 151 { 152 attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute); 153 } 154 155 156 public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute) 157 { 158 if (exceptionsAttribute.u1parametersCount > 0) 159 { 160 attributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute); 161 } 162 } 163 164 165 public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) 166 { 167 if (exceptionsAttribute.u2exceptionIndexTableLength > 0) 168 { 169 attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute); 170 } 171 } 172 173 174 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 175 { 176 attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute); 177 } 178 179 180 public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) 181 { 182 if (stackMapAttribute.u2stackMapFramesCount > 0) 183 { 184 attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute); 185 } 186 } 187 188 189 public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) 190 { 191 if (stackMapTableAttribute.u2stackMapFramesCount > 0) 192 { 193 attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute); 194 } 195 } 196 197 198 public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) 199 { 200 if (lineNumberTableAttribute.u2lineNumberTableLength > 0) 201 { 202 attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute); 203 } 204 } 205 206 207 public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) 208 { 209 if (localVariableTableAttribute.u2localVariableTableLength > 0) 210 { 211 attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute); 212 } 213 } 214 215 216 public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) 217 { 218 if (localVariableTypeTableAttribute.u2localVariableTypeTableLength > 0) 219 { 220 attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute); 221 } 222 } 223 224 225 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 226 { 227 if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) 228 { 229 attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute); 230 } 231 } 232 233 234 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 235 { 236 if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) 237 { 238 attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute); 239 } 240 } 241 242 243 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 244 { 245 if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) 246 { 247 attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute); 248 } 249 } 250 251 252 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 253 { 254 if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) 255 { 256 attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute); 257 } 258 } 259 260 261 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 262 { 263 if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) 264 { 265 attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute); 266 } 267 } 268 269 270 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 271 { 272 if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) 273 { 274 attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute); 275 } 276 } 277 278 279 public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) 280 { 281 if (runtimeVisibleParameterAnnotationsAttribute.u1parametersCount > 0) 282 { 283 attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute); 284 } 285 } 286 287 288 public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) 289 { 290 if (runtimeInvisibleParameterAnnotationsAttribute.u1parametersCount > 0) 291 { 292 attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute); 293 } 294 } 295 296 297 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 298 { 299 if (runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount > 0) 300 { 301 attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute); 302 } 303 } 304 305 306 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 307 { 308 if (runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount > 0) 309 { 310 attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute); 311 } 312 } 313 314 315 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 316 { 317 if (runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount > 0) 318 { 319 attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute); 320 } 321 } 322 323 324 public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute) 325 { 326 if (runtimeVisibleTypeAnnotationsAttribute.u2annotationsCount > 0) 327 { 328 attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute); 329 } 330 } 331 332 333 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 334 { 335 if (runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount > 0) 336 { 337 attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute); 338 } 339 } 340 341 342 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 343 { 344 if (runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount > 0) 345 { 346 attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute); 347 } 348 } 349 350 351 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 352 { 353 if (runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount > 0) 354 { 355 attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute); 356 } 357 } 358 359 360 public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute) 361 { 362 if (runtimeInvisibleTypeAnnotationsAttribute.u2annotationsCount > 0) 363 { 364 attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute); 365 } 366 } 367 368 369 public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) 370 { 371 attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute); 372 } 373 } 374