Home | History | Annotate | Download | only in proguard
      1 /*
      2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
      3  *             of Java bytecode.
      4  *
      5  * Copyright (c) 2002-2009 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;
     22 
     23 
     24 /**
     25  * This class stores a specification of class members. The specification is
     26  * template-based: the class member names and descriptors can contain wildcards.
     27  *
     28  * @author Eric Lafortune
     29  */
     30 public class MemberSpecification
     31 {
     32     public int    requiredSetAccessFlags;
     33     public int    requiredUnsetAccessFlags;
     34     public final String annotationType;
     35     public final String name;
     36     public final String descriptor;
     37 
     38 
     39     /**
     40      * Creates a new option to keep all possible class members.
     41      */
     42     public MemberSpecification()
     43     {
     44         this(0,
     45              0,
     46              null,
     47              null,
     48              null);
     49     }
     50 
     51 
     52     /**
     53      * Creates a new option to keep the specified class member(s).
     54      *
     55      * @param requiredSetAccessFlags   the class access flags that must be set
     56      *                                 in order for the class to apply.
     57      * @param requiredUnsetAccessFlags the class access flags that must be unset
     58      *                                 in order for the class to apply.
     59      * @param annotationType           the name of the class that must be an
     60      *                                 annotation in order for the class member
     61      *                                 to apply. The name may be null to specify
     62      *                                 that no annotation is required.
     63      * @param name                     the class member name. The name may be
     64      *                                 null to specify any class member or it
     65      *                                 may contain "*" or "?" wildcards.
     66      * @param descriptor               the class member descriptor. The
     67      *                                 descriptor may be null to specify any
     68      *                                 class member or it may contain
     69      *                                 "**", "*", or "?" wildcards.
     70      */
     71     public MemberSpecification(int    requiredSetAccessFlags,
     72                                int    requiredUnsetAccessFlags,
     73                                String annotationType,
     74                                String name,
     75                                String descriptor)
     76     {
     77         this.requiredSetAccessFlags   = requiredSetAccessFlags;
     78         this.requiredUnsetAccessFlags = requiredUnsetAccessFlags;
     79         this.annotationType           = annotationType;
     80         this.name                     = name;
     81         this.descriptor               = descriptor;
     82     }
     83 
     84 
     85 
     86     // Implementations for Object.
     87 
     88     public boolean equals(Object object)
     89     {
     90         if (object == null ||
     91             this.getClass() != object.getClass())
     92         {
     93             return false;
     94         }
     95 
     96         MemberSpecification other = (MemberSpecification)object;
     97         return
     98             (this.requiredSetAccessFlags   == other.requiredSetAccessFlags                                                                      ) &&
     99             (this.requiredUnsetAccessFlags == other.requiredUnsetAccessFlags                                                                    ) &&
    100             (this.annotationType == null ? other.annotationType == null : this.annotationType.equals(other.annotationType)) &&
    101             (this.name           == null ? other.name           == null : this.name.equals(other.name)                    ) &&
    102             (this.descriptor     == null ? other.descriptor     == null : this.descriptor.equals(other.descriptor)        );
    103     }
    104 
    105     public int hashCode()
    106     {
    107         return
    108             (requiredSetAccessFlags                                ) ^
    109             (requiredUnsetAccessFlags                              ) ^
    110             (annotationType == null ? 0 : annotationType.hashCode()) ^
    111             (name           == null ? 0 : name.hashCode()          ) ^
    112             (descriptor     == null ? 0 : descriptor.hashCode()    );
    113     }
    114 }
    115