mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-07 05:09:37 +07:00
convert parameter to local: change method signature accordingly (IDEA-88339)
This commit is contained in:
@@ -72,7 +72,7 @@ public abstract class BaseConvertToLocalQuickFix<V extends PsiVariable> implemen
|
||||
@Nullable
|
||||
protected abstract V getVariable(@NotNull ProblemDescriptor descriptor);
|
||||
|
||||
private static void positionCaretToDeclaration(@NotNull Project project, @NotNull PsiFile psiFile, @NotNull PsiElement declaration) {
|
||||
protected static void positionCaretToDeclaration(@NotNull Project project, @NotNull PsiFile psiFile, @NotNull PsiElement declaration) {
|
||||
final Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor();
|
||||
if (editor != null && (IJSwingUtilities.hasFocus(editor.getComponent()) || ApplicationManager.getApplication().isUnitTestMode())) {
|
||||
final PsiFile openedFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
|
||||
@@ -140,23 +140,19 @@ public abstract class BaseConvertToLocalQuickFix<V extends PsiVariable> implemen
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private PsiElement applyChanges(final @NotNull Project project,
|
||||
final @NotNull String localName,
|
||||
final @Nullable PsiExpression initializer,
|
||||
final @NotNull V variable,
|
||||
final @NotNull Collection<PsiReference> references,
|
||||
final @NotNull NotNullFunction<PsiDeclarationStatement, PsiElement> action) {
|
||||
protected PsiElement applyChanges(final @NotNull Project project,
|
||||
final @NotNull String localName,
|
||||
final @Nullable PsiExpression initializer,
|
||||
final @NotNull V variable,
|
||||
final @NotNull Collection<PsiReference> references,
|
||||
final @NotNull NotNullFunction<PsiDeclarationStatement, PsiElement> action) {
|
||||
final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);
|
||||
|
||||
return ApplicationManager.getApplication().runWriteAction(
|
||||
new Computable<PsiElement>() {
|
||||
@Override
|
||||
public PsiElement compute() {
|
||||
final PsiDeclarationStatement declaration =
|
||||
elementFactory.createVariableDeclarationStatement(localName, variable.getType(), initializer);
|
||||
final PsiElement newDeclaration = action.fun(declaration);
|
||||
retargetReferences(elementFactory, localName, references);
|
||||
final PsiElement newDeclaration = moveDeclaration(elementFactory, localName, variable, initializer, action, references);
|
||||
beforeDelete(project, variable, newDeclaration);
|
||||
variable.normalizeDeclaration();
|
||||
variable.delete();
|
||||
@@ -166,6 +162,18 @@ public abstract class BaseConvertToLocalQuickFix<V extends PsiVariable> implemen
|
||||
);
|
||||
}
|
||||
|
||||
protected PsiElement moveDeclaration(PsiElementFactory elementFactory,
|
||||
String localName,
|
||||
V variable,
|
||||
PsiExpression initializer,
|
||||
NotNullFunction<PsiDeclarationStatement, PsiElement> action,
|
||||
Collection<PsiReference> references) {
|
||||
final PsiDeclarationStatement declaration = elementFactory.createVariableDeclarationStatement(localName, variable.getType(), initializer);
|
||||
final PsiElement newDeclaration = action.fun(declaration);
|
||||
retargetReferences(elementFactory, localName, references);
|
||||
return newDeclaration;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiAssignmentExpression searchAssignmentExpression(@Nullable PsiElement anchor) {
|
||||
if (!(anchor instanceof PsiExpressionStatement)) {
|
||||
|
||||
@@ -21,6 +21,11 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.controlFlow.*;
|
||||
import com.intellij.psi.search.searches.SuperMethodsSearch;
|
||||
import com.intellij.refactoring.changeSignature.ChangeSignatureProcessor;
|
||||
import com.intellij.refactoring.changeSignature.ParameterInfoImpl;
|
||||
import com.intellij.usageView.UsageInfo;
|
||||
import com.intellij.util.NotNullFunction;
|
||||
import com.intellij.util.VisibilityUtil;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -142,6 +147,38 @@ public class ParameterCanBeLocalInspection extends BaseJavaLocalInspectionTool {
|
||||
return (PsiParameter)descriptor.getPsiElement().getParent();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected PsiElement applyChanges(@NotNull final Project project,
|
||||
@NotNull final String localName,
|
||||
@Nullable final PsiExpression initializer,
|
||||
@NotNull final PsiParameter parameter,
|
||||
@NotNull final Collection<PsiReference> references,
|
||||
@NotNull final NotNullFunction<PsiDeclarationStatement, PsiElement> action) {
|
||||
final PsiElement scope = parameter.getDeclarationScope();
|
||||
if (scope instanceof PsiMethod) {
|
||||
final PsiMethod method = (PsiMethod)scope;
|
||||
final PsiParameter[] parameters = method.getParameterList().getParameters();
|
||||
|
||||
final ParameterInfoImpl[] info = new ParameterInfoImpl[parameters.length - 1];
|
||||
for (int i = 0; i < parameters.length; i++) {
|
||||
PsiParameter psiParameter = parameters[i];
|
||||
if (psiParameter == parameter) continue;
|
||||
info[i] = new ParameterInfoImpl(i, psiParameter.getName(), psiParameter.getType());
|
||||
}
|
||||
final ChangeSignatureProcessor cp = new ChangeSignatureProcessor(project, method, false, VisibilityUtil.getVisibilityModifier(method.getModifierList()), method.getName(), method.getReturnType(), info){
|
||||
@Override
|
||||
protected void performRefactoring(UsageInfo[] usages) {
|
||||
final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);
|
||||
final PsiElement newDeclaration = moveDeclaration(elementFactory, localName, parameter, initializer, action, references);
|
||||
super.performRefactoring(usages);
|
||||
positionCaretToDeclaration(project, newDeclaration.getContainingFile(), newDeclaration);
|
||||
}
|
||||
};
|
||||
cp.run();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected String suggestLocalName(@NotNull Project project, @NotNull PsiParameter parameter, @NotNull PsiCodeBlock scope) {
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
// "Convert to local variable" "true"
|
||||
class Temp {
|
||||
|
||||
void foo() {
|
||||
<caret>int x = 5;
|
||||
System.out.println(x);
|
||||
}
|
||||
|
||||
void bar() {
|
||||
foo();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
// "Convert to local variable" "true"
|
||||
class Temp {
|
||||
|
||||
void foo(int <caret>x) {
|
||||
x = 5;
|
||||
System.out.println(x);
|
||||
}
|
||||
|
||||
void bar() {
|
||||
foo(2);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user