1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-05 08:46: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 {
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.model.ICProject;
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.TestSourceReader;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMProjectIndexLocationConverter;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
/**
* Tests behavior related to location representation in the PDOM
@ -40,15 +37,13 @@ public class PDOMLocationTests extends BaseTestCase {
return suite(PDOMLocationTests.class);
}
@Override
protected void setUp() throws Exception {
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();
}
@Override
protected void tearDown() throws Exception {
if (cproject != null) {
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.
*/
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.

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.IASTName;
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.IField;
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.ICPPTemplateArgument;
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.IIndexFileSet;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
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,
ICPPInternalClassTemplate, ICPPInternalClassTypeMixinHost {
private ICPPClassTemplate fIndexBinding= null;
private boolean checkedIndex= false;
private ICPPClassTemplatePartialSpecialization[] partialSpecializations = null;
private ICPPDeferredClassInstance fDeferredInstance;
private boolean addedPartialSpecializationsOfIndex;
public CPPClassTemplate(IASTName name) {
super(name);
}
public void checkForDefinition() {
@Override
public void checkForDefinition() {
// Ambiguity resolution ensures that definitions are resolved.
}
@Override
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.append(
ICPPClassTemplatePartialSpecialization.class, partialSpecializations, spec);
}
@Override
public ICPPASTCompositeTypeSpecifier getCompositeTypeSpecifier() {
if (definition != null) {
IASTNode node = definition.getParent();
@ -78,6 +77,7 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return null;
}
@Override
public ICPPClassScope getCompositeScope() {
if (definition == null) {
checkForDefinition();
@ -93,15 +93,16 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
}
// Forward declarations must be backed up from the index.
checkForIndexBinding();
if (fIndexBinding != null) {
IScope scope = fIndexBinding.getCompositeScope();
ICPPClassTemplate ib = getIndexBinding();
if (ib != null) {
IScope scope = ib.getCompositeScope();
if (scope instanceof ICPPClassScope)
return (ICPPClassScope) scope;
}
return null;
}
@Override
public int getKey() {
if (definition != null) {
ICPPASTCompositeTypeSpecifier cts= getCompositeTypeSpecifier();
@ -124,11 +125,25 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return ICPPASTElaboratedTypeSpecifier.k_class;
}
@Override
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);
return partialSpecializations;
}
@Override
public boolean isSameType(IType type) {
if (type == this)
return true;
@ -137,42 +152,52 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return false;
}
@Override
public ICPPBase[] getBases() {
return ClassTypeHelper.getBases(this);
}
@Override
public IField[] getFields() {
return ClassTypeHelper.getFields(this);
}
@Override
public ICPPField[] getDeclaredFields() {
return ClassTypeHelper.getDeclaredFields(this);
}
@Override
public ICPPMethod[] getMethods() {
return ClassTypeHelper.getMethods(this);
}
@Override
public ICPPMethod[] getAllDeclaredMethods() {
return ClassTypeHelper.getAllDeclaredMethods(this);
}
@Override
public ICPPMethod[] getDeclaredMethods() {
return ClassTypeHelper.getDeclaredMethods(this);
}
@Override
public ICPPConstructor[] getConstructors() {
return ClassTypeHelper.getConstructors(this);
}
@Override
public IBinding[] getFriends() {
return ClassTypeHelper.getFriends(this);
}
@Override
public ICPPClassType[] getNestedClasses() {
return ClassTypeHelper.getNestedClasses(this);
}
@Override
public IField findField(String name) {
return ClassTypeHelper.findField(this, name);
}
@ -194,10 +219,12 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return ASTTypeUtil.getType(this);
}
@Override
public boolean isAnonymous() {
return false;
}
@Override
public final ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
if (fDeferredInstance == null) {
fDeferredInstance= createDeferredInstance();
@ -210,10 +237,11 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
return new CPPDeferredClassInstance(this, args, getCompositeScope());
}
@Override
public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException {
checkForIndexBinding();
if (fIndexBinding != null) {
ICPPTemplateParameter[] params = fIndexBinding.getTemplateParameters();
ICPPClassTemplate ib = getIndexBinding();
if (ib != null) {
ICPPTemplateParameter[] params = ib.getTemplateParameters();
if (paramPos < params.length) {
ICPPTemplateParameter param = params[paramPos];
return param.getDefaultValue();
@ -221,21 +249,4 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass
}
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;
}
@Override
public ICPPTemplateParameter[] getTemplateParameters() {
ICPPClassTemplatePartialSpecialization template = (ICPPClassTemplatePartialSpecialization) getSpecializedBinding();
return template.getTemplateParameters();
}
@Override
public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null)
instances = new ObjectMap(2);
@ -52,6 +54,7 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
instances.put(key, instance);
}
@Override
public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) {
String key= ASTTypeUtil.getArgumentListString(arguments, true);
@ -60,6 +63,7 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return null;
}
@Override
public synchronized ICPPTemplateInstance[] getAllInstances() {
if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
@ -71,10 +75,12 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return ICPPTemplateInstance.EMPTY_TEMPLATE_INSTANCE_ARRAY;
}
@Override
public IBinding resolveTemplateParameter(ICPPTemplateParameter param) {
return param;
}
@Override
public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
if (fDeferredInstance == null) {
ICPPTemplateArgument[] args = CPPTemplates.templateParametersAsArguments(getTemplateParameters());
@ -83,10 +89,12 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return fDeferredInstance;
}
@Override
public ICPPClassTemplate getPrimaryClassTemplate() {
return fClassTemplate;
}
@Override
public ICPPTemplateArgument[] getTemplateArguments() throws DOMException {
ICPPTemplateArgument[] args = ((ICPPClassTemplatePartialSpecialization) getSpecializedBinding()).getTemplateArguments();
final IBinding owner = getOwner();
@ -96,10 +104,12 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return CPPTemplates.instantiateArguments(args, getTemplateParameterMap(), -1, null);
}
@Override
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
}
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException {
@Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
}
@ -118,11 +128,13 @@ public class CPPClassTemplatePartialSpecializationSpecialization extends CPPClas
return CPPTemplates.getArgumentMap(getPrimaryClassTemplate(), getTemplateParameterMap());
}
@Override
@Deprecated
public IType[] getArguments() throws DOMException {
return CPPTemplates.getArguments(getTemplateArguments());
}
@Override
public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException {
// no default arguments for partial specializations
return null;

View file

@ -39,7 +39,8 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
super(orig, owner, argumentMap);
}
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException {
@Override
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() {
if (fPartialSpecs == null) {
ICPPClassTemplate origTemplate= (ICPPClassTemplate) getSpecializedBinding();
ICPPClassTemplatePartialSpecialization[] orig = origTemplate.getPartialSpecializations();
@ -52,6 +53,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return fPartialSpecs;
}
@Override
public ICPPTemplateParameter[] getTemplateParameters() {
// mstodo if we specialize the template parameters (because of its default values), it will
// be less error prone to use the defaults.
@ -59,6 +61,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return template.getTemplateParameters();
}
@Override
public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null)
instances = new ObjectMap(2);
@ -66,6 +69,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
instances.put(key, instance);
}
@Override
public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) {
String key= ASTTypeUtil.getArgumentListString(arguments, true);
@ -74,6 +78,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return null;
}
@Override
public synchronized ICPPTemplateInstance[] getAllInstances() {
if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
@ -85,6 +90,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return ICPPTemplateInstance.EMPTY_TEMPLATE_INSTANCE_ARRAY;
}
@Override
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
}
@ -93,10 +99,12 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return getName();
}
@Override
public IBinding resolveTemplateParameter(ICPPTemplateParameter param) {
return param;
}
@Override
public ICPPDeferredClassInstance asDeferredInstance() throws DOMException {
if (fDeferredInstance == null) {
ICPPTemplateArgument[] args = CPPTemplates.templateParametersAsArguments(getTemplateParameters());
@ -105,6 +113,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return fDeferredInstance;
}
@Override
public ICPPTemplateArgument getDefaultArgFromIndex(int paramPos) throws DOMException {
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.IASTName;
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.IScope;
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.ICPPASTTemplateDeclaration;
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.ICPPTemplateArgument;
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.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.ObjectMap;
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) {
super(node, id, arg);
}
@Override
public ICPPTemplateParameter[] getTemplateParameters() {
return ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY;
}
@ -62,6 +67,10 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
private ICPPTemplateParameter[] templateParameters;
private ObjectMap instances;
private ICPPClassTemplate indexBinding= null;
private boolean checkedIndex= false;
public CPPTemplateDefinition(IASTName name) {
if (name != null) {
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) {
if (instances == null)
instances = new ObjectMap(2);
@ -92,14 +102,46 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
instances.put(key, instance);
}
@Override
public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) {
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;
}
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() {
if (instances != null) {
ICPPTemplateInstance[] result= new ICPPTemplateInstance[instances.size()];
@ -122,6 +164,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
*/
@Override
public String getName() {
return new String(getNameCharArray());
}
@ -129,6 +172,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray()
*/
@Override
public char[] getNameCharArray() {
return getTemplateName().getSimpleID();
}
@ -136,6 +180,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
*/
@Override
public IScope getScope() {
return CPPVisitor.getContainingScope(getTemplateName());
}
@ -143,6 +188,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
*/
@Override
public String[] getQualifiedName() {
return CPPVisitor.getQualifiedName(this);
}
@ -150,6 +196,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray()
*/
@Override
public char[][] getQualifiedNameCharArray() {
return CPPVisitor.getQualifiedNameCharArray(this);
}
@ -157,6 +204,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified()
*/
@Override
public boolean isGloballyQualified() {
return true;
}
@ -164,6 +212,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition#getParameters()
*/
@Override
public ICPPTemplateParameter[] getTemplateParameters() {
if (templateParameters == null) {
ICPPASTTemplateDeclaration template = CPPTemplates.getTemplateDeclaration(getTemplateName());
@ -186,6 +235,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
*/
@Override
public void addDefinition(IASTNode node) {
if (node instanceof ICPPASTCompositeTypeSpecifier) {
node = ((ICPPASTCompositeTypeSpecifier)node).getName();
@ -203,6 +253,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
*/
@Override
public void addDeclaration(IASTNode node) {
if (node instanceof ICPPASTElaboratedTypeSpecifier) {
node = ((ICPPASTElaboratedTypeSpecifier)node).getName();
@ -227,6 +278,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
}
}
@Override
public IBinding resolveTemplateParameter(ICPPTemplateParameter templateParameter) {
int pos= templateParameter.getParameterPosition();
@ -286,6 +338,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations()
*/
@Override
public IASTNode[] getDeclarations() {
return declarations;
}
@ -293,14 +346,17 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
*/
@Override
public IASTNode getDefinition() {
return definition;
}
@Override
public ILinkage getLinkage() {
return Linkage.CPP_LINKAGE;
}
@Override
public final IBinding getOwner() {
IASTName templateName= getTemplateName();
if (templateName == null)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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