blob: 586beec377ac1c33cc0f7cc8e6ab10824c87546b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2011 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ltk.core.refactoring.Refactoring;
import org.eclipse.ltk.core.refactoring.RefactoringCore;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.RefactoringStatusEntry;
import org.eclipse.ltk.core.refactoring.participants.CopyRefactoring;
import org.eclipse.ltk.core.refactoring.participants.DeleteRefactoring;
import org.eclipse.ltk.core.refactoring.participants.MoveRefactoring;
import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring;
import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
import org.eclipse.ltk.ui.refactoring.resource.RenameResourceWizard;
import org.eclipse.jdt.core.IClassFile;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.ILocalVariable;
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeParameter;
import org.eclipse.jdt.core.ITypeRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.refactoring.descriptors.ExtractClassDescriptor;
import org.eclipse.jdt.core.refactoring.descriptors.IntroduceParameterObjectDescriptor;
import org.eclipse.jdt.internal.core.refactoring.descriptors.RefactoringSignatureDescriptorFactory;
import org.eclipse.jdt.internal.corext.fix.CleanUpRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatusCodes;
import org.eclipse.jdt.internal.corext.refactoring.code.ConvertAnonymousToNestedRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.InlineConstantRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.InlineMethodRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.InlineTempRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.IntroduceFactoryRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.IntroduceIndirectionRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.IntroduceParameterRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.code.ReplaceInvocationsRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.generics.InferTypeArgumentsRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.reorg.JavaCopyProcessor;
import org.eclipse.jdt.internal.corext.refactoring.reorg.JavaDeleteProcessor;
import org.eclipse.jdt.internal.corext.refactoring.reorg.JavaMoveProcessor;
import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgPolicyFactory;
import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgPolicy.ICopyPolicy;
import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgPolicy.IMovePolicy;
import org.eclipse.jdt.internal.corext.refactoring.sef.SelfEncapsulateFieldRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureProcessor;
import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeTypeRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.structure.ExtractClassRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor;
import org.eclipse.jdt.internal.corext.refactoring.structure.ExtractSupertypeProcessor;
import org.eclipse.jdt.internal.corext.refactoring.structure.IntroduceParameterObjectProcessor;
import org.eclipse.jdt.internal.corext.refactoring.structure.MoveInnerToTopRefactoring;
import org.eclipse.jdt.internal.corext.refactoring.structure.MoveInstanceMethodProcessor;
import org.eclipse.jdt.internal.corext.refactoring.structure.MoveStaticMembersProcessor;
import org.eclipse.jdt.internal.corext.refactoring.structure.PullUpRefactoringProcessor;
import org.eclipse.jdt.internal.corext.refactoring.structure.PushDownRefactoringProcessor;
import org.eclipse.jdt.internal.corext.refactoring.structure.UseSuperTypeProcessor;
import org.eclipse.jdt.internal.corext.util.Messages;
import org.eclipse.jdt.ui.actions.SelectionDispatchAction;
import org.eclipse.jdt.ui.cleanup.ICleanUp;
import org.eclipse.jdt.ui.refactoring.RefactoringSaveHelper;
import org.eclipse.jdt.ui.refactoring.RenameSupport;
import org.eclipse.jdt.internal.ui.actions.ActionMessages;
import org.eclipse.jdt.internal.ui.fix.CleanUpRefactoringWizard;
import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
import org.eclipse.jdt.internal.ui.refactoring.ChangeSignatureWizard;
import org.eclipse.jdt.internal.ui.refactoring.ChangeTypeWizard;
import org.eclipse.jdt.internal.ui.refactoring.ConvertAnonymousToNestedWizard;
import org.eclipse.jdt.internal.ui.refactoring.ExtractClassWizard;
import org.eclipse.jdt.internal.ui.refactoring.ExtractInterfaceWizard;
import org.eclipse.jdt.internal.ui.refactoring.ExtractSupertypeWizard;
import org.eclipse.jdt.internal.ui.refactoring.InferTypeArgumentsWizard;
import org.eclipse.jdt.internal.ui.refactoring.InlineConstantWizard;
import org.eclipse.jdt.internal.ui.refactoring.InlineTempWizard;
import org.eclipse.jdt.internal.ui.refactoring.IntroduceFactoryWizard;
import org.eclipse.jdt.internal.ui.refactoring.IntroduceIndirectionWizard;
import org.eclipse.jdt.internal.ui.refactoring.IntroduceParameterObjectWizard;
import org.eclipse.jdt.internal.ui.refactoring.IntroduceParameterWizard;
import org.eclipse.jdt.internal.ui.refactoring.MoveInnerToTopWizard;
import org.eclipse.jdt.internal.ui.refactoring.MoveInstanceMethodWizard;
import org.eclipse.jdt.internal.ui.refactoring.MoveMembersWizard;
import org.eclipse.jdt.internal.ui.refactoring.PullUpWizard;
import org.eclipse.jdt.internal.ui.refactoring.PushDownWizard;
import org.eclipse.jdt.internal.ui.refactoring.RefactoringExecutionHelper;
import org.eclipse.jdt.internal.ui.refactoring.RefactoringMessages;
import org.eclipse.jdt.internal.ui.refactoring.UseSupertypeWizard;
import org.eclipse.jdt.internal.ui.refactoring.actions.RefactoringStarter;
import org.eclipse.jdt.internal.ui.refactoring.code.InlineMethodWizard;
import org.eclipse.jdt.internal.ui.refactoring.code.ReplaceInvocationsWizard;
import org.eclipse.jdt.internal.ui.refactoring.reorg.CreateTargetQueries;
import org.eclipse.jdt.internal.ui.refactoring.reorg.DeleteUserInterfaceManager;
import org.eclipse.jdt.internal.ui.refactoring.reorg.NewNameQueries;
import org.eclipse.jdt.internal.ui.refactoring.reorg.ReorgCopyWizard;
import org.eclipse.jdt.internal.ui.refactoring.reorg.ReorgMoveWizard;
import org.eclipse.jdt.internal.ui.refactoring.reorg.ReorgQueries;
import org.eclipse.jdt.internal.ui.refactoring.sef.SelfEncapsulateFieldWizard;
import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
/**
* Helper class to run refactorings from action code.
* <p>
* This class has been introduced to decouple actions from the refactoring code,
* in order not to eagerly load refactoring classes during action
* initialization.
* </p>
*
* @since 3.1
*/
public final class RefactoringExecutionStarter {
private static RenameSupport createRenameSupport(IJavaElement element, String newName, int flags) throws CoreException {
switch (element.getElementType()) {
case IJavaElement.JAVA_PROJECT:
return RenameSupport.create((IJavaProject) element, newName, flags);
case IJavaElement.PACKAGE_FRAGMENT_ROOT:
return RenameSupport.create((IPackageFragmentRoot) element, newName);
case IJavaElement.PACKAGE_FRAGMENT:
return RenameSupport.create((IPackageFragment) element, newName, flags);
case IJavaElement.COMPILATION_UNIT:
return RenameSupport.create((ICompilationUnit) element, newName, flags);
case IJavaElement.TYPE:
return RenameSupport.create((IType) element, newName, flags);
case IJavaElement.METHOD:
final IMethod method= (IMethod) element;
if (method.isConstructor())
return createRenameSupport(method.getDeclaringType(), newName, flags);
else
return RenameSupport.create((IMethod) element, newName, flags);
case IJavaElement.FIELD:
return RenameSupport.create((IField) element, newName, flags);
case IJavaElement.TYPE_PARAMETER:
return RenameSupport.create((ITypeParameter) element, newName, flags);
case IJavaElement.LOCAL_VARIABLE:
return RenameSupport.create((ILocalVariable) element, newName, flags);
}
return null;
}
public static void startChangeSignatureRefactoring(final IMethod method, final SelectionDispatchAction action, final Shell shell) throws JavaModelException {
if (!RefactoringAvailabilityTester.isChangeSignatureAvailable(method))
return;
try {
ChangeSignatureProcessor processor= new ChangeSignatureProcessor(method);
RefactoringStatus status= processor.checkInitialConditions(new NullProgressMonitor());
if (status.hasFatalError()) {
final RefactoringStatusEntry entry= status.getEntryMatchingSeverity(RefactoringStatus.FATAL);
if (entry.getCode() == RefactoringStatusCodes.OVERRIDES_ANOTHER_METHOD || entry.getCode() == RefactoringStatusCodes.METHOD_DECLARED_IN_INTERFACE) {
Object element= entry.getData();
if (element != null) {
String message= Messages.format(RefactoringMessages.RefactoringErrorDialogUtil_okToPerformQuestion, entry.getMessage());
if (MessageDialog.openQuestion(shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, message)) {
IStructuredSelection selection= new StructuredSelection(element);
// TODO: should not hijack this
// ModifiyParametersAction.
// The action is set up on an editor, but we use it
// as if it were set up on a ViewPart.
boolean wasEnabled= action.isEnabled();
action.selectionChanged(selection);
if (action.isEnabled()) {
action.run(selection);
} else {
MessageDialog.openInformation(shell, ActionMessages.ModifyParameterAction_problem_title, ActionMessages.ModifyParameterAction_problem_message);
}
action.setEnabled(wasEnabled);
}
}
return;
}
}
Refactoring refactoring= new ProcessorBasedRefactoring(processor);
ChangeSignatureWizard wizard= new ChangeSignatureWizard(processor, refactoring);
new RefactoringStarter().activate(wizard, shell, wizard.getDefaultPageTitle(), RefactoringSaveHelper.SAVE_REFACTORING);
} catch (CoreException e) {
ExceptionHandler.handle(e, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringMessages.RefactoringStarter_unexpected_exception);
}
}
public static void startChangeTypeRefactoring(final ICompilationUnit unit, final Shell shell, final int offset, final int length) {
final ChangeTypeRefactoring refactoring= new ChangeTypeRefactoring(unit, offset, length);
new RefactoringStarter().activate(new ChangeTypeWizard(refactoring), shell, RefactoringMessages.ChangeTypeAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startCleanupRefactoring(ICompilationUnit[] cus, ICleanUp[] cleanUps, boolean useOptionsFromProfile, Shell shell, boolean showWizard, String actionName) throws InvocationTargetException {
final CleanUpRefactoring refactoring= new CleanUpRefactoring(actionName);
for (ICompilationUnit cu : cus) {
refactoring.addCompilationUnit(cu);
}
if (!showWizard) {
refactoring.setUseOptionsFromProfile(useOptionsFromProfile);
for (ICleanUp cleanUp : cleanUps) {
refactoring.addCleanUp(cleanUp);
}
IRunnableContext context;
if (refactoring.getCleanUpTargetsSize() > 1) {
context= new ProgressMonitorDialog(shell);
} else {
context= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
}
RefactoringExecutionHelper helper= new RefactoringExecutionHelper(refactoring, IStatus.INFO, RefactoringSaveHelper.SAVE_REFACTORING, shell, context);
try {
helper.perform(true, true, true);
} catch (InterruptedException e) {
}
} else {
CleanUpRefactoringWizard refactoringWizard= new CleanUpRefactoringWizard(refactoring, RefactoringWizard.WIZARD_BASED_USER_INTERFACE);
RefactoringStarter starter= new RefactoringStarter();
starter.activate(refactoringWizard, shell, actionName, RefactoringSaveHelper.SAVE_REFACTORING);
}
}
public static void startConvertAnonymousRefactoring(final ICompilationUnit unit, final int offset, final int length, final Shell shell) {
final ConvertAnonymousToNestedRefactoring refactoring= new ConvertAnonymousToNestedRefactoring(unit, offset, length);
new RefactoringStarter().activate(new ConvertAnonymousToNestedWizard(refactoring), shell, RefactoringMessages.ConvertAnonymousToNestedAction_dialog_title,
RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startCopyRefactoring(IResource[] resources, IJavaElement[] javaElements, Shell shell) throws JavaModelException {
ICopyPolicy copyPolicy= ReorgPolicyFactory.createCopyPolicy(resources, javaElements);
if (copyPolicy.canEnable()) {
JavaCopyProcessor processor= new JavaCopyProcessor(copyPolicy);
Refactoring refactoring= new CopyRefactoring(processor);
RefactoringWizard wizard= new ReorgCopyWizard(processor, refactoring);
processor.setNewNameQueries(new NewNameQueries(wizard));
processor.setReorgQueries(new ReorgQueries(wizard));
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, processor.getSaveMode());
}
}
public static void startCutRefactoring(final Object[] elements, final Shell shell) throws InterruptedException, InvocationTargetException {
JavaDeleteProcessor processor= new JavaDeleteProcessor(elements);
processor.setSuggestGetterSetterDeletion(false);
processor.setQueries(new ReorgQueries(shell));
Refactoring refactoring= new DeleteRefactoring(processor);
int stopSeverity= RefactoringCore.getConditionCheckingFailedSeverity();
new RefactoringExecutionHelper(refactoring, stopSeverity, RefactoringSaveHelper.SAVE_NOTHING, shell, new ProgressMonitorDialog(shell)).perform(false, false);
}
public static void startDeleteRefactoring(final Object[] elements, final Shell shell) throws CoreException {
Refactoring refactoring= new DeleteRefactoring(new JavaDeleteProcessor(elements));
DeleteUserInterfaceManager.getDefault().getStarter(refactoring).activate(refactoring, shell, RefactoringSaveHelper.SAVE_NOTHING);
}
public static void startExtractInterfaceRefactoring(final IType type, final Shell shell) {
ExtractInterfaceProcessor processor= new ExtractInterfaceProcessor(type, JavaPreferencesSettings.getCodeGenerationSettings(type.getJavaProject()));
Refactoring refactoring= new ProcessorBasedRefactoring(processor);
new RefactoringStarter().activate(new ExtractInterfaceWizard(processor, refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring,
RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startExtractSupertypeRefactoring(final IMember[] members, final Shell shell) throws JavaModelException {
if (!RefactoringAvailabilityTester.isExtractSupertypeAvailable(members))
return;
IJavaProject project= null;
if (members != null && members.length > 0)
project= members[0].getJavaProject();
ExtractSupertypeProcessor processor= new ExtractSupertypeProcessor(members, JavaPreferencesSettings.getCodeGenerationSettings(project));
Refactoring refactoring= new ProcessorBasedRefactoring(processor);
ExtractSupertypeWizard wizard= new ExtractSupertypeWizard(processor, refactoring);
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startInferTypeArgumentsRefactoring(final IJavaElement[] elements, final Shell shell) {
try {
if (!RefactoringAvailabilityTester.isInferTypeArgumentsAvailable(elements))
return;
final InferTypeArgumentsRefactoring refactoring= new InferTypeArgumentsRefactoring(elements);
new RefactoringStarter()
.activate(new InferTypeArgumentsWizard(refactoring), shell, RefactoringMessages.InferTypeArgumentsAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
} catch (CoreException e) {
ExceptionHandler.handle(e, RefactoringMessages.InferTypeArgumentsAction_dialog_title, RefactoringMessages.OpenRefactoringWizardAction_exception);
}
}
public static boolean startInlineConstantRefactoring(final ICompilationUnit unit, final CompilationUnit node, final int offset, final int length, final Shell shell) {
final InlineConstantRefactoring refactoring= new InlineConstantRefactoring(unit, node, offset, length);
if (! refactoring.checkStaticFinalConstantNameSelected().hasFatalError()) {
new RefactoringStarter().activate(new InlineConstantWizard(refactoring), shell, RefactoringMessages.InlineConstantAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
return true;
}
return false;
}
public static boolean startInlineMethodRefactoring(final ITypeRoot typeRoot, final CompilationUnit node, final int offset, final int length, final Shell shell) {
final InlineMethodRefactoring refactoring= InlineMethodRefactoring.create(typeRoot, node, offset, length);
if (refactoring != null) {
new RefactoringStarter().activate(new InlineMethodWizard(refactoring), shell, RefactoringMessages.InlineMethodAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
return true;
}
return false;
}
public static boolean startInlineTempRefactoring(final ICompilationUnit unit, CompilationUnit node, final ITextSelection selection, final Shell shell) {
final InlineTempRefactoring refactoring= new InlineTempRefactoring(unit, node, selection.getOffset(), selection.getLength());
if (!refactoring.checkIfTempSelected().hasFatalError()) {
new RefactoringStarter().activate(new InlineTempWizard(refactoring), shell, RefactoringMessages.InlineTempAction_inline_temp, RefactoringSaveHelper.SAVE_NOTHING);
return true;
}
return false;
}
public static void startIntroduceFactoryRefactoring(final ICompilationUnit unit, final ITextSelection selection, final Shell shell) {
final IntroduceFactoryRefactoring refactoring= new IntroduceFactoryRefactoring(unit, selection.getOffset(), selection.getLength());
new RefactoringStarter().activate(new IntroduceFactoryWizard(refactoring, RefactoringMessages.IntroduceFactoryAction_use_factory), shell,
RefactoringMessages.IntroduceFactoryAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startIntroduceIndirectionRefactoring(final IClassFile file, final int offset, final int length, final Shell shell) {
final IntroduceIndirectionRefactoring refactoring= new IntroduceIndirectionRefactoring(file, offset, length);
new RefactoringStarter().activate(new IntroduceIndirectionWizard(refactoring, RefactoringMessages.IntroduceIndirectionAction_dialog_title), shell,
RefactoringMessages.IntroduceIndirectionAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startIntroduceIndirectionRefactoring(final ICompilationUnit unit, final int offset, final int length, final Shell shell) {
final IntroduceIndirectionRefactoring refactoring= new IntroduceIndirectionRefactoring(unit, offset, length);
new RefactoringStarter().activate(new IntroduceIndirectionWizard(refactoring, RefactoringMessages.IntroduceIndirectionAction_dialog_title), shell,
RefactoringMessages.IntroduceIndirectionAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startIntroduceIndirectionRefactoring(final IMethod method, final Shell shell) {
final IntroduceIndirectionRefactoring refactoring= new IntroduceIndirectionRefactoring(method);
new RefactoringStarter().activate(new IntroduceIndirectionWizard(refactoring, RefactoringMessages.IntroduceIndirectionAction_dialog_title), shell,
RefactoringMessages.IntroduceIndirectionAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startIntroduceParameter(ICompilationUnit unit, int offset, int length, Shell shell) {
final IntroduceParameterRefactoring refactoring= new IntroduceParameterRefactoring(unit, offset, length);
new RefactoringStarter().activate(new IntroduceParameterWizard(refactoring), shell, RefactoringMessages.IntroduceParameterAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startMoveInnerRefactoring(final IType type, final Shell shell) throws JavaModelException {
if (!RefactoringAvailabilityTester.isMoveInnerAvailable(type))
return;
final MoveInnerToTopRefactoring refactoring= new MoveInnerToTopRefactoring(type, JavaPreferencesSettings.getCodeGenerationSettings(type.getJavaProject()));
new RefactoringStarter().activate(new MoveInnerToTopWizard(refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startMoveMethodRefactoring(final IMethod method, final Shell shell) {
MoveInstanceMethodProcessor processor= new MoveInstanceMethodProcessor(method, JavaPreferencesSettings.getCodeGenerationSettings(method.getJavaProject()));
Refactoring refactoring= new MoveRefactoring(processor);
MoveInstanceMethodWizard wizard= new MoveInstanceMethodWizard(processor, refactoring);
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.MoveInstanceMethodAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startMoveRefactoring(final IResource[] resources, final IJavaElement[] elements, final Shell shell) throws JavaModelException {
IMovePolicy policy= ReorgPolicyFactory.createMovePolicy(resources, elements);
if (policy.canEnable()) {
JavaMoveProcessor processor= new JavaMoveProcessor(policy);
Refactoring refactoring= new MoveRefactoring(processor);
RefactoringWizard wizard= new ReorgMoveWizard(processor, refactoring);
processor.setCreateTargetQueries(new CreateTargetQueries(wizard));
processor.setReorgQueries(new ReorgQueries(wizard));
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, processor.getSaveMode());
}
}
public static void startMoveStaticMembersRefactoring(final IMember[] members, final Shell shell) throws JavaModelException {
if (!RefactoringAvailabilityTester.isMoveStaticAvailable(members))
return;
final Set<IMember> set= new HashSet<>(Arrays.asList(members));
final IMember[] elements= set.toArray(new IMember[set.size()]);
IJavaProject project= null;
if (elements.length > 0)
project= elements[0].getJavaProject();
MoveStaticMembersProcessor processor= new MoveStaticMembersProcessor(elements, JavaPreferencesSettings.getCodeGenerationSettings(project));
Refactoring refactoring= new MoveRefactoring(processor);
MoveMembersWizard wizard= new MoveMembersWizard(processor, refactoring);
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startPullUpRefactoring(final IMember[] members, final Shell shell) throws JavaModelException {
if (!RefactoringAvailabilityTester.isPullUpAvailable(members))
return;
IJavaProject project= null;
if (members != null && members.length > 0)
project= members[0].getJavaProject();
PullUpRefactoringProcessor processor= new PullUpRefactoringProcessor(members, JavaPreferencesSettings.getCodeGenerationSettings(project));
Refactoring refactoring= new ProcessorBasedRefactoring(processor);
new RefactoringStarter().activate(new PullUpWizard(processor, refactoring), shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startPushDownRefactoring(final IMember[] members, final Shell shell) throws JavaModelException {
if (!RefactoringAvailabilityTester.isPushDownAvailable(members))
return;
PushDownRefactoringProcessor processor= new PushDownRefactoringProcessor(members);
Refactoring refactoring= new ProcessorBasedRefactoring(processor);
PushDownWizard wizard= new PushDownWizard(processor, refactoring);
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startRenameRefactoring(final IJavaElement element, final Shell shell) throws CoreException {
final RenameSupport support= createRenameSupport(element, null, RenameSupport.UPDATE_REFERENCES);
if (support != null && support.preCheck().isOK())
support.openDialog(shell);
}
public static void startRenameResourceRefactoring(final IResource resource, final Shell shell) {
RenameResourceWizard wizard= new RenameResourceWizard(resource);
new RefactoringStarter().activate(wizard, shell, wizard.getWindowTitle(), RefactoringSaveHelper.SAVE_ALL);
}
public static void startReplaceInvocationsRefactoring(final ITypeRoot typeRoot, final int offset, final int length, final Shell shell) {
final ReplaceInvocationsRefactoring refactoring= new ReplaceInvocationsRefactoring(typeRoot, offset, length);
new RefactoringStarter().activate(new ReplaceInvocationsWizard(refactoring), shell, RefactoringMessages.ReplaceInvocationsAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startReplaceInvocationsRefactoring(final IMethod method, final Shell shell) {
final ReplaceInvocationsRefactoring refactoring= new ReplaceInvocationsRefactoring(method);
new RefactoringStarter().activate(new ReplaceInvocationsWizard(refactoring), shell, RefactoringMessages.ReplaceInvocationsAction_dialog_title, RefactoringSaveHelper.SAVE_REFACTORING);
}
public static void startSelfEncapsulateRefactoring(final IField field, final Shell shell) {
try {
if (!RefactoringAvailabilityTester.isSelfEncapsulateAvailable(field))
return;
final SelfEncapsulateFieldRefactoring refactoring= new SelfEncapsulateFieldRefactoring(field);
new RefactoringStarter().activate(new SelfEncapsulateFieldWizard(refactoring), shell, "", RefactoringSaveHelper.SAVE_REFACTORING); //$NON-NLS-1$
} catch (JavaModelException e) {
ExceptionHandler.handle(e, ActionMessages.SelfEncapsulateFieldAction_dialog_title, ActionMessages.SelfEncapsulateFieldAction_dialog_cannot_perform);
}
}
public static void startUseSupertypeRefactoring(final IType type, final Shell shell) {
UseSuperTypeProcessor processor= new UseSuperTypeProcessor(type);
Refactoring refactoring= new ProcessorBasedRefactoring(processor);
UseSupertypeWizard wizard= new UseSupertypeWizard(processor, refactoring);
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING);
}
private RefactoringExecutionStarter() {
// Not for instantiation
}
public static void startIntroduceParameterObject(ICompilationUnit unit, int offset, Shell shell) throws CoreException {
IJavaElement javaElement= unit.getElementAt(offset);
if (javaElement instanceof IMethod) {
IMethod method= (IMethod) javaElement;
startIntroduceParameterObject(method, shell);
}
}
public static void startIntroduceParameterObject(IMethod method, Shell shell) throws CoreException {
RefactoringStatus availability= Checks.checkAvailability(method);
if (availability.hasError()){
MessageDialog.openError(shell, RefactoringMessages.RefactoringExecutionStarter_IntroduceParameterObject_problem_title, RefactoringMessages.RefactoringExecutionStarter_IntroduceParameterObject_problem_description);
return;
}
IntroduceParameterObjectDescriptor ipod= RefactoringSignatureDescriptorFactory.createIntroduceParameterObjectDescriptor();
ipod.setMethod(method);
IntroduceParameterObjectProcessor processor= new IntroduceParameterObjectProcessor(ipod);
final RefactoringStatus status= processor.checkInitialConditions(new NullProgressMonitor());
if (status.hasFatalError()) {
final RefactoringStatusEntry entry= status.getEntryMatchingSeverity(RefactoringStatus.FATAL);
if (entry.getCode() == RefactoringStatusCodes.OVERRIDES_ANOTHER_METHOD || entry.getCode() == RefactoringStatusCodes.METHOD_DECLARED_IN_INTERFACE) {
final Object element= entry.getData();
IMethod superMethod= (IMethod) element;
availability= Checks.checkAvailability(superMethod);
if (availability.hasError()){
MessageDialog.openError(shell, RefactoringMessages.RefactoringExecutionStarter_IntroduceParameterObject_problem_title, RefactoringMessages.RefactoringExecutionStarter_IntroduceParameterObject_problem_description);
return;
}
String message= Messages.format(RefactoringMessages.RefactoringErrorDialogUtil_okToPerformQuestion, entry.getMessage());
if (element != null && MessageDialog.openQuestion(shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, message)) {
ipod= RefactoringSignatureDescriptorFactory.createIntroduceParameterObjectDescriptor();
ipod.setMethod(superMethod);
processor= new IntroduceParameterObjectProcessor(ipod);
}
else processor=null;
}
}
if (processor != null) {
Refactoring refactoring= new ProcessorBasedRefactoring(processor);
IntroduceParameterObjectWizard wizard= new IntroduceParameterObjectWizard(processor, refactoring);
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING);
}
}
public static void startExtractClassRefactoring(IType type, Shell shell) {
ExtractClassDescriptor descriptor= RefactoringSignatureDescriptorFactory.createExtractClassDescriptor();
descriptor.setType(type);
ExtractClassRefactoring refactoring= new ExtractClassRefactoring(descriptor);
ExtractClassWizard wizard= new ExtractClassWizard(descriptor, refactoring);
new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING);
}
}