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 19ef56a0bc4..83276fbcc38 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
@@ -23,6 +23,7 @@ import java.util.regex.Pattern;
import junit.framework.Test;
import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
@@ -57,6 +58,7 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
private static List toDeleteOnTearDown= new ArrayList();
private final static String locProject1= "resources/pdomtests/generatePDOMTests/project1";
private final static String locProject2= "resources/pdomtests/generatePDOMTests/project2";
+ private final static String locProject3= "resources/pdomtests/generatePDOMTests/project3";
private URI baseURI;
public static Test suite() {
@@ -224,6 +226,37 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
verifyProject2Content(wpdom);
}
+
+ public void testExternalExportProjectProvider_CLinkage() throws Exception {
+ File target= File.createTempFile("test", "pdom");
+
+ URL url= FileLocator.find(CTestPlugin.getDefault().getBundle(), new Path(locProject3), null);
+ String baseDir= FileLocator.toFileURL(url).getFile();
+
+ doGenerate(new String[] {
+ GeneratePDOMApplication.OPT_TARGET, target.getAbsolutePath(),
+ GeneratePDOMApplication.OPT_PROJECTPROVIDER, TestProjectProvider5.class.getName(),
+ ExternalExportProjectProvider.OPT_SOURCE, baseDir,
+ ExternalExportProjectProvider.OPT_FRAGMENT_ID, "hello.world"
+ });
+ assertTrue(target.exists());
+
+ IndexFilter CLinkage= new IndexFilter() {
+ public boolean acceptLinkage(ILinkage linkage) {
+ return linkage.getID().equals(ILinkage.C_LINKAGE_ID);
+ }
+ };
+
+ IndexFilter CPPLinkage= new IndexFilter() {
+ public boolean acceptLinkage(ILinkage linkage) {
+ return linkage.getID().equals(ILinkage.CPP_LINKAGE_ID);
+ }
+ };
+
+ WritablePDOM wpdom= new WritablePDOM(target, new URIRelativeLocationConverter(baseURI), LanguageManager.getInstance().getPDOMLinkageFactoryMappings());
+ assertEquals(1, wpdom.findBindings(new char[][] {"foo".toCharArray()}, CLinkage, NPM).length);
+ assertEquals(0, wpdom.findBindings(new char[][] {"foo".toCharArray()}, CPPLinkage, NPM).length);
+ }
public void verifyProject1Content(WritablePDOM wpdom) throws Exception {
wpdom.acquireReadLock();
@@ -314,6 +347,25 @@ public class GeneratePDOMApplicationTest extends PDOMTestBase {
}
public void setApplicationArguments(String[] arguments) {}
}
+
+ public static class TestProjectProvider5 implements IExportProjectProvider {
+ public ICProject createProject() throws CoreException {
+ ICProject cproject= CProjectHelper.createCProject("test"+System.currentTimeMillis(), null, IPDOMManager.ID_NO_INDEXER);
+ toDeleteOnTearDown.add(cproject);
+ CProjectHelper.importSourcesFromPlugin(cproject, CTestPlugin.getDefault().getBundle(), locProject3);
+ return cproject;
+ }
+ public Map getExportProperties() {
+ Map map= new HashMap();
+ map.put(SDK_VERSION, "4.0.1");
+ map.put(IIndexFragment.PROPERTY_FRAGMENT_ID, ACME_SDK_ID);
+ return map;
+ }
+ public IIndexLocationConverter getLocationConverter(ICProject cproject) {
+ return new ResourceContainerRelativeLocationConverter(cproject.getProject());
+ }
+ public void setApplicationArguments(String[] arguments) {}
+ }
}
class MockApplicationContext implements IApplicationContext {
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 e3ec589fd7d..317fdb949c4 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
@@ -15,13 +15,28 @@ import java.io.File;
import junit.framework.Test;
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ILinkage;
+import org.eclipse.cdt.core.dom.IName;
import org.eclipse.cdt.core.dom.IPDOMManager;
+import org.eclipse.cdt.core.dom.ast.ICompositeType;
+import org.eclipse.cdt.core.dom.ast.IFunction;
+import org.eclipse.cdt.core.dom.ast.IType;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
+import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
+import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexLocationConverter;
+import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter;
+import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
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;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
+import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.cdt.internal.core.index.IWritableIndexFragment;
@@ -29,8 +44,14 @@ import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.PDOMManager;
import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
+import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
/**
* Tests bugs found in the PDOM
@@ -174,4 +195,57 @@ public class PDOMBugsTest extends BaseTestCase {
pdom.acquireWriteLock();
pdom.releaseWriteLock();
}
+
+ public void _test191679() throws Exception {
+ IProject project= cproject.getProject();
+ IFolder cHeaders= cproject.getProject().getFolder("cHeaders");
+ cHeaders.create(true, true, NPM);
+ LanguageManager lm= LanguageManager.getInstance();
+
+ IFile cHeader= TestSourceReader.createFile(cHeaders, "cHeader.h", "struct S {int a; int b};\nvoid foo(struct S) {}\n");
+ ICProjectDescription pd= CCorePlugin.getDefault().getProjectDescription(project);
+ ICConfigurationDescription cfgd= pd.getDefaultSettingConfiguration();
+ ProjectLanguageConfiguration plc= LanguageManager.getInstance().getLanguageConfiguration(project);
+ plc.addFileMapping(cfgd, cHeader, GCCLanguage.ID);
+ IContentType ct= Platform.getContentTypeManager().getContentType(CCorePlugin.CONTENT_TYPE_CHEADER);
+ lm.storeLanguageMappingConfiguration(project, new IContentType[] {ct});
+
+ IFile cppSource= TestSourceReader.createFile(cHeaders, "cppSource.cpp", "struct S s; void ref() {foo(s);}");
+
+ IndexerPreferences.set(project, IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_FAST_INDEXER);
+ CCorePlugin.getIndexManager().reindex(cproject);
+ CCorePlugin.getIndexManager().joinIndexer(10000, NPM);
+
+ final PDOM pdom= (PDOM) CCoreInternals.getPDOMManager().getPDOM(cproject);
+ pdom.acquireReadLock();
+ try {
+ { // test reference to 'foo' was resolved correctly
+ IIndexBinding[] ib= pdom.findBindings(new char[][]{"foo".toCharArray()}, IndexFilter.ALL, NPM);
+ assertEquals(1, ib.length);
+
+ assertTrue(ib[0] instanceof IFunction);
+ assertTrue(!(ib[0] instanceof ICPPBinding));
+
+ IName[] nms= pdom.findNames(ib[0], IIndexFragment.FIND_REFERENCES);
+ assertEquals(1, nms.length);
+ assertTrue(nms[0].getFileLocation().getFileName().endsWith(".cpp"));
+ }
+
+ { // test struct S has resolved to the C linkage
+ IIndexBinding[] ib= pdom.findBindings(new char[][]{{'s'}}, IndexFilter.ALL, NPM);
+ assertEquals(1, ib.length);
+
+ assertTrue(ib[0] instanceof ICPPVariable);
+ ICPPVariable cppv= (ICPPVariable) ib[0];
+
+ IType type= cppv.getType();
+ assertTrue(type instanceof ICompositeType);
+ assertTrue(((ICompositeType) type).getKey() == ICompositeType.k_struct);
+ assertTrue(((ICompositeType) type).getLinkage().getID().equals(ILinkage.C_LINKAGE_ID));
+ }
+ } finally {
+ pdom.releaseReadLock();
+ }
+ }
}
+
diff --git a/core/org.eclipse.cdt.core.tests/plugin.xml b/core/org.eclipse.cdt.core.tests/plugin.xml
index 615ec386dd0..c47f74685d2 100644
--- a/core/org.eclipse.cdt.core.tests/plugin.xml
+++ b/core/org.eclipse.cdt.core.tests/plugin.xml
@@ -44,6 +44,9 @@
+
+