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 @@ - - - - - - - - - - - - - - + + + + + + + - - + -