1 11 package org.eclipse.jdt.internal.ui.text.correction; 12 13 import java.util.List ; 14 import java.util.Set ; 15 16 import org.eclipse.core.runtime.Assert; 17 import org.eclipse.core.runtime.CoreException; 18 19 import org.eclipse.jdt.core.ICompilationUnit; 20 import org.eclipse.jdt.core.dom.AST; 21 import org.eclipse.jdt.core.dom.ASTNode; 22 import org.eclipse.jdt.core.dom.CompilationUnit; 23 import org.eclipse.jdt.core.dom.IBinding; 24 import org.eclipse.jdt.core.dom.IMethodBinding; 25 import org.eclipse.jdt.core.dom.ITypeBinding; 26 import org.eclipse.jdt.core.dom.Javadoc; 27 import org.eclipse.jdt.core.dom.MethodDeclaration; 28 import org.eclipse.jdt.core.dom.TagElement; 29 import org.eclipse.jdt.core.dom.TextElement; 30 import org.eclipse.jdt.core.dom.Type; 31 import org.eclipse.jdt.core.dom.TypeDeclaration; 32 import org.eclipse.jdt.core.dom.TypeParameter; 33 import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; 34 import org.eclipse.jdt.core.dom.rewrite.ListRewrite; 35 36 import org.eclipse.jdt.internal.corext.dom.Bindings; 37 import org.eclipse.jdt.internal.corext.util.Messages; 38 39 import org.eclipse.jdt.internal.ui.JavaPluginImages; 40 41 44 public class AddTypeParameterProposal extends LinkedCorrectionProposal { 45 46 private IBinding fBinding; 47 private CompilationUnit fAstRoot; 48 49 private final String fTypeParamName; 50 private final ITypeBinding[] fBounds; 51 52 public AddTypeParameterProposal(ICompilationUnit targetCU, IBinding binding, CompilationUnit astRoot, String name, ITypeBinding[] bounds, int relevance) { 53 super("", targetCU, null, relevance, JavaPluginImages.get(JavaPluginImages.IMG_FIELD_PUBLIC)); 55 Assert.isTrue(binding != null && Bindings.isDeclarationBinding(binding)); 56 Assert.isTrue(binding instanceof IMethodBinding || binding instanceof ITypeBinding); 57 58 fBinding= binding; 59 fAstRoot= astRoot; 60 fTypeParamName= name; 61 fBounds= bounds; 62 63 if (binding instanceof IMethodBinding) { 64 boolean isSameCU= fAstRoot.findDeclaringNode(binding) != null; 65 String [] args= { fTypeParamName, ASTResolving.getMethodSignature((IMethodBinding) binding, isSameCU) }; 66 setDisplayName(Messages.format(CorrectionMessages.AddTypeParameterProposal_method_label, args)); 67 } else { 68 String [] args= { fTypeParamName, ASTResolving.getTypeSignature((ITypeBinding) binding) }; 69 setDisplayName(Messages.format(CorrectionMessages.AddTypeParameterProposal_type_label, args)); 70 } 71 } 72 73 protected ASTRewrite getRewrite() throws CoreException { 74 ASTNode boundNode= fAstRoot.findDeclaringNode(fBinding); 75 ASTNode declNode= null; 76 77 if (boundNode != null) { 78 declNode= boundNode; createImportRewrite(fAstRoot); 80 } else { 81 CompilationUnit newRoot= ASTResolving.createQuickFixAST(getCompilationUnit(), null); 82 declNode= newRoot.findDeclaringNode(fBinding.getKey()); 83 createImportRewrite(newRoot); 84 } 85 AST ast= declNode.getAST(); 86 TypeParameter newTypeParam= ast.newTypeParameter(); 87 newTypeParam.setName(ast.newSimpleName(fTypeParamName)); 88 if (fBounds != null && fBounds.length > 0) { 89 List typeBounds= newTypeParam.typeBounds(); 90 for (int i= 0; i < fBounds.length; i++) { 91 Type newBound= getImportRewrite().addImport(fBounds[i], ast); 92 typeBounds.add(newBound); 93 } 94 } 95 ASTRewrite rewrite= ASTRewrite.create(ast); 96 ListRewrite listRewrite; 97 Javadoc javadoc; 98 List otherTypeParams; 99 if (declNode instanceof TypeDeclaration) { 100 TypeDeclaration declaration= (TypeDeclaration) declNode; 101 listRewrite= rewrite.getListRewrite(declaration, TypeDeclaration.TYPE_PARAMETERS_PROPERTY); 102 otherTypeParams= declaration.typeParameters(); 103 javadoc= declaration.getJavadoc(); 104 } else { 105 MethodDeclaration declaration= (MethodDeclaration) declNode; 106 listRewrite= rewrite.getListRewrite(declNode, MethodDeclaration.TYPE_PARAMETERS_PROPERTY); 107 otherTypeParams= declaration.typeParameters(); 108 javadoc= declaration.getJavadoc(); 109 } 110 listRewrite.insertLast(newTypeParam, null); 111 112 if (javadoc != null && otherTypeParams != null) { 113 ListRewrite tagsRewriter= rewrite.getListRewrite(javadoc, Javadoc.TAGS_PROPERTY); 114 Set previousNames= JavadocTagsSubProcessor.getPreviousTypeParamNames(otherTypeParams, null); 115 116 String name= '<' + fTypeParamName + '>'; 117 TagElement newTag= ast.newTagElement(); 118 newTag.setTagName(TagElement.TAG_PARAM); 119 TextElement text= ast.newTextElement(); 120 text.setText(name); 121 newTag.fragments().add(text); 122 123 JavadocTagsSubProcessor.insertTag(tagsRewriter, newTag, previousNames); 124 } 125 return rewrite; 126 } 127 128 129 } 130 | Popular Tags |