blob: e74c7ef333a0214f27744bdae9d6042fa64b2226 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Shane Clarke.
* 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:
* Shane Clarke - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.internal.jaxws.ui.annotations.correction;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.IExtendedModifier;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
import org.eclipse.jdt.ui.text.java.IInvocationContext;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.swt.graphics.Image;
public class ChangeModifierCorrectionProposal extends AbstractJavaCorrectionPropsoal {
private IBinding binding;
private int includedModifiers;
private int excludedModifiers;
public ChangeModifierCorrectionProposal(IInvocationContext invocationContext, IBinding binding,
int includedModifiers, int excludedModifiers, String displayString, int relevance, Image image) {
super(invocationContext, displayString, relevance, image);
this.binding = binding;
this.includedModifiers = includedModifiers;
this.excludedModifiers = excludedModifiers;
}
@Override
@SuppressWarnings("unchecked")
public void addEdits(TextFileChange textChange) throws CoreException {
CompilationUnit astRoot = invocationContext.getASTRoot();
AST ast = astRoot.getAST();
ASTRewrite rewriter = ASTRewrite.create(ast);
ASTNode declaringNode = astRoot.findDeclaringNode(binding);
int consideredModifierFlags = includedModifiers | excludedModifiers;
int newModifierFlags = includedModifiers & consideredModifierFlags;
ListRewrite listRewrite = getListRewrite(declaringNode, rewriter);
if (listRewrite != null) {
List<ASTNode> originalList = listRewrite.getOriginalList();
for (ASTNode astNode : originalList) {
if (astNode instanceof Modifier) {
Modifier modifier = (Modifier) astNode;
int modifierFlag = modifier.getKeyword().toFlagValue();
if ((consideredModifierFlags & modifierFlag) != 0) {
if ((newModifierFlags & modifierFlag) == 0) {
listRewrite.remove(modifier, null);
}
newModifierFlags &= ~modifierFlag;
}
}
}
List<Modifier> modifers = ast.newModifiers(newModifierFlags);
ASTNode lastAnnotation = getLastAnnotation(listRewrite);
for (Modifier modifier : modifers) {
int modifierFlag = modifier.getKeyword().toFlagValue();
if ((modifierFlag & (Modifier.PUBLIC | Modifier.PRIVATE | Modifier.PROTECTED)) != 0) {
if (lastAnnotation != null) {
listRewrite.insertAfter(modifier, lastAnnotation, null);
} else {
listRewrite.insertFirst(modifier, null);
}
}
}
textChange.addEdit(rewriter.rewriteAST());
}
}
@SuppressWarnings("unchecked")
private ASTNode getLastAnnotation(ListRewrite listRewrite) {
ASTNode lastAnnotation = null;
List<ASTNode> rewrittenList = listRewrite.getRewrittenList();
for (ASTNode astNode : rewrittenList) {
if (astNode instanceof IExtendedModifier) {
IExtendedModifier extendedModifier = (IExtendedModifier) astNode;
if (extendedModifier.isAnnotation()) {
lastAnnotation = astNode;
}
}
}
return lastAnnotation;
}
private ListRewrite getListRewrite(ASTNode astNode, ASTRewrite astRewrite) {
if (astNode instanceof MethodDeclaration) {
MethodDeclaration methodDeclaration = (MethodDeclaration) astNode;
return astRewrite.getListRewrite(methodDeclaration, MethodDeclaration.MODIFIERS2_PROPERTY);
}
if (astNode instanceof TypeDeclaration) {
TypeDeclaration typeDeclaration = (TypeDeclaration) astNode;
return astRewrite.getListRewrite(typeDeclaration, TypeDeclaration.MODIFIERS2_PROPERTY);
}
return null;
}
}