use of com.intellij.psi.PsiDocumentManager in project android by JetBrains.
the class ResourceFolderRepositoryTest method testRemovePluralItems.
public void testRemovePluralItems() throws Exception {
resetScanCounter();
VirtualFile file1 = myFixture.copyFileToProject(VALUES1, "res/values/myvalues.xml");
PsiFile psiFile1 = PsiManager.getInstance(getProject()).findFile(file1);
assertNotNull(psiFile1);
ResourceFolderRepository resources = createRepository();
assertNotNull(resources);
assertTrue(resources.hasResourceItem(ResourceType.PLURALS, "my_plural"));
ResourceItem plural = getOnlyItem(resources, ResourceType.PLURALS, "my_plural");
ResourceValue resourceValue = plural.getResourceValue(false);
assertNotNull(resourceValue);
assertInstanceOf(resourceValue, PluralsResourceValue.class);
PluralsResourceValue prv = (PluralsResourceValue) resourceValue;
assertEquals(3, prv.getPluralsCount());
assertEquals("@string/hello_two", resourceValue.getValue());
assertEquals("one", prv.getQuantity(0));
long generation = resources.getModificationCount();
final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(getProject());
final Document document = documentManager.getDocument(psiFile1);
assertNotNull(document);
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
String item = "<item quantity=\"one\">@string/hello</item>";
int offset = document.getText().indexOf(item);
document.deleteString(offset, offset + item.length());
documentManager.commitDocument(document);
}
});
// First edit won't be incremental (file -> Psi).
assertTrue(resources.isScanPending(psiFile1));
UIUtil.dispatchAllInvocationEvents();
plural = getOnlyItem(resources, ResourceType.PLURALS, "my_plural");
resourceValue = plural.getResourceValue(false);
assertNotNull(resourceValue);
assertInstanceOf(resourceValue, PluralsResourceValue.class);
prv = (PluralsResourceValue) resourceValue;
assertEquals(2, prv.getPluralsCount());
assertEquals("@string/hello_two", resourceValue.getValue());
assertEquals("two", prv.getQuantity(0));
assertTrue(generation < resources.getModificationCount());
resetScanCounter();
// Try a second edit.
long generation2 = resources.getModificationCount();
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
String item = "<item quantity=\"other\">@string/hello_many</item>";
int offset = document.getText().indexOf(item);
document.deleteString(offset, offset + item.length());
documentManager.commitDocument(document);
}
});
plural = getOnlyItem(resources, ResourceType.PLURALS, "my_plural");
resourceValue = plural.getResourceValue(false);
assertNotNull(resourceValue);
assertInstanceOf(resourceValue, PluralsResourceValue.class);
prv = (PluralsResourceValue) resourceValue;
assertEquals(1, prv.getPluralsCount());
assertEquals("@string/hello_two", resourceValue.getValue());
assertEquals("two", prv.getQuantity(0));
assertTrue(generation2 < resources.getModificationCount());
// Shouldn't have done any full file rescans during the above edits
ensureIncremental();
}
use of com.intellij.psi.PsiDocumentManager in project android by JetBrains.
the class ResourceFolderRepositoryTest method testIssue56799.
public void testIssue56799() throws Exception {
// Test deleting a string; ensure that the whole repository is updated correctly.
// Regression test for
// https://code.google.com/p/android/issues/detail?id=56799
VirtualFile file1 = myFixture.copyFileToProject(STRINGS, "res/values/strings.xml");
PsiFile psiFile1 = PsiManager.getInstance(getProject()).findFile(file1);
assertNotNull(psiFile1);
final ResourceFolderRepository resources = createRepository();
assertNotNull(resources);
assertTrue(resources.hasResourceItem(ResourceType.STRING, "app_name"));
assertFalse(resources.hasResourceItem(ResourceType.STRING, "app_name2"));
assertTrue(resources.hasResourceItem(ResourceType.STRING, "hello_world"));
final long generation = resources.getModificationCount();
final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(getProject());
final Document document = documentManager.getDocument(psiFile1);
assertNotNull(document);
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
String string = " <string name=\"hello_world\">Hello world!</string>";
final int offset = document.getText().indexOf(string);
assertTrue(offset != -1);
document.deleteString(offset, offset + string.length());
documentManager.commitDocument(document);
}
});
// First edit won't be incremental (file -> Psi).
assertTrue(resources.isScanPending(psiFile1));
UIUtil.dispatchAllInvocationEvents();
assertTrue(generation < resources.getModificationCount());
assertTrue(resources.hasResourceItem(ResourceType.STRING, "app_name"));
assertTrue(resources.hasResourceItem(ResourceType.STRING, "action_settings"));
assertFalse(resources.hasResourceItem(ResourceType.STRING, "hello_world"));
resetScanCounter();
// However, the second edit can then be incremental.
long generation2 = resources.getModificationCount();
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
String string = " <string name=\"app_name\">My Application 574</string>";
final int offset = document.getText().indexOf(string);
assertTrue(offset != -1);
document.deleteString(offset, offset + string.length());
documentManager.commitDocument(document);
}
});
assertFalse(resources.isScanPending(psiFile1));
assertTrue(generation2 < resources.getModificationCount());
assertFalse(resources.hasResourceItem(ResourceType.STRING, "app_name"));
assertTrue(resources.hasResourceItem(ResourceType.STRING, "action_settings"));
assertFalse(resources.hasResourceItem(ResourceType.STRING, "hello_world"));
ensureIncremental();
}
use of com.intellij.psi.PsiDocumentManager in project android by JetBrains.
the class ResourceFolderRepositoryTest method testEmptyEdits.
/**
* Check that whitespace edits do not trigger a rescan
*/
public void testEmptyEdits() throws Exception {
resetScanCounter();
VirtualFile file1 = myFixture.copyFileToProject(VALUES1, "res/values/myvalues.xml");
PsiFile psiFile1 = PsiManager.getInstance(getProject()).findFile(file1);
assertNotNull(psiFile1);
final ResourceFolderRepository resources = createRepository();
assertNotNull(resources);
long generation = resources.getModificationCount();
final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(getProject());
final Document document = documentManager.getDocument(psiFile1);
assertNotNull(document);
// Add a space to an attribute name.
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
final int offset = document.getText().indexOf("app_name");
document.insertString(offset, " ");
documentManager.commitDocument(document);
}
});
// First edit won't be incremental (file -> Psi).
assertTrue(resources.isScanPending(psiFile1));
UIUtil.dispatchAllInvocationEvents();
assertTrue(generation < resources.getModificationCount());
assertFalse(resources.hasResourceItem(ResourceType.STRING, "app_name"));
assertTrue(resources.hasResourceItem(ResourceType.STRING, " app_name"));
resetScanCounter();
// Try a second edit, adding another space.
long generation2 = resources.getModificationCount();
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
final int offset = document.getText().indexOf(" app_name");
document.insertString(offset, " ");
documentManager.commitDocument(document);
}
});
assertFalse(resources.isScanPending(psiFile1));
assertTrue(generation2 < resources.getModificationCount());
assertTrue(resources.hasResourceItem(ResourceType.STRING, " app_name"));
generation2 = resources.getModificationCount();
ResourceItem item = getOnlyItem(resources, ResourceType.STRING, "title_zoom");
//noinspection ConstantConditions
assertEquals("Zoom", item.getResourceValue(false).getValue());
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
final int offset = document.getText().indexOf("Zoom");
document.deleteString(offset, offset + "Zoom".length());
documentManager.commitDocument(document);
}
});
assertFalse(resources.isScanPending(psiFile1));
assertTrue(generation2 < resources.getModificationCount());
// Inserting spaces in the middle of a tag shouldn't trigger a rescan or even change the modification count
generation2 = resources.getModificationCount();
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
final int offset = document.getText().indexOf("Card Flip");
document.insertString(offset, " ");
documentManager.commitDocument(document);
}
});
assertFalse(resources.isScanPending(psiFile1));
assertEquals(generation2, resources.getModificationCount());
ensureIncremental();
}
use of com.intellij.psi.PsiDocumentManager in project android by JetBrains.
the class ResourceFolderRepositoryTest method testAddValue.
public void testAddValue() throws Exception {
resetScanCounter();
VirtualFile file1 = myFixture.copyFileToProject(VALUES1, "res/values/myvalues.xml");
PsiFile psiFile1 = PsiManager.getInstance(getProject()).findFile(file1);
assertNotNull(psiFile1);
final ResourceFolderRepository resources = createRepository();
assertNotNull(resources);
Collection<String> strings = resources.getItemsOfType(ResourceType.STRING);
assertEquals(8, strings.size());
assertTrue(resources.hasResourceItem(ResourceType.STRING, "app_name"));
// Incrementally add in a new item
final long generation = resources.getModificationCount();
final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(getProject());
final Document document = documentManager.getDocument(psiFile1);
assertNotNull(document);
final int offset = document.getText().indexOf(" <item type");
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
String firstHalf = "<string name=\"new_s";
String secondHalf = "tring\">New String</string>";
document.insertString(offset, firstHalf);
documentManager.commitDocument(document);
document.insertString(offset + firstHalf.length(), secondHalf);
documentManager.commitDocument(document);
}
});
// This currently doesn't work incrementally because we get psi events that do not contain
// enough info to be handled incrementally, so instead we do an asynchronous update (such that
// we can do a single update rather than rescanning the file 20 times)
assertTrue(resources.isScanPending(psiFile1));
UIUtil.dispatchAllInvocationEvents();
UIUtil.invokeAndWaitIfNeeded(new Runnable() {
@Override
public void run() {
ensureSingleScan();
assertTrue(generation < resources.getModificationCount());
assertTrue(resources.hasResourceItem(ResourceType.STRING, "new_string"));
//noinspection ConstantConditions
assertEquals("New String", resources.getResourceItem(ResourceType.STRING, "new_string").get(0).getResourceValue(false).getValue());
}
});
}
use of com.intellij.psi.PsiDocumentManager in project android by JetBrains.
the class ResourceFolderRepositoryTest method testSync.
public void testSync() throws Exception {
// Regression test for https://code.google.com/p/android/issues/detail?id=79629
// Ensure that sync() handles rescanning immediately
VirtualFile file1 = myFixture.copyFileToProject(STRINGS, "res/values/strings.xml");
final PsiFile psiFile1 = PsiManager.getInstance(getProject()).findFile(file1);
assertNotNull(psiFile1);
final ResourceFolderRepository resources = createRepository();
assertNotNull(resources);
assertTrue(resources.hasResourceItem(ResourceType.STRING, "app_name"));
assertFalse(resources.hasResourceItem(ResourceType.STRING, "app_name2"));
assertTrue(resources.hasResourceItem(ResourceType.STRING, "hello_world"));
final long generation = resources.getModificationCount();
final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(getProject());
final Document document = documentManager.getDocument(psiFile1);
assertNotNull(document);
UIUtil.invokeAndWaitIfNeeded(new Runnable() {
@Override
public void run() {
// The sync() call must be called from the dispatch thread
WriteCommandAction.runWriteCommandAction(null, new Runnable() {
@Override
public void run() {
String string = " <string name=\"hello_world\">Hello world!</string>";
final int offset = document.getText().indexOf(string);
assertTrue(offset != -1);
// Simulate an edit event that triggers the incremental updater to
// give up and schedule a subsequent update instead. (This used to be
// the case here, but as of IntelliJ 14.1 it's now delivering more
// accurate events for the below edits, which made the sync-test
// fail because it would already have correct results *before* the
// sync. Therefore, we simply trigger a pending scan (which stops
// subequent incremental events from being processed).
resources.rescan(psiFile1, ResourceFolderType.VALUES);
document.deleteString(offset, offset + string.length());
documentManager.commitDocument(document);
}
});
// The strings file contains definitions for app_name, action_settings and hello_world.
// We've manually deleted the hello_world string. We now check that app_name remains
// in the resource set, and that hello_world is removed. (We check that hello_world
// is there before the sync, and gone after.)
assertTrue(resources.isScanPending(psiFile1));
assertTrue(resources.hasResourceItem(ResourceType.STRING, "app_name"));
assertTrue(resources.hasResourceItem(ResourceType.STRING, "hello_world"));
assertTrue(ApplicationManager.getApplication().isDispatchThread());
resources.sync();
assertTrue(generation < resources.getModificationCount());
assertTrue(resources.hasResourceItem(ResourceType.STRING, "app_name"));
assertFalse(resources.hasResourceItem(ResourceType.STRING, "hello_world"));
assertFalse(resources.isScanPending(psiFile1));
}
});
}
Aggregations