1 11 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types; 12 13 import org.eclipse.core.runtime.Assert; 14 15 import org.eclipse.jdt.core.dom.ITypeBinding; 16 17 18 public final class ArrayType extends TType { 19 private TType fElementType; 20 private int fDimensions; 21 22 private TType fErasure; 23 24 protected ArrayType(TypeEnvironment environment) { 25 super(environment); 26 } 27 28 protected ArrayType(TypeEnvironment environment, String key) { 29 super(environment, key); 30 } 31 32 protected void initialize(ITypeBinding binding, TType elementType) { 33 Assert.isTrue(binding.isArray()); 34 super.initialize(binding); 35 fElementType= elementType; 36 fDimensions= binding.getDimensions(); 37 if (fElementType.isStandardType() || fElementType.isGenericType() || fElementType.isPrimitiveType()) { 38 fErasure= this; 39 } else { 40 fErasure= getEnvironment().create(binding.getErasure()); 41 } 42 } 43 44 protected void initialize(TType elementType, int dimensions) { 45 fElementType= elementType; 46 fDimensions= dimensions; 47 if (fElementType.isStandardType() || fElementType.isGenericType() || fElementType.isPrimitiveType()) { 48 fErasure= this; 49 } else { 50 fErasure= getEnvironment().createArrayType(elementType.getErasure(), dimensions); 51 } 52 } 53 54 public TType getElementType() { 55 return fElementType; 56 } 57 58 66 public TType getComponentType() { 67 if (fDimensions > 1) 68 return getEnvironment().createArrayType(fElementType, fDimensions - 1); 69 else 70 return fElementType; 71 } 72 73 public int getDimensions() { 74 return fDimensions; 75 } 76 77 public int getKind() { 78 return ARRAY_TYPE; 79 } 80 81 public TType[] getSubTypes() { 82 TType[] subTypes= fElementType.getSubTypes(); 83 TType[] result= new TType[subTypes.length]; 84 for (int i= 0; i < subTypes.length; i++) { 85 result[i]= getEnvironment().createArrayType(subTypes[i], fDimensions); 86 } 87 return result; 88 } 89 90 public TType getErasure() { 91 return fErasure; 92 } 93 94 public boolean doEquals(TType other) { 95 ArrayType arrayType= (ArrayType)other; 96 return fElementType.equals(arrayType.fElementType) && fDimensions == arrayType.fDimensions; 97 } 98 99 public int hashCode() { 100 return fElementType.hashCode() << ARRAY_TYPE_SHIFT; 101 } 102 103 protected boolean doCanAssignTo(TType lhs) { 104 switch (lhs.getKind()) { 105 case NULL_TYPE: return false; 106 case VOID_TYPE: return false; 107 case PRIMITIVE_TYPE: return false; 108 109 case ARRAY_TYPE: return canAssignToArrayType((ArrayType)lhs); 110 111 case GENERIC_TYPE: return false; 112 case STANDARD_TYPE: return isArrayLhsCompatible(lhs); 113 case PARAMETERIZED_TYPE: return false; 114 case RAW_TYPE: return false; 115 116 case UNBOUND_WILDCARD_TYPE: 117 case EXTENDS_WILDCARD_TYPE: 118 case SUPER_WILDCARD_TYPE: 119 return ((WildcardType)lhs).checkAssignmentBound(this); 120 121 case TYPE_VARIABLE: return false; 122 case CAPTURE_TYPE: 123 return ((CaptureType)lhs).checkLowerBound(lhs); 124 } 125 return false; 126 } 127 128 private boolean canAssignToArrayType(ArrayType lhs) { 129 if (fDimensions == lhs.fDimensions) { 130 if (fElementType.getKind() == PRIMITIVE_TYPE || lhs.fElementType.getKind() == PRIMITIVE_TYPE) 132 return fElementType.isTypeEquivalentTo(lhs.fElementType); 133 return fElementType.canAssignTo(lhs.fElementType); 134 } 135 if (fDimensions < lhs.fDimensions) 136 return false; 137 return isArrayLhsCompatible(lhs.fElementType); 138 } 139 140 private boolean isArrayLhsCompatible(TType lhsElementType) { 141 return lhsElementType.isJavaLangObject() || lhsElementType.isJavaLangCloneable() || lhsElementType.isJavaIoSerializable(); 142 } 143 144 protected String getPlainPrettySignature() { 145 StringBuffer result= new StringBuffer (fElementType.getPlainPrettySignature()); 146 for (int i= 0; i < fDimensions; i++) { 147 result.append("[]"); } 149 return result.toString(); 150 } 151 152 public String getName() { 153 StringBuffer result= new StringBuffer (fElementType.getName()); 154 for (int i= 0; i < fDimensions; i++) { 155 result.append("[]"); } 157 return result.toString(); 158 } 159 160 } 161 | Popular Tags |