diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java index 77e21773cd26..e30c86bec0a0 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureUsageProcessor.java @@ -510,6 +510,23 @@ public class JavaChangeSignatureUsageProcessor implements ChangeSignatureUsagePr final PsiVariable result = processor.getResult(0); return factory.createExpressionFromText(result.getName(), list); } + if (processor.size() == 0) { + final PsiClass parentClass = PsiTreeUtil.getParentOfType(list, PsiClass.class); + if (parentClass != null) { + PsiClass containingClass = parentClass; + final Set containingClasses = new HashSet(); + while (containingClass != null) { + if (type.isAssignableFrom(factory.createType(containingClass, PsiSubstitutor.EMPTY))) { + containingClasses.add(containingClass); + } + containingClass = PsiTreeUtil.getParentOfType(containingClass, PsiClass.class); + } + if (containingClasses.size() == 1) { + return RefactoringUtil.createThisExpression(parentClass.getManager(), containingClasses.contains(parentClass) ? null + : containingClasses.iterator().next()); + } + } + } } final PsiCallExpression callExpression = PsiTreeUtil.getParentOfType(list, PsiCallExpression.class); final String defaultValue = info.getDefaultValue(); diff --git a/java/java-tests/testData/refactoring/changeSignature/UseThisAsAnyVariable.java b/java/java-tests/testData/refactoring/changeSignature/UseThisAsAnyVariable.java new file mode 100644 index 000000000000..88c0e113f3b5 --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/UseThisAsAnyVariable.java @@ -0,0 +1,18 @@ +import java.util.List; + +class C { + void method() { + } +} + +class Usage implements List { + { + final C c = new C(); + c.method(); + new Runnable() { + public void run() { + c.method(); + } + }.run(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/changeSignature/UseThisAsAnyVariable_after.java b/java/java-tests/testData/refactoring/changeSignature/UseThisAsAnyVariable_after.java new file mode 100644 index 000000000000..4044ed6b7ebf --- /dev/null +++ b/java/java-tests/testData/refactoring/changeSignature/UseThisAsAnyVariable_after.java @@ -0,0 +1,18 @@ +import java.util.List; + +class C { + void method(List l) { + } +} + +class Usage implements List { + { + final C c = new C(); + c.method(this); + new Runnable() { + public void run() { + c.method(Usage.this); + } + }.run(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java index d95a2ef475d6..41294f3e3f69 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java @@ -141,6 +141,18 @@ public class ChangeSignatureTest extends LightCodeInsightTestCase { }, false); } + public void testUseThisAsAnyVariable() throws Exception { + doTest(null, null, null, new GenParams() { + @Override + public ParameterInfoImpl[] genParams(PsiMethod method) throws IncorrectOperationException { + final PsiElementFactory factory = JavaPsiFacade.getInstance(method.getProject()).getElementFactory(); + return new ParameterInfoImpl[] { + new ParameterInfoImpl(-1, "l", factory.createTypeFromText("List", method), "null", true) + }; + } + }, false); + } + public void testRemoveVarargParameter() throws Exception { doTest(null, null, null, new ParameterInfoImpl[]{new ParameterInfoImpl(0)}, new ThrownExceptionInfo[0], false); }