Home | History | Annotate | Download | only in visitor
      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 import proguard.obfuscate.AttributeShrinker;
     28 
     29 /**
     30  * This AttributeVisitor delegates its visits to one of two other
     31  * AttributeVisitor instances, depending on whether the visited attribute
     32  * is strictly required or not.
     33  *
     34  * Stack map attributes and stack map table attributes are treated as optional.
     35  *
     36  * @see AttributeShrinker
     37  *
     38  * @author Eric Lafortune
     39  */
     40 public class RequiredAttributeFilter
     41 implements   AttributeVisitor
     42 {
     43     private final AttributeVisitor requiredAttributeVisitor;
     44     private final AttributeVisitor optionalAttributeVisitor;
     45 
     46 
     47     /**
     48      * Creates a new RequiredAttributeFilter for visiting required attributes.
     49      * @param requiredAttributeVisitor   the visitor that will visit required
     50      *                                   attributes.
     51      */
     52     public RequiredAttributeFilter(AttributeVisitor requiredAttributeVisitor)
     53     {
     54         this(requiredAttributeVisitor, null);
     55     }
     56 
     57 
     58     /**
     59      * Creates a new RequiredAttributeFilter for visiting required and
     60      * optional attributes.
     61      * @param requiredAttributeVisitor the visitor that will visit required
     62      *                                 attributes.
     63      * @param optionalAttributeVisitor the visitor that will visit optional
     64      *                                 attributes.
     65      */
     66     public RequiredAttributeFilter(AttributeVisitor requiredAttributeVisitor,
     67                                    AttributeVisitor optionalAttributeVisitor)
     68     {
     69         this.requiredAttributeVisitor = requiredAttributeVisitor;
     70         this.optionalAttributeVisitor = optionalAttributeVisitor;
     71     }
     72 
     73 
     74     // Implementations for AttributeVisitor.
     75 
     76     public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
     77     {
     78         if (optionalAttributeVisitor != null)
     79         {
     80             optionalAttributeVisitor.visitUnknownAttribute(clazz, unknownAttribute);
     81         }
     82     }
     83 
     84 
     85     public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute)
     86     {
     87         if (requiredAttributeVisitor != null)
     88         {
     89             requiredAttributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute);
     90         }
     91     }
     92 
     93 
     94     public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
     95     {
     96         if (optionalAttributeVisitor != null)
     97         {
     98             optionalAttributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute);
     99         }
    100     }
    101 
    102 
    103     public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
    104     {
    105         if (optionalAttributeVisitor != null)
    106         {
    107             optionalAttributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute);
    108         }
    109     }
    110 
    111 
    112     public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
    113     {
    114         if (optionalAttributeVisitor != null)
    115         {
    116             optionalAttributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute);
    117         }
    118     }
    119 
    120 
    121     public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
    122     {
    123         if (optionalAttributeVisitor != null)
    124         {
    125             optionalAttributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute);
    126         }
    127     }
    128 
    129 
    130     public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
    131     {
    132         if (optionalAttributeVisitor != null)
    133         {
    134             optionalAttributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute);
    135         }
    136     }
    137 
    138 
    139     public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute)
    140     {
    141         if (optionalAttributeVisitor != null)
    142         {
    143             optionalAttributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute);
    144         }
    145     }
    146 
    147 
    148     public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute)
    149     {
    150         if (optionalAttributeVisitor != null)
    151         {
    152             optionalAttributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute);
    153         }
    154     }
    155 
    156 
    157     public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
    158     {
    159         if (optionalAttributeVisitor != null)
    160         {
    161             optionalAttributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute);
    162         }
    163     }
    164 
    165 
    166     public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute)
    167     {
    168         if (optionalAttributeVisitor != null)
    169         {
    170             optionalAttributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute);
    171         }
    172     }
    173 
    174 
    175     public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute)
    176     {
    177         if (optionalAttributeVisitor != null)
    178         {
    179             optionalAttributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute);
    180         }
    181     }
    182 
    183 
    184     public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
    185     {
    186         if (optionalAttributeVisitor != null)
    187         {
    188             optionalAttributeVisitor.visitSignatureAttribute(clazz, signatureAttribute);
    189         }
    190     }
    191 
    192 
    193     public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute)
    194     {
    195         if (optionalAttributeVisitor != null)
    196         {
    197             optionalAttributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute);
    198         }
    199     }
    200 
    201 
    202     public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute)
    203     {
    204         if (optionalAttributeVisitor != null)
    205         {
    206             optionalAttributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute);
    207         }
    208     }
    209 
    210 
    211     public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
    212     {
    213         if (requiredAttributeVisitor != null)
    214         {
    215             requiredAttributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute);
    216         }
    217     }
    218 
    219 
    220     public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute)
    221     {
    222         if (optionalAttributeVisitor != null)
    223         {
    224             optionalAttributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute);
    225         }
    226     }
    227 
    228 
    229     public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
    230     {
    231         if (optionalAttributeVisitor != null)
    232         {
    233             optionalAttributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute);
    234         }
    235     }
    236 
    237 
    238     public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
    239     {
    240         if (requiredAttributeVisitor != null)
    241         {
    242             requiredAttributeVisitor.visitCodeAttribute(clazz, method, codeAttribute);
    243         }
    244     }
    245 
    246 
    247     public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
    248     {
    249         if (optionalAttributeVisitor != null)
    250         {
    251             optionalAttributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute);
    252         }
    253     }
    254 
    255 
    256     public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
    257     {
    258         if (optionalAttributeVisitor != null)
    259         {
    260             optionalAttributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute);
    261         }
    262     }
    263 
    264 
    265     public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
    266     {
    267         if (optionalAttributeVisitor != null)
    268         {
    269             optionalAttributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute);
    270         }
    271     }
    272 
    273 
    274     public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
    275     {
    276         if (optionalAttributeVisitor != null)
    277         {
    278             optionalAttributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute);
    279         }
    280     }
    281 
    282 
    283     public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
    284     {
    285         if (optionalAttributeVisitor != null)
    286         {
    287             optionalAttributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute);
    288         }
    289     }
    290 
    291 
    292     public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
    293     {
    294         if (optionalAttributeVisitor != null)
    295         {
    296             optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute);
    297         }
    298     }
    299 
    300 
    301     public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
    302     {
    303         if (optionalAttributeVisitor != null)
    304         {
    305             optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute);
    306         }
    307     }
    308 
    309 
    310     public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
    311     {
    312         if (optionalAttributeVisitor != null)
    313         {
    314             optionalAttributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute);
    315         }
    316     }
    317 
    318 
    319     public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
    320     {
    321         if (optionalAttributeVisitor != null)
    322         {
    323             optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute);
    324         }
    325     }
    326 
    327 
    328     public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
    329     {
    330         if (optionalAttributeVisitor != null)
    331         {
    332             optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute);
    333         }
    334     }
    335 
    336 
    337     public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
    338     {
    339         if (optionalAttributeVisitor != null)
    340         {
    341             optionalAttributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute);
    342         }
    343     }
    344 
    345 
    346     public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute)
    347     {
    348         if (optionalAttributeVisitor != null)
    349         {
    350             optionalAttributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute);
    351         }
    352     }
    353 
    354 
    355     public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute)
    356     {
    357         if (optionalAttributeVisitor != null)
    358         {
    359             optionalAttributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute);
    360         }
    361     }
    362 
    363 
    364     public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
    365     {
    366         if (optionalAttributeVisitor != null)
    367         {
    368             optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute);
    369         }
    370     }
    371 
    372 
    373     public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
    374     {
    375         if (optionalAttributeVisitor != null)
    376         {
    377             optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute);
    378         }
    379     }
    380 
    381 
    382     public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
    383     {
    384         if (optionalAttributeVisitor != null)
    385         {
    386             optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute);
    387         }
    388     }
    389 
    390 
    391     public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
    392     {
    393         if (optionalAttributeVisitor != null)
    394         {
    395             optionalAttributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute);
    396         }
    397     }
    398 
    399 
    400     public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
    401     {
    402         if (optionalAttributeVisitor != null)
    403         {
    404             optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute);
    405         }
    406     }
    407 
    408 
    409     public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
    410     {
    411         if (optionalAttributeVisitor != null)
    412         {
    413             optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute);
    414         }
    415     }
    416 
    417 
    418     public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
    419     {
    420         if (optionalAttributeVisitor != null)
    421         {
    422             optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute);
    423         }
    424     }
    425 
    426 
    427     public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
    428     {
    429         if (optionalAttributeVisitor != null)
    430         {
    431             optionalAttributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute);
    432         }
    433     }
    434 
    435 
    436     public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
    437     {
    438         if (optionalAttributeVisitor != null)
    439         {
    440             optionalAttributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute);
    441         }
    442     }
    443 }
    444