diff --git a/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java b/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java index 39c00a28d124..e1e42868c5e4 100644 --- a/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java +++ b/spellchecker/src/com/intellij/spellchecker/quickfixes/RenameTo.java @@ -11,6 +11,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Segment; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; @@ -33,16 +34,18 @@ import java.util.List; public class RenameTo extends IntentionAndQuickFixAction implements Iconable, EventTrackingIntentionAction { private final String typo; - private final TextRange range; + private final SmartPsiFileRange rangeRelativeToFile; private final SmartPsiElementPointer pointer; private final SpellcheckerRateTracker tracker; private volatile List suggestions; private SmartPsiElementPointer namedPointer; public RenameTo(String typo, TextRange range, PsiElement psi, SpellcheckerRateTracker tracker) { + PsiFile file = psi.getContainingFile(); + this.rangeRelativeToFile = SmartPointerManager.getInstance(psi.getProject()) + .createSmartPsiFileRangePointer(file, range.shiftRight(psi.getTextRange().getStartOffset())); this.typo = typo; - this.range = range; - this.pointer = SmartPointerManager.getInstance(psi.getProject()).createSmartPsiElementPointer(psi, psi.getContainingFile()); + this.pointer = SmartPointerManager.getInstance(psi.getProject()).createSmartPsiElementPointer(psi, file); this.tracker = tracker; } @@ -54,7 +57,7 @@ public class RenameTo extends IntentionAndQuickFixAction implements Iconable, Ev if (presentationName == null) return false; generateSuggestions(presentationName.getSecond(), element); this.namedPointer = SmartPointerManager.getInstance(project).createSmartPsiElementPointer(presentationName.getFirst()); - if (suggestions.isEmpty()) return false; + if (suggestions == null || suggestions.isEmpty()) return false; return true; } @@ -133,7 +136,8 @@ public class RenameTo extends IntentionAndQuickFixAction implements Iconable, Ev private void generateSuggestions(String name, PsiElement element) { if (suggestions == null) { - TextRange range = this.range.shiftLeft(element.getText().indexOf(name)); + TextRange range = restoreRange(name); + if (range == null) return; this.suggestions = SpellCheckerManager.getInstance(pointer.getProject()).getSuggestions(typo) .stream() .map(suggestion -> range.replace(name, suggestion)) @@ -143,6 +147,17 @@ public class RenameTo extends IntentionAndQuickFixAction implements Iconable, Ev } } + private @Nullable TextRange restoreRange(String currentElementName) { + PsiElement element = pointer.getElement(); + Segment rangeRelativeToFile = this.rangeRelativeToFile.getRange(); + if (element == null || rangeRelativeToFile == null) return null; + + int offset = element.getText().indexOf(currentElementName); + return TextRange.create(rangeRelativeToFile) + .shiftLeft(element.getTextRange().getStartOffset()) + .shiftLeft(offset); + } + private void runRenamer(PsiElement element, String suggestion) { new RenameProcessor(pointer.getProject(), element, suggestion, true, true).run(); }