/******************************************************************************* * Copyright (c) 2011 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.ext.java.jdt.internal.text.correction; import org.eclipse.che.ide.ext.java.jdt.Images; import org.eclipse.che.ide.ext.java.jdt.codeassistant.api.IProblemLocation; import org.eclipse.che.ide.ext.java.jdt.core.dom.AST; import org.eclipse.che.ide.ext.java.jdt.core.dom.ASTNode; import org.eclipse.che.ide.ext.java.jdt.core.dom.CompilationUnit; import org.eclipse.che.ide.ext.java.jdt.core.dom.IExtendedModifier; import org.eclipse.che.ide.ext.java.jdt.core.dom.IMethodBinding; import org.eclipse.che.ide.ext.java.jdt.core.dom.MarkerAnnotation; import org.eclipse.che.ide.ext.java.jdt.core.dom.MethodDeclaration; import org.eclipse.che.ide.ext.java.jdt.core.dom.Modifier; import org.eclipse.che.ide.ext.java.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.che.ide.ext.java.jdt.core.dom.rewrite.ListRewrite; import org.eclipse.che.ide.ext.java.jdt.internal.corext.codemanipulation.ASTResolving; import org.eclipse.che.ide.ext.java.jdt.internal.text.correction.proposals.ASTRewriteCorrectionProposal; import org.eclipse.che.ide.ext.java.jdt.internal.text.correction.proposals.LinkedCorrectionProposal; import org.eclipse.che.ide.ext.java.jdt.quickassist.api.InvocationContext; import org.eclipse.che.ide.ext.java.jdt.text.Document; import org.eclipse.che.ide.runtime.CoreException; import java.util.Collection; import java.util.Iterator; import java.util.List; public class VarargsWarningsSubProcessor { private static class AddSafeVarargsProposal extends LinkedCorrectionProposal { private IMethodBinding fMethodBinding; private MethodDeclaration fMethodDeclaration; public AddSafeVarargsProposal(Document document, String label, MethodDeclaration methodDeclaration, IMethodBinding methodBinding, int relevance) { super(label, null, relevance, document, Images.javadoc); fMethodDeclaration = methodDeclaration; fMethodBinding = methodBinding; } /* (non-Javadoc) * @see org.eclipse.jdt.internal.ui.text.correction.ASTRewriteCorrectionProposal#getRewrite() */ @Override protected ASTRewrite getRewrite() throws CoreException { if (fMethodDeclaration == null) { CompilationUnit astRoot = ASTResolving.createQuickFixAST(document); fMethodDeclaration = (MethodDeclaration)astRoot.findDeclaringNode(fMethodBinding.getKey()); } AST ast = fMethodDeclaration.getAST(); ASTRewrite rewrite = ASTRewrite.create(ast); ListRewrite listRewrite = rewrite.getListRewrite(fMethodDeclaration, MethodDeclaration.MODIFIERS2_PROPERTY); MarkerAnnotation annotation = ast.newMarkerAnnotation(); String importString = createImportRewrite((CompilationUnit)fMethodDeclaration.getRoot()).addImport("java.lang.SafeVarargs"); //$NON-NLS-1$ annotation.setTypeName(ast.newName(importString)); listRewrite.insertFirst(annotation, null); // set up linked mode // addLinkedPosition(rewrite.track(annotation), true, "annotation"); //$NON-NLS-1$ return rewrite; } } public static void addAddSafeVarargsProposals(InvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals) { ASTNode coveringNode = problem.getCoveringNode(context.getASTRoot()); MethodDeclaration methodDeclaration = ASTResolving.findParentMethodDeclaration(coveringNode); if (methodDeclaration == null) return; IMethodBinding methodBinding = methodDeclaration.resolveBinding(); if (methodBinding == null) return; int modifiers = methodBinding.getModifiers(); if (!Modifier.isStatic(modifiers) && !Modifier.isFinal(modifiers) && !methodBinding.isConstructor()) return; String label = CorrectionMessages.INSTANCE.VarargsWarningsSubProcessor_add_safevarargs_label(); AddSafeVarargsProposal proposal = new AddSafeVarargsProposal(context.getDocument(), label, methodDeclaration, null, -2); proposals.add(proposal); } public static void addAddSafeVarargsToDeclarationProposals(InvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals) { //TODO // if (!JavaModelUtil.is17OrHigher(context.getCompilationUnit().getJavaProject())) // return; // // ASTNode coveringNode = problem.getCoveringNode(context.getASTRoot()); // IMethodBinding methodBinding; // if (coveringNode instanceof MethodInvocation) // { // methodBinding = ((MethodInvocation)coveringNode).resolveMethodBinding(); // } // else if (coveringNode instanceof ClassInstanceCreation) // { // methodBinding = ((ClassInstanceCreation)coveringNode).resolveConstructorBinding(); // } // else // { // return; // } // if (methodBinding == null) // return; // // String label = // Messages.format(CorrectionMessages.VarargsWarningsSubProcessor_add_safevarargs_to_method_label, // methodBinding.getName()); // // ITypeBinding declaringType = methodBinding.getDeclaringClass(); // CompilationUnit astRoot = (CompilationUnit)coveringNode.getRoot(); // if (declaringType != null && declaringType.isFromSource()) // { // try // { // ICompilationUnit targetCu = // ASTResolving.findCompilationUnitForBinding(context.getCompilationUnit(), astRoot, declaringType); // if (targetCu != null) // { // AddSafeVarargsProposal proposal = // new AddSafeVarargsProposal(label, targetCu, null, methodBinding.getMethodDeclaration(), -2); // proposals.add(proposal); // } // } // catch (JavaModelException e) // { // return; // } // } } public static void addRemoveSafeVarargsProposals(InvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals) { ASTNode coveringNode = problem.getCoveringNode(context.getASTRoot()); if (!(coveringNode instanceof MethodDeclaration)) return; MethodDeclaration methodDeclaration = (MethodDeclaration)coveringNode; MarkerAnnotation annotation = null; List<IExtendedModifier> modifiers = methodDeclaration.modifiers(); for (Iterator<IExtendedModifier> iterator = modifiers.iterator(); iterator.hasNext(); ) { IExtendedModifier node = iterator.next(); if (node instanceof MarkerAnnotation) { annotation = (MarkerAnnotation)node; if ("SafeVarargs".equals(annotation.resolveAnnotationBinding().getName())) { //$NON-NLS-1$ break; } } } if (annotation == null) return; ASTRewrite rewrite = ASTRewrite.create(coveringNode.getAST()); rewrite.remove(annotation, null); String label = CorrectionMessages.INSTANCE.VarargsWarningsSubProcessor_remove_safevarargs_label(); Images image = Images.delete_obj; ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, rewrite, 5, context.getDocument(), image); proposals.add(proposal); } }