Home | History | Annotate | Download | only in impl
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package signature.model.impl;
     18 
     19 import signature.model.IClassReference;
     20 import signature.model.IParameterizedType;
     21 import signature.model.ITypeReference;
     22 import signature.model.util.ModelUtil;
     23 
     24 import java.io.Serializable;
     25 import java.util.List;
     26 
     27 @SuppressWarnings("serial")
     28 public class SigParameterizedType implements IParameterizedType, Serializable {
     29 
     30     private ITypeReference ownerType;
     31     private IClassReference rawType;
     32     private List<ITypeReference> typeArguments;
     33 
     34     public SigParameterizedType(ITypeReference ownerType,
     35             IClassReference rawType, List<ITypeReference> typeArguments) {
     36         this.ownerType = ownerType;
     37         this.rawType = rawType;
     38         this.typeArguments = typeArguments;
     39     }
     40 
     41     public ITypeReference getOwnerType() {
     42         ITypeReference returnValue = ownerType;
     43         if (returnValue == null) {
     44             if (rawType.getClassDefinition().getDeclaringClass() != null) {
     45                 returnValue = new SigClassReference(rawType
     46                         .getClassDefinition().getDeclaringClass());
     47             }
     48         }
     49         return returnValue;
     50     }
     51 
     52     public IClassReference getRawType() {
     53         return rawType;
     54     }
     55 
     56     public List<ITypeReference> getTypeArguments() {
     57         return typeArguments;
     58     }
     59 
     60     @Override
     61     public int hashCode() {
     62         return hashCode(this);
     63     }
     64 
     65     public static int hashCode(IParameterizedType type) {
     66         final int prime = 31;
     67         int result = 1;
     68         result = prime * type.getRawType().hashCode();
     69         result = prime * result + type.getTypeArguments().hashCode();
     70         return result;
     71     }
     72 
     73     @Override
     74     public boolean equals(Object obj) {
     75         return equals(this, obj);
     76     }
     77 
     78     public static boolean equals(IParameterizedType thiz, Object that) {
     79         if (!(that instanceof IParameterizedType)) {
     80             return false;
     81         }
     82         IParameterizedType other = (IParameterizedType) that;
     83         if (thiz.getOwnerType() == null) {
     84             if (other.getOwnerType() != null) {
     85                 return false;
     86             }
     87         } else if (Uninitialized.isInitialized(thiz.getOwnerType())) {
     88             if (!Uninitialized.isInitialized(other.getOwnerType())) {
     89                 return false;
     90             }
     91         } else if (!thiz.getOwnerType().equals(other.getOwnerType())) {
     92             return false;
     93         }
     94         if (!thiz.getRawType().equals(other.getRawType())) {
     95             return false;
     96         }
     97         if (!thiz.getTypeArguments().equals(other.getTypeArguments())) {
     98             return false;
     99         }
    100         return true;
    101     }
    102 
    103 
    104     @Override
    105     public String toString() {
    106         return SigParameterizedType.toString(this);
    107     }
    108 
    109     public static String toString(IParameterizedType type) {
    110         StringBuilder builder = new StringBuilder();
    111         if (type.getOwnerType() != null) {
    112             builder.append(type.getOwnerType().toString());
    113             builder.append("::");
    114         }
    115         builder.append(type.getRawType());
    116         builder.append("<");
    117         builder.append(ModelUtil.separate(type.getTypeArguments(), ", "));
    118         builder.append(">");
    119         return builder.toString();
    120     }
    121 }
    122