diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
index 7db0090f6fc..939e2d7585e 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
@@ -25,6 +25,7 @@ import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IElementChangedListener;
+import org.eclipse.cdt.internal.core.pdom.indexer.ctags.CtagsIndexer;
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
@@ -96,7 +97,7 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
IPDOMIndexer indexer = (IPDOMIndexer)rproject.getSessionProperty(indexerProperty);
if (indexer == null) {
- indexer = createIndexer(getIndexerId(project), project);
+ indexer = createIndexer(project, getIndexerId(project));
}
return indexer;
@@ -195,20 +196,29 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
} catch (CoreException e) {
}
- if (indexerId == null)
- // make it the default
+ if (indexerId == null || indexerId.equals(CtagsIndexer.ID))
+ // make it the default, ctags is gone
indexerId = getDefaultIndexerId();
// Start a job to set the id.
- new SetId(project, indexerId).schedule();
+ new SetIndexerId(project, indexerId).schedule();
+ } else if (indexerId.equals(CtagsIndexer.ID)) {
+ // make it the default, ctags is gone
+ indexerId = getDefaultIndexerId();
+
+ // Start a job to set the id.
+ new SetIndexerId(project, indexerId).schedule();
}
+
return indexerId;
}
- private static class SetId extends Job {
+ // This job is only used when setting during a get. Sometimes the get is being
+ // done in an unfriendly environment, e.g. startup.
+ private class SetIndexerId extends Job {
private final ICProject project;
private final String indexerId;
- public SetId(ICProject project, String indexerId) {
+ public SetIndexerId(ICProject project, String indexerId) {
super("Set Indexer Id");
this.project = project;
this.indexerId = indexerId;
@@ -216,7 +226,7 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
}
protected IStatus run(IProgressMonitor monitor) {
try {
- setId(project, indexerId);
+ setIndexerId(project, indexerId);
return Status.OK_STATUS;
} catch (CoreException e) {
return e.getStatus();
@@ -224,25 +234,24 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
}
}
- private static void setId(ICProject project, String indexerId) throws CoreException {
+ public void setIndexerId(ICProject project, String indexerId) throws CoreException {
IEclipsePreferences prefs = new ProjectScope(project.getProject()).getNode(CCorePlugin.PLUGIN_ID);
if (prefs == null)
return; // TODO why would this be null?
-
- prefs.put(INDEXER_ID_KEY, indexerId);
- try {
- prefs.flush();
- } catch (BackingStoreException e) {
+
+ String oldId = prefs.get(INDEXER_ID_KEY, null);
+ if (!indexerId.equals(oldId)) {
+ prefs.put(INDEXER_ID_KEY, indexerId);
+ try {
+ prefs.flush();
+ } catch (BackingStoreException e) {
+ }
+
+ createIndexer(project, indexerId).reindex();
}
}
- public void setIndexerId(ICProject project, String indexerId) throws CoreException {
- setId(project, indexerId);
- if (project.getProject().getSessionProperty(indexerProperty) != null)
- createIndexer(indexerId, project);
- }
-
- private IPDOMIndexer createIndexer(String indexerId, ICProject project) throws CoreException {
+ private IPDOMIndexer createIndexer(ICProject project, String indexerId) throws CoreException {
IPDOMIndexer indexer = null;
// Look up in extension point
IExtension indexerExt = Platform.getExtensionRegistry()
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsIndexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsIndexer.java
index 3a2cb546de5..6d13b550f7f 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsIndexer.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ctags/CtagsIndexer.java
@@ -30,6 +30,8 @@ import org.osgi.service.prefs.BackingStoreException;
*/
public class CtagsIndexer implements IPDOMIndexer {
+ public static final String ID = "org.eclipse.cdt.core.ctagsindexer"; //$NON-NLS-1$
+
private ICProject project;
private boolean useCtagsOnPath = true;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java
index 565964e6b49..43bddf7898b 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java
@@ -11,10 +11,16 @@
package org.eclipse.cdt.internal.core.pdom.indexer.nulli;
+import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMIndexer;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
/**
* @author Doug Schaefer
@@ -36,7 +42,24 @@ public class PDOMNullIndexer implements IPDOMIndexer {
public void handleDelta(ICElementDelta delta) {
}
+ private class Reindex extends Job {
+ public Reindex() {
+ super("Null Reindex"); //$NON-NLS-1$
+ setSystem(true);
+ }
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
+ pdom.clear();
+ pdom.fireChange();
+ return Status.OK_STATUS;
+ } catch (CoreException e) {
+ return e.getStatus();
+ }
+ }
+ }
public void reindex() throws CoreException {
+ new Reindex().schedule();
}
}
diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml
index 3014aed9d2e..0bf72ba3f69 100644
--- a/core/org.eclipse.cdt.core/plugin.xml
+++ b/core/org.eclipse.cdt.core/plugin.xml
@@ -531,28 +531,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
-