1 11 package org.eclipse.jdt.internal.compiler.lookup; 12 13 public class NestedTypeBinding extends SourceTypeBinding { 14 15 public SourceTypeBinding enclosingType; 16 17 public SyntheticArgumentBinding[] enclosingInstances; 18 public SyntheticArgumentBinding[] outerLocalVariables; 19 public int enclosingInstancesSlotSize; public int outerLocalVariablesSlotSize; 22 public NestedTypeBinding(char[][] typeName, ClassScope scope, SourceTypeBinding enclosingType) { 23 super(typeName, enclosingType.fPackage, scope); 24 this.tagBits |= TagBits.IsNestedType; 25 this.enclosingType = enclosingType; 26 } 27 28 31 public SyntheticArgumentBinding addSyntheticArgument(LocalVariableBinding actualOuterLocalVariable) { 32 SyntheticArgumentBinding synthLocal = null; 33 34 if (outerLocalVariables == null) { 35 synthLocal = new SyntheticArgumentBinding(actualOuterLocalVariable); 36 outerLocalVariables = new SyntheticArgumentBinding[] {synthLocal}; 37 } else { 38 int size = outerLocalVariables.length; 39 int newArgIndex = size; 40 for (int i = size; --i >= 0;) { if (outerLocalVariables[i].actualOuterLocalVariable == actualOuterLocalVariable) 42 return outerLocalVariables[i]; if (outerLocalVariables[i].id > actualOuterLocalVariable.id) 44 newArgIndex = i; 45 } 46 SyntheticArgumentBinding[] synthLocals = new SyntheticArgumentBinding[size + 1]; 47 System.arraycopy(outerLocalVariables, 0, synthLocals, 0, newArgIndex); 48 synthLocals[newArgIndex] = synthLocal = new SyntheticArgumentBinding(actualOuterLocalVariable); 49 System.arraycopy(outerLocalVariables, newArgIndex, synthLocals, newArgIndex + 1, size - newArgIndex); 50 outerLocalVariables = synthLocals; 51 } 52 if (scope.referenceCompilationUnit().isPropagatingInnerClassEmulation) 54 this.updateInnerEmulationDependents(); 55 return synthLocal; 56 } 57 58 61 public SyntheticArgumentBinding addSyntheticArgument(ReferenceBinding targetEnclosingType) { 62 SyntheticArgumentBinding synthLocal = null; 63 if (enclosingInstances == null) { 64 synthLocal = new SyntheticArgumentBinding(targetEnclosingType); 65 enclosingInstances = new SyntheticArgumentBinding[] {synthLocal}; 66 } else { 67 int size = enclosingInstances.length; 68 int newArgIndex = size; 69 for (int i = size; --i >= 0;) { 70 if (enclosingInstances[i].type == targetEnclosingType) 71 return enclosingInstances[i]; if (this.enclosingType() == targetEnclosingType) 73 newArgIndex = 0; 74 } 75 SyntheticArgumentBinding[] newInstances = new SyntheticArgumentBinding[size + 1]; 76 System.arraycopy(enclosingInstances, 0, newInstances, newArgIndex == 0 ? 1 : 0, size); 77 newInstances[newArgIndex] = synthLocal = new SyntheticArgumentBinding(targetEnclosingType); 78 enclosingInstances = newInstances; 79 } 80 if (scope.referenceCompilationUnit().isPropagatingInnerClassEmulation) 82 this.updateInnerEmulationDependents(); 83 return synthLocal; 84 } 85 86 89 public SyntheticArgumentBinding addSyntheticArgumentAndField(LocalVariableBinding actualOuterLocalVariable) { 90 SyntheticArgumentBinding synthLocal = addSyntheticArgument(actualOuterLocalVariable); 91 if (synthLocal == null) return null; 92 93 if (synthLocal.matchingField == null) 94 synthLocal.matchingField = addSyntheticFieldForInnerclass(actualOuterLocalVariable); 95 return synthLocal; 96 } 97 98 101 public SyntheticArgumentBinding addSyntheticArgumentAndField(ReferenceBinding targetEnclosingType) { 102 SyntheticArgumentBinding synthLocal = addSyntheticArgument(targetEnclosingType); 103 if (synthLocal == null) return null; 104 105 if (synthLocal.matchingField == null) 106 synthLocal.matchingField = addSyntheticFieldForInnerclass(targetEnclosingType); 107 return synthLocal; 108 } 109 110 113 final public void computeSyntheticArgumentSlotSizes() { 114 115 int slotSize = 0; 116 int enclosingInstancesCount = this.enclosingInstances == null ? 0 : this.enclosingInstances.length; 118 for (int i = 0; i < enclosingInstancesCount; i++){ 119 SyntheticArgumentBinding argument = this.enclosingInstances[i]; 120 argument.resolvedPosition = slotSize + 1; if (slotSize + 1 > 0xFF) { this.scope.problemReporter().noMoreAvailableSpaceForArgument(argument, this.scope.referenceType()); 124 } 125 if ((argument.type == TypeBinding.LONG) || (argument.type == TypeBinding.DOUBLE)){ 126 slotSize += 2; 127 } else { 128 slotSize ++; 129 } 130 } 131 this.enclosingInstancesSlotSize = slotSize; 132 133 slotSize = 0; int outerLocalsCount = this.outerLocalVariables == null ? 0 : this.outerLocalVariables.length; 135 for (int i = 0; i < outerLocalsCount; i++){ 136 SyntheticArgumentBinding argument = this.outerLocalVariables[i]; 137 if ((argument.type == TypeBinding.LONG) || (argument.type == TypeBinding.DOUBLE)){ 139 slotSize += 2; 140 } else { 141 slotSize ++; 142 } 143 } 144 this.outerLocalVariablesSlotSize = slotSize; 145 } 146 147 149 public ReferenceBinding enclosingType() { 150 151 return enclosingType; 152 } 153 154 156 public SyntheticArgumentBinding getSyntheticArgument(LocalVariableBinding actualOuterLocalVariable) { 157 158 if (outerLocalVariables == null) return null; 160 for (int i = outerLocalVariables.length; --i >= 0;) 161 if (outerLocalVariables[i].actualOuterLocalVariable == actualOuterLocalVariable) 162 return outerLocalVariables[i]; 163 return null; 164 } 165 166 public SyntheticArgumentBinding[] syntheticEnclosingInstances() { 167 return enclosingInstances; } 169 170 public ReferenceBinding[] syntheticEnclosingInstanceTypes() { 171 if (enclosingInstances == null) 172 return null; 173 174 int length = enclosingInstances.length; 175 ReferenceBinding types[] = new ReferenceBinding[length]; 176 for (int i = 0; i < length; i++) 177 types[i] = (ReferenceBinding) enclosingInstances[i].type; 178 return types; 179 } 180 181 public SyntheticArgumentBinding[] syntheticOuterLocalVariables() { 182 183 return outerLocalVariables; } 185 186 190 public void updateInnerEmulationDependents() { 191 } 193 194 196 public SyntheticArgumentBinding getSyntheticArgument(ReferenceBinding targetEnclosingType, boolean onlyExactMatch) { 197 198 if (enclosingInstances == null) return null; 200 for (int i = enclosingInstances.length; --i >= 0;) 202 if (enclosingInstances[i].type == targetEnclosingType) 203 if (enclosingInstances[i].actualOuterLocalVariable == null) 204 return enclosingInstances[i]; 205 206 if (!onlyExactMatch){ 210 for (int i = enclosingInstances.length; --i >= 0;) 211 if (enclosingInstances[i].actualOuterLocalVariable == null) 212 if (enclosingInstances[i].type.findSuperTypeWithSameErasure(targetEnclosingType) != null) 213 return enclosingInstances[i]; 214 } 215 return null; 216 } 217 } 218 | Popular Tags |