1 11 package org.eclipse.jdt.internal.corext.refactoring.delegates; 12 13 import java.util.ArrayList ; 14 import java.util.List ; 15 16 import org.eclipse.text.edits.TextEdit; 17 18 import org.eclipse.core.runtime.Assert; 19 20 import org.eclipse.jface.text.BadLocationException; 21 import org.eclipse.jface.text.Document; 22 import org.eclipse.jface.text.IDocument; 23 24 import org.eclipse.ltk.core.refactoring.CategorizedTextEditGroup; 25 import org.eclipse.ltk.core.refactoring.GroupCategory; 26 import org.eclipse.ltk.core.refactoring.GroupCategorySet; 27 28 import org.eclipse.jdt.core.JavaModelException; 29 import org.eclipse.jdt.core.dom.AST; 30 import org.eclipse.jdt.core.dom.ASTNode; 31 import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; 32 import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; 33 import org.eclipse.jdt.core.dom.BodyDeclaration; 34 import org.eclipse.jdt.core.dom.ChildListPropertyDescriptor; 35 import org.eclipse.jdt.core.dom.ChildPropertyDescriptor; 36 import org.eclipse.jdt.core.dom.Expression; 37 import org.eclipse.jdt.core.dom.IBinding; 38 import org.eclipse.jdt.core.dom.ITypeBinding; 39 import org.eclipse.jdt.core.dom.Javadoc; 40 import org.eclipse.jdt.core.dom.Name; 41 import org.eclipse.jdt.core.dom.TagElement; 42 import org.eclipse.jdt.core.dom.TextElement; 43 import org.eclipse.jdt.core.dom.Type; 44 import org.eclipse.jdt.core.dom.rewrite.ITrackedNodePosition; 45 import org.eclipse.jdt.core.dom.rewrite.ListRewrite; 46 47 import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings; 48 import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory; 49 import org.eclipse.jdt.internal.corext.dom.ASTNodes; 50 import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages; 51 import org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite; 52 import org.eclipse.jdt.internal.corext.util.Strings; 53 54 import org.eclipse.jdt.internal.ui.JavaPlugin; 55 import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings; 56 57 107 public abstract class DelegateCreator { 108 109 public static final GroupCategorySet CATEGORY_DELEGATE= new GroupCategorySet(new GroupCategory("org.eclipse.jdt.internal.corext.refactoring.delegates.delegate", RefactoringCoreMessages.DelegateCreator_change_category_title, RefactoringCoreMessages.DelegateCreator_change_category_description)); 111 122 private CompilationUnitRewrite fOriginalRewrite; 123 private CompilationUnitRewrite fDelegateRewrite; 124 125 private boolean fIsMoveToAnotherFile; 126 private boolean fCopy; 127 private boolean fDeclareDeprecated; 128 private boolean fInsertBefore; 129 130 private BodyDeclaration fDeclaration; 131 private String fNewElementName; 132 private ITypeBinding fDestinationTypeBinding; 133 private Type fDestinationType; 134 private ITrackedNodePosition fTrackedPosition; 135 136 private CodeGenerationSettings fPreferences; 137 138 public DelegateCreator() { 139 fCopy= true; 140 fDeclareDeprecated= true; 141 fInsertBefore= false; 142 } 143 144 151 public void setSourceRewrite(CompilationUnitRewrite rewrite) { 152 fOriginalRewrite= rewrite; 153 fPreferences= JavaPreferencesSettings.getCodeGenerationSettings(rewrite.getCu().getJavaProject()); 154 155 fDelegateRewrite= new CompilationUnitRewrite(rewrite.getCu(), rewrite.getRoot()); 156 fDelegateRewrite.getASTRewrite().setTargetSourceRangeComputer(rewrite.getASTRewrite().getExtendedSourceRangeComputer()); 157 } 158 159 165 public void setDeclaration(BodyDeclaration declaration) { 166 fDeclaration= declaration; 167 } 168 169 175 public void setNewElementName(String newName) { 176 fNewElementName= newName; 177 } 178 179 185 public void setNewLocation(ITypeBinding binding) { 186 fDestinationTypeBinding= binding; 187 } 188 189 199 public void setCopy(boolean isCopy) { 200 fCopy= isCopy; 201 } 202 203 212 public void setDeclareDeprecated(boolean declareDeprecated) { 213 fDeclareDeprecated= declareDeprecated; 214 } 215 216 226 public void setInsertBefore(boolean insertBefore) { 227 fInsertBefore= insertBefore; 228 } 229 230 232 237 protected abstract void initialize(); 238 239 247 protected abstract ASTNode createBody(BodyDeclaration declaration) throws JavaModelException; 248 249 259 protected abstract ASTNode createDocReference(BodyDeclaration declaration) throws JavaModelException; 260 261 267 protected abstract ASTNode getBodyHead(BodyDeclaration declaration); 268 269 275 protected abstract ChildPropertyDescriptor getJavaDocProperty(); 276 277 283 protected abstract ChildPropertyDescriptor getBodyProperty(); 284 285 286 288 protected boolean isMoveToAnotherFile() { 289 return fIsMoveToAnotherFile; 290 } 291 292 protected AST getAst() { 293 return fDelegateRewrite.getAST(); 294 } 295 296 protected BodyDeclaration getDeclaration() { 297 return fDeclaration; 298 } 299 300 protected String getNewElementName() { 301 return fNewElementName; 302 } 303 304 313 public void prepareDelegate() throws JavaModelException { 314 Assert.isNotNull(fDelegateRewrite); 315 Assert.isNotNull(fDeclaration); 316 317 initialize(); 318 319 if (fDestinationTypeBinding != null) { 321 fDestinationType= fOriginalRewrite.getImportRewrite().addImport(fDestinationTypeBinding, getAst()); 322 fIsMoveToAnotherFile= true; 323 } else 324 fIsMoveToAnotherFile= false; 325 326 fTrackedPosition= fDelegateRewrite.getASTRewrite().track(fDeclaration); 327 328 ASTNode delegateBody= createBody(fDeclaration); 329 if (delegateBody != null) { 330 fDelegateRewrite.getASTRewrite().set(getBodyHead(fDeclaration), getBodyProperty(), delegateBody, null); 332 } 333 334 if (fDeclareDeprecated) { 335 createJavadoc(); 336 } 337 } 338 339 344 private void createJavadoc() throws JavaModelException { 345 TagElement tag= getDelegateJavadocTag(fDeclaration); 346 347 Javadoc comment= fDeclaration.getJavadoc(); 348 if (comment == null) { 349 comment= getAst().newJavadoc(); 350 comment.tags().add(tag); 351 fDelegateRewrite.getASTRewrite().set(fDeclaration, getJavaDocProperty(), comment, null); 352 } else 353 fDelegateRewrite.getASTRewrite().getListRewrite(comment, Javadoc.TAGS_PROPERTY).insertLast(tag, null); 354 } 355 356 362 public void createEdit() throws JavaModelException { 363 try { 364 IDocument document= new Document(fDelegateRewrite.getCu().getBuffer().getContents()); 365 TextEdit edit= fDelegateRewrite.getASTRewrite().rewriteAST(document, fDelegateRewrite.getCu().getJavaProject().getOptions(true)); 366 edit.apply(document, TextEdit.UPDATE_REGIONS); 367 368 String newSource= Strings.trimIndentation(document.get(fTrackedPosition.getStartPosition(), fTrackedPosition.getLength()), 369 fPreferences.tabWidth, fPreferences.indentWidth, false); 370 371 ASTNode placeholder= fOriginalRewrite.getASTRewrite().createStringPlaceholder(newSource, fDeclaration.getNodeType()); 372 373 CategorizedTextEditGroup groupDescription= fOriginalRewrite.createCategorizedGroupDescription(getTextEditGroupLabel(), CATEGORY_DELEGATE); 374 ListRewrite bodyDeclarationsListRewrite= fOriginalRewrite.getASTRewrite().getListRewrite(fDeclaration.getParent(), getTypeBodyDeclarationsProperty()); 375 if (fCopy) 376 if (fInsertBefore) 377 bodyDeclarationsListRewrite.insertBefore(placeholder, fDeclaration, groupDescription); 378 else 379 bodyDeclarationsListRewrite.insertAfter(placeholder, fDeclaration, groupDescription); 380 else 381 bodyDeclarationsListRewrite.replace(fDeclaration, placeholder, groupDescription); 382 383 } catch (BadLocationException e) { 384 JavaPlugin.log(e); 385 } 386 } 387 388 protected abstract String getTextEditGroupLabel(); 389 390 395 protected abstract IBinding getDeclarationBinding(); 396 397 404 public CompilationUnitRewrite getDelegateRewrite() { 405 return fDelegateRewrite; 406 } 407 408 410 private TagElement getDelegateJavadocTag(BodyDeclaration declaration) throws JavaModelException { 411 Assert.isNotNull(declaration); 412 413 String msg= RefactoringCoreMessages.DelegateCreator_use_member_instead; 414 int firstParam= msg.indexOf("{0}"); Assert.isTrue(firstParam != -1); 416 417 List fragments= new ArrayList (); 418 TextElement text= getAst().newTextElement(); 419 text.setText(msg.substring(0, firstParam).trim()); 420 fragments.add(text); 421 422 fragments.add(createJavadocMemberReferenceTag(declaration, getAst())); 423 424 text= getAst().newTextElement(); 425 text.setText(msg.substring(firstParam + 3).trim()); 426 fragments.add(text); 427 428 final TagElement tag= getAst().newTagElement(); 429 tag.setTagName(TagElement.TAG_DEPRECATED); 430 tag.fragments().addAll(fragments); 431 return tag; 432 } 433 434 private TagElement createJavadocMemberReferenceTag(BodyDeclaration declaration, final AST ast) throws JavaModelException { 435 Assert.isNotNull(ast); 436 Assert.isNotNull(declaration); 437 ASTNode javadocReference= createDocReference(declaration); 438 final TagElement element= ast.newTagElement(); 439 element.setTagName(TagElement.TAG_LINK); 440 element.fragments().add(javadocReference); 441 return element; 442 } 443 444 protected Expression getAccess() { 445 return isMoveToAnotherFile() ? createDestinationTypeName() : null; 446 } 447 448 protected Name createDestinationTypeName() { 449 return ASTNodeFactory.newName(getAst(), ASTNodes.asString(fDestinationType)); 450 } 451 452 private ChildListPropertyDescriptor getTypeBodyDeclarationsProperty() { 453 ASTNode parent= fDeclaration.getParent(); 454 455 if (parent instanceof AbstractTypeDeclaration) 456 return ((AbstractTypeDeclaration) parent).getBodyDeclarationsProperty(); 457 else if (parent instanceof AnonymousClassDeclaration) 458 return AnonymousClassDeclaration.BODY_DECLARATIONS_PROPERTY; 459 460 Assert.isTrue(false); 461 return null; 462 } 463 } 464 | Popular Tags |