From 8ca75718a2f6b408356ae2395e092e300468bd0c Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 7 Jan 2015 12:18:55 +0100 Subject: [PATCH] check reference range also for cached references (XmlRenameTest.testRenameInsideCDATA fixed) --- .../refactoring/util/MoveRenameUsageInfo.java | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/platform/lang-api/src/com/intellij/refactoring/util/MoveRenameUsageInfo.java b/platform/lang-api/src/com/intellij/refactoring/util/MoveRenameUsageInfo.java index f8a3f5fc6cc7..618931700adb 100644 --- a/platform/lang-api/src/com/intellij/refactoring/util/MoveRenameUsageInfo.java +++ b/platform/lang-api/src/com/intellij/refactoring/util/MoveRenameUsageInfo.java @@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.usageView.UsageInfo; +import com.intellij.util.Function; import org.jetbrains.annotations.Nullable; public class MoveRenameUsageInfo extends UsageInfo{ @@ -90,18 +91,49 @@ public class MoveRenameUsageInfo extends UsageInfo{ public PsiReference getReference() { if (myReference != null) { final PsiElement element = myReference.getElement(); - if (element != null && element.isValid()) return myReference; + if (element != null && element.isValid()) { + if (myReferenceRangeMarker == null) { + return myReference; + } + + final PsiReference reference = checkReferenceRange(element, new Function() { + @Override + public PsiReference fun(Integer start) { + return myReference; + } + }); + + if (reference != null) { + return reference; + } + } } if (myReferenceRangeMarker == null) return null; final PsiElement element = getElement(); - if (element == null) return null; + if (element == null || !element.isValid()) { + return null; + } + return checkReferenceRange(element, new Function() { + @Override + public PsiReference fun(Integer start) { + return element.findReferenceAt(start); + } + }); + } + + @Nullable + private PsiReference checkReferenceRange(PsiElement element, Function fn) { final int start = myReferenceRangeMarker.getStartOffset() - element.getTextRange().getStartOffset(); final int end = myReferenceRangeMarker.getEndOffset() - element.getTextRange().getStartOffset(); - final PsiReference reference = element.findReferenceAt(start); - if (reference == null) return null; + final PsiReference reference = fn.fun(start); + if (reference == null) { + return null; + } final TextRange rangeInElement = reference.getRangeInElement(); - if (rangeInElement.getStartOffset() != start || rangeInElement.getEndOffset() != end) return null; + if (rangeInElement.getStartOffset() != start || rangeInElement.getEndOffset() != end) { + return null; + } return reference; } }