From 0ebc0410766c49281f44f9dc5f42228f88017b52 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 24 Jun 2015 18:50:01 +0300 Subject: [PATCH] copy classes: ensure refs are updated one after another (IDEA-141658) --- .../refactoring/copy/CopyClassesHandler.java | 14 +++++++++----- .../replaceAllOccurrences1/Bar.expected.java | 8 ++++++++ .../copyClass/replaceAllOccurrences1/Foo.java | 8 ++++++++ .../com/intellij/refactoring/CopyClassTest.java | 4 ++++ 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences1/Bar.expected.java create mode 100644 java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences1/Foo.java diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java index 1517cf042814..02d25f339146 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java @@ -484,10 +484,11 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { private static void decodeRefs(@NotNull PsiElement element, final Map oldToNewMap, final Set rebindExpressions) { + final Map rebindMap = new LinkedHashMap(); element.accept(new JavaRecursiveElementVisitor(){ @Override public void visitReferenceExpression(PsiReferenceExpression expression) { - decodeRef(expression, oldToNewMap, rebindExpressions); + decodeRef(expression, oldToNewMap, rebindMap); super.visitReferenceExpression(expression); } @@ -495,7 +496,7 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { public void visitNewExpression(PsiNewExpression expression) { final PsiJavaCodeReferenceElement referenceElement = expression.getClassReference(); if (referenceElement != null) { - decodeRef(referenceElement, oldToNewMap, rebindExpressions); + decodeRef(referenceElement, oldToNewMap, rebindMap); } super.visitNewExpression(expression); } @@ -504,22 +505,25 @@ public class CopyClassesHandler extends CopyHandlerDelegateBase { public void visitTypeElement(PsiTypeElement type) { final PsiJavaCodeReferenceElement referenceElement = type.getInnermostComponentReferenceElement(); if (referenceElement != null) { - decodeRef(referenceElement, oldToNewMap, rebindExpressions); + decodeRef(referenceElement, oldToNewMap, rebindMap); } super.visitTypeElement(type); } }); + for (Map.Entry entry : rebindMap.entrySet()) { + rebindExpressions.add(entry.getKey().bindToElement(entry.getValue())); + } rebindExternalReferences(element, oldToNewMap, rebindExpressions); } private static void decodeRef(final PsiJavaCodeReferenceElement expression, final Map oldToNewMap, - Set rebindExpressions) { + Map rebindExpressions) { final PsiElement resolved = expression.resolve(); if (resolved instanceof PsiClass) { final PsiClass psiClass = (PsiClass)resolved; if (oldToNewMap.containsKey(psiClass)) { - rebindExpressions.add(expression.bindToElement(oldToNewMap.get(psiClass))); + rebindExpressions.put(expression, oldToNewMap.get(psiClass)); } } } diff --git a/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences1/Bar.expected.java b/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences1/Bar.expected.java new file mode 100644 index 000000000000..005e6d2c98d4 --- /dev/null +++ b/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences1/Bar.expected.java @@ -0,0 +1,8 @@ +public class Bar { + private static final int INITIALIZED_CONST = 0; + private static int initializedStaticField = 0; + static { + System.out.println(Bar.INITIALIZED_CONST); + System.out.println(Bar.initializedStaticField); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences1/Foo.java b/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences1/Foo.java new file mode 100644 index 000000000000..f99c582b0ada --- /dev/null +++ b/java/java-tests/testData/refactoring/copyClass/replaceAllOccurrences1/Foo.java @@ -0,0 +1,8 @@ +public class Foo { + private static final int INITIALIZED_CONST = 0; + private static int initializedStaticField = 0; + static { + System.out.println(Foo.INITIALIZED_CONST); + System.out.println(Foo.initializedStaticField); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/CopyClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/CopyClassTest.java index 4f3b34a328ff..0b4a5000e1df 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/CopyClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/CopyClassTest.java @@ -47,6 +47,10 @@ public class CopyClassTest extends CodeInsightTestCase { public void testReplaceAllOccurrences() throws Exception { doTest("Foo", "Bar"); } + + public void testReplaceAllOccurrences1() throws Exception { + doTest("Foo", "Bar"); + } public void testLibraryClass() throws Exception { // IDEADEV-28791 JavaCodeStyleSettings javaSettings = getCurrentCodeStyleSettings().getCustomSettings(JavaCodeStyleSettings.class);