1/* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2013 Eric Lafortune (eric@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 */ 21package proguard.classfile.attribute.visitor; 22 23import proguard.classfile.*; 24import proguard.classfile.attribute.*; 25import proguard.classfile.attribute.annotation.*; 26import proguard.classfile.attribute.preverification.*; 27import proguard.util.StringMatcher; 28 29/** 30 * This AttributeVisitor delegates its visits another AttributeVisitor, but 31 * only when the visited attribute is not empty. For instance, a local variable 32 * table without variables is empty. 33 * 34 * @author Eric Lafortune 35 */ 36public class NonEmptyAttributeFilter 37implements AttributeVisitor 38{ 39 private final AttributeVisitor attributeVisitor; 40 41 42 /** 43 * Creates a new NonEmptyAttributeFilter. 44 * @param attributeVisitor the <code>AttributeVisitor</code> to which 45 * visits will be delegated. 46 */ 47 public NonEmptyAttributeFilter(AttributeVisitor attributeVisitor) 48 { 49 this.attributeVisitor = attributeVisitor; 50 } 51 52 53 // Implementations for AttributeVisitor. 54 55 public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute) 56 { 57 unknownAttribute.accept(clazz, attributeVisitor); 58 } 59 60 61 public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute) 62 { 63 if (bootstrapMethodsAttribute.u2bootstrapMethodsCount > 0) 64 { 65 bootstrapMethodsAttribute.accept(clazz, attributeVisitor); 66 } 67 } 68 69 70 public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute) 71 { 72 sourceFileAttribute.accept(clazz, attributeVisitor); 73 } 74 75 76 public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute) 77 { 78 sourceDirAttribute.accept(clazz, attributeVisitor); 79 } 80 81 82 public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute) 83 { 84 if (innerClassesAttribute.u2classesCount > 0) 85 { 86 innerClassesAttribute.accept(clazz, attributeVisitor); 87 } 88 } 89 90 91 public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) 92 { 93 enclosingMethodAttribute.accept(clazz, attributeVisitor); 94 } 95 96 97 public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute) 98 { 99 deprecatedAttribute.accept(clazz, attributeVisitor); 100 } 101 102 103 public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute) 104 { 105 deprecatedAttribute.accept(clazz, field, attributeVisitor); 106 } 107 108 109 public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute) 110 { 111 deprecatedAttribute.accept(clazz, method, attributeVisitor); 112 } 113 114 115 public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute) 116 { 117 syntheticAttribute.accept(clazz, attributeVisitor); 118 } 119 120 121 public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute) 122 { 123 syntheticAttribute.accept(clazz, field, attributeVisitor); 124 } 125 126 127 public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute) 128 { 129 syntheticAttribute.accept(clazz, method, attributeVisitor); 130 } 131 132 133 public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute) 134 { 135 signatureAttribute.accept(clazz, attributeVisitor); 136 } 137 138 139 public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute) 140 { 141 signatureAttribute.accept(clazz, field, attributeVisitor); 142 } 143 144 145 public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute) 146 { 147 signatureAttribute.accept(clazz, method, attributeVisitor); 148 } 149 150 151 public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute) 152 { 153 constantValueAttribute.accept(clazz, field, attributeVisitor); 154 } 155 156 157 public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute) 158 { 159 if (exceptionsAttribute.u2exceptionIndexTableLength > 0) 160 { 161 exceptionsAttribute.accept(clazz, method, attributeVisitor); 162 } 163 } 164 165 166 public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 167 { 168 codeAttribute.accept(clazz, method, attributeVisitor); 169 } 170 171 172 public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute) 173 { 174 if (stackMapAttribute.u2stackMapFramesCount > 0) 175 { 176 stackMapAttribute.accept(clazz, method, codeAttribute, attributeVisitor); 177 } 178 } 179 180 181 public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute) 182 { 183 if (stackMapTableAttribute.u2stackMapFramesCount > 0) 184 { 185 stackMapTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor); 186 } 187 } 188 189 190 public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute) 191 { 192 if (lineNumberTableAttribute.u2lineNumberTableLength > 0) 193 { 194 lineNumberTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor); 195 } 196 } 197 198 199 public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute) 200 { 201 if (localVariableTableAttribute.u2localVariableTableLength > 0) 202 { 203 localVariableTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor); 204 } 205 } 206 207 208 public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute) 209 { 210 if (localVariableTypeTableAttribute.u2localVariableTypeTableLength > 0) 211 { 212 localVariableTypeTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor); 213 } 214 } 215 216 217 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 218 { 219 if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) 220 { 221 runtimeVisibleAnnotationsAttribute.accept(clazz, attributeVisitor); 222 } 223 } 224 225 226 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 227 { 228 if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) 229 { 230 runtimeVisibleAnnotationsAttribute.accept(clazz, field, attributeVisitor); 231 } 232 } 233 234 235 public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute) 236 { 237 if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0) 238 { 239 runtimeVisibleAnnotationsAttribute.accept(clazz, method, attributeVisitor); 240 } 241 } 242 243 244 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 245 { 246 if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) 247 { 248 runtimeInvisibleAnnotationsAttribute.accept(clazz, attributeVisitor); 249 } 250 } 251 252 253 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 254 { 255 if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) 256 { 257 runtimeInvisibleAnnotationsAttribute.accept(clazz, field, attributeVisitor); 258 } 259 } 260 261 262 public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute) 263 { 264 if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0) 265 { 266 runtimeInvisibleAnnotationsAttribute.accept(clazz, method, attributeVisitor); 267 } 268 } 269 270 271 public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute) 272 { 273 if (runtimeVisibleParameterAnnotationsAttribute.u2parametersCount > 0) 274 { 275 runtimeVisibleParameterAnnotationsAttribute.accept(clazz, method, attributeVisitor); 276 } 277 } 278 279 280 public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute) 281 { 282 if (runtimeInvisibleParameterAnnotationsAttribute.u2parametersCount > 0) 283 { 284 runtimeInvisibleParameterAnnotationsAttribute.accept(clazz, method, attributeVisitor); 285 } 286 } 287 288 289 public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) 290 { 291 annotationDefaultAttribute.accept(clazz, method, attributeVisitor); 292 } 293} 294