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();