Run "Add function parameter" fix silently if current usage is the only usage of the function

This commit is contained in:
Pavel V. Talanov
2013-10-21 18:47:56 +04:00
parent 66cc9b2cc7
commit 3ddcf40518
7 changed files with 69 additions and 25 deletions
@@ -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<ValueParameterDescriptor> parameters = functionDescriptor.getValueParameters();
List<? extends ValueArgument> arguments = callElement.getValueArguments();
JetNameValidator validator = JetNameValidator.getCollectingValidator(callElement.getProject());
@@ -119,18 +118,30 @@ public class AddFunctionParametersFix extends ChangeFunctionSignatureFix {
}
}
}
@Override
public boolean performSilently(@NotNull Collection<? extends PsiElement> 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;
}
}
@@ -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<? extends PsiElement> elements) {
return false;
}
}, bindingContext, context, getText());
}
}
@@ -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<ValueParameterDescriptor> parameters = functionDescriptor.getValueParameters();
changeSignatureData.removeParameter(parameters.indexOf(parameterToRemove));
}
}, bindingContext, context, getText(), false);
@Override
public boolean performSilently(@NotNull Collection<? extends PsiElement> elements) {
return false;
}
}, bindingContext, context, getText());
}
}
@@ -35,6 +35,10 @@ import org.jetbrains.annotations.TestOnly
public trait JetChangeSignatureConfiguration {
fun configure(changeSignatureData: JetChangeSignatureData, bindingContext: BindingContext)
fun performSilently(affectedFunctions: Collection<PsiElement>): 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<JetChangeSignature>())
@@ -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())
}
@@ -52,6 +52,7 @@ public final class JetChangeSignatureData implements JetMethodDescriptor {
private final BindingContext bindingContext;
@NotNull
private final Collection<FunctionDescriptor> descriptorsForSignatureChange;
private Collection<PsiElement> affectedFunctions = null;
public JetChangeSignatureData(
@NotNull FunctionDescriptor baseDescriptor,
@@ -98,11 +99,13 @@ public final class JetChangeSignatureData implements JetMethodDescriptor {
@Override
@NotNull
public Collection<PsiElement> getAffectedFunctions() {
Set<PsiElement> 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
@@ -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<JetParameterInfo> parameters = getParameters();
@@ -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<? extends PsiElement> elements) {
return false;
}
};
}