mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 21:55:01 +07:00
deep delete parameter: ensure parameter used in the same call passed to another params is not suggested
This commit is contained in:
+12
-5
@@ -105,7 +105,7 @@ abstract class SafeDeleteJavaCallerChooser extends JavaCallerChooser {
|
||||
/**
|
||||
* @return parameter if it is used inside method only as argument in nodeMethod call at parameterIndex
|
||||
*/
|
||||
static PsiParameter isTheOnlyOneParameterUsage(PsiElement call, int parameterIndex, final PsiMethod nodeMethod) {
|
||||
static PsiParameter isTheOnlyOneParameterUsage(PsiElement call, final int parameterIndex, final PsiMethod nodeMethod) {
|
||||
if (call instanceof PsiCallExpression) {
|
||||
final PsiExpressionList argumentList = ((PsiCallExpression)call).getArgumentList();
|
||||
if (argumentList != null) {
|
||||
@@ -129,6 +129,7 @@ abstract class SafeDeleteJavaCallerChooser extends JavaCallerChooser {
|
||||
if (parameter != null && !parameter.isVarArgs()) {
|
||||
final PsiElement scope = parameter.getDeclarationScope();
|
||||
if (scope instanceof PsiMethod && ((PsiMethod)scope).findDeepestSuperMethods().length == 0) {
|
||||
final int scopeParamIdx = ((PsiMethod)scope).getParameterList().getParameterIndex(parameter);
|
||||
final Ref<Boolean> ref = new Ref<Boolean>(false);
|
||||
if (ReferencesSearch.search(parameter, new LocalSearchScope(scope)).forEach(new Processor<PsiReference>() {
|
||||
@Override
|
||||
@@ -139,11 +140,11 @@ abstract class SafeDeleteJavaCallerChooser extends JavaCallerChooser {
|
||||
while (parent != null) {
|
||||
final PsiMethod resolved = parent.resolveMethod();
|
||||
if (scope.equals(resolved)) {
|
||||
if (usedInQualifier(element, parent)) return false;
|
||||
if (usedInQualifier(element, parent, scopeParamIdx)) return false;
|
||||
return true;
|
||||
}
|
||||
if (nodeMethod.equals(resolved)) {
|
||||
if (usedInQualifier(element, parent)) return false;
|
||||
if (usedInQualifier(element, parent, parameterIndex)) return false;
|
||||
ref.set(true);
|
||||
return true;
|
||||
}
|
||||
@@ -154,7 +155,7 @@ abstract class SafeDeleteJavaCallerChooser extends JavaCallerChooser {
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean usedInQualifier(PsiElement element, PsiCallExpression parent) {
|
||||
private boolean usedInQualifier(PsiElement element, PsiCallExpression parent, int parameterIndex) {
|
||||
PsiExpression qualifier = null;
|
||||
if (parent instanceof PsiMethodCallExpression) {
|
||||
qualifier = ((PsiMethodCallExpression)parent).getMethodExpression();
|
||||
@@ -162,7 +163,13 @@ abstract class SafeDeleteJavaCallerChooser extends JavaCallerChooser {
|
||||
else if (parent instanceof PsiNewExpression) {
|
||||
qualifier = ((PsiNewExpression)parent).getQualifier();
|
||||
}
|
||||
return PsiTreeUtil.isAncestor(qualifier, element, true);
|
||||
|
||||
if (PsiTreeUtil.isAncestor(qualifier, element, true)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
final PsiExpressionList list = parent.getArgumentList();
|
||||
return list != null && !PsiTreeUtil.isAncestor(list.getExpressions()[parameterIndex], element, false);
|
||||
}
|
||||
}) && ref.get()) {
|
||||
return parameter;
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
class Test {
|
||||
void foo(String <caret>s, String p) {}
|
||||
|
||||
void bar(String s, String p) {
|
||||
foo(s, s.substring(0));
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
class Test {
|
||||
void foo(String p) {}
|
||||
|
||||
void bar(String s, String p) {
|
||||
foo(s.substring(0));
|
||||
}
|
||||
}
|
||||
@@ -92,6 +92,10 @@ public class SafeDeleteTest extends MultiFileTestCase {
|
||||
doSingleFileTest();
|
||||
}
|
||||
|
||||
public void testNoDeepDeleteParameterUsedInNextArgumentExpression() throws Exception {
|
||||
doSingleFileTest();
|
||||
}
|
||||
|
||||
public void testToDeepDeleteParameterOverriders() throws Exception {
|
||||
doSingleFileTest();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user