From 7d81db930caf3d1bafa949852b918b435c8e860a Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 15 Apr 2013 17:35:32 +0200 Subject: [PATCH] inplace rename: include nameIdentifier in rename template when no reference covers this identifier --- .../refactoring/renameLocal/RenameInPlaceOnRef.java | 5 +++++ .../renameLocal/RenameInPlaceOnRef_after.java | 5 +++++ .../com/intellij/refactoring/RenameLocalTest.java | 6 +++++- .../rename/inplace/InplaceRefactoring.java | 12 ++++++++++-- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/renameLocal/RenameInPlaceOnRef.java create mode 100644 java/java-tests/testData/refactoring/renameLocal/RenameInPlaceOnRef_after.java diff --git a/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceOnRef.java b/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceOnRef.java new file mode 100644 index 000000000000..abe3b78d2b29 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceOnRef.java @@ -0,0 +1,5 @@ +class Test { + void foo(boolean b) { + System.out.println(b); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceOnRef_after.java b/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceOnRef_after.java new file mode 100644 index 000000000000..0ca65e45b658 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameLocal/RenameInPlaceOnRef_after.java @@ -0,0 +1,5 @@ +class Test { + void foo(boolean a) { + System.out.println(a); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameLocalTest.java b/java/java-tests/testSrc/com/intellij/refactoring/RenameLocalTest.java index 9a7ab8abb48b..6799dd64391c 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameLocalTest.java @@ -88,6 +88,10 @@ public class RenameLocalTest extends LightRefactoringTestCase { doTestInplaceRename("a"); } + public void testRenameInPlaceOnRef() throws Exception { + doTestInplaceRename("a"); + } + public void testRenameInPlaceParamInOverriderAutomaticRenamer() throws Exception { doTestInplaceRename("pp"); } @@ -119,7 +123,7 @@ public class RenameLocalTest extends LightRefactoringTestCase { private void doTestInplaceRename(final String newName) throws Exception { configureByFile(BASE_PATH + "/" + getTestName(false) + ".java"); - final PsiElement element = TargetElementUtilBase.findTargetElement(myEditor, TargetElementUtilBase.ELEMENT_NAME_ACCEPTED); + final PsiElement element = TargetElementUtilBase.findTargetElement(myEditor, TargetElementUtilBase.ELEMENT_NAME_ACCEPTED | TargetElementUtilBase.REFERENCED_ELEMENT_ACCEPTED); assertNotNull(element); assertTrue("In-place rename not allowed for " + element, JavaRefactoringSupportProvider.mayRenameInplace(element, null)); diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java index 027cabd550b5..0feb675bac8d 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/InplaceRefactoring.java @@ -269,6 +269,7 @@ public abstract class InplaceRefactoring { PsiElement selectedElement = getSelectedInEditorElement(nameIdentifier, refs, stringUsages, offset); boolean subrefOnPrimaryElement = false; + boolean hasReferenceOnNameIdentifier = false; for (PsiReference ref : refs) { if (isReferenceAtCaret(selectedElement, ref)) { builder.replaceElement(ref, PRIMARY_VARIABLE_NAME, createLookupExpression(), true); @@ -276,8 +277,14 @@ public abstract class InplaceRefactoring { continue; } addVariable(ref, selectedElement, builder, offset); + hasReferenceOnNameIdentifier |= isReferenceAtCaret(nameIdentifier, ref); + } + if (nameIdentifier != null) { + hasReferenceOnNameIdentifier |= selectedElement.getTextRange().contains(nameIdentifier.getTextRange()); + if (!subrefOnPrimaryElement || !hasReferenceOnNameIdentifier){ + addVariable(nameIdentifier, selectedElement, builder); + } } - if (nameIdentifier != null && !subrefOnPrimaryElement) addVariable(nameIdentifier, selectedElement, builder); for (Pair usage : stringUsages) { addVariable(usage.first, usage.second, selectedElement, builder); } @@ -328,7 +335,8 @@ public abstract class InplaceRefactoring { } protected boolean isReferenceAtCaret(PsiElement selectedElement, PsiReference ref) { - return selectedElement != null && selectedElement.getTextRange().contains(ref.getElement().getTextRange()); + final TextRange textRange = ref.getRangeInElement().shiftRight(ref.getElement().getTextRange().getStartOffset()); + return selectedElement != null && selectedElement.getTextRange().contains(textRange); } protected void beforeTemplateStart() {