mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Problems view: change selected file state to previous one when other file changed (IDEA-241875)
GitOrigin-RevId: 940d9a0218eb934a6b2112bf97d23368ce565c95
This commit is contained in:
committed by
intellij-monorepo-bot
parent
ee6918dea2
commit
866c446a8a
+24
-9
@@ -12,6 +12,7 @@ import com.intellij.openapi.startup.StartupActivity;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
|
||||
import com.intellij.openapi.vfs.newvfs.events.VFileContentChangeEvent;
|
||||
import com.intellij.openapi.vfs.newvfs.events.VFileDeleteEvent;
|
||||
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
|
||||
import com.intellij.psi.PsiFile;
|
||||
@@ -38,10 +39,15 @@ final class ProjectProblemFileSelectionListener implements FileEditorManagerList
|
||||
VirtualFile oldFile = event.getOldFile();
|
||||
VirtualFile newFile = event.getNewFile();
|
||||
TextEditor oldEditor = tryCast(event.getOldEditor(), TextEditor.class);
|
||||
if (oldFile == null || oldEditor == null || oldFile instanceof VirtualFileWindow || !oldFile.isValid() || oldFile.equals(newFile)) return;
|
||||
PsiJavaFile psiJavaFile = tryCast(PsiManager.getInstance(myProject).findFile(oldFile), PsiJavaFile.class);
|
||||
if (oldFile == null || oldEditor == null || oldFile.equals(newFile)) return;
|
||||
setPreviousState(oldFile, oldEditor);
|
||||
}
|
||||
|
||||
private void setPreviousState(@NotNull VirtualFile file, @NotNull TextEditor textEditor) {
|
||||
if (file instanceof VirtualFileWindow || !file.isValid()) return;
|
||||
PsiJavaFile psiJavaFile = tryCast(PsiManager.getInstance(myProject).findFile(file), PsiJavaFile.class);
|
||||
if (psiJavaFile == null) return;
|
||||
ProjectProblemPassUtils.removeInfos(oldEditor.getEditor());
|
||||
ProjectProblemPassUtils.removeInfos(textEditor.getEditor());
|
||||
FileStateUpdater.setPreviousState(psiJavaFile);
|
||||
}
|
||||
|
||||
@@ -50,12 +56,21 @@ final class ProjectProblemFileSelectionListener implements FileEditorManagerList
|
||||
PsiManager psiManager = PsiManager.getInstance(myProject);
|
||||
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
|
||||
for (VFileEvent e : events) {
|
||||
if (!(e instanceof VFileDeleteEvent)) continue;
|
||||
VirtualFile virtualFile = ((VFileDeleteEvent)e).getFile();
|
||||
if (!fileIndex.isInContent(virtualFile)) continue;
|
||||
PsiFile psiFile = psiManager.findFile(virtualFile);
|
||||
if (psiFile == null) continue;
|
||||
FileStateUpdater.removeState(psiFile);
|
||||
VirtualFile changedFile = e.getFile();
|
||||
if (changedFile == null) continue;
|
||||
if (e instanceof VFileDeleteEvent) {
|
||||
if (!fileIndex.isInContent(changedFile)) continue;
|
||||
PsiFile psiFile = psiManager.findFile(changedFile);
|
||||
if (psiFile == null) continue;
|
||||
FileStateUpdater.removeState(psiFile);
|
||||
}
|
||||
if (e instanceof VFileContentChangeEvent || e instanceof VFileDeleteEvent) {
|
||||
TextEditor editor = tryCast(FileEditorManager.getInstance(myProject).getSelectedEditor(), TextEditor.class);
|
||||
if (editor == null) continue;
|
||||
VirtualFile selectedFile = editor.getFile();
|
||||
if (selectedFile == null || changedFile.equals(selectedFile)) continue;
|
||||
setPreviousState(selectedFile, editor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+48
@@ -1,9 +1,15 @@
|
||||
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package com.intellij.java.codeInsight.daemon.problems
|
||||
|
||||
import com.intellij.codeInsight.daemon.problems.pass.ProjectProblemPassUtils
|
||||
import com.intellij.openapi.command.WriteCommandAction
|
||||
import com.intellij.openapi.command.undo.UndoManager
|
||||
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.move.moveInner.MoveInnerImpl
|
||||
import com.intellij.refactoring.openapi.impl.MoveInnerRefactoringImpl
|
||||
|
||||
internal class ClassProblemsTest : ProjectProblemsViewTest() {
|
||||
|
||||
@@ -123,6 +129,48 @@ internal class ClassProblemsTest : ProjectProblemsViewTest() {
|
||||
}
|
||||
}
|
||||
|
||||
fun testMoveInnerClassAndUndo() {
|
||||
val refClass = myFixture.addClass("""
|
||||
public class A {
|
||||
private String s = "foo";
|
||||
public class Inner {
|
||||
void test() {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
""".trimIndent())
|
||||
|
||||
myFixture.openFileInEditor(refClass.containingFile.virtualFile)
|
||||
|
||||
doTest(refClass) {
|
||||
changeClass(refClass) { psiClass, _ ->
|
||||
val innerClass = psiClass.innerClasses[0]
|
||||
val targetContainer = MoveInnerImpl.getTargetContainer(innerClass, false)!!
|
||||
val moveRefactoring = MoveInnerRefactoringImpl(myFixture.project, innerClass, innerClass.name, true, "a", targetContainer)
|
||||
BaseRefactoringProcessor.ConflictsInTestsException.withIgnoredConflicts<Throwable> { moveRefactoring.run() }
|
||||
}
|
||||
changeClass(refClass) { psiClass, _ ->
|
||||
psiClass.fields[0].modifierList?.setModifierProperty(PsiModifier.PRIVATE, false)
|
||||
}
|
||||
changeClass(refClass) { psiClass, _ ->
|
||||
psiClass.fields[0].modifierList?.setModifierProperty(PsiModifier.PRIVATE, true)
|
||||
}
|
||||
|
||||
assertNotEmpty(ProjectProblemPassUtils.getInlays(myFixture.editor).entries)
|
||||
|
||||
val selectedEditor = FileEditorManager.getInstance(project).selectedEditor
|
||||
WriteCommandAction.runWriteCommandAction(project) {
|
||||
UndoManager.getInstance(project).undo(selectedEditor)
|
||||
UndoManager.getInstance(project).undo(selectedEditor)
|
||||
UndoManager.getInstance(project).undo(selectedEditor)
|
||||
}
|
||||
PsiDocumentManager.getInstance(project).commitAllDocuments()
|
||||
|
||||
assertEmpty(ProjectProblemPassUtils.getInlays(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