/**
* Copyright (c) 2008-2012 University of Illinois at Urbana-Champaign.
* 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
*/
package edu.illinois.compositerefactorings.steps;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.refactoring.descriptors.PullUpDescriptor;
import org.eclipse.jdt.internal.corext.refactoring.JavaRefactoringDescriptorUtil;
import org.eclipse.jdt.ui.text.java.IInvocationContext;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
import edu.illinois.compositerefactorings.messages.CompositeRefactoringsMessages;
@SuppressWarnings("restriction")
public class MoveToImmediateSuperclass extends RefactoringBasedStep {
public MoveToImmediateSuperclass(IInvocationContext context, ASTNode coveringNode, boolean problemsAtLocation) {
super(context, coveringNode, problemsAtLocation);
}
@Override
protected Collection<? extends IJavaElement> getInputs() {
return SelectionUtils.getSelectionMemberDeclarations(context, coveringNode);
}
@Override
protected Collection<RefactoringDescriptor> getDescriptors(Object input) throws CoreException {
Collection<RefactoringDescriptor> descriptors= new ArrayList<RefactoringDescriptor>();
IMember member= (IMember)input;
IType declaringType= member.getDeclaringType();
IType immediateSuperclass= declaringType.newTypeHierarchy(getJavaProject(), new NullProgressMonitor()).getSuperclass(declaringType);
Map<String, String> arguments= new HashMap<String, String>();
arguments.put(JavaRefactoringDescriptorUtil.ATTRIBUTE_INPUT, JavaRefactoringDescriptorUtil.elementToHandle(getJavaProject().getElementName(), immediateSuperclass));
arguments.put("stubs", String.valueOf(false));
arguments.put("instanceof", String.valueOf(false));
arguments.put("replace", String.valueOf(false));
arguments.put("abstract", String.valueOf(0));
int numberOfMethodsToRemoveFromSubclasses= 0;
if (member instanceof IField) {
numberOfMethodsToRemoveFromSubclasses= 0;
} else if (member instanceof IMethod) {
numberOfMethodsToRemoveFromSubclasses= 1;
}
arguments.put("delete", Integer.toString(numberOfMethodsToRemoveFromSubclasses));
arguments.put("pull", String.valueOf(1));
arguments.put(JavaRefactoringDescriptorUtil.ATTRIBUTE_ELEMENT + 1, JavaRefactoringDescriptorUtil.elementToHandle(getJavaProject().getElementName(), member));
if (numberOfMethodsToRemoveFromSubclasses > 0) {
arguments.put(JavaRefactoringDescriptorUtil.ATTRIBUTE_ELEMENT + 2, JavaRefactoringDescriptorUtil.elementToHandle(getJavaProject().getElementName(), member));
}
String description= MessageFormat.format(CompositeRefactoringsMessages.MoveToImmediateSuperclass_description, member.getElementName(), immediateSuperclass.getElementName());
PullUpDescriptor descriptor= new PullUpDescriptor(getJavaProject().getElementName(), description, null, arguments, RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE);
descriptors.add(descriptor);
return descriptors;
}
}