mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 14:15:23 +02:00
188274: apply fix
This commit is contained in:
parent
3840ecf156
commit
6410925da8
14 changed files with 168 additions and 58 deletions
|
@ -69,7 +69,7 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas
|
|||
// B<C> b;
|
||||
|
||||
// void foo() {C c; B<int> 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{};}
|
||||
|
|
|
@ -278,7 +278,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
|
|||
// B<long>::foo(); // instance not in the referenced pdom
|
||||
// X<int> x;
|
||||
// }
|
||||
public void _testClassImplicitInstantiations_188274() throws Exception {
|
||||
public void testClassImplicitInstantiations_188274() throws Exception {
|
||||
IBinding b2= getBindingFromASTName("X<int>", 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 {};
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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); }
|
||||
}
|
||||
|
|
|
@ -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<result.length; i++) {
|
||||
result[i]= (ICPPClassTemplatePartialSpecialization) cf.getCompositeBinding((IIndexFragmentBinding)result[i]);
|
||||
throws DOMException {
|
||||
try {
|
||||
IIndexFragmentBinding[] bindings= ((CIndex)((CPPCompositesFactory)cf).getContext()).findEquivalentBindings(rbinding);
|
||||
IIndexFragmentBinding[][] preresult= new IIndexFragmentBinding[bindings.length][];
|
||||
|
||||
for(int i=0; i<bindings.length; i++) {
|
||||
ICPPClassTemplatePartialSpecialization[] ss= ((ICPPClassTemplate)bindings[i]).getPartialSpecializations();
|
||||
preresult[i]= new IIndexFragmentBinding[ss.length];
|
||||
System.arraycopy(ss, 0, preresult[i], 0, ss.length);
|
||||
}
|
||||
|
||||
return (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.addAll(ICPPClassTemplatePartialSpecialization.class, null, cf.getCompositeBindings(preresult));
|
||||
} catch(CoreException ce) {
|
||||
CCorePlugin.log(ce);
|
||||
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException {
|
||||
|
@ -51,11 +68,24 @@ ICPPClassTemplate, ICPPInternalTemplateInstantiator{
|
|||
}
|
||||
|
||||
public ICPPSpecialization getInstance(IType[] arguments) {
|
||||
return InternalTemplateInstantiatorUtil.getInstance(arguments, cf, rbinding);
|
||||
return InternalTemplateInstantiatorUtil.getInstance(arguments, cf, this);
|
||||
}
|
||||
|
||||
public IBinding instantiate(IType[] arguments) {
|
||||
return InternalTemplateInstantiatorUtil.instantiate(arguments, cf, rbinding);
|
||||
ICPPTemplateDefinition template = null;
|
||||
try {
|
||||
template = CPPTemplates.matchTemplatePartialSpecialization(this, arguments);
|
||||
} catch (DOMException e) {
|
||||
return e.getProblem();
|
||||
}
|
||||
|
||||
if( template instanceof IProblemBinding )
|
||||
return template;
|
||||
if( template != null && template instanceof ICPPClassTemplatePartialSpecialization ){
|
||||
return ((ICPPInternalTemplateInstantiator)template).instantiate( arguments );
|
||||
}
|
||||
|
||||
return CPPTemplates.instantiateTemplate(this, arguments, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ public class CompositeCPPClassTemplatePartialSpecialization extends CompositeCPP
|
|||
return (ICPPClassTemplate) cf.getCompositeBinding((IIndexFragmentBinding)preresult);
|
||||
}
|
||||
|
||||
public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, rbinding); }
|
||||
public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPClassTemplatePartialSpecialization) rbinding); }
|
||||
public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); }
|
||||
public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); }
|
||||
public int getSignatureMemento() throws CoreException { return ((IPDOMOverloader) rbinding).getSignatureMemento(); }
|
||||
|
|
|
@ -51,7 +51,7 @@ CompositeCPPClassSpecialization implements ICPPClassTemplate, ICPPInternalTempla
|
|||
}
|
||||
|
||||
public ICPPSpecialization getInstance(IType[] arguments) {
|
||||
return InternalTemplateInstantiatorUtil.getInstance(arguments, cf, rbinding);
|
||||
return InternalTemplateInstantiatorUtil.getInstance(arguments, cf, this);
|
||||
}
|
||||
|
||||
public IBinding instantiate(IType[] arguments) {
|
||||
|
|
|
@ -50,13 +50,24 @@ class CompositeCPPClassType extends CompositeCPPBinding implements ICPPClassType
|
|||
|
||||
private class CPPBaseDelegate implements ICPPBase, ICPPInternalBase {
|
||||
private ICPPBase base;
|
||||
private IBinding baseClass;
|
||||
private boolean writable;
|
||||
|
||||
CPPBaseDelegate(ICPPBase b) {
|
||||
this.base = b;
|
||||
this(b, false);
|
||||
}
|
||||
|
||||
CPPBaseDelegate(ICPPBase b, boolean writable) {
|
||||
this.base= b;
|
||||
this.writable= writable;
|
||||
}
|
||||
|
||||
public IBinding getBaseClass() throws DOMException {
|
||||
return cf.getCompositeBinding((IIndexFragmentBinding)base.getBaseClass());
|
||||
if(baseClass!=null) {
|
||||
return baseClass;
|
||||
} else {
|
||||
return cf.getCompositeBinding((IIndexFragmentBinding)base.getBaseClass());
|
||||
}
|
||||
}
|
||||
|
||||
public IName getBaseClassSpecifierName() {
|
||||
|
@ -72,11 +83,15 @@ class CompositeCPPClassType extends CompositeCPPBinding implements ICPPClassType
|
|||
}
|
||||
|
||||
public void setBaseClass(IBinding binding) throws DOMException {
|
||||
((ICPPInternalBase)base).setBaseClass(binding);
|
||||
if(writable) {
|
||||
baseClass= binding;
|
||||
} else {
|
||||
((ICPPInternalBase)base).setBaseClass(binding);
|
||||
}
|
||||
}
|
||||
|
||||
public Object clone(){
|
||||
return ((ICPPInternalBase)base).clone();
|
||||
return new CPPBaseDelegate(base, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp
|
|||
return (IBinding) cf.getCompositeBinding((IIndexFragmentBinding)ins);
|
||||
}
|
||||
|
||||
public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, rbinding); }
|
||||
public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); }
|
||||
public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); }
|
||||
public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); }
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
|
||||
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.index.composite.ICompositesFactory;
|
||||
|
||||
|
@ -25,7 +26,7 @@ public class CompositeCPPDeferredFunctionInstance extends CompositeCPPFunction
|
|||
super(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 ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); }
|
||||
public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); }
|
||||
|
|
|
@ -25,7 +25,7 @@ public class CompositeCPPFunctionInstance extends CompositeCPPFunction implement
|
|||
super(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 ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); }
|
||||
public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); }
|
||||
|
|
|
@ -40,7 +40,7 @@ public class CompositeCPPFunctionTemplate extends CompositeCPPFunction implement
|
|||
}
|
||||
|
||||
public ICPPSpecialization getInstance(IType[] arguments) {
|
||||
return InternalTemplateInstantiatorUtil.getInstance(arguments, cf, rbinding);
|
||||
return InternalTemplateInstantiatorUtil.getInstance(arguments, cf, this);
|
||||
}
|
||||
|
||||
public IBinding instantiate(IType[] arguments) {
|
||||
|
|
|
@ -11,13 +11,16 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index.composite.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.core.index.IIndexBinding;
|
||||
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 InternalTemplateInstantiatorUtil {
|
||||
public static ICPPSpecialization deferredInstance(IType[] arguments, ICompositesFactory cf, IIndexBinding rbinding) {
|
||||
|
@ -30,9 +33,25 @@ public class InternalTemplateInstantiatorUtil {
|
|||
}
|
||||
}
|
||||
|
||||
public static ICPPSpecialization getInstance(IType[] arguments, ICompositesFactory cf, IIndexBinding rbinding) {
|
||||
ICPPSpecialization ins= ((ICPPInternalTemplateInstantiator)rbinding).getInstance(arguments);
|
||||
return (ICPPSpecialization) cf.getCompositeBinding((IIndexFragmentBinding)ins);
|
||||
public static ICPPSpecialization getInstance(IType[] arguments, ICompositesFactory cf, CompositeCPPBinding cbinding) {
|
||||
ICPPSpecialization preferredInstance= null;
|
||||
try {
|
||||
IIndexFragmentBinding[] bindings= ((CIndex)((CPPCompositesFactory)cf).getContext()).findEquivalentBindings(cbinding);
|
||||
|
||||
for(int i=0; i<bindings.length && !(preferredInstance instanceof IIndexFragmentBinding); i++) {
|
||||
ICPPInternalTemplateInstantiator instantiator= (ICPPInternalTemplateInstantiator) bindings[i];
|
||||
preferredInstance= instantiator.getInstance(arguments);
|
||||
}
|
||||
} catch(CoreException ce) {
|
||||
CCorePlugin.log(ce);
|
||||
}
|
||||
|
||||
if(preferredInstance instanceof IIndexFragmentBinding) {
|
||||
return (ICPPSpecialization) cf.getCompositeBinding((IIndexFragmentBinding)preferredInstance);
|
||||
} else {
|
||||
// can result in a non-index binding
|
||||
return preferredInstance;
|
||||
}
|
||||
}
|
||||
|
||||
public static IBinding instantiate(IType[] arguments, ICompositesFactory cf, IIndexBinding rbinding) {
|
||||
|
@ -40,7 +59,7 @@ public class InternalTemplateInstantiatorUtil {
|
|||
if (ins instanceof IIndexFragmentBinding) {
|
||||
return (IBinding) cf.getCompositeBinding((IIndexFragmentBinding)ins);
|
||||
} else {
|
||||
//can result in a non-index binding
|
||||
// can result in a non-index binding
|
||||
return ins;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ 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.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
|
||||
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;
|
||||
|
@ -29,20 +30,30 @@ import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
|
|||
*/
|
||||
public class TemplateInstanceUtil {
|
||||
public static ObjectMap getArgumentMap(ICompositesFactory cf, IIndexBinding rbinding) {
|
||||
ObjectMap preresult= ((ICPPSpecialization)rbinding).getArgumentMap();
|
||||
ICPPSpecialization specn= (ICPPSpecialization) rbinding;
|
||||
IBinding specd= ((CPPCompositesFactory)cf).findOneDefinition(specn.getSpecializedBinding());
|
||||
if(specd == null)
|
||||
specd= specn.getSpecializedBinding();
|
||||
|
||||
ObjectMap preresult= specn.getArgumentMap();
|
||||
ObjectMap result= new ObjectMap(preresult.size());
|
||||
Object[] keys= preresult.keyArray();
|
||||
for(int i=0; i<keys.length; i++) {
|
||||
IType type= (IType) preresult.get(keys[i]);
|
||||
try {
|
||||
result.put(
|
||||
cf.getCompositeBinding((IIndexFragmentBinding)keys[i]),
|
||||
cf.getCompositeType((IIndexType)type));
|
||||
} catch(DOMException de) {
|
||||
result.put(keys[i], type);
|
||||
CCorePlugin.log(de);
|
||||
Object[] keysToAdapt= keys;
|
||||
|
||||
try {
|
||||
if(specd instanceof ICPPTemplateDefinition) {
|
||||
keysToAdapt= ((ICPPTemplateDefinition)specd).getTemplateParameters();
|
||||
}
|
||||
for(int i=0; i<keys.length; i++) {
|
||||
IType type= (IType) preresult.get(keys[i]);
|
||||
result.put(
|
||||
cf.getCompositeBinding((IIndexFragmentBinding)keysToAdapt[i]),
|
||||
cf.getCompositeType((IIndexType)type));
|
||||
}
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -52,8 +63,20 @@ public class TemplateInstanceUtil {
|
|||
}
|
||||
|
||||
|
||||
public static IType[] getArguments(ICompositesFactory cf, IIndexBinding rbinding) {
|
||||
IType[] result = ((ICPPTemplateInstance)rbinding).getArguments();
|
||||
public static IType[] getArguments(ICompositesFactory cf, ICPPTemplateInstance rbinding) {
|
||||
return getArguments(cf, rbinding.getArguments());
|
||||
}
|
||||
|
||||
public static IType[] getArguments(ICompositesFactory cf, ICPPClassTemplatePartialSpecialization rbinding) {
|
||||
try {
|
||||
return getArguments(cf, rbinding.getArguments());
|
||||
} catch(DOMException de) {
|
||||
CCorePlugin.log(de);
|
||||
return IType.EMPTY_TYPE_ARRAY;
|
||||
}
|
||||
}
|
||||
|
||||
private static IType[] getArguments(ICompositesFactory cf, IType[] result) {
|
||||
try {
|
||||
for(int i=0; i<result.length; i++) {
|
||||
result[i] = cf.getCompositeType((IIndexType)result[i]);
|
||||
|
|
Loading…
Add table
Reference in a new issue