mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Related problems: recheck previous changes after refactoring (IDEA-245696)
GitOrigin-RevId: 4a6bb158fb9aa051e8a58126b7c17af88fc63a60
This commit is contained in:
committed by
intellij-monorepo-bot
parent
a57c997d52
commit
2ca6f25db0
+40
-5
@@ -18,6 +18,9 @@ import com.intellij.openapi.vfs.newvfs.events.VFileDeleteEvent;
|
||||
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
|
||||
import com.intellij.psi.PsiJavaFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.PsiMember;
|
||||
import com.intellij.refactoring.listeners.RefactoringEventData;
|
||||
import com.intellij.refactoring.listeners.RefactoringEventListener;
|
||||
import com.intellij.util.messages.MessageBusConnection;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -29,7 +32,8 @@ import static com.intellij.util.ObjectUtils.tryCast;
|
||||
|
||||
final class ProjectProblemFileSelectionListener implements FileEditorManagerListener,
|
||||
InlayHintsSettings.SettingsListener,
|
||||
BulkFileListener {
|
||||
BulkFileListener,
|
||||
RefactoringEventListener {
|
||||
private final Project myProject;
|
||||
|
||||
private ProjectProblemFileSelectionListener(@NotNull Project project) {
|
||||
@@ -66,18 +70,21 @@ final class ProjectProblemFileSelectionListener implements FileEditorManagerList
|
||||
FileStateUpdater.removeState(removedJavaFile);
|
||||
}
|
||||
if (e instanceof VFileContentChangeEvent || e instanceof VFileDeleteEvent) {
|
||||
TextEditor editor = tryCast(FileEditorManager.getInstance(myProject).getSelectedEditor(), TextEditor.class);
|
||||
if (editor == null) continue;
|
||||
VirtualFile selectedFile = editor.getFile();
|
||||
VirtualFile selectedFile = getSelectedFile();
|
||||
if (selectedFile == null || changedFile.equals(selectedFile)) continue;
|
||||
PsiJavaFile selectedJavaFile = getJavaFile(myProject, selectedFile);
|
||||
if (selectedJavaFile == null) continue;
|
||||
editor.getEditor();
|
||||
FileStateUpdater.setPreviousState(selectedJavaFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private VirtualFile getSelectedFile() {
|
||||
TextEditor editor = tryCast(FileEditorManager.getInstance(myProject).getSelectedEditor(), TextEditor.class);
|
||||
return editor == null ? null : editor.getFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void settingsChanged() {
|
||||
if (!hintsEnabled()) onHintsDisabled();
|
||||
@@ -104,6 +111,33 @@ final class ProjectProblemFileSelectionListener implements FileEditorManagerList
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refactoringStarted(@NotNull String refactoringId, @Nullable RefactoringEventData beforeData) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refactoringDone(@NotNull String refactoringId, @Nullable RefactoringEventData afterData) {
|
||||
if (afterData == null) return;
|
||||
PsiMember member = tryCast(afterData.getUserData(RefactoringEventData.PSI_ELEMENT_KEY), PsiMember.class);
|
||||
if (member == null) return;
|
||||
PsiJavaFile psiJavaFile = tryCast(member.getContainingFile(), PsiJavaFile.class);
|
||||
if (psiJavaFile == null) return;
|
||||
FileStateUpdater.setPreviousState(psiJavaFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void conflictsDetected(@NotNull String refactoringId, @NotNull RefactoringEventData conflictsData) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void undoRefactoring(@NotNull String refactoringId) {
|
||||
VirtualFile selectedFile = getSelectedFile();
|
||||
if (selectedFile == null) return;
|
||||
PsiJavaFile psiJavaFile = getJavaFile(myProject, selectedFile);
|
||||
if (psiJavaFile == null) return;
|
||||
FileStateUpdater.setPreviousState(psiJavaFile);
|
||||
}
|
||||
|
||||
private static @Nullable PsiJavaFile getJavaFile(@NotNull Project project, @Nullable VirtualFile file) {
|
||||
if (file == null || file instanceof VirtualFileWindow || !file.isValid()) return null;
|
||||
return tryCast(PsiManager.getInstance(project).findFile(file), PsiJavaFile.class);
|
||||
@@ -122,6 +156,7 @@ final class ProjectProblemFileSelectionListener implements FileEditorManagerList
|
||||
connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener);
|
||||
connection.subscribe(InlayHintsSettings.getINLAY_SETTINGS_CHANGED(), listener);
|
||||
connection.subscribe(VirtualFileManager.VFS_CHANGES, listener);
|
||||
connection.subscribe(RefactoringEventListener.REFACTORING_EVENT_TOPIC, listener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+34
@@ -10,6 +10,7 @@ import com.intellij.openapi.fileEditor.FileEditorManager
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import com.intellij.refactoring.BaseRefactoringProcessor
|
||||
import com.intellij.refactoring.RefactoringFactory
|
||||
import com.intellij.refactoring.move.moveInner.MoveInnerImpl
|
||||
import com.intellij.refactoring.openapi.impl.MoveInnerRefactoringImpl
|
||||
|
||||
@@ -287,6 +288,39 @@ internal class ClassProblemsTest : ProjectProblemsViewTest() {
|
||||
}
|
||||
}
|
||||
|
||||
fun testRenameClassAndFixUsages() {
|
||||
val targetClass = myFixture.addClass("""
|
||||
class AClass {
|
||||
}
|
||||
""".trimIndent())
|
||||
|
||||
myFixture.addClass("""
|
||||
class BClass {
|
||||
AClass tmp;
|
||||
|
||||
public void method1(String arg) {
|
||||
System.out.println(tmp.toString());
|
||||
}
|
||||
}
|
||||
""".trimIndent())
|
||||
|
||||
doTest(targetClass) {
|
||||
changeClass(targetClass) { psiClass, factory ->
|
||||
psiClass.nameIdentifier?.replace(factory.createIdentifier("AClass1"))
|
||||
}
|
||||
|
||||
assertSize(1, ProjectProblemUtils.getReportedProblems(myFixture.editor).entries)
|
||||
|
||||
changeClass(targetClass) { psiClass, _ ->
|
||||
psiClass.setName("AClass")
|
||||
val renameRefactoring = RefactoringFactory.getInstance(project).createRename(psiClass, "AClass1", true, false)
|
||||
renameRefactoring.run()
|
||||
}
|
||||
|
||||
assertEmpty(ProjectProblemUtils.getReportedProblems(myFixture.editor).entries)
|
||||
}
|
||||
}
|
||||
|
||||
private fun doNestedClassTest(isStatic: Boolean) {
|
||||
val staticModifier = if (isStatic) "static" else ""
|
||||
val targetClass = myFixture.addClass("""
|
||||
|
||||
Reference in New Issue
Block a user