/******************************************************************************* * Copyright (c) 2012 VMware, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VMware, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.quickfix.jdt.proposals; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ChildListPropertyDescriptor; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.SingleMemberAnnotation; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.internal.ui.text.correction.ASTResolving; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.ide.eclipse.quickfix.QuickfixImages; import org.springframework.ide.eclipse.quickfix.jdt.util.ProposalCalculatorUtil; /** * Quickfix proposal for adding @Qualifier to method parameter * * @author Terry Denney * @since 2.6 */ public class AddQualiferToMethodParamCompletionProposal extends MarkerResolutionProposal { private final MethodDeclaration methodDecl; // private final List<String> qualifiers; private final List<SingleVariableDeclaration> params; public AddQualiferToMethodParamCompletionProposal(List<SingleVariableDeclaration> params, MethodDeclaration methodDecl, ICompilationUnit cu) { super(getDisplayName(params, methodDecl), cu, QuickfixImages.getImage(QuickfixImages.ANNOTATION)); this.params = params; // this.qualifiers = qualifiers; this.methodDecl = methodDecl; } private SingleMemberAnnotation createAnnotation(SingleVariableDeclaration decl, String qualifiedName, String simpleName, CompilationUnit astRoot, AST ast, ASTRewrite astRewrite, ImportRewrite importRewrite, boolean multiple, int pos) { if (!ProposalCalculatorUtil.containsImport(getCompilationUnit(), qualifiedName)) { importRewrite.addImport(qualifiedName); } SingleMemberAnnotation annotation = ast.newSingleMemberAnnotation(); annotation.setTypeName(ast.newSimpleName(simpleName)); StringLiteral literal = ast.newStringLiteral(); // literal.setLiteralValue(qualifier); annotation.setValue(literal); setTrackPosition(new StringLiteralTrackedPosition(astRewrite.track(literal))); ChildListPropertyDescriptor property; property = SingleVariableDeclaration.MODIFIERS2_PROPERTY; // if (precedingNode != null) { // astRewrite.getListRewrite(decl, property).insertAfter(annotation, // precedingNode, null); // } // else { astRewrite.getListRewrite(decl, property).insertLast(annotation, null); // } if (multiple) { addLinkedPosition(new StringLiteralTrackedPosition(astRewrite.track(literal)), pos == 0, "Qualifier " + pos); } return annotation; } @Override protected ASTRewrite getRewrite() throws CoreException { CompilationUnit astRoot = ASTResolving.findParentCompilationUnit(methodDecl); ASTRewrite astRewrite = ASTRewrite.create(astRoot.getAST()); AST ast = astRewrite.getAST(); ImportRewrite importRewrite = createImportRewrite(astRoot); // List<SingleVariableDeclaration> parameters = methodDecl.parameters(); // for (int i = 0; i < qualifiers.size(); i++) { // String qualifier = qualifiers.get(i); // if (qualifier != null) { // SingleVariableDeclaration paramDecl = parameters.get(i); // createAnnotation(qualifier, paramDecl, // Qualifier.class.getCanonicalName(), Qualifier.class // .getSimpleName(), astRoot, ast, astRewrite, importRewrite, null); // } // } for (int i = 0; i < params.size(); i++) { createAnnotation(params.get(i), Qualifier.class.getCanonicalName(), "Qualifier", astRoot, ast, astRewrite, importRewrite, params.size() > 0, i); } return astRewrite; } private static String getDisplayName(List<SingleVariableDeclaration> params, MethodDeclaration methodDecl) { StringBuffer buf = new StringBuffer(); buf.append("Add @Qualifier for "); for (int i = 0; i < params.size(); i++) { if (i > 0) { buf.append(", "); } buf.append(params.get(i).getName().getFullyQualifiedName()); } // List<SingleVariableDeclaration> params = methodDecl.parameters(); // // boolean first = true; // for (int i = 0; i < qualifiers.size(); i++) { // String qualifier = qualifiers.get(i); // if (qualifier != null) { // if (!first) { // buf.append(", "); // } // buf.append("@Qualifier("); // buf.append(qualifier); // buf.append(") for "); // // buf.append(params.get(i).getName().toString()); // first = false; // } // } return buf.toString(); } }