From 18f71959cb40f10dd469f435ab08debc1fd9b39a Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 12 Apr 2013 11:31:31 +0200 Subject: [PATCH] inplace rename: fix range check for injected usages --- .../rename/inplace/InplaceRefactoring.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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 d869101800fe..9166f3b6e659 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 @@ -608,8 +608,8 @@ public abstract class InplaceRefactoring { final PsiElement selectedElement, final TemplateBuilderImpl builder, int offset) { - if (reference.getElement() == selectedElement && - reference.getRangeInElement().shiftRight(selectedElement.getTextRange().getStartOffset()).containsOffset(offset)) { + final PsiElement element = reference.getElement(); + if (element == selectedElement && checkRangeContainsOffset(offset, reference.getRangeInElement(), element)) { builder.replaceElement(reference, PRIMARY_VARIABLE_NAME, createLookupExpression(), true); } else { @@ -671,7 +671,7 @@ public abstract class InplaceRefactoring { //prefer reference in case of self-references for (PsiReference ref : refs) { final PsiElement element = ref.getElement(); - if (ref.getRangeInElement().shiftRight(element.getTextRange().getStartOffset()).containsOffset(offset)) return element; + if (checkRangeContainsOffset(offset, ref.getRangeInElement(), element)) return element; } if (nameIdentifier != null) { @@ -680,14 +680,22 @@ public abstract class InplaceRefactoring { } for (Pair stringUsage : stringUsages) { - final PsiElement element = stringUsage.first; - if (stringUsage.second.shiftRight(element.getTextRange().getStartOffset()).containsOffset(offset)) return element; + if (checkRangeContainsOffset(offset, stringUsage.second, stringUsage.first)) return stringUsage.first; } LOG.error(nameIdentifier + " by " + this.getClass().getName()); return null; } + private boolean checkRangeContainsOffset(int offset, final TextRange textRange, PsiElement element) { + int startOffset = element.getTextRange().getStartOffset(); + final PsiLanguageInjectionHost injectionHost = InjectedLanguageManager.getInstance(myProject).getInjectionHost(element); + if (injectionHost != null) { + startOffset += injectionHost.getTextOffset(); + } + return textRange.shiftRight(startOffset).containsOffset(offset); + } + protected boolean isRestart() { final Boolean isRestart = myEditor.getUserData(INTRODUCE_RESTART); return isRestart != null && isRestart;