mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 11:50:54 +07:00
issue a correct PSI event when a file gets renamed in a non-cached PsiDirectory
This commit is contained in:
@@ -41,7 +41,7 @@ class EventsTestListener implements PsiTreeChangeListener {
|
||||
|
||||
@Override
|
||||
public void beforePropertyChange(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("beforePropertyChange\n");
|
||||
myBuffer.append("beforePropertyChange " + event.getPropertyName() + "\n");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -71,6 +71,6 @@ class EventsTestListener implements PsiTreeChangeListener {
|
||||
|
||||
@Override
|
||||
public void propertyChanged(@NotNull PsiTreeChangeEvent event) {
|
||||
myBuffer.append("propertyChanged\n");
|
||||
myBuffer.append("propertyChanged " + event.getPropertyName() + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.impl.PsiTreeChangeEventImpl;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.testFramework.PlatformTestUtil;
|
||||
import com.intellij.testFramework.PsiTestCase;
|
||||
import com.intellij.testFramework.PsiTestUtil;
|
||||
import com.intellij.util.WaitFor;
|
||||
@@ -162,6 +163,9 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
VirtualFile file = myPrjDir1.createChildData(null, "a.txt");
|
||||
PsiFile psiFile = fileManager.findFile(file);
|
||||
|
||||
PsiDirectory directory = fileManager.findDirectory(myPrjDir1);
|
||||
assertNotNull(directory);
|
||||
|
||||
EventsTestListener listener = new EventsTestListener();
|
||||
myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable());
|
||||
|
||||
@@ -169,8 +173,29 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
|
||||
String string = listener.getEventsString();
|
||||
String expected =
|
||||
"beforePropertyChange\n" +
|
||||
"propertyChanged\n";
|
||||
"beforePropertyChange fileName\n" +
|
||||
"propertyChanged fileName\n";
|
||||
assertEquals(psiFile.getName(), expected, string);
|
||||
}
|
||||
|
||||
public void testRenameFileWithoutDir() throws Exception {
|
||||
FileManager fileManager = myPsiManager.getFileManager();
|
||||
VirtualFile file = myPrjDir1.createChildData(null, "a.txt");
|
||||
PsiFile psiFile = fileManager.findFile(file);
|
||||
|
||||
PlatformTestUtil.tryGcSoftlyReachableObjects();
|
||||
|
||||
assertNull(((FileManagerImpl)fileManager).getCachedDirectory(myPrjDir1));
|
||||
|
||||
EventsTestListener listener = new EventsTestListener();
|
||||
myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable());
|
||||
|
||||
file.rename(null, "b.txt");
|
||||
|
||||
String string = listener.getEventsString();
|
||||
String expected =
|
||||
"beforePropertyChange fileName\n" +
|
||||
"propertyChanged fileName\n";
|
||||
assertEquals(psiFile.getName(), expected, string);
|
||||
}
|
||||
|
||||
@@ -226,7 +251,7 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
assertEquals(psiDirectory.getName(), expected, string);
|
||||
}
|
||||
|
||||
public void testRenameDirectory() throws Exception {
|
||||
public void testRenameDirectory_WithPsiDir() throws Exception {
|
||||
FileManager fileManager = myPsiManager.getFileManager();
|
||||
VirtualFile file = myPrjDir1.createChildDirectory(null, "dir1");
|
||||
PsiDirectory psiDirectory = fileManager.findDirectory(file);
|
||||
@@ -238,11 +263,31 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
|
||||
String string = listener.getEventsString();
|
||||
String expected =
|
||||
"beforePropertyChange\n" +
|
||||
"propertyChanged\n";
|
||||
"beforePropertyChange directoryName\n" +
|
||||
"propertyChanged directoryName\n";
|
||||
assertEquals(psiDirectory.getName(), expected, string);
|
||||
}
|
||||
|
||||
public void testRenameDirectory_WithoutPsiDir() throws Exception {
|
||||
FileManager fileManager = myPsiManager.getFileManager();
|
||||
VirtualFile file = myPrjDir1.createChildDirectory(null, "dir1");
|
||||
|
||||
PlatformTestUtil.tryGcSoftlyReachableObjects();
|
||||
|
||||
assertNull(((FileManagerImpl)fileManager).getCachedDirectory(file));
|
||||
|
||||
EventsTestListener listener = new EventsTestListener();
|
||||
myPsiManager.addPsiTreeChangeListener(listener,getTestRootDisposable());
|
||||
|
||||
file.rename(null, "dir2");
|
||||
|
||||
String string = listener.getEventsString();
|
||||
String expected =
|
||||
"beforePropertyChange propUnloadedPsi\n" +
|
||||
"propertyChanged propUnloadedPsi\n";
|
||||
assertEquals(fileManager.findDirectory(file).getName(), expected, string);
|
||||
}
|
||||
|
||||
public void testRenameDirectoryToIgnored() throws Exception {
|
||||
FileManager fileManager = myPsiManager.getFileManager();
|
||||
VirtualFile file = myPrjDir1.createChildDirectory(null, "dir1");
|
||||
@@ -289,15 +334,15 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
ReadOnlyAttributeUtil.setReadOnlyAttribute(file, true);
|
||||
|
||||
final String expected =
|
||||
"beforePropertyChange\n" +
|
||||
"propertyChanged\n";
|
||||
"beforePropertyChange writable\n" +
|
||||
"propertyChanged writable\n";
|
||||
|
||||
new WaitFor(500){
|
||||
@Override
|
||||
protected boolean condition() {
|
||||
return expected.equals(listener.getEventsString());
|
||||
}
|
||||
}.assertCompleted(expected);
|
||||
}.assertCompleted(listener.getEventsString());
|
||||
|
||||
ReadOnlyAttributeUtil.setReadOnlyAttribute(file, false);
|
||||
}
|
||||
@@ -469,8 +514,8 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
|
||||
String string = listener.getEventsString();
|
||||
String expected =
|
||||
"beforePropertyChange\n" +
|
||||
"propertyChanged\n";
|
||||
"beforePropertyChange roots\n" +
|
||||
"propertyChanged roots\n";
|
||||
assertEquals(expected, string);
|
||||
}
|
||||
|
||||
@@ -484,8 +529,8 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
|
||||
String string = listener.getEventsString();
|
||||
String expected =
|
||||
"beforePropertyChange\n" +
|
||||
"propertyChanged\n";
|
||||
"beforePropertyChange roots\n" +
|
||||
"propertyChanged roots\n";
|
||||
assertEquals(expected, string);
|
||||
}
|
||||
|
||||
@@ -504,8 +549,8 @@ public class PsiEventsTest extends PsiTestCase {
|
||||
|
||||
String string = listener.getEventsString();
|
||||
String expected =
|
||||
"beforePropertyChange\n" +
|
||||
"propertyChanged\n";
|
||||
"beforePropertyChange propFileTypes\n" +
|
||||
"propertyChanged propFileTypes\n";
|
||||
assertEquals(expected, string);
|
||||
}
|
||||
|
||||
|
||||
@@ -215,8 +215,10 @@ public class PsiVFSListener extends VirtualFileAdapter {
|
||||
final VirtualFile vFile = event.getFile();
|
||||
final String propertyName = event.getPropertyName();
|
||||
|
||||
final FileViewProvider viewProvider = myFileManager.findCachedViewProvider(vFile);
|
||||
|
||||
VirtualFile parent = vFile.getParent();
|
||||
final PsiDirectory parentDir = getCachedDirectory(parent);
|
||||
final PsiDirectory parentDir = viewProvider != null && parent != null ? myFileManager.findDirectory(parent) : getCachedDirectory(parent);
|
||||
if (parent != null && parentDir == null) return; // do not notifyListeners event if parent directory was never accessed via PSI
|
||||
|
||||
ApplicationManager.getApplication().runWriteAction(
|
||||
@@ -324,7 +326,7 @@ public class PsiVFSListener extends VirtualFileAdapter {
|
||||
}
|
||||
|
||||
VirtualFile parent = vFile.getParent();
|
||||
final PsiDirectory parentDir = getCachedDirectory(parent);
|
||||
final PsiDirectory parentDir = oldPsiFile != null && parent != null ? myFileManager.findDirectory(parent) : getCachedDirectory(parent);
|
||||
|
||||
if (oldFileViewProvider != null // there is no need to rebuild if there were no PSI in the first place
|
||||
&& FileContentUtilCore.FORCE_RELOAD_REQUESTOR.equals(event.getRequestor())) {
|
||||
|
||||
Reference in New Issue
Block a user