Run "Add function parameter" fix silently if current usage is the only usage of the function
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
+10
-6
@@ -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())
|
||||
}
|
||||
+7
-4
@@ -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
|
||||
|
||||
+5
@@ -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();
|
||||
|
||||
|
||||
+9
-1
@@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user