1 11 package org.eclipse.jdt.internal.corext.refactoring.rename; 12 13 import java.util.Collections ; 14 import java.util.LinkedList ; 15 import java.util.Map ; 16 17 import org.eclipse.core.runtime.Assert; 18 19 import org.eclipse.jdt.core.IField; 20 import org.eclipse.jdt.core.IInitializer; 21 import org.eclipse.jdt.core.IJavaElement; 22 import org.eclipse.jdt.core.IMember; 23 import org.eclipse.jdt.core.IMethod; 24 import org.eclipse.jdt.core.IType; 25 import org.eclipse.jdt.core.Signature; 26 27 28 40 public class RefactoringHandleTransplanter { 41 42 private final IType fOldType; 43 private final IType fNewType; 44 private final Map fRefactoredSimilarElements; 45 46 51 public RefactoringHandleTransplanter(IType oldType, IType newType, Map refactoredSimilarElements) { 52 fOldType= oldType; 53 fNewType= newType; 54 if (refactoredSimilarElements == null) 55 fRefactoredSimilarElements= Collections.EMPTY_MAP; 56 else 57 fRefactoredSimilarElements= refactoredSimilarElements; 58 } 59 60 67 public IMember transplantHandle(IMember handle) { 68 69 72 final LinkedList oldElements= new LinkedList (); 73 addElements(handle, oldElements); 74 75 78 final IMember[] newElements= convertElements((IMember[]) oldElements.toArray(new IMember[0])); 79 80 return newElements[newElements.length - 1]; 81 } 82 83 private void addElements(IMember element, LinkedList chain) { 84 chain.addFirst(element); 85 IJavaElement parent= element.getParent(); 86 if (parent instanceof IMember) 87 addElements((IMember) parent, chain); 88 } 89 90 private IMember[] convertElements(IMember[] oldElements) { 91 92 final IMember[] newElements= new IMember[oldElements.length]; 93 final IMember first= oldElements[0]; 94 95 Assert.isTrue(first instanceof IType); 96 97 if (first.equals(fOldType)) 98 newElements[0]= fNewType; 100 else 101 newElements[0]= first; 102 103 108 109 for (int i= 1; i < oldElements.length; i++) { 110 final IJavaElement newParent= newElements[i - 1]; 111 final IJavaElement currentElement= oldElements[i]; 112 switch (newParent.getElementType()) { 113 case IJavaElement.TYPE: { 114 switch (currentElement.getElementType()) { 115 case IJavaElement.TYPE: { 116 final String newName= resolveTypeName((IType) currentElement); 117 newElements[i]= ((IType) newParent).getType(newName); 118 break; 119 } 120 case IJavaElement.METHOD: { 121 final String newName= resolveElementName(currentElement); 122 final String [] newParameterTypes= resolveParameterTypes((IMethod) currentElement); 123 newElements[i]= ((IType) newParent).getMethod(newName, newParameterTypes); 124 break; 125 } 126 case IJavaElement.INITIALIZER: { 127 final IInitializer initializer= (IInitializer) currentElement; 128 newElements[i]= ((IType) newParent).getInitializer(initializer.getOccurrenceCount()); 129 break; 130 } 131 case IJavaElement.FIELD: { 132 final String newName= resolveElementName(currentElement); 133 newElements[i]= ((IType) newParent).getField(newName); 134 break; 135 } 136 } 137 break; 138 } 139 case IJavaElement.METHOD: { 140 switch (currentElement.getElementType()) { 141 case IJavaElement.TYPE: { 142 newElements[i]= resolveTypeInMember((IMethod) newParent, (IType) currentElement); 143 break; 144 } 145 } 146 break; 147 } 148 case IJavaElement.INITIALIZER: { 149 switch (currentElement.getElementType()) { 150 case IJavaElement.TYPE: { 151 newElements[i]= resolveTypeInMember((IInitializer) newParent, (IType) currentElement); 152 break; 153 } 154 } 155 break; 156 } 157 case IJavaElement.FIELD: { 158 switch (currentElement.getElementType()) { 159 case IJavaElement.TYPE: { 160 newElements[i]= resolveTypeInMember((IField) newParent, (IType) currentElement); 162 break; 163 } 164 } 165 break; 166 } 167 } 168 } 169 return newElements; 170 } 171 172 private String [] resolveParameterTypes(IMethod method) { 173 final String [] oldParameterTypes= method.getParameterTypes(); 174 final String [] newparams= new String [oldParameterTypes.length]; 175 176 final String [] possibleOldSigs= new String [4]; 177 possibleOldSigs[0]= Signature.createTypeSignature(fOldType.getElementName(), false); 178 possibleOldSigs[1]= Signature.createTypeSignature(fOldType.getElementName(), true); 179 possibleOldSigs[2]= Signature.createTypeSignature(fOldType.getFullyQualifiedName(), false); 180 possibleOldSigs[3]= Signature.createTypeSignature(fOldType.getFullyQualifiedName(), true); 181 182 final String [] possibleNewSigs= new String [4]; 183 possibleNewSigs[0]= Signature.createTypeSignature(fNewType.getElementName(), false); 184 possibleNewSigs[1]= Signature.createTypeSignature(fNewType.getElementName(), true); 185 possibleNewSigs[2]= Signature.createTypeSignature(fNewType.getFullyQualifiedName(), false); 186 possibleNewSigs[3]= Signature.createTypeSignature(fNewType.getFullyQualifiedName(), true); 187 188 for (int i= 0; i < oldParameterTypes.length; i++) { 191 newparams[i]= oldParameterTypes[i]; 192 for (int j= 0; j < possibleOldSigs.length; j++) { 193 newparams[i]= replaceAll(newparams[i], possibleOldSigs[j], possibleNewSigs[j]); 194 } 195 } 196 return newparams; 197 } 198 199 private String resolveElementName(IJavaElement element) { 200 final String newName= (String ) fRefactoredSimilarElements.get(element); 201 if (newName != null) 202 return newName; 203 else 204 return element.getElementName(); 205 } 206 207 private IMember resolveTypeInMember(final IMember newParent, IType oldChild) { 208 String newName= ""; if (oldChild.getElementName().length() != 0) 211 newName= resolveTypeName(oldChild); 212 return newParent.getType(newName, oldChild.getOccurrenceCount()); 213 } 214 215 private String resolveTypeName(IType type) { 216 return type.equals(fOldType) ? fNewType.getElementName() : type.getElementName(); 217 } 218 219 private static String replaceAll(final String source, final String replaceFrom, final String replaceTo) { 220 final StringBuffer buf= new StringBuffer (source.length()); 221 int currentIndex= 0; 222 int matchIndex; 223 while ((matchIndex= source.indexOf(replaceFrom, currentIndex)) != -1) { 224 buf.append(source.substring(currentIndex, matchIndex)); 225 buf.append(replaceTo); 226 currentIndex= matchIndex + replaceFrom.length(); 227 } 228 buf.append(source.substring(currentIndex)); 229 return buf.toString(); 230 } 231 } 232 | Popular Tags |