diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java index 47c8f4e2ecd..90077a18fb7 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java @@ -22,6 +22,8 @@ import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.internal.core.XmlUtil; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsSerializableStorage; +import org.eclipse.cdt.internal.core.settings.model.CConfigurationSpecSettings; +import org.eclipse.cdt.internal.core.settings.model.IInternalCCfgInfo; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; @@ -273,12 +275,33 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr */ public void serializeLanguageSettingsInBackground(ICConfigurationDescription cfgDescription) { if (cfgDescription != null) { - LanguageSettingsManager.serializeLanguageSettingsInBackground(cfgDescription.getProjectDescription()); + if (isLanguageSettingsProviderStoreChanged(cfgDescription)) { + LanguageSettingsManager.serializeLanguageSettingsInBackground(cfgDescription.getProjectDescription()); + } } else { LanguageSettingsManager.serializeLanguageSettingsWorkspaceInBackground(); } } + /** + * Compare provider store with cached persistent store used to calculate delta. + */ + private boolean isLanguageSettingsProviderStoreChanged(ICConfigurationDescription cfgDescription) { + if (cfgDescription instanceof IInternalCCfgInfo) { + try { + CConfigurationSpecSettings ss = ((IInternalCCfgInfo)cfgDescription).getSpecSettings(); + if (ss != null) { + return ss.isLanguageSettingsProviderStoreChanged(this); + } + } catch (CoreException e) { + CCorePlugin.log(e); + } + } + + // If something went wrong assuming it might have changed + return true; + } + /** * Load provider from XML provider element. * This is convenience method not intended to be overridden on purpose. diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java index 62a95c1eb73..290d5b34030 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationSpecSettings.java @@ -27,6 +27,7 @@ import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsBroadca import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvidersKeeper; import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager; +import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsSerializableProvider; import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsStorage; import org.eclipse.cdt.core.settings.model.CExternalSetting; import org.eclipse.cdt.core.settings.model.ICBuildSetting; @@ -1090,4 +1091,15 @@ public class CConfigurationSpecSettings implements ICSettingsStorage, ILanguageS return languageSettingsDelta; } + /** + * Check if language settings that provider keeps got changed since last notification event. + * + * @param provider - serializable language settings provider. + * @return {@code true} if provider's entries changed or {@code false} if not. + */ + public boolean isLanguageSettingsProviderStoreChanged(LanguageSettingsSerializableProvider provider) { + LanguageSettingsStorage store = ((ILanguageSettingsBroadcastingProvider) provider).copyStorage(); + return ! store.equals(lspPersistedState.get(provider.getId())); + } + }