From bbdc82b058da2682d9cc0e199fead13ee300ef0f Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Fri, 24 Oct 2008 13:53:22 +0000 Subject: [PATCH] Removes references to deprecated API related to template arguments, bug 242668. --- .../tests/IndexCPPBindingResolutionBugs.java | 4 +- .../tests/IndexCPPTemplateResolutionTest.java | 8 +- .../eclipse/cdt/core/dom/ast/ASTTypeUtil.java | 2 +- ...CPPClassTemplatePartialSpecialization.java | 12 +- .../dom/ast/cpp/ICPPTemplateArgument.java | 6 + .../ast/cpp/ICPPTemplateNonTypeParameter.java | 13 +- .../dom/ast/cpp/ICPPTemplateParameter.java | 6 + .../dom/ast/cpp/ICPPTemplateParameterMap.java | 7 + .../cpp/ICPPTemplateTemplateParameter.java | 10 +- .../cdt/internal/core/dom/parser/Value.java | 15 + .../AbstractCPPClassSpecializationScope.java | 6 +- .../core/dom/parser/cpp/CPPClassInstance.java | 1 - .../parser/cpp/CPPClassSpecialization.java | 8 +- ...CPPClassTemplatePartialSpecialization.java | 37 +- .../cpp/CPPClassTemplateSpecialization.java | 12 +- .../parser/cpp/CPPConstructorInstance.java | 1 - .../cpp/CPPConstructorSpecialization.java | 4 +- .../CPPConstructorTemplateSpecialization.java | 4 +- .../parser/cpp/CPPDeferredClassInstance.java | 7 +- .../cpp/CPPDeferredFunctionInstance.java | 21 +- .../parser/cpp/CPPFieldSpecialization.java | 4 +- .../dom/parser/cpp/CPPFunctionInstance.java | 1 - .../parser/cpp/CPPFunctionSpecialization.java | 6 +- .../CPPFunctionTemplateSpecialization.java | 12 +- .../dom/parser/cpp/CPPMethodInstance.java | 1 - .../parser/cpp/CPPMethodSpecialization.java | 4 +- .../cpp/CPPMethodTemplateSpecialization.java | 4 +- .../cpp/CPPParameterSpecialization.java | 4 +- .../dom/parser/cpp/CPPSpecialization.java | 14 +- .../dom/parser/cpp/CPPTemplateArgument.java | 15 +- .../dom/parser/cpp/CPPTemplateDefinition.java | 8 +- .../cpp/CPPTemplateNonTypeParameter.java | 12 + .../parser}/cpp/CPPTemplateParameterMap.java | 40 +- .../cpp/CPPTemplateTemplateParameter.java | 17 +- .../parser/cpp/CPPTemplateTypeParameter.java | 9 + .../parser/cpp/CPPTypedefSpecialization.java | 4 +- .../parser/cpp/CPPUnknownClassInstance.java | 16 +- .../core/dom/parser/cpp/CPPUnknownScope.java | 4 +- .../dom/parser/cpp/ICPPInstanceCache.java | 7 +- .../parser/cpp/ICPPUnknownClassInstance.java | 7 +- .../parser/cpp/semantics/CPPSemantics.java | 54 +- .../parser/cpp/semantics/CPPTemplates.java | 688 ++++++++++-------- .../parser/cpp/semantics/SemanticUtil.java | 30 + .../core/index/IndexCPPSignatureUtil.java | 81 ++- .../cpp/CompositeCPPClassSpecialization.java | 4 +- .../cpp/CompositeCPPClassTemplate.java | 6 +- ...CPPClassTemplatePartialSpecialization.java | 2 +- ...mpositeCPPClassTemplateSpecialization.java | 6 +- .../CompositeCPPDeferredClassInstance.java | 1 - .../cpp/CompositeCPPFieldSpecialization.java | 2 +- .../CompositeCPPFunctionSpecialization.java | 2 +- .../cpp/CompositeCPPFunctionTemplate.java | 6 +- ...siteCPPFunctionTemplateSpecialization.java | 6 +- .../CompositeCPPParameterSpecialization.java | 2 +- .../CompositeCPPTemplateNonTypeParameter.java | 20 +- .../CompositeCPPTemplateTypeParameter.java | 9 + .../CompositeCPPTypedefSpecialization.java | 2 +- .../cpp/CompositeCPPUnknownClassInstance.java | 18 +- .../composite/cpp/CompositeInstanceCache.java | 8 +- .../composite/cpp/TemplateInstanceUtil.java | 4 +- .../eclipse/cdt/internal/core/pdom/PDOM.java | 34 +- .../dom/cpp/PDOMCPPClassSpecialization.java | 8 +- .../pdom/dom/cpp/PDOMCPPClassTemplate.java | 5 +- ...CPPClassTemplatePartialSpecialization.java | 16 +- .../PDOMCPPClassTemplateSpecialization.java | 5 +- .../pdom/dom/cpp/PDOMCPPFunctionTemplate.java | 6 +- ...PDOMCPPFunctionTemplateSpecialization.java | 6 +- .../cpp/PDOMCPPTemplateNonTypeParameter.java | 32 +- .../dom/cpp/PDOMCPPTemplateParameterMap.java | 6 +- .../dom/cpp/PDOMCPPTemplateTypeParameter.java | 10 + .../dom/cpp/PDOMCPPUnknownClassInstance.java | 48 +- .../core/pdom/dom/cpp/PDOMInstanceCache.java | 8 +- .../ui/indexview/IndexLabelProvider.java | 40 +- 73 files changed, 891 insertions(+), 657 deletions(-) rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/{core/dom/ast => internal/core/dom/parser}/cpp/CPPTemplateParameterMap.java (73%) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java index adf0d52b936..9275b81226a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java @@ -41,6 +41,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +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; @@ -50,6 +51,7 @@ import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexMacro; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.core.runtime.CoreException; @@ -218,7 +220,7 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas assertInstance(b1, ICPPInstanceCache.class); ICPPInstanceCache ct= (ICPPInstanceCache) b1; - ICPPSpecialization inst= ct.getInstance(new IType[]{(IType)b0}); + ICPPSpecialization inst= ct.getInstance(new ICPPTemplateArgument[]{new CPPTemplateArgument((IType)b0)}); assertInstance(inst, ICPPClassType.class); ICPPClassType c2t= (ICPPClassType) inst; ICPPBase[] bases= c2t.getBases(); 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 81999681de1..97a53bc24f9 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 @@ -40,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +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.ICPPTemplateNonTypeParameter; @@ -52,6 +53,7 @@ import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecializationScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.index.IIndexScope; @@ -1480,11 +1482,11 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa ICPPTemplateInstance inst= (ICPPTemplateInstance) t1; final ICPPTemplateDefinition tmplDef = inst.getTemplateDefinition(); - IBinding inst2= CPPTemplates.instantiate(tmplDef, inst.getArguments()); + IBinding inst2= CPPTemplates.instantiate(tmplDef, inst.getTemplateArguments()); assertSame(inst, inst2); - IBinding charInst1= CPPTemplates.instantiate(tmplDef, new IType[] {new CPPBasicType(IBasicType.t_char, 0)}); - IBinding charInst2= CPPTemplates.instantiate(tmplDef, new IType[] {new CPPBasicType(IBasicType.t_char, 0)}); + IBinding charInst1= CPPTemplates.instantiate(tmplDef, new ICPPTemplateArgument[] {new CPPTemplateArgument(new CPPBasicType(IBasicType.t_char, 0))}); + IBinding charInst2= CPPTemplates.instantiate(tmplDef, new ICPPTemplateArgument[] {new CPPTemplateArgument(new CPPBasicType(IBasicType.t_char, 0))}); assertSame(charInst1, charInst2); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java index 75c76051f3c..70e3e79e474 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java @@ -138,7 +138,7 @@ public class ASTTypeUtil { if (arg.isNonTypeValue()) return arg.getNonTypeValue().getCanonicalRepresentation(); - return getTypeString(arg.getTypeValue(), normalize); + return getType(arg.getTypeValue(), normalize); } /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplatePartialSpecialization.java index d18e43f8eeb..47f47537491 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassTemplatePartialSpecialization.java @@ -27,12 +27,6 @@ import org.eclipse.cdt.core.dom.ast.IType; public interface ICPPClassTemplatePartialSpecialization extends ICPPClassTemplate { public static final ICPPClassTemplatePartialSpecialization[] EMPTY_PARTIAL_SPECIALIZATION_ARRAY = new ICPPClassTemplatePartialSpecialization[0]; - /** - * get the arguments to this specialization - */ - public IType [] getArguments() throws DOMException; - - /** * get the ICPPTemplateDefinition which this is a specialization of */ @@ -44,4 +38,10 @@ public interface ICPPClassTemplatePartialSpecialization extends ICPPClassTemplat * @since 5.1 */ public ICPPTemplateArgument[] getTemplateArguments(); + + /** + * @deprecated use {@link #getTemplateArguments()}, instead. + */ + @Deprecated + public IType [] getArguments() throws DOMException; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java index 842174b8a31..9839b3ba5d8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java @@ -27,6 +27,12 @@ public interface ICPPTemplateArgument { */ boolean isNonTypeValue(); + /** + * Returns whether this is a type value, suitable for either a template type or a + * template template parameter. + */ + boolean isTypeValue(); + /** * If this is a type value (suitable for a template type and template template parameters), * the type used as a value is returned. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateNonTypeParameter.java index c6886f20495..26a68cde50f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateNonTypeParameter.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Doug Schaefer (IBM) - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; @@ -16,13 +17,11 @@ import org.eclipse.cdt.core.dom.ast.IVariable; /** * @author Doug Schaefer */ -public interface ICPPTemplateNonTypeParameter extends ICPPTemplateParameter, - IVariable { +public interface ICPPTemplateNonTypeParameter extends ICPPTemplateParameter, IVariable { - /** - * The default value for this parameter. - * + /** + * @deprecated, use {@link ICPPTemplateParameter#getDefaultValue()}. */ + @Deprecated public IASTExpression getDefault(); - } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameter.java index 93d755683c3..1f2e5703894 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameter.java @@ -29,4 +29,10 @@ public interface ICPPTemplateParameter extends ICPPBinding { * @since 5.1 */ int getParameterPosition(); + + /** + * Returns the default value for this template parameter, or null. + * @since 5.1 + */ + ICPPTemplateArgument getDefaultValue(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameterMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameterMap.java index debfba65079..59e21f693bf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameterMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameterMap.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; + /** * Models the mapping of template parameters to values. * @since 5.1 @@ -22,6 +23,12 @@ public interface ICPPTemplateParameterMap { */ public ICPPTemplateArgument getArgument(int paramPosition); + /** + * Returns the value for the template parameter in the map, or null if + * the parameter is not mapped. + */ + public ICPPTemplateArgument getArgument(ICPPTemplateParameter param); + /** * Returns the array of template parameter positions, for which a mapping exists. */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateTemplateParameter.java index 7d0381dbd2e..e5177ad11ca 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateTemplateParameter.java @@ -6,26 +6,22 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Corporation - initial API and implementation + * Andrew Niefer (IBM Corporation) - initial API and implementation *******************************************************************************/ -/* - * Created on Apr 13, 2005 - */ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IType; /** - * @author aniefer + * Template parameters of type template */ public interface ICPPTemplateTemplateParameter extends ICPPTemplateParameter, ICPPClassTemplate { public ICPPTemplateParameter[] getTemplateParameters() throws DOMException; /** - * The default type for this parameter. May be null - * + * Return the default value for this parameter, or null. */ public IType getDefault() throws DOMException; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java index 98329d8a834..80b296162aa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java @@ -81,6 +81,21 @@ public class Value implements IValue { return TYPICAL[(int) value]; return new Value(String.valueOf(value)); } + + public static IValue create(ICPPTemplateNonTypeParameter tntp) { + return new Value(evaluate(tntp)); + } + + public static int isTemplateParameter(IValue tval) { + final String rep= tval.getCanonicalRepresentation(); + if (rep.indexOf('#') == 0 && rep.indexOf(',') == -1) { + try { + return Integer.parseInt(rep.substring(1), 16); + } catch (NumberFormatException e) { + } + } + return -1; + } public static IValue create(IASTExpression expr, int maxRecursionDepth) { try { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java index 88961318028..c1695487b4c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java @@ -29,10 +29,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; 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.ICPPNamespace; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; -import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; @@ -112,12 +112,12 @@ public class AbstractCPPClassSpecializationScope implements ICPPClassSpecializat public ICPPBase[] getBases() throws DOMException { ICPPBase[] result = null; ICPPBase[] bases = specialClass.getSpecializedBinding().getBases(); - final ObjectMap argmap = specialClass.getArgumentMap(); + final ICPPTemplateParameterMap tpmap = specialClass.getTemplateParameterMap(); for (ICPPBase base : bases) { ICPPBase specBase = base.clone(); IBinding origClass = base.getBaseClass(); if (origClass instanceof IType) { - IType specClass= CPPTemplates.instantiateType((IType) origClass, argmap, specialClass); + IType specClass= CPPTemplates.instantiateType((IType) origClass, tpmap, specialClass); specClass = SemanticUtil.getUltimateType(specClass, false); if (specClass instanceof IBinding && !(specClass instanceof IProblemBinding)) { specBase.setBaseClass((IBinding) specClass); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java index 671da1aec62..528f16e78ef 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java @@ -17,7 +17,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index 078d4e2492c..dffccf324bc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -26,7 +26,6 @@ import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; @@ -38,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; 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.ICPPSpecialization; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -50,11 +50,11 @@ import org.eclipse.cdt.internal.core.index.IIndexType; public class CPPClassSpecialization extends CPPSpecialization implements ICPPClassSpecialization, ICPPInternalClassTypeMixinHost { - private CPPClassSpecializationScope specScope; + private ICPPClassSpecializationScope specScope; private ObjectMap specializationMap= ObjectMap.EMPTY_MAP; private boolean checked; - public CPPClassSpecialization(ICPPClassType specialized, IBinding owner, CPPTemplateParameterMap argumentMap) { + public CPPClassSpecialization(ICPPClassType specialized, IBinding owner, ICPPTemplateParameterMap argumentMap) { super(specialized, owner, argumentMap); } @@ -71,7 +71,7 @@ public class CPPClassSpecialization extends CPPSpecialization return result; } - IBinding result= CPPTemplates.createSpecialization(this, original, getArgumentMap()); + IBinding result= CPPTemplates.createSpecialization(this, original, getTemplateParameterMap()); synchronized(this) { IBinding concurrent= (IBinding) specializationMap.get(original); if (concurrent != null) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java index 854c371ecaa..e88af3b2660 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java @@ -11,16 +11,15 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; 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.ICPPSpecialization; 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.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -43,16 +42,10 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate private void createArguments() { if (arguments == null) { - arguments= CPPTemplates.convert( - CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) getTemplateName())); + arguments= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) getTemplateName()); } } - @Deprecated - public IType[] getArguments() { - return CPPTemplates.getArguments(getTemplateArguments()); - } - /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization#getPrimaryClassTemplate() */ @@ -65,22 +58,22 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate return getPrimaryClassTemplate(); } - public CPPTemplateParameterMap getTemplateParameterMap() { - CPPTemplateParameterMap result= new CPPTemplateParameterMap(); - try { - ICPPTemplateParameter[] params = getPrimaryClassTemplate().getTemplateParameters(); - ICPPTemplateArgument[] args= getTemplateArguments(); - int len= Math.min(params.length, args.length); - for (int i = 0; i < len; i++) { - result.put(params[i], args[i]); - } - } catch (DOMException e) { - } - return result; + public ICPPTemplateParameterMap getTemplateParameterMap() { + return CPPTemplates.createParameterMap(getPrimaryClassTemplate(), getTemplateArguments()); } + @Override + public String toString() { + return super.toString() + '<' + ASTTypeUtil.getArgumentListString(getTemplateArguments(), true) + '>'; + } + @Deprecated public ObjectMap getArgumentMap() { return CPPTemplates.getArgumentMap(getPrimaryClassTemplate(), getTemplateParameterMap()); } + + @Deprecated + public IType[] getArguments() { + return CPPTemplates.getArguments(getTemplateArguments()); + } } 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 a96e1b28a12..451e4452f9c 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 @@ -13,13 +13,13 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; 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.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -31,7 +31,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization private ObjectMap instances = null; - public CPPClassTemplateSpecialization(ICPPClassTemplate orig, ICPPClassType owner, CPPTemplateParameterMap argumentMap) { + public CPPClassTemplateSpecialization(ICPPClassTemplate orig, ICPPClassType owner, ICPPTemplateParameterMap argumentMap) { super(orig, owner, argumentMap); } @@ -50,16 +50,16 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization return template.getTemplateParameters(); } - public synchronized void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { if (instances == null) instances = new ObjectMap(2); instances.put(arguments, instance); } - public synchronized ICPPTemplateInstance getInstance(IType[] arguments) { + public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { if (instances != null) { loop: for (int i=0; i < instances.size(); i++) { - IType[] args = (IType[]) instances.keyAt(i); + ICPPTemplateArgument[] args = (ICPPTemplateArgument[]) instances.keyAt(i); if (args.length == arguments.length) { for (int j=0; j < args.length; j++) { if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorInstance.java index b1459c103af..e53fb6d70ba 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorInstance.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorSpecialization.java index 04f086eecf4..dbabf66e8f0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorSpecialization.java @@ -13,9 +13,9 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; /** * Specialization of a constructor for a class-template or class-template specialization @@ -24,7 +24,7 @@ public class CPPConstructorSpecialization extends CPPMethodSpecialization implements ICPPConstructor { public CPPConstructorSpecialization(IBinding orig, ICPPClassType owner, - CPPTemplateParameterMap argMap) { + ICPPTemplateParameterMap argMap) { super(orig, owner, argMap); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorTemplateSpecialization.java index 74f65978409..7eec02e378c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPConstructorTemplateSpecialization.java @@ -13,9 +13,9 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; /** * Specialization of a constructor template @@ -24,7 +24,7 @@ public class CPPConstructorTemplateSpecialization extends CPPMethodTemplateSpeci implements ICPPConstructor { public CPPConstructorTemplateSpecialization(IBinding specialized, - ICPPClassType owner, CPPTemplateParameterMap tpmap) { + ICPPClassType owner, ICPPTemplateParameterMap tpmap) { super(specialized, owner, tpmap); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index b5df0bb7b5e..0b02cecef87 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -12,12 +12,12 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; @@ -103,4 +103,9 @@ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDef public IScope getScope() throws DOMException { return fClassTemplate.getScope(); } + + @Override + public String toString() { + return getName() + ASTTypeUtil.getArgumentListString(fArguments, true); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java index 34378b8511b..9044d4c7b7e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java @@ -19,14 +19,13 @@ import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; 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.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -40,7 +39,7 @@ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements IC private ICPPTemplateArgument[] fArguments; private ICPPFunctionTemplate fFunctionTemplate; - private CPPTemplateParameterMap fArgmap; + private ICPPTemplateParameterMap fArgmap; private IParameter [] fParameters; private IFunctionType fFunctionType; @@ -63,20 +62,10 @@ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements IC return CPPTemplates.getArgumentMap(fFunctionTemplate, getTemplateParameterMap()); } - public CPPTemplateParameterMap getTemplateParameterMap() { + public ICPPTemplateParameterMap getTemplateParameterMap() { // mstodo- deferred function instance and tpmap if (fArgmap == null) { - CPPTemplateParameterMap argmap= new CPPTemplateParameterMap(); - try { - ICPPTemplateParameter[] params= fFunctionTemplate.getTemplateParameters(); - ICPPTemplateArgument[] args= fArguments; - int len= Math.min(params.length, args.length); - for (int i = 0; i < len; i++) { - argmap.put(params[i], args[i]); - } - } catch (DOMException e) { - } - fArgmap= argmap; + fArgmap= CPPTemplates.createParameterMap(fFunctionTemplate, getTemplateArguments()); } return fArgmap; } @@ -110,7 +99,7 @@ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements IC if( fFunctionType == null ){ IFunctionType ft = ((ICPPFunction)getTemplateDefinition()).getType(); IType returnType = ft.getReturnType(); - returnType = CPPTemplates.instantiateType(returnType, getArgumentMap(), null); + returnType = CPPTemplates.instantiateType(returnType, getTemplateParameterMap(), null); fFunctionType = CPPVisitor.createImplicitFunctionType( returnType, getParameters(), null); } return fFunctionType; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java index 789d82e3c6f..3dddadfac83 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java @@ -16,9 +16,9 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.IInternalVariable; import org.eclipse.cdt.internal.core.dom.parser.Value; @@ -29,7 +29,7 @@ public class CPPFieldSpecialization extends CPPSpecialization implements ICPPFie private IType type = null; private IValue value= null; - public CPPFieldSpecialization( IBinding orig, ICPPClassType owner, CPPTemplateParameterMap tpmap) { + public CPPFieldSpecialization( IBinding orig, ICPPClassType owner, ICPPTemplateParameterMap tpmap) { super(orig, owner, tpmap); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionInstance.java index 6a141c2415c..4dcfb346f15 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionInstance.java @@ -16,7 +16,6 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java index 229c2d4ae36..cc3c2fb3fb2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionSpecialization.java @@ -24,10 +24,10 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IScope; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; @@ -39,7 +39,7 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP private IFunctionType type = null; private IParameter[] specializedParams = null; - public CPPFunctionSpecialization(IBinding orig, IBinding owner, CPPTemplateParameterMap argMap) { + public CPPFunctionSpecialization(IBinding orig, IBinding owner, ICPPTemplateParameterMap argMap) { super(orig, owner, argMap); } @@ -242,7 +242,7 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP } catch (DOMException e) { } result.append(t != null ? ASTTypeUtil.getParameterTypeString(t) : "()"); //$NON-NLS-1$ - CPPTemplateParameterMap tpmap= getTemplateParameterMap(); + ICPPTemplateParameterMap tpmap= getTemplateParameterMap(); if (tpmap != null) { result.append(" "); //$NON-NLS-1$ result.append(tpmap.toString()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java index de3f617ff35..14508f7ead7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplateSpecialization.java @@ -13,12 +13,12 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; 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.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -30,7 +30,7 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization private ObjectMap instances = null; - public CPPFunctionTemplateSpecialization(IBinding specialized, ICPPClassType owner, CPPTemplateParameterMap argumentMap) { + public CPPFunctionTemplateSpecialization(IBinding specialized, ICPPClassType owner, ICPPTemplateParameterMap argumentMap) { super(specialized, owner, argumentMap); } @@ -39,16 +39,16 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization return template.getTemplateParameters(); } - public synchronized final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { if (instances == null) instances = new ObjectMap(2); instances.put(arguments, instance); } - public synchronized final ICPPTemplateInstance getInstance(IType[] arguments) { + public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { if (instances != null) { loop: for (int i=0; i < instances.size(); i++) { - IType[] args = (IType[]) instances.keyAt(i); + ICPPTemplateArgument[] args = (ICPPTemplateArgument[]) instances.keyAt(i); if (args.length == arguments.length) { for (int j=0; j < args.length; j++) { if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodInstance.java index b347087203e..e96611519e9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodInstance.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodSpecialization.java index e71e3222d20..0faeba123c2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodSpecialization.java @@ -17,10 +17,10 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; /** * The specialization of a method in the context of a class-specialization. @@ -28,7 +28,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; public class CPPMethodSpecialization extends CPPFunctionSpecialization implements ICPPMethod { - public CPPMethodSpecialization(IBinding orig, ICPPClassType owner, CPPTemplateParameterMap argMap ) { + public CPPMethodSpecialization(IBinding orig, ICPPClassType owner, ICPPTemplateParameterMap argMap ) { super(orig, owner, argMap ); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodTemplateSpecialization.java index 0c75f16ab86..e75a17b0a5e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodTemplateSpecialization.java @@ -13,9 +13,9 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; /** * The specialization of a method template in the context of a class specialization. @@ -24,7 +24,7 @@ public class CPPMethodTemplateSpecialization extends CPPFunctionTemplateSpeciali implements ICPPMethod { public CPPMethodTemplateSpecialization(IBinding specialized, ICPPClassType owner, - CPPTemplateParameterMap ctmap) { + ICPPTemplateParameterMap ctmap) { super(specialized, owner, ctmap); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameterSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameterSpecialization.java index 54267e41f70..465952ee57b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameterSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameterSpecialization.java @@ -15,8 +15,8 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; /** * Binding for a specialization of a parameter. @@ -24,7 +24,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; public class CPPParameterSpecialization extends CPPSpecialization implements ICPPParameter { private IType type = null; - public CPPParameterSpecialization(ICPPParameter orig, IBinding owner, CPPTemplateParameterMap tpmap) { + public CPPParameterSpecialization(ICPPParameter orig, IBinding owner, ICPPTemplateParameterMap tpmap) { super(orig, owner, tpmap); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java index 1a66e1a863c..587cb92cc96 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java @@ -18,12 +18,12 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.Linkage; @@ -40,11 +40,11 @@ import org.eclipse.core.runtime.PlatformObject; public abstract class CPPSpecialization extends PlatformObject implements ICPPSpecialization, ICPPInternalBinding { private IBinding owner; private IBinding specialized; - private CPPTemplateParameterMap argumentMap; + private ICPPTemplateParameterMap argumentMap; protected IASTNode definition; private IASTNode[] declarations; - public CPPSpecialization(IBinding specialized, IBinding owner, CPPTemplateParameterMap argumentMap) { + public CPPSpecialization(IBinding specialized, IBinding owner, ICPPTemplateParameterMap argumentMap) { this.specialized = specialized; this.owner = owner; this.argumentMap = argumentMap; @@ -52,14 +52,14 @@ public abstract class CPPSpecialization extends PlatformObject implements ICPPSp public IType specializeType(IType type) throws DOMException { if (owner instanceof ICPPClassSpecialization) { - return CPPTemplates.instantiateType(type, getArgumentMap(), (ICPPClassSpecialization) owner); + return CPPTemplates.instantiateType(type, getTemplateParameterMap(), (ICPPClassSpecialization) owner); } else { - return CPPTemplates.instantiateType(type, getArgumentMap(), null); + return CPPTemplates.instantiateType(type, getTemplateParameterMap(), null); } } public IValue specializeValue(IValue value) { - return CPPTemplates.instantiateValue(value, getArgumentMap()); + return CPPTemplates.instantiateValue(value, getTemplateParameterMap()); } public IBinding getSpecializedBinding() { @@ -149,7 +149,7 @@ public abstract class CPPSpecialization extends PlatformObject implements ICPPSp return CPPTemplates.getArgumentMap(this, getTemplateParameterMap()); } - public CPPTemplateParameterMap getTemplateParameterMap() { + public ICPPTemplateParameterMap getTemplateParameterMap() { return argumentMap; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateArgument.java index a77554f1f11..cdd288e9dd3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateArgument.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateArgument.java @@ -33,13 +33,17 @@ public class CPPTemplateArgument implements ICPPTemplateArgument { fType= type; fValue= null; } - + + public boolean isTypeValue() { + return fValue == null; + } + public boolean isNonTypeValue() { return fValue != null; } public IType getTypeValue() { - return isNonTypeValue() ? null : fType; + return isTypeValue() ? fType : null; } public IValue getNonTypeValue() { @@ -56,4 +60,11 @@ public class CPPTemplateArgument implements ICPPTemplateArgument { } return fType.isSameType(arg.getTypeValue()); } + + @Override + public String toString() { + if (fValue != null) + return fValue.toString(); + return fType.toString(); + } } 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 96012981260..b5cd7a6ab67 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 @@ -22,7 +22,6 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration; @@ -31,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; 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.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; @@ -98,16 +98,16 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC } } - public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { if (instances == null) instances = new ObjectMap(2); instances.put(arguments, instance); } - public final ICPPTemplateInstance getInstance(IType[] arguments) { + public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { if (instances != null) { loop: for (int i=0; i < instances.size(); i++) { - IType[] args = (IType[]) instances.keyAt(i); + ICPPTemplateArgument[] args = (ICPPTemplateArgument[]) instances.keyAt(i); if (args.length == arguments.length) { for (int j=0; j < args.length; j++) { if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java index ea9df687e46..9e805a6c8a6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeParameter.java @@ -20,7 +20,9 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; +import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; /** @@ -47,6 +49,16 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements return null; } + + public ICPPTemplateArgument getDefaultValue() { + IASTExpression d= getDefault(); + if (d == null) + return null; + + IValue val= Value.create(d, Value.MAX_RECURSION_DEPTH); + IType t= CPPVisitor.createType(d); + return new CPPTemplateArgument(val, t); + } public IType getType() { if( type == null ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPTemplateParameterMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameterMap.java similarity index 73% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPTemplateParameterMap.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameterMap.java index 6ac289d4cbe..7c7b155c291 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPTemplateParameterMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameterMap.java @@ -8,19 +8,28 @@ * Contributors: * Markus Schorn - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.core.dom.ast.cpp; +package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; +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.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; /** * Maps template parameters to values. - * @since 5.1 */ public class CPPTemplateParameterMap implements ICPPTemplateParameterMap { - public static final CPPTemplateParameterMap EMPTY = new CPPTemplateParameterMap(); + public static final CPPTemplateParameterMap EMPTY = new CPPTemplateParameterMap(0); - private ObjectMap fMap= new ObjectMap(2); + private final ObjectMap fMap; + + /** + * Constructs an empty parameter map. + */ + public CPPTemplateParameterMap(int initialSize) { + fMap= new ObjectMap(initialSize); + } /** * Returns whether the map contains the given parameter @@ -61,13 +70,26 @@ public class CPPTemplateParameterMap implements ICPPTemplateParameterMap { /** * Puts all mappings from the supplied map into this map. */ - public void putAll(CPPTemplateParameterMap map) { - final ObjectMap omap= map.fMap; - for (int i = 0; i < omap.size(); i++) { - fMap.put(omap.keyAt(i), omap.getAt(i)); + public void putAll(ICPPTemplateParameterMap map) { + + if (map instanceof CPPTemplateParameterMap) { + final ObjectMap omap= ((CPPTemplateParameterMap) map).fMap; + for (int i = 0; i < omap.size(); i++) { + fMap.put(omap.keyAt(i), omap.getAt(i)); + } + } else { + assert false; } } - + + public ICPPTemplateArgument[] values() { + ICPPTemplateArgument[] result= new ICPPTemplateArgument[fMap.size()]; + for (int i = 0; i < result.length; i++) { + result[i]= (ICPPTemplateArgument) fMap.getAt(i); + } + return result; + } + /** * Returns the array of template parameter positions, for which a mapping exists. */ 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 87d2b0f5a98..078f08e3f1c 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 @@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; 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.ICPPScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; 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.ICPPTemplateTemplateParameter; @@ -106,7 +107,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; } - public IType getDefault() throws DOMException { + public IType getDefault() { IASTNode[] nds = getDeclarations(); if (nds == null || nds.length == 0) return null; @@ -117,6 +118,14 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement return CPPVisitor.createType(defaultValue); return null; } + + public ICPPTemplateArgument getDefaultValue() { + IType d= getDefault(); + if (d == null) + return null; + + return new CPPTemplateArgument(d); + } public ICPPBase[] getBases() { return ICPPBase.EMPTY_BASE_ARRAY; @@ -177,16 +186,16 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; } - public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { if (instances == null) instances = new ObjectMap(2); instances.put(arguments, instance); } - public final ICPPTemplateInstance getInstance(IType[] arguments) { + public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { if (instances != null) { loop: for (int i=0; i < instances.size(); i++) { - IType[] args = (IType[]) instances.keyAt(i); + ICPPTemplateArgument[] args = (ICPPTemplateArgument[]) instances.keyAt(i); if (args.length == arguments.length) { for (int j=0; j < args.length; j++) { if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java index 6a5fbfbae89..5acec0891d9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java @@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.index.IIndexType; @@ -55,6 +56,14 @@ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements return CPPVisitor.createType(typeId); return null; } + + public ICPPTemplateArgument getDefaultValue() { + IType t= getDefault(); + if (t == null) + return null; + + return new CPPTemplateArgument(t); + } public boolean isSameType(IType type) { if (type == this) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedefSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedefSpecialization.java index a58d407eb2f..98a8c750cfa 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedefSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedefSpecialization.java @@ -18,9 +18,9 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; @@ -43,7 +43,7 @@ public class CPPTypedefSpecialization extends CPPSpecialization implements IType private int fResolutionDepth; public CPPTypedefSpecialization(IBinding specialized, ICPPClassType owner, - CPPTemplateParameterMap tpmap) { + ICPPTemplateParameterMap tpmap) { super(specialized, owner, tpmap); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java index 222f0984016..e4ccec643be 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClassInstance.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Sergey Prigogin (Google) - initial API and implementation + * Sergey Prigogin (Google) - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -16,6 +17,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -25,20 +27,20 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; * @author Sergey Prigogin */ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnknownClassInstance { - private final IType[] arguments; + private final ICPPTemplateArgument[] arguments; - public CPPUnknownClassInstance(ICPPUnknownBinding scopeBinding, IASTName name, IType[] arguments) { + public CPPUnknownClassInstance(ICPPUnknownBinding scopeBinding, IASTName name, ICPPTemplateArgument[] arguments) { super(scopeBinding, name); this.arguments = arguments; } - public IType[] getArguments() { + public ICPPTemplateArgument[] getArguments() { return arguments; } @Override public String toString() { - return getName() + " <" + ASTTypeUtil.getTypeListString(arguments) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ + return getName() + " <" + ASTTypeUtil.getArgumentListString(arguments, true) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ } @Override @@ -53,8 +55,8 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnkn if (type instanceof ICPPUnknownClassInstance) { ICPPUnknownClassInstance rhs= (ICPPUnknownClassInstance) type; if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) { - IType[] lhsArgs= getArguments(); - IType[] rhsArgs= rhs.getArguments(); + ICPPTemplateArgument[] lhsArgs= getArguments(); + ICPPTemplateArgument[] rhsArgs= rhs.getArguments(); if (lhsArgs != rhsArgs) { if (lhsArgs == null || rhsArgs == null) return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java index cac25b7b5c4..6dd90fefad5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java @@ -20,10 +20,10 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; @@ -111,7 +111,7 @@ public class CPPUnknownScope implements ICPPScope, ICPPInternalUnknownScope { IBinding b; IASTNode parent = name.getParent(); if (parent instanceof ICPPASTTemplateId) { - IType[] arguments = CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) parent); + ICPPTemplateArgument[] arguments = CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) parent); b = new CPPUnknownClassInstance(binding, name, arguments); } else { b = new CPPUnknownClass(binding, name); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInstanceCache.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInstanceCache.java index dee0b4d865e..489dd35fee1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInstanceCache.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInstanceCache.java @@ -8,10 +8,11 @@ * Contributors: * QNX - Initial API and implementation * Sergey Prigogin (Google) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; @@ -23,12 +24,12 @@ public interface ICPPInstanceCache { /** * Attempts to cache an instance with this template */ - public void addInstance(IType[] arguments, ICPPTemplateInstance instance); + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance); /** * Attempts to get a cached instance from this template */ - public ICPPTemplateInstance getInstance(IType[] arguments); + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments); /** * Returns an array of all cached instances diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassInstance.java index cabb1b9ab11..2ec1d50f377 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassInstance.java @@ -6,11 +6,12 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Sergey Prigogin (Google) - initial API and implementation + * Sergey Prigogin (Google) - initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; /** * Represents a partially instantiated C++ class template, declaration of which is not yet available. @@ -22,5 +23,5 @@ public interface ICPPUnknownClassInstance extends ICPPUnknownClassType { /** * Returns the arguments of the instantiation */ - public IType[] getArguments(); + public ICPPTemplateArgument[] getArguments(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 171472efc0d..dd581023adf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -110,6 +110,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +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.ICPPTemplateNonTypeParameter; @@ -125,7 +126,6 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.DebugUtil; -import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectSet; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; @@ -287,7 +287,7 @@ public class CPPSemantics { if (data.astName instanceof ICPPASTTemplateId && cls instanceof ICPPClassTemplate) { if (data.tu != null) { ICPPASTTemplateId id = (ICPPASTTemplateId) data.astName; - IType[] args = CPPTemplates.createTemplateArgumentArray(id); + ICPPTemplateArgument[] args = CPPTemplates.createTemplateArgumentArray(id); IBinding inst= CPPTemplates.instantiate((ICPPClassTemplate) cls, args); cls = inst instanceof ICPPClassType && !(inst instanceof ICPPDeferredTemplateInstance) ? (ICPPClassType)inst : cls; } @@ -307,28 +307,50 @@ public class CPPSemantics { } + // mstodo this looks like a hack? // in template declarations the template-ids get instantiated to deferred instances, revert that. IASTName name = data.astName; if (name instanceof ICPPASTTemplateId) { - if (CPPTemplates.getTemplateDeclaration(name) != null && binding instanceof ICPPDeferredTemplateInstance) { + if (binding instanceof ICPPDeferredTemplateInstance && CPPTemplates.getTemplateDeclaration(name) != null ) { ICPPDeferredTemplateInstance deferred= (ICPPDeferredTemplateInstance) binding; - boolean useOriginal= true; - final ObjectMap argMap = deferred.getArgumentMap(); - if (argMap != null) { - for (int i = 0; useOriginal && i < argMap.size(); i++) { - final Object key = argMap.keyAt(i); - if (!key.equals(argMap.getAt(i))) { - // bug 231868 non type parameters are modeled via their type :-( - if (key instanceof ICPPTemplateNonTypeParameter == false) { - useOriginal= false; - break; + IBinding spec= deferred.getSpecializedBinding(); + if (spec instanceof ICPPTemplateDefinition) { + try { + ICPPTemplateArgument[] args= deferred.getTemplateArguments(); + ICPPTemplateParameter[] pars= ((ICPPTemplateDefinition) spec).getTemplateParameters(); + if (args.length == pars.length) { + boolean useOriginal= true; + for (int i = 0; useOriginal && i < pars.length; i++) { + ICPPTemplateParameter par= pars[i]; + if (par instanceof ICPPTemplateNonTypeParameter) { + // mstodo change this + } else { + if (!((IType) par).isSameType(args[i].getTypeValue())) { + useOriginal= false; + } + } + } + if (useOriginal) { + binding= spec; } } + } catch (DOMException e) { } } - if (useOriginal) { - binding= deferred.getSpecializedBinding(); - } + // mstodo+ remove +// final ObjectMap argMap = deferred.getArgumentMap(); +// if (argMap != null) { +// for (int i = 0; useOriginal && i < argMap.size(); i++) { +// final Object key = argMap.keyAt(i); +// if (!key.equals(argMap.getAt(i))) { +// // bug 231868 non type parameters are modeled via their type :-( +// if (key instanceof ICPPTemplateNonTypeParameter == false) { +// useOriginal= false; +// break; +// } +// } +// } +// } } } if (name.getParent() instanceof ICPPASTTemplateId) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index 137debe3914..5bdf0a08c9f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -48,7 +48,6 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; @@ -96,6 +95,7 @@ import org.eclipse.cdt.core.parser.util.ObjectSet; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; +import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTLiteralExpression; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassInstance; @@ -122,6 +122,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPQualifierType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateDefinition; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateTemplateParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTypedefSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClass; @@ -144,7 +145,7 @@ public class CPPTemplates { /** * Instantiates a template with the given arguments. May return null. */ - public static IBinding instantiate(ICPPTemplateDefinition template, IType[] arguments) { + public static IBinding instantiate(ICPPTemplateDefinition template, ICPPTemplateArgument[] arguments) { try { if (template instanceof ICPPTemplateTemplateParameter) { return deferredInstance(template, arguments); @@ -171,24 +172,26 @@ public class CPPTemplates { /** * Instantiates a partial class template specialization. */ - private static IBinding instantiatePartialSpecialization(ICPPClassTemplatePartialSpecialization partialSpec, IType[] args) throws DOMException { - args= SemanticUtil.getSimplifiedTypes(args); + private static IBinding instantiatePartialSpecialization(ICPPClassTemplatePartialSpecialization partialSpec, ICPPTemplateArgument[] args) throws DOMException { + args= SemanticUtil.getSimplifiedArguments(args); ICPPTemplateInstance instance= getInstance(partialSpec, args); if (instance != null) return instance; - ObjectMap argMap= CPPTemplates.deduceTemplateArguments(partialSpec.getArguments(), args, true); - if (argMap == null) + CPPTemplateParameterMap tpMap= new CPPTemplateParameterMap(args.length); + if (!CPPTemplates.deduceTemplateParameterMap(partialSpec.getTemplateArguments(), args, true, tpMap)) return null; ICPPTemplateParameter[] params= partialSpec.getTemplateParameters(); int numParams = params.length; for (int i = 0; i < numParams; i++) { - if (params[i] instanceof IType && !argMap.containsKey(params[i])) + final ICPPTemplateParameter param = params[i]; + // mstodo check non-type parameters, also + if (param instanceof IType && tpMap.getArgument(param) == null) return null; } - instance= createInstance(partialSpec.getOwner(), partialSpec, argMap, args); + instance= createInstance(partialSpec.getOwner(), partialSpec, tpMap, args); addInstance(partialSpec, args, instance); return instance; } @@ -196,7 +199,7 @@ public class CPPTemplates { /** * Instantiates the selected template, without looking for specializations. May return null. */ - private static IBinding instantiateSelectedTemplate(ICPPTemplateDefinition template, IType[] arguments) + private static IBinding instantiateSelectedTemplate(ICPPTemplateDefinition template, ICPPTemplateArgument[] arguments) throws DOMException { Assert.isTrue(!(template instanceof ICPPClassTemplatePartialSpecialization)); @@ -207,13 +210,13 @@ public class CPPTemplates { final int numParams= parameters.length; int numArgs = arguments.length; - ObjectMap map = new ObjectMap(numParams); + CPPTemplateParameterMap map = new CPPTemplateParameterMap(numParams); ICPPTemplateParameter param = null; - IType arg = null; - IType[] actualArgs = new IType[numParams]; + ICPPTemplateArgument arg = null; + ICPPTemplateArgument[] actualArgs = new ICPPTemplateArgument[numParams]; boolean argsContainDependentType = false; - arguments= SemanticUtil.getSimplifiedTypes(arguments); + arguments= SemanticUtil.getSimplifiedArguments(arguments); for (int i = 0; i < numParams; i++) { arg= null; param= parameters[i]; @@ -221,45 +224,19 @@ public class CPPTemplates { if (i < numArgs) { arg= arguments[i]; } else { - IType defaultType = null; - if (param instanceof ICPPTemplateTypeParameter) - defaultType = ((ICPPTemplateTypeParameter) param).getDefault(); - else if (param instanceof ICPPTemplateTemplateParameter) - defaultType = ((ICPPTemplateTemplateParameter) param).getDefault(); - else if (param instanceof ICPPTemplateNonTypeParameter) - defaultType = CPPVisitor.getExpressionType(((ICPPTemplateNonTypeParameter) param).getDefault()); - - if (defaultType == null) { + ICPPTemplateArgument defaultArg= param.getDefaultValue(); + if (defaultArg == null) { return null; } - - if (defaultType instanceof ICPPTemplateParameter) { - if (map.containsKey(defaultType)) { - arg = (IType) map.get(defaultType); - } - } else if (defaultType instanceof ICPPUnknownBinding) { - // A default template parameter may be depend on a previously defined - // parameter: template > class B {}; - IType resolvedType= null; - try { - IBinding resolved= resolveUnknown((ICPPUnknownBinding) defaultType, map, null); - if (resolved instanceof IType) { - resolvedType= (IType) resolved; - } - } catch (DOMException e) { - } - arg= resolvedType == null ? defaultType : resolvedType; - } else { - arg = defaultType; - } + arg= instantiateArgument(defaultArg, map, null); } - if (CPPTemplates.matchTemplateParameterAndArgument(param, arg, map)) { - if (!param.equals(arg)) { + if (CPPTemplates.matchTemplateParameterAndArgument(param, getArgument(arg), map)) { + if (!param.equals(getArgument(arg))) { map.put(param, arg); } actualArgs[i] = arg; - if (CPPTemplates.isDependentType(arg)) { + if (CPPTemplates.isDependentArgument(arg)) { argsContainDependentType = true; } } else { @@ -288,7 +265,7 @@ public class CPPTemplates { /** * Obtains a cached instance from the template. */ - private static ICPPTemplateInstance getInstance(ICPPTemplateDefinition template, IType[] args) { + private static ICPPTemplateInstance getInstance(ICPPTemplateDefinition template, ICPPTemplateArgument[] args) { if (template instanceof ICPPInstanceCache) { return ((ICPPInstanceCache) template).getInstance(args); } @@ -298,24 +275,24 @@ public class CPPTemplates { /** * Caches an instance with the template. */ - private static void addInstance(ICPPTemplateDefinition template, IType[] args, ICPPTemplateInstance instance) { + private static void addInstance(ICPPTemplateDefinition template, ICPPTemplateArgument[] args, ICPPTemplateInstance instance) { if (template instanceof ICPPInstanceCache) { ((ICPPInstanceCache) template).addInstance(args, instance); } } - private static IBinding deferredInstance(ICPPTemplateDefinition template, IType[] arguments) throws DOMException { + private static IBinding deferredInstance(ICPPTemplateDefinition template, ICPPTemplateArgument[] arguments) throws DOMException { ICPPTemplateInstance instance= getInstance(template, arguments); if (instance != null) return instance; if (template instanceof ICPPClassTemplate) { - instance = new CPPDeferredClassInstance((ICPPClassTemplate) template, convert(arguments)); + instance = new CPPDeferredClassInstance((ICPPClassTemplate) template, arguments); addInstance(template, arguments, instance); return instance; } if (template instanceof ICPPFunctionTemplate) { - instance = new CPPDeferredFunctionInstance((ICPPFunctionTemplate) template, convert(arguments)); + instance = new CPPDeferredFunctionInstance((ICPPFunctionTemplate) template, arguments); addInstance(template, arguments, instance); return instance; } @@ -327,15 +304,21 @@ public class CPPTemplates { */ public static IBinding instantiateWithinClassTemplate(ICPPClassTemplate template) throws DOMException { ICPPTemplateParameter[] templateParameters = template.getTemplateParameters(); - IType[] args = new IType[templateParameters.length]; + ICPPTemplateArgument[] args = new ICPPTemplateArgument[templateParameters.length]; for (int i = 0; i < templateParameters.length; i++) { - if (templateParameters[i] instanceof IType) { - args[i] = (IType) templateParameters[i]; - } else if (templateParameters[i] instanceof ICPPTemplateNonTypeParameter) { - args[i] = ((ICPPTemplateNonTypeParameter) templateParameters[i]).getType(); + final ICPPTemplateParameter tp = templateParameters[i]; + if (tp instanceof IType) { + args[i] = new CPPTemplateArgument((IType) tp); + } else if (tp instanceof ICPPTemplateNonTypeParameter) { + final ICPPTemplateNonTypeParameter nttp = (ICPPTemplateNonTypeParameter) tp; + // mstodo for now stick to the type + args[i]= new CPPTemplateArgument(nttp.getType()); + + // args[i] = new CPPTemplateArgument(Value.create(nttp), nttp.getType()); + } else { + assert false; } } - return deferredInstance(template, args); } @@ -523,8 +506,8 @@ public class CPPTemplates { } if (template instanceof ICPPTemplateDefinition) { - IType[] types= CPPTemplates.createTemplateArgumentArray(id); - IBinding instance= instantiate((ICPPTemplateDefinition) template, types); + ICPPTemplateArgument[] args= CPPTemplates.createTemplateArgumentArray(id); + IBinding instance= instantiate((ICPPTemplateDefinition) template, args); return CPPSemantics.postResolution(instance, id); } } else { @@ -549,7 +532,7 @@ public class CPPTemplates { IBinding template = id.getTemplateName().resolveBinding(); if (template instanceof ICPPClassTemplate) { ICPPClassTemplate classTemplate = (ICPPClassTemplate) template; - IType[] args= createTemplateArgumentArray(id); + ICPPTemplateArgument[] args= createTemplateArgumentArray(id); IBinding binding= instantiate(classTemplate, args); if (binding != null) return binding; @@ -586,18 +569,18 @@ public class CPPTemplates { if (templateDecl instanceof ICPPASTTemplateSpecialization) { ICPPTemplateInstance inst = null; ICPPTemplateParameter[] templateParams= template.getTemplateParameters(); - IType[] args= createTemplateArgumentArray(id); - ObjectMap argMap = new ObjectMap(templateParams.length); + ICPPTemplateArgument[] args= createTemplateArgumentArray(id); + CPPTemplateParameterMap tpMap = new CPPTemplateParameterMap(templateParams.length); if (templateParams.length != args.length) { return null; //TODO problem } for (int i = 0; i < templateParams.length; i++) { - argMap.put(templateParams[i], args[i]); + tpMap.put(templateParams[i], args[i]); } inst= getInstance(template, args); if (inst == null) { IBinding owner= binding.getOwner(); - inst= new CPPClassInstance(owner, template, convert(argMap), convert(args)); + inst= new CPPClassInstance(owner, template, tpMap, args); addInstance(template, args, inst); } if (inst instanceof ICPPInternalBinding) { @@ -663,19 +646,18 @@ public class CPPTemplates { parent = parent.getParent(); IASTParameterDeclaration[] ps = ((ICPPASTFunctionDeclarator) parent).getParameters(); - Object[] map_types= deduceTemplateFunctionArguments(function, ps, data.templateId); - if (map_types == null) + final CPPTemplateParameterMap tpMap= new CPPTemplateParameterMap(ps.length); + ICPPTemplateArgument[] args= deduceTemplateFunctionArguments(function, ps, data.templateId, tpMap); + if (args == null) return new ProblemBinding(name, IProblemBinding.SEMANTIC_INVALID_TYPE, name.toCharArray()); while (!(parent instanceof IASTDeclaration)) parent = parent.getParent(); - final IType[] args = (IType[]) map_types[1]; - final ObjectMap argMap= (ObjectMap) map_types[0]; IBinding owner= function.getOwner(); ICPPTemplateInstance instance= getInstance(function, args); if (instance == null) { - instance = createInstance(owner, function, argMap, args); + instance = createInstance(owner, function, tpMap, args); addInstance(function, args, instance); } if (instance instanceof ICPPInternalBinding) { @@ -715,7 +697,7 @@ public class CPPTemplates { if (templates == null) return null; - IType[] templateArguments = null; + ICPPTemplateArgument[] templateArguments = null; if (name instanceof ICPPASTTemplateId) { templateArguments= createTemplateArgumentArray((ICPPASTTemplateId) name); @@ -736,14 +718,14 @@ public class CPPTemplates { outer: for (int i = 0; i < templates.length && templates[i] != null; i++) { ICPPFunctionTemplate tmpl = templates[i]; - ObjectMap map = ObjectMap.EMPTY_MAP; + CPPTemplateParameterMap map= new CPPTemplateParameterMap(functionParameters.length); try { - map = deduceTemplateArguments(tmpl, functionParameters); + if (!deduceTemplateParameterMapFromFunctionParameters(tmpl, functionParameters, map)) + continue; } catch (DOMException e) { + continue; // mstodo potential failure } - if (map == null) - continue; ICPPTemplateParameter[] params = null; try { params = tmpl.getTemplateParameters(); @@ -752,7 +734,7 @@ public class CPPTemplates { } int numParams = params.length; - IType arg = null; + ICPPTemplateArgument arg = null; for (int j = 0; j < numParams; j++) { ICPPTemplateParameter param = params[j]; if (j < numArgs && templateArguments != null) { @@ -760,14 +742,16 @@ public class CPPTemplates { } else { arg = null; } - if (map.containsKey(param)) { - IType t = (IType) map.get(param); + ICPPTemplateArgument deducedArg= map.getArgument(param); + if (deducedArg != null) { if (arg == null) { - arg = t; - } else if (!CPPTemplates.isSameTemplateArgument(t, arg)) { + map.put(param, deducedArg); + arg = deducedArg; + } else if (!CPPTemplates.isSameTemplateArgument(deducedArg, arg)) { continue outer; } - } else if (arg == null || !matchTemplateParameterAndArgument(param, arg, map)) { + } + if (arg == null || !matchTemplateParameterAndArgument(param, getArgument(arg), map)) { continue outer; } } @@ -785,75 +769,74 @@ public class CPPTemplates { * return Object[] of { ObjectMap, IType[] } * @throws DOMException */ - static protected Object[] deduceTemplateFunctionArguments(ICPPFunctionTemplate primaryTemplate, - IASTParameterDeclaration[] ps, ICPPASTTemplateId id) throws DOMException { + static protected ICPPTemplateArgument[] deduceTemplateFunctionArguments(ICPPFunctionTemplate primaryTemplate, + IASTParameterDeclaration[] ps, ICPPASTTemplateId id, CPPTemplateParameterMap map) throws DOMException { ICPPTemplateParameter[] templateParameters = primaryTemplate.getTemplateParameters(); - IType[] arguments= createTemplateArgumentArray(id); - IType[] result = new IType[templateParameters.length]; - - ObjectMap map = null; + ICPPTemplateArgument[] arguments= createTemplateArgumentArray(id); + ICPPTemplateArgument[] result = new ICPPTemplateArgument[templateParameters.length]; if (arguments.length == result.length) { - map = new ObjectMap(result.length); for (int i = 0; i < templateParameters.length; i++) { result[i] = arguments[i]; - map.put(templateParameters, arguments[i]); + map.put(templateParameters[i], arguments[i]); } - return new Object[] { map, result }; + return result; } //else need to deduce some arguments IType[] paramTypes = createTypeArray(ps); - map = deduceTemplateArguments(primaryTemplate, paramTypes); - if (map != null) { + if (deduceTemplateParameterMapFromFunctionParameters(primaryTemplate, paramTypes, map)) { for (int i = 0; i < templateParameters.length; i++) { ICPPTemplateParameter param = templateParameters[i]; - IType arg = null; - if (i < arguments.length) { + ICPPTemplateArgument arg = null; + if (i < arguments.length) arg = arguments[i]; - map.put(param, arg); - } else if (map.containsKey(param)) { - arg = (IType) map.get(param); - } - - if (arg == null || !matchTemplateParameterAndArgument(param, arg, map)) + + ICPPTemplateArgument deducedArg= map.getArgument(param); + if (deducedArg != null) { + if (arg == null) { + map.put(param, deducedArg); + arg = deducedArg; + } else if (!CPPTemplates.isSameTemplateArgument(deducedArg, arg)) { + return null; + } + } + if (arg == null || !matchTemplateParameterAndArgument(param, getArgument(arg), map)) return null; result[i] = arg; } - return new Object[] { map, result }; + return result; } return null; } public static ICPPTemplateInstance createInstance(IBinding owner, ICPPTemplateDefinition template, - ObjectMap argMap, IType[] args) { + CPPTemplateParameterMap tpMap, ICPPTemplateArgument[] args) { if (owner instanceof ICPPSpecialization) { - ObjectMap map= ((ICPPSpecialization) owner).getArgumentMap(); + ICPPTemplateParameterMap map= ((ICPPSpecialization) owner).getTemplateParameterMap(); if (map != null) { - for (int i = 0; i < map.size(); i++) { - argMap.put(map.keyAt(i), map.getAt(i)); - } + tpMap.putAll(map); } } ICPPTemplateInstance instance = null; if (template instanceof ICPPClassType) { - instance = new CPPClassInstance(owner, (ICPPClassType) template, convert(argMap), convert(args)); + instance = new CPPClassInstance(owner, (ICPPClassType) template, tpMap, args); } else if (owner instanceof ICPPClassType && template instanceof ICPPMethod) { if (template instanceof ICPPConstructor) { - instance = new CPPConstructorInstance((ICPPClassType) owner, (ICPPConstructor) template, convert(argMap), convert(args)); + instance = new CPPConstructorInstance((ICPPClassType) owner, (ICPPConstructor) template, tpMap, args); } else { - instance = new CPPMethodInstance((ICPPClassType) owner, (ICPPMethod) template, convert(argMap), convert(args)); + instance = new CPPMethodInstance((ICPPClassType) owner, (ICPPMethod) template, tpMap, args); } } else if (template instanceof ICPPFunction) { - instance = new CPPFunctionInstance(owner, (ICPPFunction) template, convert(argMap), convert(args)); + instance = new CPPFunctionInstance(owner, (ICPPFunction) template, tpMap, args); } return instance; } - public static ICPPSpecialization createSpecialization(ICPPClassSpecialization owner, IBinding decl, ObjectMap argMap) { + public static ICPPSpecialization createSpecialization(ICPPClassSpecialization owner, IBinding decl, ICPPTemplateParameterMap tpMap) { // mstodo- specializations of partial specializations if (decl instanceof ICPPClassTemplatePartialSpecialization) @@ -861,31 +844,31 @@ public class CPPTemplates { ICPPSpecialization spec = null; if (decl instanceof ICPPClassTemplate) { - spec = new CPPClassTemplateSpecialization((ICPPClassTemplate) decl, owner, convert(argMap)); + spec = new CPPClassTemplateSpecialization((ICPPClassTemplate) decl, owner, tpMap); } else if (decl instanceof ICPPClassType) { - spec = new CPPClassSpecialization((ICPPClassType) decl, owner, convert(argMap)); + spec = new CPPClassSpecialization((ICPPClassType) decl, owner, tpMap); } else if (decl instanceof ICPPField) { - spec = new CPPFieldSpecialization(decl, owner, convert(argMap)); + spec = new CPPFieldSpecialization(decl, owner, tpMap); } else if (decl instanceof ICPPFunctionTemplate) { if (decl instanceof ICPPConstructor) - spec = new CPPConstructorTemplateSpecialization(decl, owner, convert(argMap)); + spec = new CPPConstructorTemplateSpecialization(decl, owner, tpMap); else if (decl instanceof ICPPMethod) - spec = new CPPMethodTemplateSpecialization(decl, owner, convert(argMap)); + spec = new CPPMethodTemplateSpecialization(decl, owner, tpMap); else - spec = new CPPFunctionTemplateSpecialization(decl, owner, convert(argMap)); + spec = new CPPFunctionTemplateSpecialization(decl, owner, tpMap); } else if (decl instanceof ICPPConstructor) { - spec = new CPPConstructorSpecialization(decl, owner, convert(argMap)); + spec = new CPPConstructorSpecialization(decl, owner, tpMap); } else if (decl instanceof ICPPMethod) { - spec = new CPPMethodSpecialization(decl, owner, convert(argMap)); + spec = new CPPMethodSpecialization(decl, owner, tpMap); } else if (decl instanceof ICPPFunction) { - spec = new CPPFunctionSpecialization(decl, owner, convert(argMap)); + spec = new CPPFunctionSpecialization(decl, owner, tpMap); } else if (decl instanceof ITypedef) { - spec = new CPPTypedefSpecialization(decl, owner, convert(argMap)); + spec = new CPPTypedefSpecialization(decl, owner, tpMap); } return spec; } - public static IValue instantiateValue(IValue value, ObjectMap argMap) { + public static IValue instantiateValue(IValue value, ICPPTemplateParameterMap tpMap) { if (value == null) return null; // mstodo- instantiate values @@ -895,20 +878,20 @@ public class CPPTemplates { /** * This method propagates the specialization of a member to the types used by the member. * @param type a type to instantiate. - * @param argMap a mapping between template parameters and the corresponding arguments. + * @param tpMap a mapping between template parameters and the corresponding arguments. */ - public static IType instantiateType(IType type, ObjectMap argMap, ICPPClassSpecialization within) { + public static IType instantiateType(IType type, ICPPTemplateParameterMap tpMap, ICPPClassSpecialization within) { try { - if (argMap == null) + if (tpMap == null) return type; if (type instanceof IFunctionType) { IType ret = null; IType[] params = null; final IType r = ((IFunctionType) type).getReturnType(); - ret = instantiateType(r, argMap, within); + ret = instantiateType(r, tpMap, within); IType[] ps = ((IFunctionType) type).getParameterTypes(); - params = instantiateTypes(ps, argMap, within); + params = instantiateTypes(ps, tpMap, within); if (ret == r && params == ps) { return type; } @@ -916,21 +899,17 @@ public class CPPTemplates { } if (type instanceof ICPPTemplateParameter) { - IType t = (IType) argMap.get(type); - if (t != null) { - return t; - } - for (int i = 0; i < argMap.size(); i++) { - Object key = argMap.keyAt(i); - if (key instanceof IType && type.isSameType((IType) key)) { - return (IType) argMap.getAt(i); - } + ICPPTemplateArgument arg= tpMap.getArgument((ICPPTemplateParameter) type); + if (arg != null) { + IType t= arg.getTypeValue(); + if (t != null) + return t; } return type; } if (type instanceof ICPPUnknownBinding) { - IBinding binding= resolveUnknown((ICPPUnknownBinding) type, argMap, within); + IBinding binding= resolveUnknown((ICPPUnknownBinding) type, tpMap, within); if (binding instanceof IType) return (IType) binding; @@ -947,7 +926,7 @@ public class CPPTemplates { if (parentType.isSameType(originalClass)) { return (IType) within.specializeMember(typeAsBinding); } - IType newOwner= instantiateType(parentType, argMap, within); + IType newOwner= instantiateType(parentType, tpMap, within); if (newOwner != typeOwner && newOwner instanceof ICPPClassSpecialization) { return (IType) ((ICPPClassSpecialization) newOwner).specializeMember(typeAsBinding); } @@ -957,11 +936,11 @@ public class CPPTemplates { if (type instanceof ITypeContainer) { IType nestedType = ((ITypeContainer) type).getType(); - IType newNestedType = instantiateType(nestedType, argMap, within); + IType newNestedType = instantiateType(nestedType, tpMap, within); if (type instanceof ICPPPointerToMemberType) { ICPPPointerToMemberType ptm = (ICPPPointerToMemberType) type; IType memberOfClass = ptm.getMemberOfClass(); - IType newMemberOfClass = instantiateType(memberOfClass, argMap, within); + IType newMemberOfClass = instantiateType(memberOfClass, tpMap, within); if ((newNestedType != nestedType || newMemberOfClass != memberOfClass) && newMemberOfClass instanceof ICPPClassType) { return new CPPPointerToMemberType(newNestedType, (ICPPClassType) newMemberOfClass, @@ -996,14 +975,14 @@ public class CPPTemplates { /** * Instantiates types contained in an array. * @param types an array of types - * @param argMap template argument map + * @param tpMap template argument map * @return an array containing instantiated types. */ - public static IType[] instantiateTypes(IType[] types, ObjectMap argMap, ICPPClassSpecialization within) { + public static IType[] instantiateTypes(IType[] types, ICPPTemplateParameterMap tpMap, ICPPClassSpecialization within) { // Don't create a new array until it's really needed. IType[] result = types; for (int i = 0; i < types.length; i++) { - IType type = CPPTemplates.instantiateType(types[i], argMap, within); + IType type = CPPTemplates.instantiateType(types[i], tpMap, within); if (result != types) { result[i]= type; } else if (type != types[i]) { @@ -1017,6 +996,47 @@ public class CPPTemplates { return result; } + /** + * Instantiates arguments contained in an array. + */ + public static ICPPTemplateArgument[] instantiateArguments(ICPPTemplateArgument[] types, ICPPTemplateParameterMap tpMap, ICPPClassSpecialization within) { + // Don't create a new array until it's really needed. + ICPPTemplateArgument[] result = types; + for (int i = 0; i < types.length; i++) { + ICPPTemplateArgument type = CPPTemplates.instantiateArgument(types[i], tpMap, within); + if (result != types) { + result[i]= type; + } else if (type != types[i]) { + result = new ICPPTemplateArgument[types.length]; + if (i > 0) { + System.arraycopy(types, 0, result, 0, i); + } + result[i]= type; + } + } + return result; + } + + /** + * Instantiates an argument + */ + private static ICPPTemplateArgument instantiateArgument(ICPPTemplateArgument arg, + ICPPTemplateParameterMap tpMap, ICPPClassSpecialization within) { + if (arg.isNonTypeValue()) { + final IValue orig= arg.getNonTypeValue(); + final IValue inst= instantiateValue(orig, tpMap); + if (orig == inst) + return arg; + return new CPPTemplateArgument(inst, arg.getTypeOfNonTypeValue()); + } + + final IType orig= arg.getTypeValue(); + final IType inst= instantiateType(orig, tpMap, within); + if (orig == inst) + return arg; + return new CPPTemplateArgument(inst); + } + /** * Checks whether a given name corresponds to a template declaration and returns the ast node for it. * This works for the name of a template-definition and also for a name needed to qualify a member @@ -1161,10 +1181,11 @@ public class CPPTemplates { IBinding binding = name.getBinding(); boolean clear = bindings.containsKey(name.getBinding()); if (!clear && binding instanceof ICPPTemplateInstance) { - IType[] args = ((ICPPTemplateInstance) binding).getArguments(); - for (IType arg : args) { - if (arg instanceof IBinding) { - if (bindings.containsKey((IBinding)arg)) { + ICPPTemplateArgument[] args = ((ICPPTemplateInstance) binding).getTemplateArguments(); + for (ICPPTemplateArgument arg : args) { + IType t= arg.getTypeValue(); + if (t instanceof IBinding) { + if (bindings.containsKey((IBinding)t)) { clear = true; break; } @@ -1200,6 +1221,7 @@ public class CPPTemplates { if (defParams.length != templateParams.length) return false; + // mstodo interesting side-effect, why not make this more explicit? ObjectSet bindingsToClear = null; for (int i = 0; i < templateParams.length; i++) { IASTName tn = getTemplateParameterName(templateParams[i]); @@ -1237,20 +1259,16 @@ public class CPPTemplates { if (name instanceof ICPPASTTemplateId) { if (definition instanceof ICPPClassTemplatePartialSpecialization) { ICPPClassTemplatePartialSpecialization spec = (ICPPClassTemplatePartialSpecialization) definition; - IType[] args= createTemplateArgumentArray((ICPPASTTemplateId)name); - try { - IType[] specArgs = spec.getArguments(); - if (args.length == specArgs.length) { - int i = 0; - for (; i < args.length; i++) { - if (isSameTemplateArgument(specArgs[i], args[i])) - continue; + ICPPTemplateArgument[] args= createTemplateArgumentArray((ICPPASTTemplateId)name); + ICPPTemplateArgument[] specArgs = spec.getTemplateArguments(); + if (args.length == specArgs.length) { + result= true; + for (int i=0; i < args.length; i++) { + if (!isSameTemplateArgument(specArgs[i], args[i])) { + result= false; break; } - result = (i == args.length); } - } catch (DOMException e) { - result = false; } } } else { @@ -1258,6 +1276,7 @@ public class CPPTemplates { } } + // mstodo we should not add the binding in the first place?? if (bindingsToClear != null && !result) { ClearBindingAction action = new ClearBindingAction(bindingsToClear); templateDecl.accept(action); @@ -1302,11 +1321,11 @@ public class CPPTemplates { * @return an array of template arguments, currently modeled as IType objects. The * empty IType array is returned if id is null */ - static public IType[] createTemplateArgumentArray(ICPPASTTemplateId id) { - IType[] result= IType.EMPTY_TYPE_ARRAY; + static public ICPPTemplateArgument[] createTemplateArgumentArray(ICPPASTTemplateId id) { + ICPPTemplateArgument[] result= ICPPTemplateArgument.EMPTY_ARGUMENTS; if (id != null) { IASTNode[] params= id.getTemplateArguments(); - result = new IType[params.length]; + result = new ICPPTemplateArgument[params.length]; for (int i = 0; i < params.length; i++) { IASTNode param= params[i]; /* @@ -1322,7 +1341,10 @@ public class CPPTemplates { // prevent null pointer exception when the type cannot be determined // happens when templates with still ambiguous template-ids are accessed during // resolution of other ambiguities. - result[i]= type == null ? new CPPBasicType(-1, 0) : type; + if (type == null) + type= new CPPBasicType(-1, 0); + + result[i]= new CPPTemplateArgument(type); } } return result; @@ -1371,7 +1393,7 @@ public class CPPTemplates { int size = templates.size(); int numTemplateArgs = 0; - IType[] templateArguments = null; + ICPPTemplateArgument[] templateArguments = null; if (name instanceof ICPPASTTemplateId) { templateArguments = createTemplateArgumentArray((ICPPASTTemplateId) name); numTemplateArgs = templateArguments.length; @@ -1382,14 +1404,13 @@ public class CPPTemplates { outer: for (int idx = 0; idx < size; idx++) { ICPPFunctionTemplate template = (ICPPFunctionTemplate) templates.keyAt(idx); - ObjectMap map = null; + CPPTemplateParameterMap map= new CPPTemplateParameterMap(fnArgs.length); try { - map = deduceTemplateArguments(template, fnArgs); + if (!deduceTemplateParameterMapFromFunctionParameters(template, fnArgs, map)) + continue; } catch (DOMException e) { continue; } - if (map == null) - continue; ICPPTemplateParameter[] templateParams = null; try { @@ -1401,8 +1422,8 @@ public class CPPTemplates { IType[] instanceArgs = null; for (int i = 0; i < numTemplateParams; i++) { - IType arg = (i < numTemplateArgs && templateArguments != null) ? templateArguments[i] : null; - IType mapped = (IType) map.get(templateParams[i]); + IType arg = (i < numTemplateArgs && templateArguments != null) ? getArgument(templateArguments[i]) : null; + IType mapped = getArgument(map.getArgument(templateParams[i])); if (arg != null && mapped != null) { if (arg.isSameType(mapped)) // compare as IType: 'mapped' is not a template argument @@ -1439,7 +1460,7 @@ public class CPPTemplates { } } instanceArgs= (IType[]) ArrayUtil.trim(IType.class, instanceArgs); - IBinding temp= instantiate(template, instanceArgs); + IBinding temp= instantiate(template, convert(instanceArgs)); if (temp instanceof IFunction) { instances = (IFunction[]) ArrayUtil.append(IFunction.class, instances, temp); } @@ -1449,49 +1470,79 @@ public class CPPTemplates { } /** - * - * @param template - * @param args - * @return - * - * A type that is specified in terms of template parameters (P) is compared with an actual - * type (A), and an attempt is made to find template argument vaules that will make P, - * after substitution of the deduced values, compatible with A. - * @throws DOMException + * Deduces the mapping for the template parameters from the function parameters, + * returns false if there is no mapping. */ - static private ObjectMap deduceTemplateArguments(ICPPFunctionTemplate template, IType[] arguments) throws DOMException{ + private static boolean deduceTemplateParameterMapFromFunctionParameters(ICPPFunctionTemplate template, IType[] arguments, CPPTemplateParameterMap map) throws DOMException{ ICPPFunction function = (ICPPFunction) template; IType[] functionParameters = null; try { functionParameters = function.getType().getParameterTypes(); + return deduceTemplateParameterMap(functionParameters, arguments, false, map); } catch (DOMException e) { - return null; } - return deduceTemplateArguments(functionParameters, arguments, false); + return false; } /** - * @param specArgs - * @param args - * @param all whether to match all arguments - * @return the mapping required to pairwise match the specified arguments, or null if no mapping exists + * Deduces the template parameter mapping from pairs of types. */ - public static ObjectMap deduceTemplateArguments(final IType[] specArgs, final IType[] args, final boolean all) { + public static boolean deduceTemplateParameterMap(final IType[] specArgs, final IType[] args, final boolean all, CPPTemplateParameterMap map) throws DOMException { if (specArgs == null || (all && specArgs.length != args.length)) { - return null; + return false; } - ObjectMap map= new ObjectMap(specArgs.length); int len= all ? specArgs.length : Math.min(specArgs.length, args.length); for (int j= 0; j < len; j++) { - try { - if (!deduceTemplateArgument(map, specArgs[j], args[j])) { - return null; - } - } catch (DOMException de) { - return null; + if (!deduceTemplateParameterMap(specArgs[j], args[j], map)) { + return false; } } - return map; + return true; + } + + /** + * Deduces the template parameter mapping from pairs of template arguments. + */ + public static boolean deduceTemplateParameterMap(final ICPPTemplateArgument[] p, final ICPPTemplateArgument[] a, final boolean all, CPPTemplateParameterMap map) throws DOMException { + if (p == null || (all && p.length != a.length)) { + return false; + } + int len= Math.min(p.length, a.length); + for (int j=0; j 0) { + System.arraycopy(args, 0, result, 0, i); + } + result[i]= newArg; + } + } + } + return result; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java index d73424cc9df..64693ae2484 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java @@ -29,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; 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.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; @@ -55,10 +56,10 @@ public class IndexCPPSignatureUtil { StringBuffer buffer = new StringBuffer(); if (binding instanceof ICPPTemplateInstance) { ICPPTemplateInstance inst = (ICPPTemplateInstance) binding; - buffer.append(getTemplateArgString(inst.getArguments(), true)); + buffer.append(getTemplateArgString(inst.getTemplateArguments(), true)); } else if (binding instanceof ICPPClassTemplatePartialSpecialization) { ICPPClassTemplatePartialSpecialization partial = (ICPPClassTemplatePartialSpecialization) binding; - buffer.append(getTemplateArgString(partial.getArguments(), false)); + buffer.append(getTemplateArgString(partial.getTemplateArguments(), false)); } if (binding instanceof IFunction) { @@ -73,43 +74,49 @@ public class IndexCPPSignatureUtil { * Constructs a string in the format: * */ - public static String getTemplateArgString(IType[] types, boolean qualifyTemplateParameters) throws CoreException, DOMException { + public static String getTemplateArgString(ICPPTemplateArgument[] args, boolean qualifyTemplateParameters) throws CoreException, DOMException { StringBuilder buffer = new StringBuilder(); buffer.append('<'); - for (int i = 0; i < types.length; i++) { + for (int i = 0; i < args.length; i++) { if (i>0) { buffer.append(','); } - final IType type = types[i]; - if (qualifyTemplateParameters && type instanceof ICPPTemplateParameter) { - List parents = new ArrayList(); - IBinding parent= ((ICPPTemplateParameter) type).getOwner(); - while (parent != null) { - parents.add(parent); - parent= parent.getOwner(); - } - //identical template parameters from different template specializations must have unique signatures - Collections.reverse(parents); - for (IBinding binding : parents) { - if (binding != null) { - buffer.append(binding.getNameCharArray()); - if (binding instanceof ICPPTemplateInstance) { - ICPPTemplateInstance inst= (ICPPTemplateInstance) binding; - appendTemplateArgs(inst.getArguments(), buffer); - } - buffer.append("::"); //$NON-NLS-1$ + final ICPPTemplateArgument arg= args[i]; + if (arg.isNonTypeValue()) { + buffer.append(arg.getNonTypeValue().getCanonicalRepresentation()); + } else { + final IType type= arg.getTypeValue(); + if (qualifyTemplateParameters && type instanceof ICPPTemplateParameter) { + List parents = new ArrayList(); + IBinding parent= ((ICPPTemplateParameter) type).getOwner(); + while (parent != null) { + parents.add(parent); + parent= parent.getOwner(); + } + //identical template parameters from different template specializations must have unique signatures + Collections.reverse(parents); + for (IBinding binding : parents) { + if (binding != null) { + buffer.append(binding.getNameCharArray()); + if (binding instanceof ICPPTemplateInstance) { + ICPPTemplateInstance inst= (ICPPTemplateInstance) binding; + appendTemplateArgs(inst.getTemplateArguments(), buffer); + } + buffer.append("::"); //$NON-NLS-1$ + } + } + buffer.append(((ICPPTemplateParameter)type).getName()); + } else if (type instanceof ICPPBasicType){ + // mstodo remove + IASTExpression expr= ((ICPPBasicType) type).getValue(); + if (expr != null) { + buffer.append(getValueString(expr)); + } else { + buffer.append(ASTTypeUtil.getType(type)); } - } - buffer.append(((ICPPTemplateParameter)type).getName()); - } else if (type instanceof ICPPBasicType){ - IASTExpression expr= ((ICPPBasicType) type).getValue(); - if (expr != null) { - buffer.append(getValueString(expr)); } else { buffer.append(ASTTypeUtil.getType(type)); } - } else { - buffer.append(ASTTypeUtil.getType(type)); } } buffer.append('>'); @@ -134,16 +141,14 @@ public class IndexCPPSignatureUtil { } - private static void appendTemplateArgs(Object[] values, StringBuilder buffer) { + private static void appendTemplateArgs(ICPPTemplateArgument[] values, StringBuilder buffer) { boolean needcomma= false; buffer.append('<'); - for (final Object val : values) { - if (val instanceof IType) { - if (needcomma) - buffer.append(','); - needcomma= true; - buffer.append(ASTTypeUtil.getType((IType) val)); - } + for (final ICPPTemplateArgument val : values) { + if (needcomma) + buffer.append(','); + buffer.append(ASTTypeUtil.getArgumentString(val, true)); + needcomma= true; } buffer.append('>'); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java index e81b497a3b6..202fa8d5345 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java @@ -16,7 +16,6 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; @@ -26,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -101,7 +101,7 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple if (result != null) return result; } - IBinding newSpec= CPPTemplates.createSpecialization(this, original, getArgumentMap()); + IBinding newSpec= CPPTemplates.createSpecialization(this, original, getTemplateParameterMap()); synchronized (specializationMap) { IBinding oldSpec= (IBinding) specializationMap.put(original, newSpec); if (oldSpec != 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 d3a24f3dc63..8f23787d629 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 @@ -13,10 +13,10 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.parser.util.ArrayUtil; @@ -60,11 +60,11 @@ public class CompositeCPPClassTemplate extends CompositeCPPClassType return result; } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java index 55c9c028105..db1afccec38 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassTemplatePartialSpecialization.java @@ -14,13 +14,13 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; 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.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; 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 e2273139928..05c1b8a6a21 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 @@ -12,10 +12,10 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; @@ -46,11 +46,11 @@ CompositeCPPClassSpecialization implements ICPPClassTemplate, ICPPInstanceCache{ return result; } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java index 8d491f73eb7..1b45cdc1cc8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java @@ -68,7 +68,6 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp return (ICPPClassTemplate) cf.getCompositeBinding((IIndexFragmentBinding) ((ICPPDeferredClassInstance) rbinding).getClassTemplate()); } - @Deprecated public ICPPTemplateArgument[] getTemplateArguments() { return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldSpecialization.java index dab0dad3235..69e9edb3d25 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFieldSpecialization.java @@ -13,11 +13,11 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; public class CompositeCPPFieldSpecialization extends CompositeCPPField implements ICPPSpecialization { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionSpecialization.java index 3c4d7d19df6..de690495369 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionSpecialization.java @@ -14,11 +14,11 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; public class CompositeCPPFunctionSpecialization extends CompositeCPPFunction implements ICPPSpecialization { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java index 43b7e161d37..f4ba0837645 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplate.java @@ -12,9 +12,9 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; @@ -36,11 +36,11 @@ public class CompositeCPPFunctionTemplate extends CompositeCPPFunction return result; } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplateSpecialization.java index 5ab50934cae..b9770a01429 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionTemplateSpecialization.java @@ -12,9 +12,9 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; @@ -36,11 +36,11 @@ public class CompositeCPPFunctionTemplateSpecialization extends CompositeCPPFunc return result; } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPParameterSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPParameterSpecialization.java index 8e66e9aab15..2dc82a9e19e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPParameterSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPParameterSpecialization.java @@ -13,11 +13,11 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; public class CompositeCPPParameterSpecialization extends CompositeCPPParameter implements ICPPSpecialization { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateNonTypeParameter.java index 32e19ddf554..b0a67d9d351 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateNonTypeParameter.java @@ -11,10 +11,13 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; public class CompositeCPPTemplateNonTypeParameter extends CompositeCPPVariable implements ICPPTemplateNonTypeParameter { @@ -31,11 +34,20 @@ public class CompositeCPPTemplateNonTypeParameter extends CompositeCPPVariable i fail(); return null; } - public IASTExpression getDefault() { - return null; - } - public int getParameterPosition() { return ((ICPPTemplateParameter)rbinding).getParameterPosition(); } + + public ICPPTemplateArgument getDefaultValue() { + try { + return TemplateInstanceUtil.convert(cf, ((ICPPTemplateTypeParameter)rbinding).getDefaultValue()); + } catch (DOMException e) { + return null; + } + } + + @Deprecated + public IASTExpression getDefault() { + return null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java index a0d49c31a50..de6db323197 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +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.ICPPTemplateTypeParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; @@ -59,4 +60,12 @@ public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding public IASTName getUnknownName() { return new CPPASTName(getNameCharArray()); } + + public ICPPTemplateArgument getDefaultValue() { + try { + return TemplateInstanceUtil.convert(cf, ((ICPPTemplateTypeParameter)rbinding).getDefaultValue()); + } catch (DOMException e) { + return null; + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTypedefSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTypedefSpecialization.java index 02c7523f7b8..f34add58ce1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTypedefSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTypedefSpecialization.java @@ -13,11 +13,11 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; class CompositeCPPTypedefSpecialization extends CompositeCPPTypedef implements ICPPSpecialization { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassInstance.java index d8fafa3b275..931bc319fe3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassInstance.java @@ -11,11 +11,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; -import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; -import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; /** @@ -29,15 +26,8 @@ class CompositeCPPUnknownClassInstance extends CompositeCPPUnknownClassType super(cf, rbinding); } - public IType[] getArguments() { - IType[] arguments = ((ICPPUnknownClassInstance) rbinding).getArguments(); - try { - for (int i = 0; i < arguments.length; i++) { - arguments[i] = cf.getCompositeType((IIndexType) arguments[i]); - } - } catch (DOMException e) { - CCorePlugin.log(e); - } - return arguments; + public ICPPTemplateArgument[] getArguments() { + ICPPTemplateArgument[] arguments = ((ICPPUnknownClassInstance) rbinding).getArguments(); + return TemplateInstanceUtil.convert(cf, arguments); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeInstanceCache.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeInstanceCache.java index 76b6927449b..f9cc46853be 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeInstanceCache.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeInstanceCache.java @@ -14,7 +14,7 @@ import java.util.HashMap; 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.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.index.IIndexFragment; @@ -44,7 +44,7 @@ public class CompositeInstanceCache { fMap= new HashMap(); } - synchronized public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + synchronized public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { try { String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true); fMap.put(key, instance); @@ -54,7 +54,7 @@ public class CompositeInstanceCache { } } - synchronized public final ICPPTemplateInstance getInstance(IType[] arguments) { + synchronized public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { try { String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true); return fMap.get(key); @@ -71,7 +71,7 @@ public class CompositeInstanceCache { for (ICPPTemplateInstance ti : insts) { if (ti instanceof IIndexFragmentBinding) { ICPPTemplateInstance comp= (ICPPTemplateInstance) cf.getCompositeBinding((IIndexFragmentBinding) ti); - IType[] args= comp.getArguments(); + ICPPTemplateArgument[] args= comp.getTemplateArguments(); addInstance(args, comp); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java index 702d6ce22b2..19296d53159 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/TemplateInstanceUtil.java @@ -16,7 +16,6 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; @@ -26,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; @@ -36,8 +36,8 @@ import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; public class TemplateInstanceUtil { public static ICPPTemplateParameterMap getTemplateParameterMap(ICompositesFactory cf, ICPPTemplateInstance rbinding) { ICPPTemplateParameterMap preresult= rbinding.getTemplateParameterMap(); - CPPTemplateParameterMap result= new CPPTemplateParameterMap(); Integer[] keys= preresult.getAllParameterPositions(); + CPPTemplateParameterMap result= new CPPTemplateParameterMap(keys.length); try { for(int i = 0; i < keys.length; i++) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 1482c94e085..cd36c7bbf6e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -99,22 +99,6 @@ public class PDOM extends PlatformObject implements IPDOM { */ public static final String FRAGMENT_PROPERTY_VALUE_FORMAT_ID= "org.eclipse.cdt.internal.core.pdom.PDOM"; //$NON-NLS-1$ - private static int version(int major, int minor) { - return major << 16 + minor; - } - public static final int MAJOR_VERSION = 72; - public static final int MINOR_VERSION = 0; // minor versions must be compatible - - public static final int CURRENT_VERSION= version(MAJOR_VERSION, MINOR_VERSION); - public static final int MIN_SUPPORTED_VERSION= version(MAJOR_VERSION, 0); - public static final int MAX_SUPPORTED_VERSION= version(MAJOR_VERSION+1, 0)-1; - - public static String versionString(int version) { - final int major= version >> 16; - final int minor= version & 0xffff; - return "" + major + '.' + minor; //$NON-NLS-1$ - } - /* * PDOM internal format history * @@ -178,8 +162,24 @@ public class PDOM extends PlatformObject implements IPDOM { * 71.0 - proper support for anonymous unions, bug 206450 * 72.0 - store project-relative paths for resources that belong to the project, bug 239472 * 72.1 - store flag for pure virtual methods. - * 73.0 - add values for variables and enumerations, bug + * 73.0 - add values for variables and enumerations, bug 250788 + * 74.0 - changes for proper template argument support, bug 242668 */ + private static int version(int major, int minor) { + return major << 16 + minor; + } + public static final int MAJOR_VERSION = 74; + public static final int MINOR_VERSION = 0; // minor versions must be compatible + + public static final int CURRENT_VERSION= version(MAJOR_VERSION, MINOR_VERSION); + public static final int MIN_SUPPORTED_VERSION= version(MAJOR_VERSION, 0); + public static final int MAX_SUPPORTED_VERSION= version(MAJOR_VERSION+1, 0)-1; + + public static String versionString(int version) { + final int major= version >> 16; + final int minor= version & 0xffff; + return "" + major + '.' + minor; //$NON-NLS-1$ + } public static final int LINKAGES = Database.DATA_AREA; public static final int FILE_INDEX = Database.DATA_AREA + 4; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index 225a35cdb50..b36908887c9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -120,7 +120,7 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements if (result != null) return result; } - IBinding newSpec= CPPTemplates.createSpecialization(this, original, getArgumentMap()); + IBinding newSpec= CPPTemplates.createSpecialization(this, original, getTemplateParameterMap()); synchronized (specializationMap) { IBinding oldSpec= (IBinding) specializationMap.put(original, newSpec); if (oldSpec != null) { @@ -372,11 +372,7 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements @Override public String toString() { - String result= super.toString(); - ObjectMap map= getArgumentMap(); - for(int i=0; i"+getArgumentMap().getAt(i)+">"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ - return result; + return super.toString() + " <"+ getTemplateParameterMap().toString() + ">"; //$NON-NLS-1$//$NON-NLS-2$ } public boolean isAnonymous() { 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 7cc63dca830..104a8a56bbe 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 @@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; @@ -220,11 +221,11 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType implements ICPPClassT } } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return PDOMInstanceCache.getCache(this).getInstance(arguments); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { PDOMInstanceCache.getCache(this).addInstance(arguments, instance); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java index 31962f4d4ee..d3f4c35151a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java @@ -16,13 +16,13 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -154,18 +154,8 @@ class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate return cmp; } - public CPPTemplateParameterMap getTemplateParameterMap() { - CPPTemplateParameterMap result= new CPPTemplateParameterMap(); - try { - ICPPTemplateParameter[] params = getPrimaryClassTemplate().getTemplateParameters(); - ICPPTemplateArgument[] args= getTemplateArguments(); - int len= Math.min(params.length, args.length); - for (int i = 0; i < len; i++) { - result.put(params[i], args[i]); - } - } catch (DOMException e) { - } - return result; + public ICPPTemplateParameterMap getTemplateParameterMap() { + return CPPTemplates.createParameterMap(getPrimaryClassTemplate(), getTemplateArguments()); } @Override 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 66a694500cb..b4327e8685e 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 @@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.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.ICPPTemplateNonTypeParameter; @@ -67,11 +68,11 @@ class PDOMCPPClassTemplateSpecialization extends PDOMCPPClassSpecialization return template.getTemplateParameters(); } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return PDOMInstanceCache.getCache(this).getInstance(arguments); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { PDOMInstanceCache.getCache(this).addInstance(arguments, instance); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java index 196d317c199..97e59b1c05a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java @@ -21,9 +21,9 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.index.IIndexBinding; @@ -164,11 +164,11 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction return this; } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return PDOMInstanceCache.getCache(this).getInstance(arguments); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { PDOMInstanceCache.getCache(this).addInstance(arguments, instance); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java index 26b913a0cfc..bdc97803939 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java @@ -12,9 +12,9 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; @@ -51,11 +51,11 @@ class PDOMCPPFunctionTemplateSpecialization extends PDOMCPPFunctionSpecializatio return template.getTemplateParameters(); } - public ICPPTemplateInstance getInstance(IType[] arguments) { + public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return PDOMInstanceCache.getCache(this).getInstance(arguments); } - public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { PDOMInstanceCache.getCache(this).addInstance(arguments, instance); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java index 287f4ae89e4..094f06f4b9b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java @@ -16,10 +16,15 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IValue; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; +import org.eclipse.cdt.internal.core.dom.parser.Value; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.Database; +import org.eclipse.cdt.internal.core.pdom.db.IString; import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; @@ -33,19 +38,28 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE; private static final int PARAMETERPOS= PDOMCPPVariable.RECORD_SIZE + 4; + private static final int DEFAULTVAL= PDOMCPPVariable.RECORD_SIZE + 8; /** * The size in bytes of a PDOMCPPTemplateTypeParameter record in the database. */ @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPVariable.RECORD_SIZE + 8; + protected static final int RECORD_SIZE = PDOMCPPVariable.RECORD_SIZE + 12; public PDOMCPPTemplateNonTypeParameter(PDOM pdom, PDOMNode parent, ICPPTemplateNonTypeParameter param) throws CoreException { super(pdom, parent, param); final Database db = pdom.getDB(); db.putInt(record + PARAMETERPOS, param.getParameterPosition()); + ICPPTemplateArgument val= param.getDefaultValue(); + if (val != null) { + IValue sval= val.getNonTypeValue(); + if (sval != null) { + IString s= db.newString(sval.getCanonicalRepresentation()); + db.putInt(record + DEFAULTVAL, s.getRecord()); + } + } } public PDOMCPPTemplateNonTypeParameter(PDOM pdom, int bindingRecord) { @@ -62,6 +76,22 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe return IIndexCPPBindingConstants.CPP_TEMPLATE_NON_TYPE_PARAMETER; } + public ICPPTemplateArgument getDefaultValue() { + try { + final Database db = pdom.getDB(); + int rec= db.getInt(record + DEFAULTVAL); + if (rec == 0) + return null; + String val= db.getString(rec).getString(); + if (val == null) + return null; + return new CPPTemplateArgument(Value.fromCanonicalRepresentation(val), getType()); + } catch (CoreException e) { + CCorePlugin.log(e); + return null; + } + } + public int getParameterPosition() { try { final Database db = pdom.getDB(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateParameterMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateParameterMap.java index fec284d5363..1c7b1d81eae 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateParameterMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateParameterMap.java @@ -11,12 +11,12 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.db.IString; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; @@ -99,11 +99,11 @@ public class PDOMCPPTemplateParameterMap { Assert.isTrue(len >= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/12); if (len == 0) { - return new CPPTemplateParameterMap(); + return CPPTemplateParameterMap.EMPTY; } rec+=2; - CPPTemplateParameterMap result= new CPPTemplateParameterMap(); + CPPTemplateParameterMap result= new CPPTemplateParameterMap(len); for (int i=0; i args = new ArrayList(); - public boolean visit(IPDOMNode node) throws CoreException { - if (node instanceof IType) - args.add((IType) node); - return false; - } - public void leave(IPDOMNode node) throws CoreException { - } - public IType[] getTemplateArguments() { - return args.toArray(new IType[args.size()]); - } - } - - public IType[] getArguments() { + public ICPPTemplateArgument[] getArguments() { if (arguments == null) { try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - TemplateArgumentCollector visitor = new TemplateArgumentCollector(); - list.accept(visitor); - arguments = visitor.getTemplateArguments(); + final int rec= getPDOM().getDB().getInt(record+ARGUMENTS); + arguments= PDOMCPPArgumentList.getArguments(this, rec); } catch (CoreException e) { CCorePlugin.log(e); - return IType.EMPTY_TYPE_ARRAY; + arguments= ICPPTemplateArgument.EMPTY_ARGUMENTS; } } return arguments; @@ -101,7 +75,7 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP @Override public String toString() { - return getName() + " <" + ASTTypeUtil.getTypeListString(getArguments()) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ + return getName() + " <" + ASTTypeUtil.getArgumentListString(getArguments(), true) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ } @Override @@ -120,8 +94,8 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP if (type instanceof ICPPUnknownClassInstance) { ICPPUnknownClassInstance rhs= (ICPPUnknownClassInstance) type; if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) { - IType[] lhsArgs= getArguments(); - IType[] rhsArgs= rhs.getArguments(); + ICPPTemplateArgument[] lhsArgs= getArguments(); + ICPPTemplateArgument[] rhsArgs= rhs.getArguments(); if (lhsArgs != rhsArgs) { if (lhsArgs == null || rhsArgs == null) return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMInstanceCache.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMInstanceCache.java index 992843e6f99..66eb1e0346d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMInstanceCache.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMInstanceCache.java @@ -14,7 +14,7 @@ import java.util.HashMap; 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.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -52,7 +52,7 @@ public class PDOMInstanceCache { fMap= new HashMap(); } - synchronized public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + synchronized public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) { try { String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true); fMap.put(key, instance); @@ -62,7 +62,7 @@ public class PDOMInstanceCache { } } - synchronized public final ICPPTemplateInstance getInstance(IType[] arguments) { + synchronized public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { try { String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true); return fMap.get(key); @@ -85,7 +85,7 @@ public class PDOMInstanceCache { if (node instanceof ICPPTemplateInstance) { ICPPTemplateInstance inst= (ICPPTemplateInstance) node; if (binding.equals(inst.getTemplateDefinition())) { - IType[] args= inst.getArguments(); + ICPPTemplateArgument[] args= inst.getTemplateArguments(); addInstance(args, inst); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexLabelProvider.java index bfa3721ae61..5fb7545750c 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexLabelProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexLabelProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2007 QNX Software Systems and others. + * Copyright (c) 2006, 2008 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -12,7 +12,6 @@ * Andrew Ferguson (Symbian) * Bryan Wilkinson (QNX) *******************************************************************************/ - package org.eclipse.cdt.internal.ui.indexview; import org.eclipse.core.runtime.CoreException; @@ -29,7 +28,6 @@ import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IFunction; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; @@ -37,13 +35,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +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.model.ICContainer; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; @@ -103,11 +100,11 @@ public class IndexLabelProvider extends LabelProvider { } buffer.append(result); buffer.append('<'); - IType[] types = ((ICPPTemplateInstance) element).getArguments(); + ICPPTemplateArgument[] types = ((ICPPTemplateInstance) element).getTemplateArguments(); for (int i = 0; i < types.length; i++) { if (i > 0) buffer.append(','); - buffer.append(ASTTypeUtil.getType(types[i])); + buffer.append(ASTTypeUtil.getArgumentString(types[i], false)); } buffer.append('>'); result = buffer.toString(); @@ -115,14 +112,11 @@ public class IndexLabelProvider extends LabelProvider { StringBuffer buffer = new StringBuffer("Part: "); //$NON-NLS-1$ buffer.append(result); buffer.append('<'); - try { - IType[] types = ((ICPPClassTemplatePartialSpecialization) element).getArguments(); - for (int i = 0; i < types.length; i++) { - if (i > 0) - buffer.append(','); - buffer.append(ASTTypeUtil.getType(types[i])); - } - } catch (DOMException e) { + ICPPTemplateArgument[] types = ((ICPPClassTemplatePartialSpecialization) element).getTemplateArguments(); + for (int i = 0; i < types.length; i++) { + if (i > 0) + buffer.append(','); + buffer.append(ASTTypeUtil.getArgumentString(types[i], false)); } buffer.append('>'); result = buffer.toString(); @@ -135,19 +129,9 @@ public class IndexLabelProvider extends LabelProvider { if (!(spec instanceof ICPPTemplateDefinition) && spec.getSpecializedBinding() instanceof ICPPTemplateDefinition) { - ICPPTemplateDefinition template = (ICPPTemplateDefinition) spec.getSpecializedBinding(); - try { - ICPPTemplateParameter[] params = template.getTemplateParameters(); - buffer.append('<'); - ObjectMap argMap = ((ICPPSpecialization) element).getArgumentMap(); - for (int i = 0; i < params.length; i++) { - if (i > 0) - buffer.append(','); - buffer.append(ASTTypeUtil.getType((IType) argMap.get(params[i]))); - } - buffer.append('>'); - } catch (DOMException e) { - } + buffer.append('<'); + buffer.append(((ICPPSpecialization) element).getTemplateParameterMap().toString()); + buffer.append('>'); } result = buffer.toString();