diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java index 29d0a2dacdb..3e4f9230146 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java @@ -10,14 +10,20 @@ *******************************************************************************/ package org.eclipse.cdt.internal.pdom.tests; +import java.io.File; + import junit.framework.Test; import org.eclipse.cdt.core.dom.IPDOMManager; +import org.eclipse.cdt.core.index.IIndexLocationConverter; +import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.internal.core.CCoreInternals; +import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IWritableIndexFragment; +import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.WritablePDOM; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.NullProgressMonitor; @@ -59,4 +65,50 @@ public class PDOMBugsTest extends BaseTestCase { pdom.releaseWriteLock(0); } } + + public void testProjectPDOMProperties() throws Exception { + IWritableIndexFragment pdom = (IWritableIndexFragment) CCoreInternals.getPDOMManager().getPDOM(cproject); + pdom.acquireReadLock(); + try { + String id= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + assertNotNull(id); + + CCoreInternals.getPDOMManager().reindex(cproject); + + String id2= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + assertNotNull(id2); + assertEquals(id, id2); + } finally { + pdom.releaseReadLock(); + } + } + + public void testProjectPDOMPropertiesOnExport() throws Exception { + File tmp= new File(System.getProperty("java.io.tmpdir")+"/temp"+System.currentTimeMillis()+".pdom"); + IIndexLocationConverter cvr= new ResourceContainerRelativeLocationConverter(cproject.getProject()); + CCoreInternals.getPDOMManager().exportProjectPDOM(cproject, tmp, cvr); + + IWritableIndexFragment pdom = new WritablePDOM(tmp, cvr); + pdom.acquireReadLock(); + try { + String id= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + assertNotNull(id); + + String id2= ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + assertNotNull(id2); + assertFalse(id2.equals(id)); + + CCoreInternals.getPDOMManager().reindex(cproject); + + String id3= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + assertNotNull(id3); + assertEquals(id,id3); + + String id4= ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + assertNotNull(id4); + assertFalse(id4.equals(id)); + } finally { + pdom.releaseReadLock(); + } + } } 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 e5a5012e55a..3e09e95f43e 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 @@ -42,6 +42,7 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IElementChangedListener; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.core.CCoreInternals; +import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IWritableIndex; import org.eclipse.cdt.internal.core.index.IWritableIndexManager; import org.eclipse.cdt.internal.core.index.IndexChangeEvent; @@ -195,7 +196,11 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen storeDatabaseName(rproject, dbName); } + boolean newPDOM= !dbFile.exists(); pdom = new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject)); + if(newPDOM) { + writeProjectPDOMProperties(pdom, rproject); + } pdom.addListener(this); } @@ -873,6 +878,11 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen PDOMFile file = (PDOMFile) i.next(); file.clear(); } + + // ensure fragment id has a sensible value, in case callee's do not + // overwrite their own values + String oldId= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + newPDOM.setProperty(IIndexFragment.PROPERTY_FRAGMENT_ID, "exported."+oldId); //$NON-NLS-1$ } finally { newPDOM.releaseWriteLock(); } @@ -914,6 +924,7 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen try { pdom.reloadFromFile(newFile); storeDatabaseName(project.getProject(), newName); + writeProjectPDOMProperties(pdom, project.getProject()); } finally { pdom.releaseWriteLock(); @@ -926,4 +937,16 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen operation.setOptions(options); operation.run(monitor); } + + /** + * Write metadata appropriate for a project pdom + * @param pdom the pdom to write to + * @param project the project to write metadata about + * @throws CoreException + */ + public static void writeProjectPDOMProperties(WritablePDOM pdom, IProject project) throws CoreException { + String DELIM = "\0"; //$NON-NLS-1$ + String id= CCorePlugin.PLUGIN_ID + ".pdom.project." + DELIM + project.getName() + DELIM; //$NON-NLS-1$ + pdom.setProperty(IIndexFragment.PROPERTY_FRAGMENT_ID, id); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java index 02821a8aa83..df115a190cb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java @@ -20,9 +20,12 @@ import org.eclipse.cdt.core.dom.IPDOMIndexerTask; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.index.IWritableIndex; import org.eclipse.cdt.internal.core.index.IWritableIndexManager; import org.eclipse.cdt.internal.core.pdom.IndexerProgress; +import org.eclipse.cdt.internal.core.pdom.PDOMManager; +import org.eclipse.cdt.internal.core.pdom.WritablePDOM; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.osgi.util.NLS; @@ -69,6 +72,29 @@ public class PDOMRebuildTask implements IPDOMIndexerTask { if (fDelegate != null) { fDelegate.run(monitor); + writeProjectProperties(project); + } + } + + /** + * Writes project metadata to the pdom + * @see PDOMManager#writeProjectPDOMProperties(WritablePDOM, org.eclipse.core.resources.IProject) + * @param project the project to write project metadata about + */ + private void writeProjectProperties(ICProject project) { + try { + PDOMManager mgr= CCoreInternals.getPDOMManager(); + WritablePDOM projectPDOM= (WritablePDOM) mgr.getPDOM(project); + projectPDOM.acquireWriteLock(); + try { + PDOMManager.writeProjectPDOMProperties(projectPDOM, project.getProject()); + } finally { + projectPDOM.releaseWriteLock(); + } + } catch(CoreException ce) { + CCorePlugin.log(ce); + } catch(InterruptedException ie) { + // no-op } }