From d03c0ac2b297f80c85ec9dce6c2068dadb6006e0 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 28 Jan 2010 21:58:50 +0300 Subject: [PATCH] rename conflict: local variable hided by a field in an inner class (IDEA-20700) --- .../changeSignature/ChangeSignatureProcessor.java | 4 ++-- .../refactoring/introduceVariable/InputValidator.java | 2 -- .../rename/JavaUnresolvableLocalCollisionDetector.java | 11 ++++++----- .../RenameLocalVariableHidesFieldInAnonymous.java | 16 ++++++++++++++++ .../com/intellij/refactoring/RenameCollisionsTest.java | 12 ++++++++++++ .../com/intellij/refactoring/rename/RenameProcessor.java | 4 ++++ 6 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/refactoring/renameCollisions/RenameLocalVariableHidesFieldInAnonymous.java diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java index 1c4578948d..909b200d8e 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureProcessor.java @@ -289,7 +289,7 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { if (!newName.equals(parameter.getName())) { JavaUnresolvableLocalCollisionDetector.visitLocalsCollisions(parameter, newName, method.getBody(), null, new JavaUnresolvableLocalCollisionDetector.CollidingVariableVisitor() { public void visitCollidingElement(final PsiVariable collidingVariable) { - if (!(collidingVariable instanceof PsiField) && !deletedOrRenamedParameters.contains(collidingVariable)) { + if (!deletedOrRenamedParameters.contains(collidingVariable)) { result.add(new RenamedParameterCollidesWithLocalUsageInfo(parameter, collidingVariable, method)); } } @@ -300,7 +300,7 @@ public class ChangeSignatureProcessor extends BaseRefactoringProcessor { else { JavaUnresolvableLocalCollisionDetector.visitLocalsCollisions(method, newName, method.getBody(), null, new JavaUnresolvableLocalCollisionDetector.CollidingVariableVisitor() { public void visitCollidingElement(PsiVariable collidingVariable) { - if (!(collidingVariable instanceof PsiField) && !deletedOrRenamedParameters.contains(collidingVariable)) { + if (!deletedOrRenamedParameters.contains(collidingVariable)) { result.add(new NewParameterCollidesWithLocalUsageInfo(collidingVariable, collidingVariable, method)); } } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceVariable/InputValidator.java b/java/java-impl/src/com/intellij/refactoring/introduceVariable/InputValidator.java index 6833985f55..1b5cbe2bc5 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceVariable/InputValidator.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceVariable/InputValidator.java @@ -18,7 +18,6 @@ package com.intellij.refactoring.introduceVariable; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiField; import com.intellij.psi.PsiVariable; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.rename.JavaUnresolvableLocalCollisionDetector; @@ -49,7 +48,6 @@ public class InputValidator implements IntroduceVariableBase.Validator { final HashSet reportedVariables = new HashSet(); JavaUnresolvableLocalCollisionDetector.CollidingVariableVisitor visitor = new JavaUnresolvableLocalCollisionDetector.CollidingVariableVisitor() { public void visitCollidingElement(PsiVariable collidingVariable) { - if (collidingVariable instanceof PsiField) return; if (!reportedVariables.contains(collidingVariable)) { reportedVariables.add(collidingVariable); String message = RefactoringBundle.message("introduced.variable.will.conflict.with.0", RefactoringUIUtil.getDescription(collidingVariable, true)); diff --git a/java/java-impl/src/com/intellij/refactoring/rename/JavaUnresolvableLocalCollisionDetector.java b/java/java-impl/src/com/intellij/refactoring/rename/JavaUnresolvableLocalCollisionDetector.java index 0cf9705a50..d0c02b6194 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/JavaUnresolvableLocalCollisionDetector.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/JavaUnresolvableLocalCollisionDetector.java @@ -51,7 +51,7 @@ public class JavaUnresolvableLocalCollisionDetector { final CollidingVariableVisitor collidingNameVisitor = new CollidingVariableVisitor() { public void visitCollidingElement(PsiVariable collidingVariable) { - if (collidingVariable.equals(element) || collidingVariable instanceof PsiField) return; + if (collidingVariable.equals(element)) return; LocalHidesRenamedLocalUsageInfo collision = new LocalHidesRenamedLocalUsageInfo(element, collidingVariable); result.add(collision); } @@ -116,9 +116,6 @@ public class JavaUnresolvableLocalCollisionDetector { current = current.getParent(); } } - } - - if (collidingVariable != null) { collidingNameVisitor.visitCollidingElement(collidingVariable); } } @@ -136,7 +133,11 @@ public class JavaUnresolvableLocalCollisionDetector { visitElement(expression); } - @Override public void visitClass(PsiClass aClass) { + @Override + public void visitField(PsiField field) { + if (myName.equals(field.getName())) { + myCollidingNameVisitor.visitCollidingElement(field); + } } @Override public void visitVariable(PsiVariable variable) { diff --git a/java/java-tests/testData/refactoring/renameCollisions/RenameLocalVariableHidesFieldInAnonymous.java b/java/java-tests/testData/refactoring/renameCollisions/RenameLocalVariableHidesFieldInAnonymous.java new file mode 100644 index 0000000000..e8d17c292d --- /dev/null +++ b/java/java-tests/testData/refactoring/renameCollisions/RenameLocalVariableHidesFieldInAnonymous.java @@ -0,0 +1,16 @@ +public class A { + Thread m() { + final int x = 42; + return new Thread() { + int y = 23; + + public void run() { + System.out.println(x); + } + }; + } + + public static void main(String[] args) { + new A().m().start(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java index 5286661ee2..99ff8bf186 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameCollisionsTest.java @@ -7,6 +7,7 @@ import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import com.intellij.psi.PsiElement; import com.intellij.refactoring.rename.RenameProcessor; import com.intellij.testFramework.LightCodeInsightTestCase; +import org.junit.Assert; /** * @author sashache @@ -140,6 +141,17 @@ public class RenameCollisionsTest extends LightCodeInsightTestCase { doTest("STATIC_FIELD"); } + public void testRenameLocalVariableHidesFieldInAnonymous() throws Exception { + try { + doTest("y"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + Assert.assertEquals("There is already a field y. It will conflict with the renamed variable", e.getMessage()); + return; + } + fail("Conflicts were not found"); + } + private void doTest(final String newName) throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".java"); PsiElement element = TargetElementUtilBase diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java index 88744ad411..a7b97f882b 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/RenameProcessor.java @@ -16,6 +16,7 @@ package com.intellij.refactoring.rename; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.progress.ProgressManager; @@ -121,6 +122,9 @@ public class RenameProcessor extends BaseRefactoringProcessor { RenameUtil.addConflictDescriptions(usagesIn, conflicts); RenamePsiElementProcessor.forElement(myPrimaryElement).findExistingNameConflicts(myPrimaryElement, myNewName, conflicts); if (!conflicts.isEmpty()) { + if (ApplicationManager.getApplication().isUnitTestMode()) { + throw new ConflictsInTestsException(conflicts.values()); + } ConflictsDialog conflictsDialog = new ConflictsDialog(myProject, conflicts); conflictsDialog.show(); if (!conflictsDialog.isOK()) { -- 2.11.4.GIT