diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
index 278a16667f1..21cbf20cf06 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
@@ -34,6 +34,9 @@ import org.eclipse.cdt.core.IBinaryParser;
import org.eclipse.cdt.core.IBinaryParser.IBinaryArchive;
import org.eclipse.cdt.core.IBinaryParser.IBinaryFile;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
+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.LanguageSettingsManager;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ElementChangedEvent;
@@ -87,7 +90,9 @@ import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.core.runtime.content.IContentTypeManager.ContentTypeChangeEvent;
import org.eclipse.core.runtime.content.IContentTypeManager.IContentTypeChangeListener;
-public class CModelManager implements IResourceChangeListener, IContentTypeChangeListener, ICProjectDescriptionListener {
+public class CModelManager implements IResourceChangeListener, IContentTypeChangeListener,
+ ICProjectDescriptionListener, ILanguageSettingsChangeListener {
+
public static boolean VERBOSE = false;
/**
@@ -197,6 +202,9 @@ public class CModelManager implements IResourceChangeListener, IContentTypeChang
// Register the Core Model on the ContentTypeManager
// it needs to know about changes.
Platform.getContentTypeManager().addContentTypeChangeListener(factory);
+
+ // Register to listen on language settings changes from LSP providers
+ LanguageSettingsManager.registerLanguageSettingsChangeListener(factory);
}
}
return factory;
@@ -837,7 +845,7 @@ public class CModelManager implements IResourceChangeListener, IContentTypeChang
/**
* Registers the given delta with this manager. This API is to be
- * used to registerd deltas that are created explicitly by the C
+ * used to register deltas that are created explicitly by the C
* Model. Deltas created as translations of IResourceDeltas
* are to be registered with #registerResourceDelta
.
*/
@@ -969,6 +977,31 @@ public class CModelManager implements IResourceChangeListener, IContentTypeChang
ContentTypeProcessor.processContentTypeChanges(events);
}
+ @Override
+ public void handleEvent(ILanguageSettingsChangeEvent event) {
+ try {
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(event.getProjectName());
+
+ // Recalculate cached settings
+ CoreModel.getDefault().updateProjectDescriptions(new IProject[] {project}, null);
+
+ // Notify listeners
+ ICProject cproject = CModelManager.getDefault().getCModel().getCProject(project);
+ CElementDelta delta = new CElementDelta(cproject);
+ // just add all possible flags, listeners tend to recalculate themselves anyway
+ int flag = ICElementDelta.F_CHANGED_PATHENTRY_PROJECT
+ | ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE
+ | ICElementDelta.F_CHANGED_PATHENTRY_MACRO
+ | ICElementDelta.F_ADDED_PATHENTRY_LIBRARY
+ | ICElementDelta.F_REMOVED_PATHENTRY_LIBRARY
+ | ICElementDelta.F_PATHENTRY_REORDER;
+ delta.changed(cproject, flag);
+ fire(delta, ElementChangedEvent.POST_CHANGE);
+ } catch (CoreException e) {
+ CCorePlugin.log(e);
+ }
+ }
+
public void fire(int eventType) {
fire(null, eventType);
}
@@ -1277,9 +1310,13 @@ public class CModelManager implements IResourceChangeListener, IContentTypeChang
}
public void shutdown() {
+ // Unregister from language settings changes
+ LanguageSettingsManager.unregisterLanguageSettingsChangeListener(factory);
+
// Remove ourself from the DescriptorManager.
CProjectDescriptionManager.getInstance().removeCProjectDescriptionListener(this);
// CCorePlugin.getDefault().getCDescriptorManager().removeDescriptorListener(factory);
+
// Remove ourself from the ContentTypeManager
Platform.getContentTypeManager().removeContentTypeChangeListener(factory);