diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 7cb034015791..e7499783944c 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -891,6 +891,7 @@ public class RefactoringUtil { final Iterable parametersIterable, final PsiSubstitutor substitutor, final PsiElementFactory factory) { + final Map replacement = new LinkedHashMap(); for (PsiTypeParameter parameter : parametersIterable) { PsiType substitutedType = substitutor.substitute(parameter); if (substitutedType == null) { @@ -900,12 +901,17 @@ public class RefactoringUtil { final PsiElement element = reference.getElement(); final PsiElement parent = element.getParent(); if (parent instanceof PsiTypeElement) { - parent.replace(factory.createTypeElement(substitutedType)); + replacement.put(parent, factory.createTypeElement(substitutedType)); } else if (element instanceof PsiJavaCodeReferenceElement && substitutedType instanceof PsiClassType) { - element.replace(factory.createReferenceElementByType((PsiClassType)substitutedType)); + replacement.put(element, factory.createReferenceElementByType((PsiClassType)substitutedType)); } } } + for (PsiElement element : replacement.keySet()) { + if (element.isValid()) { + element.replace(replacement.get(element)); + } + } } @Nullable diff --git a/java/java-tests/testData/refactoring/pullUp/TypeParamsConflictingNames.java b/java/java-tests/testData/refactoring/pullUp/TypeParamsConflictingNames.java new file mode 100644 index 000000000000..d7b4dff9b570 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/TypeParamsConflictingNames.java @@ -0,0 +1,7 @@ +interface Bar { } + +interface Base { } + +class Foo implements Base { + void foo(Bar bar) { } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/TypeParamsConflictingNames_after.java b/java/java-tests/testData/refactoring/pullUp/TypeParamsConflictingNames_after.java new file mode 100644 index 000000000000..984121891943 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/TypeParamsConflictingNames_after.java @@ -0,0 +1,10 @@ +interface Bar { } + +interface Base { + void foo(Bar bar); +} + +class Foo implements Base { + @Override + public void foo(Bar bar) { } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java index c4f5a7aa0e89..141ca3afd68c 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java @@ -115,6 +115,10 @@ public class PullUpTest extends LightRefactoringTestCase { doTest(false, new RefactoringTestUtil.MemberDescriptor("I", PsiClass.class)); } + public void testTypeParamsConflictingNames() throws Exception { + doTest(false, new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class)); + } + private void doTest(RefactoringTestUtil.MemberDescriptor... membersToFind) throws Exception { doTest(true, membersToFind); }