diff --git a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java index b82d9f927e83..83b6f1f7a7ab 100644 --- a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java +++ b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperProcessorBase.java @@ -294,6 +294,9 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces processUsage(variable); return; } + } else if (classReference.getParent() instanceof PsiAnonymousClass) { + processUsage(classReference); + return; } } markNode(ref); //??? @@ -635,10 +638,17 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces final PsiType type = ((PsiParameter)element).getType(); final PsiClass aClass = PsiUtil.resolveClassInType(type); if (aClass != null) { - if (!myManager.isInProject(element) || !myManager.areElementsEquivalent(aClass, myClass)) { - if (!isSuperInheritor(aClass)) { - markNode(element); + if (aClass instanceof PsiTypeParameter) { + for (Node node : myElementToNode.get(element).mySuccessors) { + final PsiResolveHelper psiResolveHelper = JavaPsiFacade.getInstance(myProject).getResolveHelper(); + final PsiType psiType = psiResolveHelper + .inferTypeForMethodTypeParameter((PsiTypeParameter)aClass, new PsiParameter[]{(PsiParameter)element}, + new PsiExpression[]{(PsiExpression)node.myMark.myElement}, PsiSubstitutor.EMPTY, null, + false); + if (checkNode(element, PsiUtil.resolveClassInType(psiType))) break; } + } else { + checkNode(element, aClass); } } else { // unresolvable class @@ -648,6 +658,16 @@ public abstract class TurnRefsToSuperProcessorBase extends BaseRefactoringProces } } + private boolean checkNode(PsiElement element, PsiClass psiClass) { + if (!myManager.isInProject(element) || !myManager.areElementsEquivalent(psiClass, myClass)) { + if (!isSuperInheritor(psiClass)) { + markNode(element); + return true; + } + } + return false; + } + protected abstract boolean isSuperInheritor(PsiClass aClass); protected abstract boolean isInSuper(PsiElement member); diff --git a/java/java-tests/testData/refactoring/turnRefsToSuper/anonymousWithTypeArguments/after/Clazz.java b/java/java-tests/testData/refactoring/turnRefsToSuper/anonymousWithTypeArguments/after/Clazz.java new file mode 100644 index 000000000000..94ce2ffe56c6 --- /dev/null +++ b/java/java-tests/testData/refactoring/turnRefsToSuper/anonymousWithTypeArguments/after/Clazz.java @@ -0,0 +1,20 @@ +interface Intf { +} + +interface Factory { + E create(); + void save(E obj); + + static class helper { + static Factory get2() { + return (Factory)new Factory() { + public Intf create() { return null; } + public void save(Intf obj) { } + }; + } + } +} + + +public class Clazz implements Intf { +} diff --git a/java/java-tests/testData/refactoring/turnRefsToSuper/anonymousWithTypeArguments/before/Clazz.java b/java/java-tests/testData/refactoring/turnRefsToSuper/anonymousWithTypeArguments/before/Clazz.java new file mode 100644 index 000000000000..e2cd2a9721f5 --- /dev/null +++ b/java/java-tests/testData/refactoring/turnRefsToSuper/anonymousWithTypeArguments/before/Clazz.java @@ -0,0 +1,20 @@ +interface Intf { +} + +interface Factory { + E create(); + void save(E obj); + + static class helper { + static Factory get2() { + return (Factory)new Factory() { + public Clazz create() { return null; } + public void save(Clazz obj) { } + }; + } + } +} + + +public class Clazz implements Intf { +} diff --git a/java/java-tests/testData/refactoring/turnRefsToSuper/typeArgumentsParam/after/Clazz.java b/java/java-tests/testData/refactoring/turnRefsToSuper/typeArgumentsParam/after/Clazz.java new file mode 100644 index 000000000000..ef0d6df502c4 --- /dev/null +++ b/java/java-tests/testData/refactoring/turnRefsToSuper/typeArgumentsParam/after/Clazz.java @@ -0,0 +1,22 @@ +interface Intf { +} + +interface Factory { + E create(); + + void save(E obj); + + static class helper { + static Factory get() { + return null; + } + } +} + + +public class Clazz implements Intf { + void bar() { + Intf y = Factory.helper.get().create(); + Factory.helper.get().save(y); + } +} diff --git a/java/java-tests/testData/refactoring/turnRefsToSuper/typeArgumentsParam/before/Clazz.java b/java/java-tests/testData/refactoring/turnRefsToSuper/typeArgumentsParam/before/Clazz.java new file mode 100644 index 000000000000..fde99a08dac0 --- /dev/null +++ b/java/java-tests/testData/refactoring/turnRefsToSuper/typeArgumentsParam/before/Clazz.java @@ -0,0 +1,22 @@ +interface Intf { +} + +interface Factory { + E create(); + + void save(E obj); + + static class helper { + static Factory get() { + return null; + } + } +} + + +public class Clazz implements Intf { + void bar() { + Clazz y = Factory.helper.get().create(); + Factory.helper.get().save(y); + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/TurnRefsToSuperTest.java b/java/java-tests/testSrc/com/intellij/refactoring/TurnRefsToSuperTest.java index a9a0e9302462..dd1167897034 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/TurnRefsToSuperTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/TurnRefsToSuperTest.java @@ -126,6 +126,14 @@ public class TurnRefsToSuperTest extends MultiFileTestCase { doTest("IImpl", "I", false); } + public void testAnonymousWithTypeArguments() throws Exception { + doTest("Clazz", "Intf", false); + } + + public void testTypeArgumentsParam() throws Exception { + doTest("Clazz", "Intf", false); + } + private void doTest(@NonNls final String className, @NonNls final String superClassName, final boolean replaceInstanceOf) throws Exception { doTest(new PerformAction() { public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception {