1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

bug 290631: Missing LSP change notification event when provider being serialized equals extension

This commit is contained in:
Andrew Gvozdev 2013-03-10 07:01:02 -04:00
parent e034731fee
commit ae1e68cd09
2 changed files with 56 additions and 9 deletions

View file

@ -1099,7 +1099,8 @@ public class LanguageSettingsListenersTests extends BaseTestCase {
assertEquals(1, event.getConfigurationDescriptionIds().length);
assertEquals(cfgDescriptionId, event.getConfigurationDescriptionIds()[0]);
}
// Change the provider's entries back (bug was found for this case)
// Clear the provider's entries
{
// retrieve a global provider
ILanguageSettingsProvider wspProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_EDITABLE_PROVIDER_ID);
@ -1134,6 +1135,47 @@ public class LanguageSettingsListenersTests extends BaseTestCase {
assertEquals(1, event.getConfigurationDescriptionIds().length);
assertEquals(cfgDescriptionId, event.getConfigurationDescriptionIds()[0]);
}
// Change the provider's entries back to original state from extension point
{
ILanguageSettingsProvider extensionProviderCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, true);
List<ICLanguageSettingEntry> extEntries = extensionProviderCopy.getSettingEntries(null, null, null);
// retrieve a global provider
ILanguageSettingsProvider wspProvider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_EDITABLE_PROVIDER_ID);
assertNotNull(wspProvider);
ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(wspProvider);
assertTrue(rawProvider instanceof MockLanguageSettingsEditableProvider);
// reset the provider to match extension
((MockLanguageSettingsEditableProvider) rawProvider).setSettingEntries(null, null, null, extEntries);
assertTrue(LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true));
// reset count
mockLseListener.resetCount();
assertEquals(0, mockLseListener.getCount());
assertEquals(null, mockLseListener.getLastEvent());
// Serialize settings
LanguageSettingsManager.serializeLanguageSettingsWorkspace();
// get cfgDescriptionId
ICProjectDescription prjDescription = CProjectDescriptionManager.getInstance().getProjectDescription(project, false);
assertNotNull(prjDescription);
ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations();
assertEquals(1, cfgDescriptions.length);
ICConfigurationDescription cfgDescription = cfgDescriptions[0];
String cfgDescriptionId = cfgDescription.getId();
// inspect event
assertEquals(1, mockLseListener.getCount());
ILanguageSettingsChangeEvent event = mockLseListener.getLastEvent();
assertNotNull(event);
assertEquals(project.getName(), event.getProjectName());
assertEquals(1, event.getConfigurationDescriptionIds().length);
assertEquals(cfgDescriptionId, event.getConfigurationDescriptionIds()[0]);
}
}
/**

View file

@ -21,6 +21,7 @@ import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.language.settings.providers.ICListenerAgent;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsBroadcastingProvider;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsChangeEvent;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsChangeListener;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsEditableProvider;
@ -482,11 +483,11 @@ public class LanguageSettingsProvidersSerializer {
/**
* Compute events for language settings changes in workspace.
*/
private static List<LanguageSettingsChangeEvent> createLanguageSettingsChangeEvents(List<LanguageSettingsSerializableProvider> providers) {
private static List<LanguageSettingsChangeEvent> createLanguageSettingsChangeEvents(List<ILanguageSettingsBroadcastingProvider> providers) {
List<LanguageSettingsChangeEvent> events = new ArrayList<LanguageSettingsChangeEvent>();
List<String> providerIds = new ArrayList<String>();
for (LanguageSettingsSerializableProvider provider : providers) {
for (ILanguageSettingsBroadcastingProvider provider : providers) {
providerIds.add(provider.getId());
}
@ -521,23 +522,27 @@ public class LanguageSettingsProvidersSerializer {
*/
public static void serializeLanguageSettingsWorkspace() throws CoreException {
URI uriStoreWsp = getStoreInWorkspaceArea(STORAGE_WORKSPACE_LANGUAGE_SETTINGS);
List<LanguageSettingsSerializableProvider> serializableWorkspaceProviders = new ArrayList<LanguageSettingsSerializableProvider>();
List<ILanguageSettingsBroadcastingProvider> broadcastingWorkspaceProviders = new ArrayList<ILanguageSettingsBroadcastingProvider>();
List<LanguageSettingsSerializableProvider> serializingWorkspaceProviders = new ArrayList<LanguageSettingsSerializableProvider>();
for (ILanguageSettingsProvider provider : rawGlobalWorkspaceProviders.values()) {
if (provider instanceof ILanguageSettingsBroadcastingProvider) {
broadcastingWorkspaceProviders.add((ILanguageSettingsBroadcastingProvider)provider);
}
if (provider instanceof LanguageSettingsSerializableProvider) {
if (!LanguageSettingsManager.isEqualExtensionProvider(provider, true)) {
serializableWorkspaceProviders.add((LanguageSettingsSerializableProvider)provider);
serializingWorkspaceProviders.add((LanguageSettingsSerializableProvider)provider);
}
}
}
try {
List<LanguageSettingsChangeEvent> events = null;
if (serializableWorkspaceProviders.isEmpty()) {
if (serializingWorkspaceProviders.isEmpty()) {
java.io.File fileStoreWsp = new java.io.File(uriStoreWsp);
try {
serializingLockWsp.acquire();
fileStoreWsp.delete();
// manufacture events while inside the lock
events = createLanguageSettingsChangeEvents(serializableWorkspaceProviders);
events = createLanguageSettingsChangeEvents(broadcastingWorkspaceProviders);
} finally {
serializingLockWsp.release();
}
@ -547,7 +552,7 @@ public class LanguageSettingsProvidersSerializer {
Element elementExtension = XmlUtil.appendElement(rootElement, ELEM_EXTENSION,
new String[] {ATTR_EXTENSION_POINT, PROVIDER_EXTENSION_POINT_ID});
for (LanguageSettingsSerializableProvider provider : serializableWorkspaceProviders) {
for (LanguageSettingsSerializableProvider provider : serializingWorkspaceProviders) {
provider.serialize(elementExtension);
}
@ -555,7 +560,7 @@ public class LanguageSettingsProvidersSerializer {
serializingLockWsp.acquire();
XmlUtil.serializeXml(doc, uriStoreWsp);
// manufacture events while inside the lock
events = createLanguageSettingsChangeEvents(serializableWorkspaceProviders);
events = createLanguageSettingsChangeEvents(broadcastingWorkspaceProviders);
} finally {
serializingLockWsp.release();
}