1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

bug 166092 - users should be able to pass in own linkage factory mappings

This commit is contained in:
Vivian Kong 2007-04-10 18:02:14 +00:00
parent 4c5225719b
commit 716d881e6b
10 changed files with 57 additions and 50 deletions

View file

@ -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.ExternalExportProjectProvider;
import org.eclipse.cdt.core.index.export.IExportProjectProvider; import org.eclipse.cdt.core.index.export.IExportProjectProvider;
import org.eclipse.cdt.core.model.ICProject; 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.CProjectHelper;
import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexFragment;
@ -107,7 +108,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
GeneratePDOMApplication.OPT_PROJECTPROVIDER, TestProjectProvider3.class.getName() GeneratePDOMApplication.OPT_PROJECTPROVIDER, TestProjectProvider3.class.getName()
}); });
assertTrue(target.exists()); assertTrue(target.exists());
WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI)); WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject1Content(wpdom); verifyProject1Content(wpdom);
String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
@ -122,7 +123,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
GeneratePDOMApplication.OPT_PROJECTPROVIDER, TestProjectProvider4.class.getName() GeneratePDOMApplication.OPT_PROJECTPROVIDER, TestProjectProvider4.class.getName()
}); });
assertTrue(target.exists()); assertTrue(target.exists());
WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI)); WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject1Content(wpdom); verifyProject1Content(wpdom);
String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
@ -187,7 +188,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
}); });
assertTrue(target.exists()); assertTrue(target.exists());
WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI)); WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject1Content(wpdom); verifyProject1Content(wpdom);
String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); String fid= wpdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
@ -219,7 +220,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
}); });
assertTrue(target.exists()); assertTrue(target.exists());
WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI)); WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject2Content(wpdom); verifyProject2Content(wpdom);
} }

View file

@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.index.IIndexLocationConverter; import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter; import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter;
import org.eclipse.cdt.core.model.ICProject; 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.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.CCoreInternals;
@ -95,7 +96,7 @@ public class PDOMBugsTest extends BaseTestCase {
final PDOMManager pdomManager = CCoreInternals.getPDOMManager(); final PDOMManager pdomManager = CCoreInternals.getPDOMManager();
pdomManager.exportProjectPDOM(cproject, tmp, cvr); 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(); pdom.acquireReadLock();
try { try {
String id= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); String id= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);

View file

@ -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.IPDOMDescriptor;
import org.eclipse.cdt.core.index.provider.IReadOnlyPDOMProvider; import org.eclipse.cdt.core.index.provider.IReadOnlyPDOMProvider;
import org.eclipse.cdt.core.model.ICProject; 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.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.CProjectHelper;
@ -231,7 +232,7 @@ public class PDOMProviderTests extends PDOMTestBase {
CProjectHelper.delete(cproject); CProjectHelper.delete(cproject);
// mimic a pdom with superceded version // mimic a pdom with superceded version
WritablePDOM wpdom= new WritablePDOM(tempPDOM, cvr); WritablePDOM wpdom= new WritablePDOM(tempPDOM, cvr, LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
wpdom.acquireWriteLock(); wpdom.acquireWriteLock();
try { try {
wpdom.getDB().setVersion(1); wpdom.getDB().setVersion(1);

View file

@ -15,6 +15,7 @@
package org.eclipse.cdt.core.model; package org.eclipse.cdt.core.model;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
@ -294,37 +295,35 @@ public class LanguageManager {
} }
/** /**
* Returns a factory for the given linkage ID. The IDs are defined in {@link ILinkage}. * Returns mappings between IDs and IPDOMLinkageFactory. The IDs are defined in {@link ILinkage}.
* @param linkageID an ID for a linkage. * @return a map.
* @return a factory or <code>null</code>.
* @since 4.0 * @since 4.0
*/ */
public IPDOMLinkageFactory getPDOMLinkageFactory(String linkageID) { public Map getPDOMLinkageFactoryMappings() {
final IPDOMLinkageFactory[] result= new IPDOMLinkageFactory[] {null}; if (!fPDOMLinkageFactoryCache.isEmpty())
result[0]= (IPDOMLinkageFactory) fPDOMLinkageFactoryCache.get(linkageID); return Collections.unmodifiableMap(fPDOMLinkageFactoryCache);
if (result[0] == null) { fPDOMLinkageFactoryCache.clear();
// read configuration final IPDOMLinkageFactory[] result = new IPDOMLinkageFactory[] {null};
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 { // read configuration
result[0]= (IPDOMLinkageFactory) element.createExecutableExtension(ATTRIBUTE_CLASS); 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);
} }
}
public void run() throws Exception {
result[0] = (IPDOMLinkageFactory) element.createExecutableExtension(ATTRIBUTE_CLASS);
}}
);
fPDOMLinkageFactoryCache.put(element.getAttribute(ATTRIBUTE_ID), result[0]);
} }
fPDOMLinkageFactoryCache.put(linkageID, result[0]);
} }
return result[0]; return Collections.unmodifiableMap(fPDOMLinkageFactoryCache);
} }
/** /**

View file

@ -19,6 +19,7 @@ import java.util.Set;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexLocationConverter; 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.cdt.internal.core.pdom.PDOM;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
@ -69,7 +70,7 @@ class PDOMCache {
} }
if(result==null) { if(result==null) {
try { try {
result = new PDOM(file, converter); result = new PDOM(file, converter, LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
result.acquireReadLock(); result.acquireReadLock();
try { try {

View file

@ -40,7 +40,6 @@ import org.eclipse.cdt.core.index.IIndexLinkage;
import org.eclipse.cdt.core.index.IIndexLocationConverter; import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.index.IndexFilter; 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.IIndexFragment;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile; 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 Map fLinkageIDCache = new HashMap();
private File fPath; private File fPath;
private IIndexLocationConverter locationConverter; private IIndexLocationConverter locationConverter;
private Map fPDOMLinkageFactoryCache;
public PDOM(File dbPath, IIndexLocationConverter locationConverter) throws CoreException { public PDOM(File dbPath, IIndexLocationConverter locationConverter, Map linkageFactoryMappings) throws CoreException {
this(dbPath, locationConverter, ChunkCache.getSharedInstance()); 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); loadDatabase(dbPath, cache);
this.locationConverter = locationConverter; this.locationConverter = locationConverter;
} }
@ -421,7 +422,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
int record= getFirstLinkageRecord(); int record= getFirstLinkageRecord();
while (record != 0) { while (record != 0) {
String linkageID= PDOMLinkage.getId(this, record).getString(); String linkageID= PDOMLinkage.getId(this, record).getString();
IPDOMLinkageFactory factory= LanguageManager.getInstance().getPDOMLinkageFactory(linkageID); IPDOMLinkageFactory factory= (IPDOMLinkageFactory) fPDOMLinkageFactoryCache.get(linkageID);
if (factory != null) { if (factory != null) {
PDOMLinkage linkage= factory.getLinkage(this, record); PDOMLinkage linkage= factory.getLinkage(this, record);
fLinkageIDCache.put(linkageID, linkage); fLinkageIDCache.put(linkageID, linkage);
@ -438,7 +439,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
PDOMLinkage pdomLinkage= (PDOMLinkage) fLinkageIDCache.get(linkageID); PDOMLinkage pdomLinkage= (PDOMLinkage) fLinkageIDCache.get(linkageID);
if (pdomLinkage == null) { if (pdomLinkage == null) {
// Need to create it // Need to create it
IPDOMLinkageFactory factory= LanguageManager.getInstance().getPDOMLinkageFactory(linkageID); IPDOMLinkageFactory factory= (IPDOMLinkageFactory) fPDOMLinkageFactoryCache.get(linkageID);
if (factory != null) { if (factory != null) {
return factory.createLinkage(this); return factory.createLinkage(this);
} }

View file

@ -248,7 +248,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
fromScratch= true; fromScratch= true;
} }
pdom= new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject)); pdom= new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
if (pdom.versionMismatch() || fromScratch) { if (pdom.versionMismatch() || fromScratch) {
try { try {
pdom.acquireWriteLock(); pdom.acquireWriteLock();
@ -966,7 +966,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
} }
// overwrite internal location representations // overwrite internal location representations
final WritablePDOM newPDOM = new WritablePDOM(targetLocation, pdom.getLocationConverter()); final WritablePDOM newPDOM = new WritablePDOM(targetLocation, pdom.getLocationConverter(), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
try { try {
newPDOM.acquireWriteLock(); newPDOM.acquireWriteLock();
try { try {

View file

@ -31,6 +31,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexLocationConverter; import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter; import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter;
import org.eclipse.cdt.core.model.ICProject; 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.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IndexFileLocation; import org.eclipse.cdt.internal.core.index.IndexFileLocation;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences; import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
@ -95,7 +96,7 @@ public class TeamPDOMExportOperation implements IWorkspaceRunnable {
monitor.worked(5); monitor.worked(5);
// create checksums // create checksums
PDOM pdom= new PDOM(tmpPDOM, converter); PDOM pdom= new PDOM(tmpPDOM, converter, LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
try { try {
monitor.setTaskName(Messages.Checksums_taskComputeChecksums); monitor.setTaskName(Messages.Checksums_taskComputeChecksums);
createChecksums(fProject, pdom, tmpChecksums, subMonitor(monitor, 94)); createChecksums(fProject, pdom, tmpChecksums, subMonitor(monitor, 94));

View file

@ -17,6 +17,7 @@ import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.IASTName; 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 fClearedBecauseOfVersionMismatch= false;
private boolean fCreatedFromScratch= false; private boolean fCreatedFromScratch= false;
public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter) throws CoreException { public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter, Map linkageFactoryMappings) throws CoreException {
this(dbPath, locationConverter, ChunkCache.getSharedInstance()); this(dbPath, locationConverter, ChunkCache.getSharedInstance(), linkageFactoryMappings);
} }
public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter, ChunkCache cache) throws CoreException { public WritablePDOM(File dbPath, IIndexLocationConverter locationConverter, ChunkCache cache, Map linkageFactoryMappings) throws CoreException {
super(dbPath, locationConverter, cache); super(dbPath, locationConverter, cache, linkageFactoryMappings);
} }
public IIndexFragmentFile addFile(IIndexFileLocation location) throws CoreException { public IIndexFragmentFile addFile(IIndexFileLocation location) throws CoreException {

View file

@ -19,6 +19,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexLocationConverter; import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.export.IExportProjectProvider; import org.eclipse.cdt.core.index.export.IExportProjectProvider;
import org.eclipse.cdt.core.model.ICProject; 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.CCoreInternals;
import org.eclipse.cdt.internal.core.pdom.WritablePDOM; import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences; import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
@ -67,7 +68,7 @@ public class GeneratePDOM implements ISafeRunnable {
try { try {
CCoreInternals.getPDOMManager().exportProjectPDOM(cproject, targetLocation, converter); CCoreInternals.getPDOMManager().exportProjectPDOM(cproject, targetLocation, converter);
WritablePDOM exportedPDOM= new WritablePDOM(targetLocation, converter); WritablePDOM exportedPDOM= new WritablePDOM(targetLocation, converter, LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
exportedPDOM.acquireWriteLock(0); exportedPDOM.acquireWriteLock(0);
try { try {