[grazie] IJPL-214423 IAE: [RenameTo.generateSuggestions]

Merge-request: IJ-MR-179707
Merged-by: Ilia Permiashkin <ilia.permiashkin@jetbrains.com>

GitOrigin-RevId: 994b677a6ef205ec0696effcdb8624805f8ec0fa
This commit is contained in:
Ilia Permiashkin
2025-10-24 13:20:32 +00:00
committed by intellij-monorepo-bot
parent df199373cf
commit 2be04f6162
@@ -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<PsiElement> pointer;
private final SpellcheckerRateTracker tracker;
private volatile List<String> suggestions;
private SmartPsiElementPointer<PsiElement> 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();
}