diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionBugs.java index 06552dc76e5..14fec39edbd 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionBugs.java @@ -13,7 +13,11 @@ package org.eclipse.cdt.internal.index.tests; import junit.framework.TestSuite; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; /** * For testing PDOM binding resolution @@ -127,4 +131,33 @@ public class IndexBindingResolutionBugs extends IndexBindingResolutionTestBase { getBindingFromASTName("k=2", 1); getBindingFromASTName("l=2", 1); } + + // namespace X {} + + // namespace Y { + // class Ambiguity {}; + // enum Ambiguity {A1,A2,A3}; + // void foo() { + // Ambiguity problem; + // } + // } + public void testBug176708_CCE() throws Exception { + IBinding binding= getBindingFromASTName("Y {", 1); + assertTrue(binding instanceof ICPPNamespace); + ICPPNamespace adapted= (ICPPNamespace) strategy.getIndex().adaptBinding(binding); + IASTName[] names= findNames("Ambiguity problem", 9); + assertEquals(1, names.length); + IBinding binding2= adapted.getNamespaceScope().getBinding(names[0], true); + } + + // namespace X {int i;} + + // // references + // #include "header.h" + // int a= X::i; + public void testBug176708_NPE() throws Exception { + IBinding binding= getBindingFromASTName("i;", 1); + assertTrue(binding instanceof ICPPVariable); + IScope scope= binding.getScope(); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java index 3dab510aa7a..a22641d144d 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexBindingResolutionTestBase.java @@ -36,6 +36,7 @@ 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.dom.parser.cpp.CPPVisitor; +import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -55,7 +56,7 @@ import org.osgi.framework.Bundle; * the PDOM purely from AST information (i.e. without a real binding from the DOM) */ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { - private ITestStrategy strategy; + protected ITestStrategy strategy; public void setStrategy(ITestStrategy strategy) { this.strategy = strategy; @@ -68,8 +69,8 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { protected void tearDown() throws Exception { strategy.tearDown(); } - - protected IBinding getBindingFromASTName(String section, int len) { + + protected IASTName[] findNames(String section, int len) { // get the language from the language manager ILanguage language = null; ICProject cproject = strategy.getCProject(); @@ -83,8 +84,11 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { assertNotNull("No language for file " + ast.getFilePath().toString(), language); - IASTName[] names= language.getSelectedNames(ast, strategy.getTestData()[1].indexOf(section), len); + return language.getSelectedNames(ast, strategy.getTestData()[1].indexOf(section), len); + } + protected IBinding getBindingFromASTName(String section, int len) { + IASTName[] names= findNames(section, len); assertEquals("<>1 name found for \""+section+"\"", 1, names.length); IBinding binding = names[0].resolveBinding(); assertNotNull("No binding for "+names[0].getRawSignature(), binding); @@ -163,6 +167,7 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { public IASTTranslationUnit getAst(); public StringBuffer[] getTestData(); public ICProject getCProject(); + public boolean isCompositeIndex(); } class SinglePDOMTestStrategy implements ITestStrategy { @@ -200,6 +205,7 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { IFile cppfile= TestSourceReader.createFile(cproject.getProject(), new Path("references.c" + (cpp ? "pp" : "")), testData[1].toString()); assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor())); + // ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).accept(new PDOMPrettyPrinter()); index= CCorePlugin.getIndexManager().getIndex(cproject); @@ -219,6 +225,10 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { public IIndex getIndex() { return index; } + + public boolean isCompositeIndex() { + return false; + } } class ReferencedProject implements ITestStrategy { @@ -249,8 +259,8 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { } public void setUp() throws Exception { - cproject= cpp ? CProjectHelper.createCCProject("OnlineContent", "bin", IPDOMManager.ID_NO_INDEXER) - : CProjectHelper.createCProject("OnlineContent", "bin", IPDOMManager.ID_NO_INDEXER); + cproject= cpp ? CProjectHelper.createCCProject("OnlineContent"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER) + : CProjectHelper.createCProject("OnlineContent"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER); Bundle b= CTestPlugin.getDefault().getBundle(); testData= TestSourceReader.getContentsForTest(b, "parser", IndexBindingResolutionTestBase.this.getClass(), getName(), 2); referenced = createReferencedContent(); @@ -262,8 +272,13 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { pd.setReferencedProjects(refs); cproject.getProject().setDescription(pd, new NullProgressMonitor()); - CCoreInternals.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER); + IndexerPreferences.set(cproject.getProject(), IndexerPreferences.KEY_INDEX_ALL_FILES, "true"); + IndexerPreferences.set(cproject.getProject(), IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_FAST_INDEXER); + CCoreInternals.getPDOMManager().reindex(cproject); assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor())); + + // System.out.println("Online: "+getName()); + // ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).accept(new PDOMPrettyPrinter()); index= CCorePlugin.getIndexManager().getIndex(cproject); index.acquireReadLock(); @@ -274,11 +289,16 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { ICProject referenced = cpp ? CProjectHelper.createCCProject("ReferencedContent"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER) : CProjectHelper.createCProject("ReferencedContent"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER); String content = testData[0].toString(); - IFile file = TestSourceReader.createFile(cproject.getProject(), new Path("header.h"), content); - - CCoreInternals.getPDOMManager().setIndexerId(referenced, IPDOMManager.ID_FAST_INDEXER); + IFile file = TestSourceReader.createFile(referenced.getProject(), new Path("header.h"), content); + + IndexerPreferences.set(referenced.getProject(), IndexerPreferences.KEY_INDEX_ALL_FILES, "true"); + IndexerPreferences.set(referenced.getProject(), IndexerPreferences.KEY_INDEXER_ID, IPDOMManager.ID_FAST_INDEXER); + CCoreInternals.getPDOMManager().reindex(referenced); + + //System.out.println("Referenced: "+getName()); assertTrue(CCorePlugin.getIndexManager().joinIndexer(360000, new NullProgressMonitor())); - + //((PDOM)CCoreInternals.getPDOMManager().getPDOM(referenced)).accept(new PDOMPrettyPrinter()); + return referenced; } @@ -293,5 +313,9 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase { public StringBuffer[] getTestData() { return testData; } + + public boolean isCompositeIndex() { + return true; + } } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionBugs.java index bf67f6f0cd1..70e753de960 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCBindingResolutionBugs.java @@ -67,5 +67,7 @@ public class IndexCBindingResolutionBugs extends IndexBindingResolutionTestBase assertEquals(1, params.length); IType param= params[0].getType(); assertTrue(param instanceof IBasicType); + IType returnType= f0.getType().getReturnType(); + assertTrue(returnType instanceof IBasicType); } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java index f14cbeb74a2..1970882f414 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java @@ -71,9 +71,10 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti // }; // // referencing file - // #include "referenced.h" + // #include "header.h" + // + // C *cp = new C(); /*b0, b1*/ // void references() { - // C *cp = new C(); /*b0, b1*/ // long l = 5, *lp; // lp = &l; // cp->cs.*cp->ouch = lp = cp->cs.*cp->autsch; /*b2, b3, b4*/ @@ -1039,8 +1040,18 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti assertEquals(binding2, getBindingFromASTName("f(const_int_ptr_const)", 1)); assertEquals(binding2, getBindingFromASTName("f(int_const_ptr_const)", 1)); - assertEquals(2, getIndex().findNames(binding1, IIndex.FIND_DECLARATIONS).length); - assertEquals(4, getIndex().findNames(binding2, IIndex.FIND_DECLARATIONS).length); + if(strategy.isCompositeIndex()) { + // getIndex() returns the index for the referencing content only + assertEquals(0, getIndex().findNames(binding1, IIndex.FIND_DECLARATIONS).length); + assertEquals(0, getIndex().findNames(binding2, IIndex.FIND_DECLARATIONS).length); + assertEquals(1, getIndex().findNames(binding1, IIndex.FIND_DEFINITIONS).length); + assertEquals(1, getIndex().findNames(binding2, IIndex.FIND_DEFINITIONS).length); + } else { + assertEquals(2, getIndex().findNames(binding1, IIndex.FIND_DECLARATIONS).length); + assertEquals(4, getIndex().findNames(binding2, IIndex.FIND_DECLARATIONS).length); + assertEquals(1, getIndex().findNames(binding1, IIndex.FIND_DEFINITIONS).length); + assertEquals(1, getIndex().findNames(binding2, IIndex.FIND_DEFINITIONS).length); + } } // typedef struct S {int a;} S; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java index 256325a04be..8d8e6cbfd88 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java @@ -54,7 +54,8 @@ public class CIndex implements IIndex { final private IIndexFragment[] fFragments; final private int fPrimaryFragmentCount; private int fReadLock; - + private ICompositesFactory cppCF, cCF, fCF; + public CIndex(IIndexFragment[] fragments, int primaryFragmentCount) { fFragments= fragments; fPrimaryFragmentCount= primaryFragmentCount; @@ -328,18 +329,23 @@ public class CIndex implements IIndex { } } - + public IIndexBinding adaptBinding(IBinding binding) { try { if(SPECIALCASE_SINGLES && fFragments.length==1) { return fFragments[0].adaptBinding(binding); } else { - return getCompositesFactory(binding.getLinkage().getID()).getCompositeBinding(binding); + for (int i = 0; i < fPrimaryFragmentCount; i++) { + IIndexFragmentBinding adaptedBinding= fFragments[i].adaptBinding(binding); + if (adaptedBinding != null) { + return getCompositesFactory(binding.getLinkage().getID()).getCompositeBinding(adaptedBinding); + } + } } } catch(CoreException ce) { CCorePlugin.log(ce); - return null; } + return null; } public IIndexBinding[] findBindings(char[] name, IndexFilter filter, IProgressMonitor monitor) throws CoreException { @@ -391,7 +397,6 @@ public class CIndex implements IIndex { return (IIndexFragmentBinding[]) result.toArray(new IIndexFragmentBinding[result.size()]); } - ICompositesFactory cppCF, cCF, fCF; private ICompositesFactory getCompositesFactory(String linkageID) { if(linkageID.equals(ILinkage.CPP_LINKAGE_ID)) { if(cppCF==null) { @@ -423,7 +428,7 @@ public class CIndex implements IIndex { } public boolean acceptImplicitMethods() { return filter.acceptImplicitMethods(); - }; + } public boolean acceptLinkage(ILinkage other) { return linkage.getID().equals(other.getID()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/AbstractCompositeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/AbstractCompositeFactory.java index 1b1bd010ba4..d183b2bb704 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/AbstractCompositeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/AbstractCompositeFactory.java @@ -34,7 +34,7 @@ public abstract class AbstractCompositeFactory implements ICompositesFactory { * (non-Javadoc) * @see org.eclipse.cdt.internal.core.index.composite.ICompositesFactory#getCompositeBindings(org.eclipse.cdt.core.index.IIndex, org.eclipse.cdt.internal.core.index.IIndexFragmentBinding[]) */ - public final IIndexBinding[] getCompositeBindings(IBinding[] bindings) { + public final IIndexBinding[] getCompositeBindings(IIndexFragmentBinding[] bindings) { IIndexBinding[] result = new IIndexBinding[bindings.length]; for(int i=0; i