1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 09:16:02 +02:00

Bug 357563: Consider specializations found in index.

This commit is contained in:
Markus Schorn 2012-01-03 16:42:43 +01:00
parent 8afad54183
commit 3f92e17364
13 changed files with 215 additions and 50 deletions

View file

@ -1901,4 +1901,33 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
public void testUsageOfClassTemplateOutsideOfClassBody_357320() throws Exception { public void testUsageOfClassTemplateOutsideOfClassBody_357320() throws Exception {
getBindingFromASTName("m1", 0, ICPPMethod.class); getBindingFromASTName("m1", 0, ICPPMethod.class);
} }
// template <typename> struct foo;
// template <> struct foo<int> {
// typedef int type;
// };
// #include "header.h"
// template <typename> struct foo {};
// int main() {
// typedef foo<int>::type type; // ERROR HERE: 'foo<int>::type' could not be
// }
public void testSpecializationInIndex_367563a() throws Exception {
getBindingFromASTName("type type", 4, ITypedef.class);
}
// template <typename> struct foo;
// template <typename T> struct foo<T*> {
// typedef int type;
// };
// #include "header.h"
// template <typename> struct foo {};
// int main() {
// typedef foo<int*>::type type; // ERROR HERE: 'foo<int>::type' could not be
// }
public void testSpecializationInIndex_367563b() throws Exception {
getBindingFromASTName("type type", 4, ITypedef.class);
}
} }

View file

@ -21,14 +21,11 @@ import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
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.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMProjectIndexLocationConverter; import org.eclipse.cdt.internal.core.pdom.dom.PDOMProjectIndexLocationConverter;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
/** /**
* Tests behavior related to location representation in the PDOM * Tests behavior related to location representation in the PDOM
@ -40,15 +37,13 @@ public class PDOMLocationTests extends BaseTestCase {
return suite(PDOMLocationTests.class); return suite(PDOMLocationTests.class);
} }
@Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
cproject= CProjectHelper.createCCProject("PDOMLocationTests"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER); cproject= CProjectHelper.createCCProject("PDOMLocationTests"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER);
Bundle b = CTestPlugin.getDefault().getBundle();
CharSequence[] testData = TestSourceReader.getContentsForTest(b, "parser", getClass(), getName(), 3);
super.setUp(); super.setUp();
} }
@Override
protected void tearDown() throws Exception { protected void tearDown() throws Exception {
if (cproject != null) { if (cproject != null) {
cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor());

View file

@ -18,7 +18,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
* @noimplement This interface is not intended to be implemented by clients. * @noimplement This interface is not intended to be implemented by clients.
*/ */
public interface ICPPClassTemplate extends ICPPTemplateDefinition, ICPPClassType { public interface ICPPClassTemplate extends ICPPTemplateDefinition, ICPPClassType {
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException; public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations();
/** /**
* Returns a deferred instance that allows lookups within this class template. * Returns a deferred instance that allows lookups within this class template.

View file

@ -17,7 +17,6 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
@ -36,8 +35,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -47,26 +46,26 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClassTemplate, public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClassTemplate,
ICPPInternalClassTemplate, ICPPInternalClassTypeMixinHost { ICPPInternalClassTemplate, ICPPInternalClassTypeMixinHost {
private ICPPClassTemplate fIndexBinding= null;
private boolean checkedIndex= false;
private ICPPClassTemplatePartialSpecialization[] partialSpecializations = null; private ICPPClassTemplatePartialSpecialization[] partialSpecializations = null;
private ICPPDeferredClassInstance fDeferredInstance; private ICPPDeferredClassInstance fDeferredInstance;
private boolean addedPartialSpecializationsOfIndex;
public CPPClassTemplate(IASTName name) { public CPPClassTemplate(IASTName name) {
super(name); super(name);
} }
public void checkForDefinition() { @Override
public void checkForDefinition() {
// Ambiguity resolution ensures that definitions are resolved. // Ambiguity resolution ensures that definitions are resolved.
} }
@Override
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) { public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.append( partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.append(
ICPPClassTemplatePartialSpecialization.class, partialSpecializations, spec); ICPPClassTemplatePartialSpecialization.class, partialSpecializations, spec);
} }
@Override
public ICPPASTCompositeTypeSpecifier getCompositeTypeSpecifier() { public ICPPASTCompositeTypeSpecifier getCompositeTypeSpecifier() {
if (definition != null) { if (definition != null) {
IASTNode node = definition.getParent(); IASTNode node = definition.getParent();
@ -78,6 +77,7 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return null; return null;
} }
@Override
public ICPPClassScope getCompositeScope() { public ICPPClassScope getCompositeScope() {
if (definition == null) { if (definition == null) {
checkForDefinition(); checkForDefinition();
@ -93,15 +93,16 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
} }
// Forward declarations must be backed up from the index. // Forward declarations must be backed up from the index.
checkForIndexBinding(); ICPPClassTemplate ib = getIndexBinding();
if (fIndexBinding != null) { if (ib != null) {
IScope scope = fIndexBinding.getCompositeScope(); IScope scope = ib.getCompositeScope();
if (scope instanceof ICPPClassScope) if (scope instanceof ICPPClassScope)
return (ICPPClassScope) scope; return (ICPPClassScope) scope;
} }
return null; return null;
} }
@Override
public int getKey() { public int getKey() {
if (definition != null) { if (definition != null) {
ICPPASTCompositeTypeSpecifier cts= getCompositeTypeSpecifier(); ICPPASTCompositeTypeSpecifier cts= getCompositeTypeSpecifier();
@ -124,11 +125,25 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return ICPPASTElaboratedTypeSpecifier.k_class; return ICPPASTElaboratedTypeSpecifier.k_class;
} }
@Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() { public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
if (!addedPartialSpecializationsOfIndex) {
addedPartialSpecializationsOfIndex= true;
ICPPClassTemplate ib = getIndexBinding();
if (ib != null) {
IIndexFileSet fs = getTemplateName().getTranslationUnit().getIndexFileSet();
for (ICPPClassTemplatePartialSpecialization spec : ib.getPartialSpecializations()) {
if (spec instanceof IIndexBinding && fs.containsDeclaration((IIndexBinding) spec)) {
addPartialSpecialization(spec);
}
}
}
}
partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.trim(ICPPClassTemplatePartialSpecialization.class, partialSpecializations); partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.trim(ICPPClassTemplatePartialSpecialization.class, partialSpecializations);
return partialSpecializations; return partialSpecializations;
} }
@Override
public boolean isSameType(IType type) { public boolean isSameType(IType type) {
if (type == this) if (type == this)
return true; return true;
@ -137,42 +152,52 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return false; return false;
} }
@Override
public ICPPBase[] getBases() { public ICPPBase[] getBases() {
return ClassTypeHelper.getBases(this); return ClassTypeHelper.getBases(this);
} }
@Override
public IField[] getFields() { public IField[] getFields() {
return ClassTypeHelper.getFields(this); return ClassTypeHelper.getFields(this);
} }
@Override
public ICPPField[] getDeclaredFields() { public ICPPField[] getDeclaredFields() {
return ClassTypeHelper.getDeclaredFields(this); return ClassTypeHelper.getDeclaredFields(this);
} }
@Override
public ICPPMethod[] getMethods() { public ICPPMethod[] getMethods() {
return ClassTypeHelper.getMethods(this); return ClassTypeHelper.getMethods(this);
} }
@Override
public ICPPMethod[] getAllDeclaredMethods() { public ICPPMethod[] getAllDeclaredMethods() {
return ClassTypeHelper.getAllDeclaredMethods(this); return ClassTypeHelper.getAllDeclaredMethods(this);
} }
@Override
public ICPPMethod[] getDeclaredMethods() { public ICPPMethod[] getDeclaredMethods() {
return ClassTypeHelper.getDeclaredMethods(this); return ClassTypeHelper.getDeclaredMethods(this);
} }
@Override
public ICPPConstructor[] getConstructors() { public ICPPConstructor[] getConstructors() {
return ClassTypeHelper.getConstructors(this); return ClassTypeHelper.getConstructors(this);
} }
@Override
public IBinding[] getFriends() { public IBinding[] getFriends() {
return ClassTypeHelper.getFriends(this); return ClassTypeHelper.getFriends(this);
} }
@Override
public ICPPClassType[] getNestedClasses() { public ICPPClassType[] getNestedClasses() {
return ClassTypeHelper.getNestedClasses(this); return ClassTypeHelper.getNestedClasses(this);
} }
@Override
public IField findField(String name) { public IField findField(String name) {
return ClassTypeHelper.findField(this, name); return ClassTypeHelper.findField(this, name);
} }
@ -194,10 +219,12 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return ASTTypeUtil.getType(this); return ASTTypeUtil.getType(this);
} }
@Override
public boolean isAnonymous() { public boolean isAnonymous() {
return false; return false;
} }
@Override
public final ICPPDeferredClassInstance asDeferredInstance() throws DOMException { public final ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
if (fDeferredInstance == null) { if (fDeferredInstance == null) {
fDeferredInstance= createDeferredInstance(); fDeferredInstance= createDeferredInstance();
@ -210,10 +237,11 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return new CPPDeferredClassInstance(this, args, getCompositeScope()); return new CPPDeferredClassInstance(this, args, getCompositeScope());
} }
@Override
public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException { public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException {
checkForIndexBinding(); ICPPClassTemplate ib = getIndexBinding();
if (fIndexBinding != null) { if (ib != null) {
ICPPTemplateParameter[] params = fIndexBinding.getTemplateParameters(); ICPPTemplateParameter[] params = ib.getTemplateParameters();
if (paramPos < params.length) { if (paramPos < params.length) {
ICPPTemplateParameter param = params[paramPos]; ICPPTemplateParameter param = params[paramPos];
return param.getDefaultValue(); return param.getDefaultValue();
@ -221,21 +249,4 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
} }
return null; return null;
} }
private void checkForIndexBinding() {
if (checkedIndex)
return;
checkedIndex= true;
IASTTranslationUnit tu;
if (definition != null) {
tu= definition.getTranslationUnit();
} else {
tu= declarations[0].getTranslationUnit();
}
IIndex index= tu.getIndex();
if (index != null) {
fIndexBinding= (ICPPClassTemplate) index.adaptBinding(this);
}
}
} }

View file

@ -40,11 +40,13 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
fClassTemplate= template; fClassTemplate= template;
} }
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
ICPPClassTemplatePartialSpecialization template = (ICPPClassTemplatePartialSpecialization) getSpecializedBinding(); ICPPClassTemplatePartialSpecialization template = (ICPPClassTemplatePartialSpecialization) getSpecializedBinding();
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
@Override
public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
@ -52,6 +54,7 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
instances.put(key, instance); instances.put(key, instance);
} }
@Override
public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) { if (instances != null) {
String key= ASTTypeUtil.getArgumentListString(arguments, true); String key= ASTTypeUtil.getArgumentListString(arguments, true);
@ -60,6 +63,7 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return null; return null;
} }
@Override
public synchronized ICPPTemplateInstance[] getAllInstances() { public synchronized ICPPTemplateInstance[] getAllInstances() {
if (instances != null) { if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()]; ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
@ -71,10 +75,12 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return ICPPTemplateInstance.EMPTY_TEMPLATE_INSTANCE_ARRAY; return ICPPTemplateInstance.EMPTY_TEMPLATE_INSTANCE_ARRAY;
} }
@Override
public IBinding resolveTemplateParameter(ICPPTemplateParameter param) { public IBinding resolveTemplateParameter(ICPPTemplateParameter param) {
return param; return param;
} }
@Override
public ICPPDeferredClassInstance asDeferredInstance() throws DOMException { public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
if (fDeferredInstance == null) { if (fDeferredInstance == null) {
ICPPTemplateArgument[] args = CPPTemplates.templateParametersAsArguments(getTemplateParameters()); ICPPTemplateArgument[] args = CPPTemplates.templateParametersAsArguments(getTemplateParameters());
@ -83,10 +89,12 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return fDeferredInstance; return fDeferredInstance;
} }
@Override
public ICPPClassTemplate getPrimaryClassTemplate() { public ICPPClassTemplate getPrimaryClassTemplate() {
return fClassTemplate; return fClassTemplate;
} }
@Override
public ICPPTemplateArgument[] getTemplateArguments() throws DOMException { public ICPPTemplateArgument[] getTemplateArguments() throws DOMException {
ICPPTemplateArgument[] args = ((ICPPClassTemplatePartialSpecialization) getSpecializedBinding()).getTemplateArguments(); ICPPTemplateArgument[] args = ((ICPPClassTemplatePartialSpecialization) getSpecializedBinding()).getTemplateArguments();
final IBinding owner = getOwner(); final IBinding owner = getOwner();
@ -96,10 +104,12 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return CPPTemplates.instantiateArguments(args, getTemplateParameterMap(), -1, null); return CPPTemplates.instantiateArguments(args, getTemplateParameterMap(), -1, null);
} }
@Override
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) { public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { @Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
} }
@ -118,11 +128,13 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return CPPTemplates.getArgumentMap(getPrimaryClassTemplate(), getTemplateParameterMap()); return CPPTemplates.getArgumentMap(getPrimaryClassTemplate(), getTemplateParameterMap());
} }
@Override
@Deprecated @Deprecated
public IType[] getArguments() throws DOMException { public IType[] getArguments() throws DOMException {
return CPPTemplates.getArguments(getTemplateArguments()); return CPPTemplates.getArguments(getTemplateArguments());
} }
@Override
public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException { public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException {
// no default arguments for partial specializations // no default arguments for partial specializations
return null; return null;

View file

@ -39,7 +39,8 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
super(orig, owner, argumentMap); super(orig, owner, argumentMap);
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { @Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
if (fPartialSpecs == null) { if (fPartialSpecs == null) {
ICPPClassTemplate origTemplate= (ICPPClassTemplate) getSpecializedBinding(); ICPPClassTemplate origTemplate= (ICPPClassTemplate) getSpecializedBinding();
ICPPClassTemplatePartialSpecialization[] orig = origTemplate.getPartialSpecializations(); ICPPClassTemplatePartialSpecialization[] orig = origTemplate.getPartialSpecializations();
@ -52,6 +53,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return fPartialSpecs; return fPartialSpecs;
} }
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
// mstodo if we specialize the template parameters (because of its default values), it will // mstodo if we specialize the template parameters (because of its default values), it will
// be less error prone to use the defaults. // be less error prone to use the defaults.
@ -59,6 +61,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
@Override
public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
@ -66,6 +69,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
instances.put(key, instance); instances.put(key, instance);
} }
@Override
public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) { if (instances != null) {
String key= ASTTypeUtil.getArgumentListString(arguments, true); String key= ASTTypeUtil.getArgumentListString(arguments, true);
@ -74,6 +78,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return null; return null;
} }
@Override
public synchronized ICPPTemplateInstance[] getAllInstances() { public synchronized ICPPTemplateInstance[] getAllInstances() {
if (instances != null) { if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()]; ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
@ -85,6 +90,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return ICPPTemplateInstance.EMPTY_TEMPLATE_INSTANCE_ARRAY; return ICPPTemplateInstance.EMPTY_TEMPLATE_INSTANCE_ARRAY;
} }
@Override
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) { public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
} }
@ -93,10 +99,12 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return getName(); return getName();
} }
@Override
public IBinding resolveTemplateParameter(ICPPTemplateParameter param) { public IBinding resolveTemplateParameter(ICPPTemplateParameter param) {
return param; return param;
} }
@Override
public ICPPDeferredClassInstance asDeferredInstance() throws DOMException { public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
if (fDeferredInstance == null) { if (fDeferredInstance == null) {
ICPPTemplateArgument[] args = CPPTemplates.templateParametersAsArguments(getTemplateParameters()); ICPPTemplateArgument[] args = CPPTemplates.templateParametersAsArguments(getTemplateParameters());
@ -105,6 +113,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return fDeferredInstance; return fDeferredInstance;
} }
@Override
public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException { public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException {
return null; return null;
} }

View file

@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
@ -28,11 +29,14 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
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.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.Linkage;
@ -48,6 +52,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
public CPPTemplateProblem(IASTNode node, int id, char[] arg) { public CPPTemplateProblem(IASTNode node, int id, char[] arg) {
super(node, id, arg); super(node, id, arg);
} }
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
return ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY; return ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY;
} }
@ -62,6 +67,10 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
private ICPPTemplateParameter[] templateParameters; private ICPPTemplateParameter[] templateParameters;
private ObjectMap instances; private ObjectMap instances;
private ICPPClassTemplate indexBinding= null;
private boolean checkedIndex= false;
public CPPTemplateDefinition(IASTName name) { public CPPTemplateDefinition(IASTName name) {
if (name != null) { if (name != null) {
ASTNodeProperty prop = name.getPropertyInParent(); ASTNodeProperty prop = name.getPropertyInParent();
@ -85,6 +94,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
} }
} }
@Override
public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
@ -92,14 +102,46 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
instances.put(key, instance); instances.put(key, instance);
} }
@Override
public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) { if (instances != null) {
String key= ASTTypeUtil.getArgumentListString(arguments, true); String key= ASTTypeUtil.getArgumentListString(arguments, true);
return (ICPPTemplateInstance) instances.get(key); ICPPTemplateInstance cand = (ICPPTemplateInstance) instances.get(key);
if (cand != null)
return cand;
}
final ICPPClassTemplate ib = getIndexBinding();
if (ib instanceof ICPPInstanceCache) {
ICPPTemplateInstance cand= ((ICPPInstanceCache) ib).getInstance(arguments);
if (cand instanceof IIndexBinding &&
getTemplateName().getTranslationUnit().getIndexFileSet().containsDeclaration((IIndexBinding) cand)) {
return cand;
}
} }
return null; return null;
} }
protected ICPPClassTemplate getIndexBinding() {
if (!checkedIndex) {
checkedIndex= true;
IASTName name= getTemplateName();
if (name != null) {
IASTTranslationUnit tu = name.getTranslationUnit();
if (tu != null) {
IIndex index= tu.getIndex();
if (index != null) {
IIndexBinding ib = index.adaptBinding(this);
if (ib instanceof ICPPClassTemplate)
indexBinding= (ICPPClassTemplate) ib;
}
}
}
}
return indexBinding;
}
@Override
public ICPPTemplateInstance[] getAllInstances() { public ICPPTemplateInstance[] getAllInstances() {
if (instances != null) { if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()]; ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
@ -122,6 +164,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName() * @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
*/ */
@Override
public String getName() { public String getName() {
return new String(getNameCharArray()); return new String(getNameCharArray());
} }
@ -129,6 +172,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray() * @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray()
*/ */
@Override
public char[] getNameCharArray() { public char[] getNameCharArray() {
return getTemplateName().getSimpleID(); return getTemplateName().getSimpleID();
} }
@ -136,6 +180,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope() * @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
*/ */
@Override
public IScope getScope() { public IScope getScope() {
return CPPVisitor.getContainingScope(getTemplateName()); return CPPVisitor.getContainingScope(getTemplateName());
} }
@ -143,6 +188,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
*/ */
@Override
public String[] getQualifiedName() { public String[] getQualifiedName() {
return CPPVisitor.getQualifiedName(this); return CPPVisitor.getQualifiedName(this);
} }
@ -150,6 +196,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray()
*/ */
@Override
public char[][] getQualifiedNameCharArray() { public char[][] getQualifiedNameCharArray() {
return CPPVisitor.getQualifiedNameCharArray(this); return CPPVisitor.getQualifiedNameCharArray(this);
} }
@ -157,6 +204,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified()
*/ */
@Override
public boolean isGloballyQualified() { public boolean isGloballyQualified() {
return true; return true;
} }
@ -164,6 +212,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition#getParameters() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition#getParameters()
*/ */
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
if (templateParameters == null) { if (templateParameters == null) {
ICPPASTTemplateDeclaration template = CPPTemplates.getTemplateDeclaration(getTemplateName()); ICPPASTTemplateDeclaration template = CPPTemplates.getTemplateDeclaration(getTemplateName());
@ -186,6 +235,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
*/ */
@Override
public void addDefinition(IASTNode node) { public void addDefinition(IASTNode node) {
if (node instanceof ICPPASTCompositeTypeSpecifier) { if (node instanceof ICPPASTCompositeTypeSpecifier) {
node = ((ICPPASTCompositeTypeSpecifier)node).getName(); node = ((ICPPASTCompositeTypeSpecifier)node).getName();
@ -203,6 +253,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode) * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
*/ */
@Override
public void addDeclaration(IASTNode node) { public void addDeclaration(IASTNode node) {
if (node instanceof ICPPASTElaboratedTypeSpecifier) { if (node instanceof ICPPASTElaboratedTypeSpecifier) {
node = ((ICPPASTElaboratedTypeSpecifier)node).getName(); node = ((ICPPASTElaboratedTypeSpecifier)node).getName();
@ -227,6 +278,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
} }
} }
@Override
public IBinding resolveTemplateParameter(ICPPTemplateParameter templateParameter) { public IBinding resolveTemplateParameter(ICPPTemplateParameter templateParameter) {
int pos= templateParameter.getParameterPosition(); int pos= templateParameter.getParameterPosition();
@ -286,6 +338,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations() * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations()
*/ */
@Override
public IASTNode[] getDeclarations() { public IASTNode[] getDeclarations() {
return declarations; return declarations;
} }
@ -293,14 +346,17 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition() * @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
*/ */
@Override
public IASTNode getDefinition() { public IASTNode getDefinition() {
return definition; return definition;
} }
@Override
public ILinkage getLinkage() { public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE; return Linkage.CPP_LINKAGE;
} }
@Override
public final IBinding getOwner() { public final IBinding getOwner() {
IASTName templateName= getTemplateName(); IASTName templateName= getTemplateName();
if (templateName == null) if (templateName == null)

View file

@ -57,10 +57,12 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
fIsParameterPack= isPack; fIsParameterPack= isPack;
} }
@Override
public final boolean isParameterPack() { public final boolean isParameterPack() {
return fIsParameterPack; return fIsParameterPack;
} }
@Override
public ICPPScope asScope() { public ICPPScope asScope() {
if (unknownScope == null) { if (unknownScope == null) {
IASTName n = null; IASTName n = null;
@ -72,6 +74,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return unknownScope; return unknownScope;
} }
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
if (templateParameters == null) { if (templateParameters == null) {
ICPPASTTemplatedTypeTemplateParameter template = (ICPPASTTemplatedTypeTemplateParameter) getPrimaryDeclaration().getParent(); ICPPASTTemplatedTypeTemplateParameter template = (ICPPASTTemplatedTypeTemplateParameter) getPrimaryDeclaration().getParent();
@ -88,6 +91,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return templateParameters; return templateParameters;
} }
@Override
public IBinding resolveTemplateParameter(ICPPTemplateParameter templateParameter) { public IBinding resolveTemplateParameter(ICPPTemplateParameter templateParameter) {
return templateParameter; return templateParameter;
} }
@ -96,6 +100,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
} }
@Override
public IType getDefault() { public IType getDefault() {
IASTName[] nds = getDeclarations(); IASTName[] nds = getDeclarations();
if (nds == null || nds.length == 0) if (nds == null || nds.length == 0)
@ -120,6 +125,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return null; return null;
} }
@Override
public ICPPTemplateArgument getDefaultValue() { public ICPPTemplateArgument getDefaultValue() {
IType d= getDefault(); IType d= getDefault();
if (d == null) if (d == null)
@ -128,46 +134,59 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return new CPPTemplateArgument(d); return new CPPTemplateArgument(d);
} }
@Override
public ICPPBase[] getBases() { public ICPPBase[] getBases() {
return ICPPBase.EMPTY_BASE_ARRAY; return ICPPBase.EMPTY_BASE_ARRAY;
} }
@Override
public IField[] getFields() { public IField[] getFields() {
return IField.EMPTY_FIELD_ARRAY; return IField.EMPTY_FIELD_ARRAY;
} }
@Override
public IField findField(String name) { public IField findField(String name) {
return null; return null;
} }
@Override
public ICPPField[] getDeclaredFields() { public ICPPField[] getDeclaredFields() {
return ICPPField.EMPTY_CPPFIELD_ARRAY; return ICPPField.EMPTY_CPPFIELD_ARRAY;
} }
@Override
public ICPPMethod[] getMethods() { public ICPPMethod[] getMethods() {
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
} }
@Override
public ICPPMethod[] getAllDeclaredMethods() { public ICPPMethod[] getAllDeclaredMethods() {
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
} }
@Override
public ICPPMethod[] getDeclaredMethods() { public ICPPMethod[] getDeclaredMethods() {
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
} }
@Override
public ICPPConstructor[] getConstructors() { public ICPPConstructor[] getConstructors() {
return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY;
} }
@Override
public IBinding[] getFriends() { public IBinding[] getFriends() {
return IBinding.EMPTY_BINDING_ARRAY; return IBinding.EMPTY_BINDING_ARRAY;
} }
@Override
public ICPPClassType[] getNestedClasses() { public ICPPClassType[] getNestedClasses() {
return ICPPClassType.EMPTY_CLASS_ARRAY; return ICPPClassType.EMPTY_CLASS_ARRAY;
} }
@Override
public int getKey() { public int getKey() {
return 0; return 0;
} }
@Override
public IScope getCompositeScope() { public IScope getCompositeScope() {
return null; return null;
} }
public boolean isSameType(IType type) { @Override
public boolean isSameType(IType type) {
if (type == this) if (type == this)
return true; return true;
if (type instanceof ITypedef) if (type instanceof ITypedef)
@ -178,10 +197,12 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return getParameterID() == ((ICPPTemplateParameter) type).getParameterID(); return getParameterID() == ((ICPPTemplateParameter) type).getParameterID();
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { @Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
} }
@Override
public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
@ -189,6 +210,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
instances.put(key, instance); instances.put(key, instance);
} }
@Override
public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) { if (instances != null) {
String key= ASTTypeUtil.getArgumentListString(arguments, true); String key= ASTTypeUtil.getArgumentListString(arguments, true);
@ -197,6 +219,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return null; return null;
} }
@Override
public ICPPTemplateInstance[] getAllInstances() { public ICPPTemplateInstance[] getAllInstances() {
if (instances != null) { if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()]; ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
@ -208,14 +231,17 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return ICPPTemplateInstance.EMPTY_TEMPLATE_INSTANCE_ARRAY; return ICPPTemplateInstance.EMPTY_TEMPLATE_INSTANCE_ARRAY;
} }
@Override
public IASTName getUnknownName() { public IASTName getUnknownName() {
return new CPPASTName(getNameCharArray()); return new CPPASTName(getNameCharArray());
} }
@Override
public boolean isAnonymous() { public boolean isAnonymous() {
return false; return false;
} }
@Override
public ICPPDeferredClassInstance asDeferredInstance() { public ICPPDeferredClassInstance asDeferredInstance() {
return null; return null;
} }

View file

@ -36,7 +36,8 @@ public class CompositeCPPClassTemplate extends CompositeCPPClassType
super(cf, ct); super(cf, ct);
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { @Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
try { try {
final CIndex cIndex = (CIndex) ((CPPCompositesFactory) cf).getContext(); final CIndex cIndex = (CIndex) ((CPPCompositesFactory) cf).getContext();
IIndexFragmentBinding[] bindings = cIndex.findEquivalentBindings(rbinding); IIndexFragmentBinding[] bindings = cIndex.findEquivalentBindings(rbinding);
@ -59,22 +60,27 @@ public class CompositeCPPClassTemplate extends CompositeCPPClassType
} }
} }
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
return TemplateInstanceUtil.convert(cf, ((ICPPClassTemplate) rbinding).getTemplateParameters()); return TemplateInstanceUtil.convert(cf, ((ICPPClassTemplate) rbinding).getTemplateParameters());
} }
@Override
public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments);
} }
@Override
public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance);
} }
@Override
public ICPPTemplateInstance[] getAllInstances() { public ICPPTemplateInstance[] getAllInstances() {
return CompositeInstanceCache.getCache(cf, rbinding).getAllInstances(); return CompositeInstanceCache.getCache(cf, rbinding).getAllInstances();
} }
@Override
public ICPPDeferredClassInstance asDeferredInstance() throws DOMException { public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
CompositeInstanceCache cache= CompositeInstanceCache.getCache(cf, rbinding); CompositeInstanceCache cache= CompositeInstanceCache.getCache(cf, rbinding);
synchronized (cache) { synchronized (cache) {

View file

@ -32,8 +32,8 @@ CompositeCPPClassSpecialization implements ICPPClassTemplate, ICPPInstanceCache{
super(cf, rbinding); super(cf, rbinding);
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() @Override
throws DOMException { public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
ICPPClassTemplatePartialSpecialization[] result= ((ICPPClassTemplate) rbinding).getPartialSpecializations(); ICPPClassTemplatePartialSpecialization[] result= ((ICPPClassTemplate) rbinding).getPartialSpecializations();
for (int i= 0; i < result.length; i++) { for (int i= 0; i < result.length; i++) {
result[i]= (ICPPClassTemplatePartialSpecialization) cf.getCompositeBinding((IIndexFragmentBinding)result[i]); result[i]= (ICPPClassTemplatePartialSpecialization) cf.getCompositeBinding((IIndexFragmentBinding)result[i]);
@ -41,23 +41,28 @@ CompositeCPPClassSpecialization implements ICPPClassTemplate, ICPPInstanceCache{
return result; return result;
} }
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
return TemplateInstanceUtil.convert(cf, ((ICPPClassTemplate) rbinding).getTemplateParameters()); return TemplateInstanceUtil.convert(cf, ((ICPPClassTemplate) rbinding).getTemplateParameters());
} }
@Override
public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments);
} }
@Override
public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance);
} }
@Override
public ICPPTemplateInstance[] getAllInstances() { public ICPPTemplateInstance[] getAllInstances() {
return CompositeInstanceCache.getCache(cf, rbinding).getAllInstances(); return CompositeInstanceCache.getCache(cf, rbinding).getAllInstances();
} }
@Override
public ICPPDeferredClassInstance asDeferredInstance() throws DOMException { public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
CompositeInstanceCache cache= CompositeInstanceCache.getCache(cf, rbinding); CompositeInstanceCache cache= CompositeInstanceCache.getCache(cf, rbinding);
synchronized (cache) { synchronized (cache) {

View file

@ -87,6 +87,7 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType
return IIndexCPPBindingConstants.CPP_CLASS_TEMPLATE; return IIndexCPPBindingConstants.CPP_CLASS_TEMPLATE;
} }
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
if (params == null) { if (params == null) {
try { try {
@ -209,7 +210,8 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType
getDB().putRecPtr(record + FIRST_PARTIAL, partial.getRecord()); getDB().putRecPtr(record + FIRST_PARTIAL, partial.getRecord());
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { @Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
try { try {
ArrayList<PDOMCPPClassTemplatePartialSpecialization> partials = ArrayList<PDOMCPPClassTemplatePartialSpecialization> partials =
new ArrayList<PDOMCPPClassTemplatePartialSpecialization>(); new ArrayList<PDOMCPPClassTemplatePartialSpecialization>();
@ -262,18 +264,22 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType
return SemanticUtil.isSameOwner(getOwner(), ctype.getOwner()); return SemanticUtil.isSameOwner(getOwner(), ctype.getOwner());
} }
@Override
public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return PDOMInstanceCache.getCache(this).getInstance(arguments); return PDOMInstanceCache.getCache(this).getInstance(arguments);
} }
@Override
public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
PDOMInstanceCache.getCache(this).addInstance(arguments, instance); PDOMInstanceCache.getCache(this).addInstance(arguments, instance);
} }
@Override
public ICPPTemplateInstance[] getAllInstances() { public ICPPTemplateInstance[] getAllInstances() {
return PDOMInstanceCache.getCache(this).getAllInstances(); return PDOMInstanceCache.getCache(this).getAllInstances();
} }
@Override
public ICPPTemplateParameter adaptTemplateParameter(ICPPTemplateParameter param) { public ICPPTemplateParameter adaptTemplateParameter(ICPPTemplateParameter param) {
// Template parameters are identified by their position in the parameter list. // Template parameters are identified by their position in the parameter list.
int pos = param.getParameterPosition(); int pos = param.getParameterPosition();
@ -296,6 +302,7 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType
return null; return null;
} }
@Override
public ICPPDeferredClassInstance asDeferredInstance() throws DOMException { public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
PDOMInstanceCache cache= PDOMInstanceCache.getCache(this); PDOMInstanceCache cache= PDOMInstanceCache.getCache(this);
synchronized (cache) { synchronized (cache) {

View file

@ -11,7 +11,6 @@
package org.eclipse.cdt.internal.core.pdom.dom.cpp; package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
@ -67,7 +66,7 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla
} }
@Override @Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
} }
@ -102,6 +101,7 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla
return CPPClassTemplatePartialSpecialization.isSamePartialClassSpecialization(this, rhs); return CPPClassTemplatePartialSpecialization.isSamePartialClassSpecialization(this, rhs);
} }
@Override
public ICPPClassTemplate getPrimaryClassTemplate() { public ICPPClassTemplate getPrimaryClassTemplate() {
if (fPrimaryTemplate == null) { if (fPrimaryTemplate == null) {
try { try {
@ -114,6 +114,7 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla
return fPrimaryTemplate; return fPrimaryTemplate;
} }
@Override
public void setArguments(ICPPTemplateArgument[] templateArguments) throws CoreException { public void setArguments(ICPPTemplateArgument[] templateArguments) throws CoreException {
final Database db = getPDOM().getDB(); final Database db = getPDOM().getDB();
long oldRec = db.getRecPtr(record+ARGUMENTS); long oldRec = db.getRecPtr(record+ARGUMENTS);
@ -124,6 +125,7 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla
} }
} }
@Override
public ICPPTemplateArgument[] getTemplateArguments() { public ICPPTemplateArgument[] getTemplateArguments() {
try { try {
final long rec= getPDOM().getDB().getRecPtr(record+ARGUMENTS); final long rec= getPDOM().getDB().getRecPtr(record+ARGUMENTS);
@ -134,6 +136,7 @@ class PDOMCPPClassTemplatePartialSpecializationSpecialization extends PDOMCPPCla
} }
} }
@Override
@Deprecated @Deprecated
public IType[] getArguments() { public IType[] getArguments() {
return CPPTemplates.getArguments(getTemplateArguments()); return CPPTemplates.getArguments(getTemplateArguments());

View file

@ -64,19 +64,23 @@ class PDOMCPPClassTemplateSpecialization extends PDOMCPPClassSpecialization
return IIndexCPPBindingConstants.CPP_CLASS_TEMPLATE_SPECIALIZATION; return IIndexCPPBindingConstants.CPP_CLASS_TEMPLATE_SPECIALIZATION;
} }
@Override
public ICPPTemplateParameter[] getTemplateParameters() { public ICPPTemplateParameter[] getTemplateParameters() {
ICPPClassTemplate template = (ICPPClassTemplate) getSpecializedBinding(); ICPPClassTemplate template = (ICPPClassTemplate) getSpecializedBinding();
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
@Override
public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return PDOMInstanceCache.getCache(this).getInstance(arguments); return PDOMInstanceCache.getCache(this).getInstance(arguments);
} }
@Override
public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
PDOMInstanceCache.getCache(this).addInstance(arguments, instance); PDOMInstanceCache.getCache(this).addInstance(arguments, instance);
} }
@Override
public ICPPTemplateInstance[] getAllInstances() { public ICPPTemplateInstance[] getAllInstances() {
return PDOMInstanceCache.getCache(this).getAllInstances(); return PDOMInstanceCache.getCache(this).getAllInstances();
} }
@ -153,7 +157,8 @@ class PDOMCPPClassTemplateSpecialization extends PDOMCPPClassSpecialization
return ((ICPPClassType) owner1).isSameType((ICPPClassType) owner2); return ((ICPPClassType) owner1).isSameType((ICPPClassType) owner2);
} }
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { @Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
ICPPClassTemplate origTemplate= (ICPPClassTemplate) getSpecializedBinding(); ICPPClassTemplate origTemplate= (ICPPClassTemplate) getSpecializedBinding();
ICPPClassTemplatePartialSpecialization[] orig = origTemplate.getPartialSpecializations(); ICPPClassTemplatePartialSpecialization[] orig = origTemplate.getPartialSpecializations();
ICPPClassTemplatePartialSpecialization[] spec = new ICPPClassTemplatePartialSpecialization[orig.length]; ICPPClassTemplatePartialSpecialization[] spec = new ICPPClassTemplatePartialSpecialization[orig.length];
@ -163,6 +168,7 @@ class PDOMCPPClassTemplateSpecialization extends PDOMCPPClassSpecialization
return spec; return spec;
} }
@Override
public ICPPDeferredClassInstance asDeferredInstance() throws DOMException { public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
PDOMInstanceCache cache= PDOMInstanceCache.getCache(this); PDOMInstanceCache cache= PDOMInstanceCache.getCache(this);
synchronized (cache) { synchronized (cache) {