issue a correct PSI event when a file gets renamed in a non-cached PsiDirectory

This commit is contained in:
peter
2014-12-05 11:38:52 +01:00
parent ab92646740
commit 381a4393f8
3 changed files with 65 additions and 18 deletions

View File

@@ -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");
}
}

View File

@@ -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);
}

View File

@@ -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())) {