diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/GeneratePDOMApplicationTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/GeneratePDOMApplicationTest.java
index 0c8f3e9d462..f5e051cb98f 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/GeneratePDOMApplicationTest.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/GeneratePDOMApplicationTest.java
@@ -35,6 +35,7 @@ import org.eclipse.cdt.core.index.URIRelativeLocationConverter;
import org.eclipse.cdt.core.index.export.ExternalExportProjectProvider;
import org.eclipse.cdt.core.index.export.IExportProjectProvider;
import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
@@ -107,7 +108,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
GeneratePDOMApplication.OPT_PROJECTPROVIDER, TestProjectProvider3.class.getName()
});
assertTrue(target.exists());
- WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI));
+ WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject1Content(wpdom);
String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
@@ -122,7 +123,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
GeneratePDOMApplication.OPT_PROJECTPROVIDER, TestProjectProvider4.class.getName()
});
assertTrue(target.exists());
- WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI));
+ WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject1Content(wpdom);
String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
@@ -187,7 +188,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
});
assertTrue(target.exists());
- WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI));
+ WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject1Content(wpdom);
String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
@@ -219,7 +220,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
});
assertTrue(target.exists());
- WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI));
+ WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject2Content(wpdom);
}
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 086b9ec3550..1b1d79a1805 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
@@ -19,6 +19,7 @@ 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.model.LanguageManager;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.CCoreInternals;
@@ -95,7 +96,7 @@ public class PDOMBugsTest extends BaseTestCase {
final PDOMManager pdomManager = CCoreInternals.getPDOMManager();
pdomManager.exportProjectPDOM(cproject, tmp, cvr);
- IWritableIndexFragment pdom = new WritablePDOM(tmp, cvr, new ChunkCache());
+ IWritableIndexFragment pdom = new WritablePDOM(tmp, cvr, new ChunkCache(), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
pdom.acquireReadLock();
try {
String id= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMProviderTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMProviderTests.java
index f63c3cff0a8..8acc7807d90 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMProviderTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMProviderTests.java
@@ -27,6 +27,7 @@ import org.eclipse.cdt.core.index.URIRelativeLocationConverter;
import org.eclipse.cdt.core.index.provider.IPDOMDescriptor;
import org.eclipse.cdt.core.index.provider.IReadOnlyPDOMProvider;
import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
@@ -231,7 +232,7 @@ public class PDOMProviderTests extends PDOMTestBase {
CProjectHelper.delete(cproject);
// mimic a pdom with superceded version
- WritablePDOM wpdom= new WritablePDOM(tempPDOM, cvr);
+ WritablePDOM wpdom= new WritablePDOM(tempPDOM, cvr, LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
wpdom.acquireWriteLock();
try {
wpdom.getDB().setVersion(1);
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java
index 32555141393..b8075366f6f 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java
@@ -15,6 +15,7 @@
package org.eclipse.cdt.core.model;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -294,38 +295,36 @@ public class LanguageManager {
}
/**
- * Returns a factory for the given linkage ID. The IDs are defined in {@link ILinkage}.
- * @param linkageID an ID for a linkage.
- * @return a factory or null
.
+ * Returns mappings between IDs and IPDOMLinkageFactory. The IDs are defined in {@link ILinkage}.
+ * @return a map.
* @since 4.0
*/
- public IPDOMLinkageFactory getPDOMLinkageFactory(String linkageID) {
- final IPDOMLinkageFactory[] result= new IPDOMLinkageFactory[] {null};
- result[0]= (IPDOMLinkageFactory) fPDOMLinkageFactoryCache.get(linkageID);
-
- if (result[0] == null) {
- // read configuration
- IConfigurationElement[] configs= Platform.getExtensionRegistry().getConfigurationElementsFor(LANGUAGE_EXTENSION_POINT_ID);
- for (int i = 0; result[0] == null && i < configs.length; i++) {
- final IConfigurationElement element = configs[i];
- if (ELEMENT_PDOM_LINKAGE_FACTORY.equals(element.getName())) {
- if (linkageID.equals(element.getAttribute(ATTRIBUTE_ID))) {
- SafeRunner.run(new ISafeRunnable(){
- public void handleException(Throwable exception) {
- CCorePlugin.log(exception);
- }
-
- public void run() throws Exception {
- result[0]= (IPDOMLinkageFactory) element.createExecutableExtension(ATTRIBUTE_CLASS);
- }}
- );
+ public Map getPDOMLinkageFactoryMappings() {
+ if (!fPDOMLinkageFactoryCache.isEmpty())
+ return Collections.unmodifiableMap(fPDOMLinkageFactoryCache);
+
+ fPDOMLinkageFactoryCache.clear();
+ final IPDOMLinkageFactory[] result = new IPDOMLinkageFactory[] {null};
+
+ // read configuration
+ IConfigurationElement[] configs= Platform.getExtensionRegistry().getConfigurationElementsFor(LANGUAGE_EXTENSION_POINT_ID);
+ for (int i = 0; i < configs.length; i++) {
+ final IConfigurationElement element = configs[i];
+ if (ELEMENT_PDOM_LINKAGE_FACTORY.equals(element.getName())) {
+ SafeRunner.run(new ISafeRunnable(){
+ public void handleException(Throwable exception) {
+ CCorePlugin.log(exception);
}
- }
- }
- fPDOMLinkageFactoryCache.put(linkageID, result[0]);
- }
- return result[0];
- }
+
+ public void run() throws Exception {
+ result[0] = (IPDOMLinkageFactory) element.createExecutableExtension(ATTRIBUTE_CLASS);
+ }}
+ );
+ fPDOMLinkageFactoryCache.put(element.getAttribute(ATTRIBUTE_ID), result[0]);
+ }
+ }
+ return Collections.unmodifiableMap(fPDOMLinkageFactoryCache);
+ }
/**
* Returns all of the languages registered with the Platform
.
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/provider/PDOMCache.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/provider/PDOMCache.java
index 7a63e7d3420..ad8507202c6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/provider/PDOMCache.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/provider/PDOMCache.java
@@ -19,6 +19,7 @@ import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexLocationConverter;
+import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
@@ -69,7 +70,7 @@ class PDOMCache {
}
if(result==null) {
try {
- result = new PDOM(file, converter);
+ result = new PDOM(file, converter, LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
result.acquireReadLock();
try {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
index 5127137a8c1..8ae4a6ddc5d 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
@@ -40,7 +40,6 @@ import org.eclipse.cdt.core.index.IIndexLinkage;
import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.index.IndexFilter;
-import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
@@ -114,12 +113,14 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
private Map fLinkageIDCache = new HashMap();
private File fPath;
private IIndexLocationConverter locationConverter;
+ private Map fPDOMLinkageFactoryCache;
- public PDOM(File dbPath, IIndexLocationConverter locationConverter) throws CoreException {
- this(dbPath, locationConverter, ChunkCache.getSharedInstance());
+ public PDOM(File dbPath, IIndexLocationConverter locationConverter, Map linkageFactoryMappings) throws CoreException {
+ this(dbPath, locationConverter, ChunkCache.getSharedInstance(), linkageFactoryMappings);
}
- public PDOM(File dbPath, IIndexLocationConverter locationConverter, ChunkCache cache) throws CoreException {
+ public PDOM(File dbPath, IIndexLocationConverter locationConverter, ChunkCache cache, Map linkageFactoryMappings) throws CoreException {
+ fPDOMLinkageFactoryCache = linkageFactoryMappings;
loadDatabase(dbPath, cache);
this.locationConverter = locationConverter;
}
@@ -421,7 +422,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
int record= getFirstLinkageRecord();
while (record != 0) {
String linkageID= PDOMLinkage.getId(this, record).getString();
- IPDOMLinkageFactory factory= LanguageManager.getInstance().getPDOMLinkageFactory(linkageID);
+ IPDOMLinkageFactory factory= (IPDOMLinkageFactory) fPDOMLinkageFactoryCache.get(linkageID);
if (factory != null) {
PDOMLinkage linkage= factory.getLinkage(this, record);
fLinkageIDCache.put(linkageID, linkage);
@@ -438,7 +439,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
PDOMLinkage pdomLinkage= (PDOMLinkage) fLinkageIDCache.get(linkageID);
if (pdomLinkage == null) {
// Need to create it
- IPDOMLinkageFactory factory= LanguageManager.getInstance().getPDOMLinkageFactory(linkageID);
+ IPDOMLinkageFactory factory= (IPDOMLinkageFactory) fPDOMLinkageFactoryCache.get(linkageID);
if (factory != null) {
return factory.createLinkage(this);
}
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 f9c5451d857..5c0999a9071 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
@@ -248,7 +248,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
fromScratch= true;
}
- pdom= new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject));
+ pdom= new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
if (pdom.versionMismatch() || fromScratch) {
try {
pdom.acquireWriteLock();
@@ -966,7 +966,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
// overwrite internal location representations
- final WritablePDOM newPDOM = new WritablePDOM(targetLocation, pdom.getLocationConverter());
+ final WritablePDOM newPDOM = new WritablePDOM(targetLocation, pdom.getLocationConverter(), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
try {
newPDOM.acquireWriteLock();
try {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/TeamPDOMExportOperation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/TeamPDOMExportOperation.java
index 1b114610bd5..9b83cfbdbb4 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/TeamPDOMExportOperation.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/TeamPDOMExportOperation.java
@@ -31,6 +31,7 @@ import org.eclipse.cdt.core.CCorePlugin;
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.model.LanguageManager;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
@@ -95,7 +96,7 @@ public class TeamPDOMExportOperation implements IWorkspaceRunnable {
monitor.worked(5);
// create checksums
- PDOM pdom= new PDOM(tmpPDOM, converter);
+ PDOM pdom= new PDOM(tmpPDOM, converter, LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
try {
monitor.setTaskName(Messages.Checksums_taskComputeChecksums);
createChecksums(fProject, pdom, tmpChecksums, subMonitor(monitor, 94));
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java
index a27e67c75dd..ef43f4e99f6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java
@@ -17,6 +17,7 @@ import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTName;
@@ -38,12 +39,12 @@ public class WritablePDOM extends PDOM implements IWritableIndexFragment {
private boolean fClearedBecauseOfVersionMismatch= false;
private boolean fCreatedFromScratch= false;
- public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter) throws CoreException {
- this(dbPath, locationConverter, ChunkCache.getSharedInstance());
+ public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter, Map linkageFactoryMappings) throws CoreException {
+ this(dbPath, locationConverter, ChunkCache.getSharedInstance(), linkageFactoryMappings);
}
- public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter, ChunkCache cache) throws CoreException {
- super(dbPath, locationConverter, cache);
+ public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter, ChunkCache cache, Map linkageFactoryMappings) throws CoreException {
+ super(dbPath, locationConverter, cache, linkageFactoryMappings);
}
public IIndexFragmentFile addFile(IIndexFileLocation location) throws CoreException {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOM.java
index c481576ff7b..3198778ff4e 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOM.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOM.java
@@ -19,6 +19,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.export.IExportProjectProvider;
import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
@@ -67,7 +68,7 @@ public class GeneratePDOM implements ISafeRunnable {
try {
CCoreInternals.getPDOMManager().exportProjectPDOM(cproject, targetLocation, converter);
- WritablePDOM exportedPDOM= new WritablePDOM(targetLocation, converter);
+ WritablePDOM exportedPDOM= new WritablePDOM(targetLocation, converter, LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
exportedPDOM.acquireWriteLock(0);
try {