From 6410925da8b55f09c3db53dcab449a5caf62ba1d Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Thu, 31 May 2007 11:43:46 +0000 Subject: [PATCH] 188274: apply fix --- .../tests/IndexCPPBindingResolutionBugs.java | 4 +- .../tests/IndexCPPTemplateResolutionTest.java | 4 +- .../composite/cpp/CPPCompositesFactory.java | 58 +++++++++++++------ .../cpp/CompositeCPPClassInstance.java | 6 +- .../cpp/CompositeCPPClassTemplate.java | 44 +++++++++++--- ...CPPClassTemplatePartialSpecialization.java | 2 +- ...mpositeCPPClassTemplateSpecialization.java | 2 +- .../composite/cpp/CompositeCPPClassType.java | 23 ++++++-- .../CompositeCPPDeferredClassInstance.java | 2 +- .../CompositeCPPDeferredFunctionInstance.java | 3 +- .../cpp/CompositeCPPFunctionInstance.java | 2 +- .../cpp/CompositeCPPFunctionTemplate.java | 2 +- .../cpp/InternalTemplateInstantiatorUtil.java | 27 +++++++-- .../composite/cpp/TemplateInstanceUtil.java | 47 +++++++++++---- 14 files changed, 168 insertions(+), 58 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java index 7bb41cf2398..fd05137b532 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java @@ -69,7 +69,7 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas // B b; // void foo() {C c; B b;} - public void _testBug188274() throws Exception { + public void testBug188274() throws Exception { IBinding b0= getBindingFromASTName("C", 1); IBinding b1= getBindingFromASTName("B", 1); assertInstance(b0, ICPPClassType.class); @@ -84,8 +84,6 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas ICPPBase[] bases= c2t.getBases(); assertEquals(1, bases.length); assertInstance(bases[0].getBaseClass(), ICPPClassType.class); - - fakeFailForSingle(); } // namespace ns {class A{};} diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 3849e5aff85..08fbe24d345 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -278,7 +278,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa // B::foo(); // instance not in the referenced pdom // X x; // } - public void _testClassImplicitInstantiations_188274() throws Exception { + public void testClassImplicitInstantiations_188274() throws Exception { IBinding b2= getBindingFromASTName("X", 6, true); assertInstance(b2, ICPPClassType.class); assertInstance(b2, ICPPTemplateInstance.class); @@ -302,8 +302,6 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa ICPPBase[] bss1= ct1.getBases(); assertEquals(1, bss1.length); assertInstance(bss1[0].getBaseClass(), ICPPClassType.class); - - fakeFailForSingle(); } // class B {}; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java index 12aa20e57c8..cca5fea1296 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java @@ -149,6 +149,14 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC namespaces[i] = (ICPPNamespace) ibs[i]; return namespaces; } + + IIndex getContext() { + return index; + } + + protected IIndexFragmentBinding findOneDefinition(IBinding binding) { + return super.findOneDefinition(binding); + } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.index.composite.cpp.ICompositesFactory#getCompositeBinding(org.eclipse.cdt.core.index.IIndex, org.eclipse.cdt.core.dom.ast.IBinding) @@ -159,18 +167,6 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC try { if(binding==null) { result = null; - } else if (binding instanceof ICPPTemplateDefinition) { - if(binding instanceof ICPPClassTemplate) { - return new CompositeCPPClassTemplate(this, (ICPPClassType) findOneDefinition(binding)); - } else if (binding instanceof ICPPConstructor) { - return new CompositeCPPConstructorTemplate(this, (ICPPConstructor) binding); - } else if (binding instanceof ICPPMethod) { - return new CompositeCPPMethodTemplate(this, (ICPPMethod) binding); - } else if (binding instanceof ICPPFunctionTemplate) { - return new CompositeCPPFunctionTemplate(this, (ICPPFunction) binding); - } else { - throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ - } } else if(binding instanceof ICPPSpecialization) { if(binding instanceof ICPPTemplateInstance) { if(binding instanceof ICPPDeferredTemplateInstance) { @@ -184,19 +180,33 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC } else { if(binding instanceof ICPPClassType) { return new CompositeCPPClassInstance(this, (ICPPClassType) findOneDefinition(binding)); - } if(binding instanceof ICPPFunction) { + } else if(binding instanceof ICPPConstructor) { + return new CompositeCPPConstructorInstance(this, (ICPPConstructor) binding); + } else if(binding instanceof ICPPMethod) { + return new CompositeCPPMethodInstance(this, (ICPPMethod) binding); + } else if(binding instanceof ICPPFunction) { return new CompositeCPPFunctionInstance(this, (ICPPFunction) binding); } else { throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ } } + } else if (binding instanceof ICPPTemplateDefinition) { + if(binding instanceof ICPPClassTemplatePartialSpecialization) { + return new CompositeCPPClassTemplatePartialSpecialization(this, (ICPPClassTemplatePartialSpecialization) binding); + } else if(binding instanceof ICPPClassType) { + return new CompositeCPPClassTemplateSpecialization(this, (ICPPClassType) binding); + } else if(binding instanceof ICPPConstructor) { + return new CompositeCPPConstructorTemplateSpecialization(this, (ICPPConstructor) binding); + } else if(binding instanceof ICPPMethod) { + return new CompositeCPPMethodTemplateSpecialization(this, (ICPPMethod) binding); + } else if(binding instanceof ICPPFunctionType) { + return new CompositeCPPFunctionTemplateSpecialization(this, (ICPPFunction) binding); + } else { + throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ + } } else { if(binding instanceof ICPPClassType) { - if(binding instanceof ICPPClassTemplatePartialSpecialization) { - return new CompositeCPPClassTemplatePartialSpecialization(this, (ICPPClassTemplatePartialSpecialization) binding); - } else { - return new CompositeCPPClassSpecialization(this, (ICPPClassType) findOneDefinition(binding)); - } + return new CompositeCPPClassSpecialization(this, (ICPPClassType) findOneDefinition(binding)); } if(binding instanceof ICPPConstructor) { return new CompositeCPPConstructorSpecialization(this, (ICPPConstructor) binding); } if(binding instanceof ICPPMethod) { @@ -213,6 +223,18 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ } } + } else if (binding instanceof ICPPTemplateDefinition) { + if(binding instanceof ICPPClassTemplate) { + return new CompositeCPPClassTemplate(this, (ICPPClassType) findOneDefinition(binding)); + } else if (binding instanceof ICPPConstructor) { + return new CompositeCPPConstructorTemplate(this, (ICPPConstructor) binding); + } else if (binding instanceof ICPPMethod) { + return new CompositeCPPMethodTemplate(this, (ICPPMethod) binding); + } else if (binding instanceof ICPPFunctionTemplate) { + return new CompositeCPPFunctionTemplate(this, (ICPPFunction) binding); + } else { + throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ + } } else if(binding instanceof ICPPParameter) { result = new CompositeCPPParameter(this, (ICPPParameter) binding); } else if(binding instanceof ICPPField) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java index 429c8f7481c..11628f08af7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java @@ -10,13 +10,16 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; @@ -29,6 +32,7 @@ ICPPClassType, IIndexType, ICPPTemplateInstance, ICPPSpecialization { public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } - public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, rbinding); } + public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); } public ICPPTemplateDefinition getTemplateDefinition() { return TemplateInstanceUtil.getTemplateDefinition(cf, rbinding); } + public ICPPBase[] getBases() throws DOMException { return CPPTemplates.getBases(this); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java index 29266b27ab0..7081eba8213 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java @@ -10,17 +10,24 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; +import org.eclipse.cdt.internal.core.index.CIndex; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; +import org.eclipse.core.runtime.CoreException; public class CompositeCPPClassTemplate extends CompositeCPPClassType implements ICPPClassTemplate, ICPPInternalTemplateInstantiator{ @@ -30,12 +37,22 @@ ICPPClassTemplate, ICPPInternalTemplateInstantiator{ } public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() - throws DOMException { - ICPPClassTemplatePartialSpecialization[] result= ((ICPPClassTemplate)rbinding).getPartialSpecializations(); - for(int i=0; i