extract method params suggester: cleanup initial params if they are not used anymore

This commit is contained in:
Anna Kozlova
2015-03-18 17:46:02 +01:00
parent f06fd54ec9
commit be5e054e6a
2 changed files with 23 additions and 4 deletions
@@ -33,6 +33,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.SuggestedNameInfo;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.introduceParameter.Util;
@@ -149,11 +150,11 @@ public class ExtractMethodSignatureSuggester {
if (duplicates != null && !duplicates.isEmpty()) {
restoreRenamedParams(copies);
inlineSameArguments(method, copies, variables, duplicates);
if (!myMethodCall.isValid()) {
return null;
}
myMethodCall = (PsiMethodCallExpression)myMethodCall.copy();
inlineSameArguments(method, copies, variables, duplicates);
for (PsiExpression expression : copies) {
myMethodCall.getArgumentList().add(expression);
}
@@ -188,6 +189,24 @@ public class ExtractMethodSignatureSuggester {
inlineArgumentsInMethodBody(toInline);
removeRedundantParametersFromMethodSignature(toInline);
}
removeUnusedStongParams(strongParamsCound);
}
private void removeUnusedStongParams(int strongParamsCound) {
final PsiExpression[] expressions = myMethodCall.getArgumentList().getExpressions();
final PsiParameter[] parameters = myExtractedMethod.getParameterList().getParameters();
final PsiCodeBlock body = myExtractedMethod.getBody();
if (body != null) {
final LocalSearchScope scope = new LocalSearchScope(body);
for(int i = strongParamsCound - 1; i >= 0; i--) {
final PsiParameter parameter = parameters[i];
if (ReferencesSearch.search(parameter, scope).findFirst() == null) {
parameter.delete();
expressions[i].delete();
}
}
}
}
private void removeRedundantParametersFromMethodSignature(Map<PsiVariable, PsiExpression> param2ExprMap) {
@@ -2,12 +2,12 @@ public class Test {
{
int x = 0;
newMethod(x, "foo".substring(x));
newMethod("foo".substring(x));
newMethod(x, "bar".substring(x));
newMethod("bar".substring(x));
}
private void newMethod(int x, String substring) {
private void newMethod(String substring) {
System.out.println(substring);
}
}