rename in place if corresponding option is selected (IDEA-179917)

rename without predefined new name is available in editor only and thus it's safe to rely on context; if no handler is found, fallback to original implementation
This commit is contained in:
Anna.Kozlova
2017-12-28 18:09:41 +01:00
parent c522bdfb38
commit 833b80e86f
2 changed files with 19 additions and 1 deletions
@@ -42,6 +42,14 @@ public interface RefactoringQuickFix extends LocalQuickFix {
@NotNull
RefactoringActionHandler getHandler();
/**
* Override if preferred handler can be chosen based on context
*/
@NotNull
default RefactoringActionHandler getHandler(DataContext context) {
return getHandler();
}
default PsiElement getElementToRefactor(PsiElement element) {
final PsiElement parent = element.getParent();
return (parent instanceof PsiNamedElement) ? parent : element;
@@ -54,7 +62,7 @@ public interface RefactoringQuickFix extends LocalQuickFix {
}
final Consumer<DataContext> consumer = dataContext -> {
dataContext = enhanceDataContext(dataContext);
final RefactoringActionHandler handler = getHandler();
final RefactoringActionHandler handler = getHandler(dataContext);
handler.invoke(element.getProject(), new PsiElement[] {elementToRefactor}, dataContext);
};
DataManager.getInstance().getDataContextFromFocus().doWhenDone(consumer);
@@ -16,12 +16,15 @@
package com.siyeh.ig.fixes;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.refactoring.RefactoringActionHandler;
import com.intellij.refactoring.RefactoringActionHandlerFactory;
import com.intellij.refactoring.RefactoringFactory;
import com.intellij.refactoring.RenameRefactoring;
import com.intellij.refactoring.rename.RenameHandler;
import com.intellij.refactoring.rename.RenameHandlerRegistry;
import com.siyeh.InspectionGadgetsBundle;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -74,6 +77,13 @@ public class RenameFix extends RefactoringInspectionGadgetsFix {
return RefactoringActionHandlerFactory.getInstance().createRenameHandler();
}
@NotNull
@Override
public RefactoringActionHandler getHandler(DataContext context) {
RenameHandler renameHandler = RenameHandlerRegistry.getInstance().getRenameHandler(context);
return renameHandler != null ? renameHandler : getHandler();
}
@Override
public void doFix(Project project, ProblemDescriptor descriptor) {
if (m_targetName == null) {