convert parameter to local: change method signature accordingly (IDEA-88339)

This commit is contained in:
Anna Kozlova
2012-08-15 20:22:56 +04:00
parent b955ffd093
commit b180abd8fb
4 changed files with 81 additions and 12 deletions

View File

@@ -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)) {

View File

@@ -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) {

View File

@@ -0,0 +1,12 @@
// "Convert to local variable" "true"
class Temp {
void foo() {
<caret>int x = 5;
System.out.println(x);
}
void bar() {
foo();
}
}

View File

@@ -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);
}
}