diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index fb7d83c9b36..b837c87a7a6 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -1901,4 +1901,33 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa public void testUsageOfClassTemplateOutsideOfClassBody_357320() throws Exception { getBindingFromASTName("m1", 0, ICPPMethod.class); } + + // template struct foo; + // template <> struct foo { + // typedef int type; + // }; + + // #include "header.h" + // template struct foo {}; + // int main() { + // typedef foo::type type; // ERROR HERE: 'foo::type' could not be + // } + public void testSpecializationInIndex_367563a() throws Exception { + getBindingFromASTName("type type", 4, ITypedef.class); + } + + // template struct foo; + // template struct foo { + // typedef int type; + // }; + + // #include "header.h" + // template struct foo {}; + // int main() { + // typedef foo::type type; // ERROR HERE: 'foo::type' could not be + // } + public void testSpecializationInIndex_367563b() throws Exception { + getBindingFromASTName("type type", 4, ITypedef.class); + } + } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMLocationTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMLocationTests.java index a6f3912954b..fd3d21f10ee 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMLocationTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMLocationTests.java @@ -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()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplate.java index 081f8a203ff..d15b346c59b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplate.java @@ -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. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java index 09640c55525..dbf7c43a78b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java @@ -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); - } - } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecializationSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecializationSpecialization.java index da05c75aa7e..5a2698fb02c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecializationSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecializationSpecialization.java @@ -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; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java index 8d142cffb2c..1e971a0d7a1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java @@ -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; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java index 507c814dd11..c914bbe3eb2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java @@ -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) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java index 93e731538bf..38afe6913f3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java @@ -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; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java index 63d63da979e..455ea46095d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplate.java @@ -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) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java index 112644297ae..4d419dd02a6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplateSpecialization.java @@ -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) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java index cb9d3a847a3..01c73df88c7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java @@ -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 partials = new ArrayList(); @@ -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) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java index 1fe83dd4e0c..5f8780bad84 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecializationSpecialization.java @@ -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()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java index 4ace683587b..4e2c110e1bd 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java @@ -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) {