if selected text is in the injection, use host editor range when comparing with host editor template ranges

This commit is contained in:
Dennis Ushakov
2016-10-14 12:56:37 +03:00
parent 2dc052fc8e
commit 5a369fa737
@@ -17,8 +17,10 @@ package com.intellij.refactoring.rename.inplace;
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateState;
import com.intellij.injected.editor.EditorWindow;
import com.intellij.lang.Language;
import com.intellij.lang.LanguageExtension;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.CommandProcessor;
@@ -159,13 +161,22 @@ public class VariableInplaceRenamer extends InplaceRefactoring {
@Override
protected void restoreSelection() {
if (mySelectedRange != null) {
TemplateState state = TemplateManagerImpl.getTemplateState(InjectedLanguageUtil.getTopLevelEditor(myEditor));
Editor editor = InjectedLanguageUtil.getTopLevelEditor(myEditor);
TextRange selectedRange;
if (myEditor instanceof EditorWindow) {
PsiFile injected = ((EditorWindow)myEditor).getInjectedFile();
selectedRange = InjectedLanguageManager.getInstance(editor.getProject()).injectedToHost(injected, mySelectedRange);
} else {
selectedRange = mySelectedRange;
}
TemplateState state = TemplateManagerImpl.getTemplateState(editor);
if (state != null) {
for (int i = 0; i < state.getSegmentsCount(); i++) {
final TextRange segmentRange = state.getSegmentRange(i);
TextRange intersection = segmentRange.intersection(mySelectedRange);
TextRange intersection = segmentRange.intersection(selectedRange);
if (intersection != null) {
myEditor.getSelectionModel().setSelection(intersection.getStartOffset(), intersection.getEndOffset());
editor.getSelectionModel().setSelection(intersection.getStartOffset(), intersection.getEndOffset());
return;
}
}