From 3ddcf4051830c0145810f8416d241035b05479f6 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 21 Oct 2013 18:47:56 +0400 Subject: [PATCH] Run "Add function parameter" fix silently if current usage is the only usage of the function --- .../quickfix/AddFunctionParametersFix.java | 35 ++++++++++++------- .../ChangeFunctionLiteralSignatureFix.java | 9 ++++- .../quickfix/RemoveFunctionParametersFix.java | 8 ++++- .../changeSignature/JetChangeSignature.kt | 16 +++++---- .../JetChangeSignatureData.java | 11 +++--- .../JetChangeSignatureDialog.java | 5 +++ .../JetChangeSignatureHandler.java | 10 +++++- 7 files changed, 69 insertions(+), 25 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AddFunctionParametersFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/AddFunctionParametersFix.java index 9e8b563cbd2..ceccfb989e0 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/AddFunctionParametersFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AddFunctionParametersFix.java @@ -21,6 +21,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.search.searches.ReferencesSearch; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; @@ -35,6 +36,7 @@ import org.jetbrains.jet.plugin.refactoring.JetNameValidator; import org.jetbrains.jet.plugin.refactoring.changeSignature.*; import org.jetbrains.jet.renderer.DescriptorRenderer; +import java.util.Collection; import java.util.List; import static org.jetbrains.jet.plugin.refactoring.changeSignature.ChangeSignaturePackage.runChangeSignature; @@ -62,7 +64,7 @@ public class AddFunctionParametersFix extends ChangeFunctionSignatureFix { assert newParametersCnt > 0; String subjectSuffix = newParametersCnt > 1 ? "s" : ""; - if (functionDescriptor instanceof ConstructorDescriptor) { + if (isConstructor()) { String className = functionDescriptor.getContainingDeclaration().getName().asString(); if (hasTypeMismatches) @@ -83,16 +85,13 @@ public class AddFunctionParametersFix extends ChangeFunctionSignatureFix { @Override protected void invoke(@NotNull Project project, Editor editor, JetFile file) { BindingContext bindingContext = AnalyzerFacadeWithCache.analyzeFileWithCache((JetFile) callElement.getContainingFile()).getBindingContext(); - boolean performSilently = !hasTypeMismatches && !(functionDescriptor instanceof ConstructorDescriptor) && !hasOtherUsages(); - runChangeSignature(project, functionDescriptor, addParameterConfiguration(), bindingContext, callElement, getText(), performSilently); + runChangeSignature(project, functionDescriptor, addParameterConfiguration(), bindingContext, callElement, getText()); } private JetChangeSignatureConfiguration addParameterConfiguration() { return new JetChangeSignatureConfiguration() { @Override - public void configure( - @NotNull JetChangeSignatureData changeSignatureData, @NotNull BindingContext bindingContext - ) { + public void configure(@NotNull JetChangeSignatureData changeSignatureData, @NotNull BindingContext bindingContext) { List parameters = functionDescriptor.getValueParameters(); List arguments = callElement.getValueArguments(); JetNameValidator validator = JetNameValidator.getCollectingValidator(callElement.getProject()); @@ -119,18 +118,30 @@ public class AddFunctionParametersFix extends ChangeFunctionSignatureFix { } } } + + @Override + public boolean performSilently(@NotNull Collection affectedFunctions) { + if (affectedFunctions.size() != 1) { + return false; + } + PsiElement onlyFunction = affectedFunctions.iterator().next(); + return !hasTypeMismatches && !isConstructor() && !hasOtherUsages(onlyFunction); + } }; } - private boolean hasOtherUsages() { - for (PsiReference reference : ReferencesSearch.search(element)) { - PsiElement referenceElement = reference.getElement(); - - if (referenceElement != null && referenceElement.getParent() instanceof JetReferenceExpression && - !callElement.equals(referenceElement.getParent().getParent())) + private boolean hasOtherUsages(@NotNull PsiElement function) { + for (PsiReference reference : ReferencesSearch.search(function)) { + JetCallElement call = PsiTreeUtil.getParentOfType(reference.getElement(), JetCallElement.class); + if (call != null && !callElement.equals(call)) { return true; + } } return false; } + + private boolean isConstructor() { + return functionDescriptor instanceof ConstructorDescriptor; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeFunctionLiteralSignatureFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeFunctionLiteralSignatureFix.java index 5a513ac97ba..1e833485e32 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeFunctionLiteralSignatureFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeFunctionLiteralSignatureFix.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.plugin.quickfix; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetFile; @@ -32,6 +33,7 @@ import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureCo import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureData; import org.jetbrains.jet.plugin.refactoring.changeSignature.JetParameterInfo; +import java.util.Collection; import java.util.List; import static org.jetbrains.jet.plugin.refactoring.changeSignature.ChangeSignaturePackage.runChangeSignature; @@ -66,6 +68,11 @@ public class ChangeFunctionLiteralSignatureFix extends ChangeFunctionSignatureFi changeSignatureData.addParameter(new JetParameterInfo(name, type)); } } - }, bindingContext, context, getText(), false); + + @Override + public boolean performSilently(Collection elements) { + return false; + } + }, bindingContext, context, getText()); } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveFunctionParametersFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveFunctionParametersFix.java index 584ec84e38c..f0e0f978aff 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveFunctionParametersFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/RemoveFunctionParametersFix.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureConfiguration; import org.jetbrains.jet.plugin.refactoring.changeSignature.JetChangeSignatureData; +import java.util.Collection; import java.util.List; import static org.jetbrains.jet.plugin.refactoring.changeSignature.ChangeSignaturePackage.runChangeSignature; @@ -62,6 +63,11 @@ public class RemoveFunctionParametersFix extends ChangeFunctionSignatureFix { List parameters = functionDescriptor.getValueParameters(); changeSignatureData.removeParameter(parameters.indexOf(parameterToRemove)); } - }, bindingContext, context, getText(), false); + + @Override + public boolean performSilently(@NotNull Collection elements) { + return false; + } + }, bindingContext, context, getText()); } } diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignature.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignature.kt index aab38b6b008..ea9991f589b 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignature.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignature.kt @@ -35,6 +35,10 @@ import org.jetbrains.annotations.TestOnly public trait JetChangeSignatureConfiguration { fun configure(changeSignatureData: JetChangeSignatureData, bindingContext: BindingContext) + + fun performSilently(affectedFunctions: Collection): Boolean { + return false + } } public fun runChangeSignature(project: Project, @@ -42,9 +46,8 @@ public fun runChangeSignature(project: Project, configuration: JetChangeSignatureConfiguration, bindingContext: BindingContext, defaultValueContext: PsiElement, - commandName: String? = null, - performSilently: Boolean = false): Unit { - JetChangeSignature(project, functionDescriptor, configuration, bindingContext, defaultValueContext, commandName, performSilently).run() + commandName: String? = null): Unit { + JetChangeSignature(project, functionDescriptor, configuration, bindingContext, defaultValueContext, commandName).run() } public class JetChangeSignature(val project: Project, @@ -52,8 +55,7 @@ public class JetChangeSignature(val project: Project, val configuration: JetChangeSignatureConfiguration, val bindingContext: BindingContext, val defaultValueContext: PsiElement, - val commandName: String?, - val performSilently: Boolean) { + val commandName: String?) { private val LOG = Logger.getInstance(javaClass()) @@ -118,6 +120,8 @@ public class JetChangeSignature(val project: Project, return } + val performSilently = configuration.performSilently(dialog.getMethodDescriptor().getAffectedFunctions()) + if (performSilently || ApplicationManager.getApplication()!!.isUnitTestMode()) { performRefactoringSilently(dialog) } @@ -201,6 +205,6 @@ TestOnly public fun getChangeSignatureDialog(project: Project, configuration: JetChangeSignatureConfiguration, bindingContext: BindingContext, defaultValueContext: PsiElement): JetChangeSignatureDialog? { - val jetChangeSignature = JetChangeSignature(project, functionDescriptor, configuration, bindingContext, defaultValueContext, null, true) + val jetChangeSignature = JetChangeSignature(project, functionDescriptor, configuration, bindingContext, defaultValueContext, null) return jetChangeSignature.createChangeSignatureDialog(jetChangeSignature.getDeepestSuperDeclarations()) } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureData.java b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureData.java index 18657576da7..a956cb9ae41 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureData.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureData.java @@ -52,6 +52,7 @@ public final class JetChangeSignatureData implements JetMethodDescriptor { private final BindingContext bindingContext; @NotNull private final Collection descriptorsForSignatureChange; + private Collection affectedFunctions = null; public JetChangeSignatureData( @NotNull FunctionDescriptor baseDescriptor, @@ -98,11 +99,13 @@ public final class JetChangeSignatureData implements JetMethodDescriptor { @Override @NotNull public Collection getAffectedFunctions() { - Set result = Sets.newHashSet(); - for (FunctionDescriptor descriptor : descriptorsForSignatureChange) { - result.addAll(computeHierarchyFrom(descriptor)); + if (affectedFunctions == null) { + affectedFunctions = Sets.newHashSet(); + for (FunctionDescriptor descriptor : descriptorsForSignatureChange) { + affectedFunctions.addAll(computeHierarchyFrom(descriptor)); + } } - return result; + return affectedFunctions; } @NotNull diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureDialog.java b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureDialog.java index f9f0e1d9b96..b787db6d656 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureDialog.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureDialog.java @@ -400,6 +400,11 @@ public class JetChangeSignatureDialog extends ChangeSignatureDialogBase< return new JetChangeSignatureProcessor(myProject, evaluateChangeInfo(), commandName != null ? commandName : getTitle()); } + @NotNull + public JetMethodDescriptor getMethodDescriptor() { + return myMethod; + } + public JetChangeInfo evaluateChangeInfo() { List parameters = getParameters(); diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureHandler.java b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureHandler.java index 35fe5cef14b..83fb74c7738 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/changeSignature/JetChangeSignatureHandler.java @@ -38,6 +38,9 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle; +import java.util.Collection; + +import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED; import static org.jetbrains.jet.plugin.refactoring.changeSignature.ChangeSignaturePackage.runChangeSignature; public class JetChangeSignatureHandler implements ChangeSignatureHandler { @@ -93,7 +96,7 @@ public class JetChangeSignatureHandler implements ChangeSignatureHandler { if (functionDescriptor == null) { return; } - runChangeSignature(project, functionDescriptor, emptyConfiguration(), bindingContext, context, null, false); + runChangeSignature(project, functionDescriptor, emptyConfiguration(), bindingContext, context, null); } @TestOnly @@ -109,6 +112,11 @@ public class JetChangeSignatureHandler implements ChangeSignatureHandler { ) { //do nothing } + + @Override + public boolean performSilently(@NotNull Collection elements) { + return false; + } }; }