From 6724c62308187683d07902ade5c0cf28391e0cc5 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 22 Oct 2008 10:58:24 +0000 Subject: [PATCH] API and data-structures for proper support of template non-type arguments, bug 242668. --- .../internal/core/browser/IndexModelUtil.java | 4 +- .../core/model/ext/CElementHandle.java | 3 +- .../eclipse/cdt/core/dom/ast/ASTTypeUtil.java | 157 +++++++++-------- .../dom/ast/cpp/CPPTemplateParameterMap.java | 102 +++++++++++ ...CPPClassTemplatePartialSpecialization.java | 21 +-- .../ast/cpp/ICPPDeferredTemplateInstance.java | 15 +- .../core/dom/ast/cpp/ICPPSpecialization.java | 27 ++- .../dom/ast/cpp/ICPPTemplateArgument.java | 55 ++++++ .../dom/ast/cpp/ICPPTemplateInstance.java | 11 +- .../dom/ast/cpp/ICPPTemplateParameter.java | 21 ++- .../dom/ast/cpp/ICPPTemplateParameterMap.java | 29 ++++ .../cdt/internal/core/dom/parser/Value.java | 16 +- .../core/dom/parser/c/CBasicType.java | 4 +- .../core/dom/parser/cpp/CPPClassInstance.java | 24 ++- .../parser/cpp/CPPClassSpecialization.java | 5 +- ...CPPClassTemplatePartialSpecialization.java | 67 ++++---- .../cpp/CPPClassTemplateSpecialization.java | 3 +- .../parser/cpp/CPPConstructorInstance.java | 17 +- .../cpp/CPPConstructorSpecialization.java | 5 +- .../CPPConstructorTemplateSpecialization.java | 11 +- .../parser/cpp/CPPDeferredClassInstance.java | 36 ++-- .../cpp/CPPDeferredFunctionInstance.java | 48 +++--- .../parser/cpp/CPPFieldSpecialization.java | 6 +- .../dom/parser/cpp/CPPFunctionInstance.java | 36 ++-- .../parser/cpp/CPPFunctionSpecialization.java | 16 +- .../CPPFunctionTemplateSpecialization.java | 8 +- .../dom/parser/cpp/CPPMethodInstance.java | 12 +- .../parser/cpp/CPPMethodSpecialization.java | 9 +- .../cpp/CPPMethodTemplateSpecialization.java | 17 +- .../cpp/CPPParameterSpecialization.java | 6 +- .../dom/parser/cpp/CPPSpecialization.java | 18 +- .../dom/parser/cpp/CPPTemplateArgument.java | 59 +++++++ .../dom/parser/cpp/CPPTemplateParameter.java | 49 +++++- .../parser/cpp/CPPTypedefSpecialization.java | 27 ++- .../parser/cpp/semantics/CPPTemplates.java | 162 ++++++++++++++++-- .../dom/parser/cpp/semantics/CPPVisitor.java | 4 +- .../dom/parser/cpp/semantics/Conversions.java | 2 +- .../cpp/CompositeCPPClassInstance.java | 20 ++- .../cpp/CompositeCPPClassSpecialization.java | 23 ++- ...CPPClassTemplatePartialSpecialization.java | 40 ++++- .../CompositeCPPDeferredClassInstance.java | 29 +++- .../CompositeCPPDeferredFunctionInstance.java | 36 +++- .../cpp/CompositeCPPFieldSpecialization.java | 29 +++- .../cpp/CompositeCPPFunctionInstance.java | 36 +++- .../CompositeCPPFunctionSpecialization.java | 25 ++- .../CompositeCPPParameterSpecialization.java | 27 ++- .../CompositeCPPTemplateNonTypeParameter.java | 6 + .../CompositeCPPTemplateTypeParameter.java | 6 + .../CompositeCPPTypedefSpecialization.java | 28 ++- .../composite/cpp/TemplateInstanceUtil.java | 81 +++++++-- .../core/pdom/dom/c/PDOMCBasicType.java | 15 +- .../pdom/dom/cpp/PDOMCPPArgumentList.java | 115 +++++++++++++ .../core/pdom/dom/cpp/PDOMCPPBasicType.java | 10 +- .../pdom/dom/cpp/PDOMCPPClassInstance.java | 83 +++------ ...CPPClassTemplatePartialSpecialization.java | 161 ++++++++--------- .../dom/cpp/PDOMCPPDeferredClassInstance.java | 66 ++----- .../pdom/dom/cpp/PDOMCPPFunctionInstance.java | 55 ++---- .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 13 +- .../pdom/dom/cpp/PDOMCPPSpecialization.java | 133 +++----------- .../cpp/PDOMCPPTemplateNonTypeParameter.java | 22 ++- .../dom/cpp/PDOMCPPTemplateParameterMap.java | 124 ++++++++++++++ .../dom/cpp/PDOMCPPTemplateTypeParameter.java | 24 ++- .../core/pdom/dom/cpp/PDOMCPPVariable.java | 3 +- .../lrparser/c99/bindings/C99BasicType.java | 1 + 64 files changed, 1575 insertions(+), 748 deletions(-) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPTemplateParameterMap.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameterMap.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateArgument.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPArgumentList.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateParameterMap.java diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/IndexModelUtil.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/IndexModelUtil.java index f321dd577e0..f06677dc29f 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/IndexModelUtil.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/IndexModelUtil.java @@ -170,7 +170,7 @@ public class IndexModelUtil { String[] parameterTypes= new String[params.length]; for (int i = 0; i < params.length; i++) { IParameter param = params[i]; - parameterTypes[i]= ASTTypeUtil.getType(param.getType()); + parameterTypes[i]= ASTTypeUtil.getType(param.getType(), false); } if (parameterTypes.length == 1 && parameterTypes[0].equals("void")) { //$NON-NLS-1$ return EMPTY_STRING_ARRAY; @@ -185,6 +185,6 @@ public class IndexModelUtil { * @throws DOMException */ public static String extractReturnType(IFunction function) throws DOMException { - return ASTTypeUtil.getType(function.getType().getReturnType()); + return ASTTypeUtil.getType(function.getType().getReturnType(), false); } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/CElementHandle.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/CElementHandle.java index bcacedf9661..9ae34d53c11 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/CElementHandle.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ext/CElementHandle.java @@ -9,7 +9,6 @@ * Markus Schorn - initial API and implementation * Anton Leherbauer (Wind River Systems) *******************************************************************************/ - package org.eclipse.cdt.internal.core.model.ext; import java.net.URI; @@ -271,7 +270,7 @@ abstract class CElementHandle implements ICElementHandle, ISourceReference { String[] parameterTypes= new String[params.length]; for (int i = 0; i < params.length; i++) { IParameter param = params[i]; - parameterTypes[i]= ASTTypeUtil.getType(param.getType()); + parameterTypes[i]= ASTTypeUtil.getType(param.getType(), false); } if (parameterTypes.length == 1 && parameterTypes[0].equals("void")) { //$NON-NLS-1$ return EMPTY_STRING_ARRAY; 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 94bdfb465db..75c76051f3c 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 @@ -27,9 +27,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; 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.ICPPTemplateScope; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPBasicType; import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPPointerType; import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPQualifierType; @@ -56,13 +56,9 @@ public class ASTTypeUtil { private static final int DEAULT_ITYPE_SIZE = 2; /** - * Returns a String representation of the parameter type of an IFunctionType. - * - * This function calls ASTTypeUtil#getParameterTypeStringArray(IFunctionType) and wraps the - * results in "()" with a comma separated list. - * - * @param type - * @return the representation of the parameter type of an IFunctionType + * Returns a string representation for the parameters of the given function type. The + * representation contains the comma-separated list of the normalized parameter type + * representations wrapped in parenthesis. */ public static String getParameterTypeString(IFunctionType type) { StringBuilder result = new StringBuilder(); @@ -80,29 +76,75 @@ public class ASTTypeUtil { return result.toString(); } + /** + * Returns a string representation for the type array. The representation is + * a comma-separated list of the normalized string representations of the + * provided types. + * @see #getTypeListString(IType[], boolean) + */ + public static String getTypeListString(IType[] types) { + return getTypeListString(types, true); + } + /** * Returns a String representation of the type array as a * comma-separated list. * @param types * @return representation of the type array as a comma-separated list + * @since 5.1 */ - public static String getTypeListString(IType[] types) { + public static String getTypeListString(IType[] types, boolean normalize) { StringBuilder result = new StringBuilder(); for (int i = 0; i < types.length; i++) { if (types[i] != null) { - result.append(getTypeString(types[i])); + result.append(getType(types[i], normalize)); if (i < types.length - 1) result.append(COMMA_SPACE); } } return result.toString(); } + + /** + * Returns a comma-separated list of the string representations of the arguments. + * Optionally normalization is performed: + *
template parameter names are represented by their parameter position, + *
further normalization may be performed in future versions. + * @param normalize indicates whether normalization shall be performed + * @since 5.1 + */ + public static String getArgumentListString(ICPPTemplateArgument[] args, boolean normalize) { + StringBuilder result= new StringBuilder(); + boolean first= true; + for (ICPPTemplateArgument arg : args) { + if (!first) { + result.append(','); + } + first= false; + result.append(getArgumentString(arg, normalize)); + } + return result.toString(); + } /** - * Returns String[] corresponding to the types of the parameters for the IFunctionType. - * - * @param type - * @return the types of the parameters for the IFunctionType + * Returns a string representation for an template argument. Optionally + * normalization is performed: + *
template parameter names are represented by their parameter position, + *
further normalization may be performed in future versions. + * @param normalize indicates whether normalization shall be performed + * @since 5.1 + */ + public static String getArgumentString(ICPPTemplateArgument arg, boolean normalize) { + if (arg.isNonTypeValue()) + return arg.getNonTypeValue().getCanonicalRepresentation(); + + return getTypeString(arg.getTypeValue(), normalize); + } + + /** + * Returns an array of normalized string representations for the parameter types of the + * given function type. + * @see #getType(IType, boolean) */ public static String[] getParameterTypeStringArray(IFunctionType type) { IType[] parms = null; @@ -123,7 +165,7 @@ public class ASTTypeUtil { return result; } - private static String getTypeString(IType type) { + private static String getTypeString(IType type, boolean normalize) { StringBuilder result = new StringBuilder(); boolean needSpace = false; @@ -269,29 +311,16 @@ public class ASTTypeUtil { } } catch (DOMException e) { } + } else if (type instanceof ICPPTemplateParameter) { + final ICPPTemplateParameter tpar = (ICPPTemplateParameter) type; + if (normalize) { + result.append('#'); + result.append(Integer.toString(tpar.getParameterPosition(), 16)); + } else { + result.append(tpar.getName()); + } } else if (type instanceof ICompositeType) { // 101114 fix, do not display class, and for consistency don't display struct/union as well -// if (type instanceof ICPPClassType) { -// try { -// switch(((ICPPClassType) type).getKey()) { -// case ICPPClassType.k_class: -// result.append(Keywords.CLASS); -// break; -// } -// } catch (DOMException e) {} -// } -// -// try { -// switch(((ICompositeType) type).getKey()) { -// case ICompositeType.k_struct: -// result.append(Keywords.STRUCT); -// break; -// case ICompositeType.k_union: -// result.append(Keywords.UNION); -// break; -// } -// } catch (DOMException e) {} -// result.append(SPACE); if (type instanceof ICPPClassType) { try { String qn = CPPVisitor.renderQualifiedName(getQualifiedNameForAnonymous((ICPPClassType) type)); @@ -304,17 +333,13 @@ public class ASTTypeUtil { } } else if (type instanceof ICPPReferenceType) { result.append(Keywords.cpAMPER); - } else if (type instanceof ICPPTemplateTypeParameter) { - result.append(((ICPPTemplateTypeParameter) type).getName()); - } else if (type instanceof ICPPTemplateTemplateParameter) { - result.append(((ICPPTemplateTemplateParameter) type).getName()); } else if (type instanceof IEnumeration) { result.append(Keywords.ENUM); result.append(SPACE); result.append(getNameForAnonymous((IEnumeration) type)); } else if (type instanceof IFunctionType) { try { - String temp = getType(((IFunctionType) type).getReturnType()); + String temp = getType(((IFunctionType) type).getReturnType(), normalize); if (temp != null && !temp.equals(EMPTY_STRING)) { result.append(temp); needSpace = true; } @@ -389,23 +414,24 @@ public class ASTTypeUtil { } /** - * Returns the type representation of the IType as a String. This function uses the IType interfaces to build the - * String representation of the IType. Resolves typedefs. - * @param type - * @return the type representation of the IType + * Returns the normalized string representation of the type. + * @see #getType(IType, boolean) */ public static String getType(IType type) { return getType(type, true); } /** - * Returns the type representation of the IType as a String. This function uses the IType interfaces to build the - * String representation of the IType. - * @param type - * @param resolveTypedefs whether or not typedefs shall be resolved to their real types + * Returns a string representation of a type. + * Optionally the representation is normalized: + *
typedefs are resolved + *
template parameter names are represented by their parameter position + *
further normalization may be performed in the future. + * @param type a type to compute the string representation for. + * @param normalize whether or not normalization should be performed. * @return the type representation of the IType */ - public static String getType(IType type, boolean resolveTypedefs) { + public static String getType(IType type, boolean normalize) { StringBuilder result = new StringBuilder(); IType[] types = new IType[DEAULT_ITYPE_SIZE]; @@ -413,10 +439,10 @@ public class ASTTypeUtil { int i = 0; while (type != null && ++i < 100) { final boolean isTypedef= type instanceof ITypedef; - if (!resolveTypedefs || !isTypedef) { + if (!normalize || !isTypedef) { types = (IType[]) ArrayUtil.append(IType.class, types, type); } - if (!resolveTypedefs && isTypedef) { + if (!normalize && isTypedef) { type= null; // stop here } else if (type instanceof ITypeContainer) { try { @@ -436,12 +462,12 @@ public class ASTTypeUtil { if (types[j] != null) { if (j > 0 && types[j - 1] instanceof IQualifierType) { - result.append(getTypeString(types[j - 1])); + result.append(getTypeString(types[j - 1], normalize)); result.append(SPACE); - result.append(getTypeString(types[j])); + result.append(getTypeString(types[j], normalize)); --j; } else { - result.append(getTypeString(types[j])); + result.append(getTypeString(types[j], normalize)); } } } @@ -450,10 +476,10 @@ public class ASTTypeUtil { } /** - * Returns the type representation of the declarator (including parameters) as a String. - * - * @param decltor - * @return the type representation of the IASTDeclarator (including parameters) + * For testing purposes, only. + * Returns the normalized string representation of the type defined by the given declarator. + * + * @noreference This method is not intended to be referenced by clients. */ public static String getType(IASTDeclarator decltor) { // get the most nested declarator @@ -485,13 +511,10 @@ public class ASTTypeUtil { } /** - * Return's the String representation of a node's type (if available). This is - * currently only being used for testing. + * For testing purposes, only. + * Return's the String representation of a node's type (if available). * - * TODO Remove this function when done testing if it is no longer needed - * - * @param node - * @return the String representation of a node's type (if available) + * @noreference This method is not intended to be referenced by clients. */ public static String getNodeType(IASTNode node) { try { @@ -511,7 +534,7 @@ public class ASTTypeUtil { } /** - * Retuns the type representation of the IASTTypeId as a String. + * Returns the type representation of the IASTTypeId as a String. * * @param typeId * @return the type representation of the IASTTypeId as a String 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/core/dom/ast/cpp/CPPTemplateParameterMap.java new file mode 100644 index 00000000000..6ac289d4cbe --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPTemplateParameterMap.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.dom.ast.cpp; + +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; +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(); + + private ObjectMap fMap= new ObjectMap(2); + + /** + * Returns whether the map contains the given parameter + */ + public boolean contains(ICPPTemplateParameter templateParameter) { + return fMap.containsKey(templateParameter.getParameterPosition()); + } + + /** + * Adds the mapping to the map. + */ + public void put(ICPPTemplateParameter param, ICPPTemplateArgument value) { + fMap.put(param.getParameterPosition(), value); + } + + /** + * Adds the mapping to the map. + */ + public void put(int parameterPos, ICPPTemplateArgument value) { + fMap.put(parameterPos, value); + } + + /** + * Returns the value for the given parameter. + */ + public ICPPTemplateArgument getArgument(ICPPTemplateParameter param) { + return (ICPPTemplateArgument) fMap.get(param.getParameterPosition()); + } + + /** + * Returns the value for the template parameter at the given position. + * @see ICPPTemplateParameter#getParameterPosition() + */ + public ICPPTemplateArgument getArgument(int paramPosition) { + return (ICPPTemplateArgument) fMap.get(paramPosition); + } + + /** + * 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)); + } + } + + /** + * Returns the array of template parameter positions, for which a mapping exists. + */ + public Integer[] getAllParameterPositions() { + return fMap.keyArray(Integer.class); + } + + /** + * For debugging purposes, only. + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder("{"); //$NON-NLS-1$ + for (int i = 0; i < fMap.size(); i++) { + Integer key = (Integer) fMap.keyAt(i); + if (key != null) { + if (sb.length() > 1) { + sb.append(", "); //$NON-NLS-1$ + } + ICPPTemplateArgument value = (ICPPTemplateArgument) fMap.getAt(i); + sb.append('#'); + sb.append(key >> 16); + sb.append(','); + sb.append(key & 0xffff); + sb.append(": "); //$NON-NLS-1$ + sb.append(ASTTypeUtil.getArgumentString(value, true)); + } + } + sb.append("}"); //$NON-NLS-1$ + return sb.toString(); + } +} 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 8fbdc6702b5..d18e43f8eeb 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 @@ -6,29 +6,23 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ -/* - * Created on Mar 23, 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 - */ - /** * This interface represents a class template partial specialization. A partial specialization is * a class template in its own right. * - * eg: + * e.g.: * template class A {}; //the primary class template * template class A {}; //a partial specialization of the primary class template * - * @author aniefer + * @noimplement This interface is not intended to be implemented by clients. */ public interface ICPPClassTemplatePartialSpecialization extends ICPPClassTemplate { public static final ICPPClassTemplatePartialSpecialization[] EMPTY_PARTIAL_SPECIALIZATION_ARRAY = new ICPPClassTemplatePartialSpecialization[0]; @@ -43,4 +37,11 @@ public interface ICPPClassTemplatePartialSpecialization extends ICPPClassTemplat * get the ICPPTemplateDefinition which this is a specialization of */ public ICPPClassTemplate getPrimaryClassTemplate() throws DOMException; + + + /** + * Returns the arguments of this partial specialization. + * @since 5.1 + */ + public ICPPTemplateArgument[] getTemplateArguments(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java index cc4993f21f2..ea326cf4b3b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java @@ -1,17 +1,26 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. + * Copyright (c) 2007, 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Bryan Wilkinson (QNX) - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; /** - * @author Bryan Wilkinson + * Interface for deferred instances. A deferred instance is not actually instantiated yet, + * because the correct template cannot be selected until all information is available. */ public interface ICPPDeferredTemplateInstance extends ICPPTemplateInstance { + + /** + * Returns an empty map, because template parameters cannot be mapped until + * all of the arguments are resolved. + * @since 5.1 + */ + public ICPPTemplateParameterMap getTemplateParameterMap(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPSpecialization.java index 23582f5816f..5bc8b616be4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPSpecialization.java @@ -1,17 +1,14 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 IBM Corporation and others. + * Copyright (c) 2005, 2008 IBM Corporation 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation - * / + * Andrew Niefer (IBM) - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ -/* - * Created on Apr 29, 2005 - */ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -22,11 +19,9 @@ import org.eclipse.cdt.core.parser.util.ObjectMap; * specializations of the members of the original class template. * For an instantiation of a function template, the parameters will be specializations * of the parameters of the original function template. + * Specializations can also be explicitly defined. * - * Specializations can also be explicitly defined - * - * @author aniefer - * + * @noimplement This interface is not intended to be implemented by clients. */ public interface ICPPSpecialization extends ICPPBinding { /** @@ -36,10 +31,14 @@ public interface ICPPSpecialization extends ICPPBinding { public IBinding getSpecializedBinding(); /** - * Returns the argument map for this specialization. For partial specializations, only - * those arguments which have been specialized will appear. - * @return a map which maps from template parameter to the corresponding - * template argument + * Returns the mapping of template parameters to values. + * @since 5.1 */ + public ICPPTemplateParameterMap getTemplateParameterMap(); + + /** + * @deprecated use {@link #getTemplateParameterMap()}, instead. + */ + @Deprecated public ObjectMap getArgumentMap(); } 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 new file mode 100644 index 00000000000..842174b8a31 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.dom.ast.cpp; + +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.IValue; + +/** + * Models the value of a template parameter or for the argument of a template-id. + * Such a value can either be a type-value, or an integral value. + * + * @since 5.1 + */ +public interface ICPPTemplateArgument { + ICPPTemplateArgument[] EMPTY_ARGUMENTS = {}; + + /** + * Returns whether this is an integral value, suitable for a template non-type parameter. + */ + boolean isNonTypeValue(); + + /** + * If this is a type value (suitable for a template type and template template parameters), + * the type used as a value is returned. + * For non-type values, null is returned. + */ + IType getTypeValue(); + + /** + * If this is a non-type value (suitable for a template non-type parameters), + * the value is returned. + * For type values, null is returned. + */ + IValue getNonTypeValue(); + + /** + * If this is a non-type value (suitable for a template non-type parameter), + * the type of the value is returned. + * For type values, null is returned. + */ + IType getTypeOfNonTypeValue(); + + /** + * Checks whether two arguments denote the same value. + */ + boolean isSameValue(ICPPTemplateArgument arg); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateInstance.java index 80a1c2108b8..d93eb3952cc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateInstance.java @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * IBM - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; @@ -35,7 +35,14 @@ public interface ICPPTemplateInstance extends ICPPSpecialization { public ICPPTemplateDefinition getTemplateDefinition(); /** - * get the types of the arguments the template was instantiated with. + * Returns the template arguments of this instance. + * @since 5.1 */ + public ICPPTemplateArgument[] getTemplateArguments(); + + /** + * @deprecated use {@link #getTemplateArguments()}, instead. + */ + @Deprecated public IType[] getArguments(); } 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 9a51f81fe74..93d755683c3 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 @@ -1,19 +1,32 @@ /******************************************************************************* - * Copyright (c) 2004, 2005 IBM Corporation and others. + * Copyright (c) 2004, 2008 IBM Corporation 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 * 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; - /** - * @author Doug Schaefer + * Base interface for all template parameters (non-type, type and template). + * + * @noimplement This interface is not intended to be implemented by clients. */ public interface ICPPTemplateParameter extends ICPPBinding { public static final ICPPTemplateParameter[] EMPTY_TEMPLATE_PARAMETER_ARRAY = new ICPPTemplateParameter[0]; + + /** + * The position of the template parameter is determined by the nesting level of the template + * declaration and the position within the template parameter list. In every context where a + * template parameter can be referenced (i.e. within a template declaration) the parameter + * position is unique. + * + * The position is computed by (nesting-level << 16) + position-in-parameter-list + * @since 5.1 + */ + int getParameterPosition(); } 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 new file mode 100644 index 00000000000..debfba65079 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateParameterMap.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.dom.ast.cpp; + +/** + * Models the mapping of template parameters to values. + * @since 5.1 + */ +public interface ICPPTemplateParameterMap { + + /** + * Returns the value for the template parameter at the given position. + * @see ICPPTemplateParameter#getParameterPosition() + */ + public ICPPTemplateArgument getArgument(int paramPosition); + + /** + * Returns the array of template parameter positions, for which a mapping exists. + */ + Integer[] getAllParameterPositions(); +} 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 4b11532988e..98329d8a834 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 @@ -49,6 +49,7 @@ public class Value implements IValue { private final String fValue; private Value(String rep) { + assert rep != null; fValue= rep; } public String getCanonicalRepresentation() { @@ -62,6 +63,18 @@ public class Value implements IValue { } return null; } + + @Override + public int hashCode() { + return fValue.hashCode(); + } + @Override + public boolean equals(Object obj) { + if (!(obj instanceof IValue)) { + return false; + } + return fValue.equals(((IValue) obj).getCanonicalRepresentation()); + } public static IValue create(long value) { if (value >=0 && value < TYPICAL.length) @@ -185,8 +198,7 @@ public class Value implements IValue { @SuppressWarnings("nls") private static String evaluate(ICPPTemplateParameter param) { - // mstodo add support for parameter positions first. - return "#" ;//+Integer.toHexString(param.getParameterPosition()); + return "#" + Integer.toHexString(param.getParameterPosition()); } @SuppressWarnings("nls") diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CBasicType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CBasicType.java index 11cfab8cf62..3a9cdb91694 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CBasicType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CBasicType.java @@ -148,9 +148,7 @@ public class CBasicType implements ICBasicType { return t; } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IBasicType#getValue() - */ + @Deprecated public IASTExpression getValue() { return value; } 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 abbbdad3dec..671da1aec62 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 @@ -6,28 +6,31 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - Initial API and implementation * Bryan Wilkinson (QNX) * Andrew Ferguson (Symbian) * Sergey Prigogin (Google) + * Markus Schorn (Wind River Systems) *******************************************************************************/ 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; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; -import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; /** - * @author aniefer + * The result of instantiating a class template. */ public class CPPClassInstance extends CPPClassSpecialization implements ICPPTemplateInstance { - private IType[] arguments; + private ICPPTemplateArgument[] arguments; - public CPPClassInstance(IBinding owner, ICPPClassType orig, ObjectMap argMap, IType[] args) { + public CPPClassInstance(IBinding owner, ICPPClassType orig, CPPTemplateParameterMap argMap, ICPPTemplateArgument[] args) { super(orig, owner, argMap); this.arguments= args; } @@ -35,17 +38,22 @@ public class CPPClassInstance extends CPPClassSpecialization implements ICPPTemp public ICPPTemplateDefinition getTemplateDefinition() { return (ICPPTemplateDefinition) getSpecializedBinding(); } - - public IType[] getArguments() { + + public ICPPTemplateArgument[] getTemplateArguments() { return arguments; } + @Deprecated + public IType[] getArguments() { + return CPPTemplates.getArguments(getTemplateArguments()); + } + /* (non-Javadoc) * For debug purposes only */ @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 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 0e7fb8901b1..078d4e2492c 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,6 +26,7 @@ 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; @@ -53,7 +54,7 @@ public class CPPClassSpecialization extends CPPSpecialization private ObjectMap specializationMap= ObjectMap.EMPTY_MAP; private boolean checked; - public CPPClassSpecialization(ICPPClassType specialized, IBinding owner, ObjectMap argumentMap) { + public CPPClassSpecialization(ICPPClassType specialized, IBinding owner, CPPTemplateParameterMap argumentMap) { super(specialized, owner, argumentMap); } @@ -70,7 +71,7 @@ public class CPPClassSpecialization extends CPPSpecialization return result; } - IBinding result= CPPTemplates.createSpecialization(this, original, argumentMap); + IBinding result= CPPTemplates.createSpecialization(this, original, getArgumentMap()); 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 e8189a139e3..854c371ecaa 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 @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -14,39 +14,45 @@ 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.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.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; /** - * @author aniefer + * A partial class template specialization. */ -public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate implements - ICPPClassTemplatePartialSpecialization, ICPPSpecialization { +public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate + implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization { + + private ICPPTemplateArgument[] arguments; - private IType [] arguments; - /** - * @param name - */ public CPPClassTemplatePartialSpecialization(ICPPASTTemplateId name) { super(name); } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateSpecialization#getArguments() - */ - public IType[] getArguments() { - if( arguments == null ){ - ICPPASTTemplateId id= (ICPPASTTemplateId) getTemplateName(); - arguments = CPPTemplates.createTemplateArgumentArray(id); - } + public ICPPTemplateArgument[] getTemplateArguments() { + createArguments(); return arguments; } + private void createArguments() { + if (arguments == null) { + arguments= CPPTemplates.convert( + CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) getTemplateName())); + } + } + + @Deprecated + public IType[] getArguments() { + return CPPTemplates.getArguments(getTemplateArguments()); + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization#getPrimaryClassTemplate() */ @@ -59,25 +65,22 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate impl return getPrimaryClassTemplate(); } - /* - * (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization#getArgumentMap() - */ - public ObjectMap getArgumentMap() { - IType[] arg= getArguments(); - ICPPTemplateParameter[] params; + public CPPTemplateParameterMap getTemplateParameterMap() { + CPPTemplateParameterMap result= new CPPTemplateParameterMap(); try { - params = getPrimaryClassTemplate().getTemplateParameters(); + 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 ObjectMap.EMPTY_MAP; - } - // lengths should be equal, be defensive - final int len= Math.min(params.length, arg.length); - ObjectMap map = new ObjectMap(len); - for (int i = 0; i < len; i++) { - map.put(params[i], arg[i]); } + return result; + } - return map; + @Deprecated + public ObjectMap getArgumentMap() { + return CPPTemplates.getArgumentMap(getPrimaryClassTemplate(), getTemplateParameterMap()); } } 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 3e4ab6761be..a96e1b28a12 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 @@ -14,6 +14,7 @@ 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; @@ -30,7 +31,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization private ObjectMap instances = null; - public CPPClassTemplateSpecialization(ICPPClassTemplate orig, ICPPClassType owner, ObjectMap argumentMap) { + public CPPClassTemplateSpecialization(ICPPClassTemplate orig, ICPPClassType owner, CPPTemplateParameterMap argumentMap) { super(orig, owner, argumentMap); } 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 50a7ac28cf7..b1459c103af 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 @@ -6,26 +6,25 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Bryan Wilkinson (QNX) - 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.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.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; -import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; /** - * @author Bryan Wilkinson - * + * Instantiation of a constructor template */ -public class CPPConstructorInstance extends CPPMethodInstance implements - ICPPConstructor { +public class CPPConstructorInstance extends CPPMethodInstance implements ICPPConstructor { - public CPPConstructorInstance(ICPPClassType owner, ICPPConstructor orig, ObjectMap argMap, IType[] args) { - super(owner, orig, argMap, args); + public CPPConstructorInstance(ICPPClassType owner, ICPPConstructor orig, + CPPTemplateParameterMap tpmap, ICPPTemplateArgument[] args) { + super(owner, orig, tpmap, args); } public boolean isExplicit() throws DOMException { 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 a83bdf5f881..04f086eecf4 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.parser.util.ObjectMap; /** * Specialization of a constructor for a class-template or class-template specialization @@ -23,7 +23,8 @@ import org.eclipse.cdt.core.parser.util.ObjectMap; public class CPPConstructorSpecialization extends CPPMethodSpecialization implements ICPPConstructor { - public CPPConstructorSpecialization(IBinding orig, ICPPClassType owner, ObjectMap argMap) { + public CPPConstructorSpecialization(IBinding orig, ICPPClassType owner, + CPPTemplateParameterMap 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 11c38645424..74f65978409 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,18 +13,19 @@ 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.parser.util.ObjectMap; /** * Specialization of a constructor template */ -public class CPPConstructorTemplateSpecialization extends CPPMethodTemplateSpecialization implements ICPPConstructor { - +public class CPPConstructorTemplateSpecialization extends CPPMethodTemplateSpecialization + implements ICPPConstructor { + public CPPConstructorTemplateSpecialization(IBinding specialized, - ICPPClassType owner, ObjectMap argumentMap) { - super(specialized, owner, argumentMap); + ICPPClassType owner, CPPTemplateParameterMap tpmap) { + super(specialized, owner, tpmap); } /* (non-Javadoc) 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 8c8ab975351..b5df0bb7b5e 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 @@ -17,7 +17,9 @@ 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; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -27,10 +29,10 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; */ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDeferredClassInstance { - private final IType[] fArguments; + private final ICPPTemplateArgument[] fArguments; private final ICPPClassTemplate fClassTemplate; - public CPPDeferredClassInstance(ICPPClassTemplate template, IType[] arguments) throws DOMException { + public CPPDeferredClassInstance(ICPPClassTemplate template, ICPPTemplateArgument[] arguments) throws DOMException { super(template.getOwner(), new CPPASTName(template.getNameCharArray())); fArguments= arguments; @@ -62,21 +64,7 @@ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDef if (!classTemplate.isSameType((IType) rhs.getSpecializedBinding())) return false; - IType[] lhsArgs= getArguments(); - IType[] rhsArgs= rhs.getArguments(); - if (lhsArgs != rhsArgs) { - if (lhsArgs == null || rhsArgs == null) - return false; - - if (lhsArgs.length != rhsArgs.length) - return false; - - for (int i= 0; i < lhsArgs.length; i++) { - if (!CPPTemplates.isSameTemplateArgument(lhsArgs[i],rhsArgs[i])) - return false; - } - } - return true; + return CPPTemplates.haveSameArguments(this, rhs); } return false; } @@ -85,8 +73,13 @@ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDef public int getKey() throws DOMException { return getClassTemplate().getKey(); } - + + @Deprecated public IType[] getArguments() { + return CPPTemplates.getArguments(getTemplateArguments()); + } + + public ICPPTemplateArgument[] getTemplateArguments() { return fArguments; } @@ -95,8 +88,11 @@ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDef } public ObjectMap getArgumentMap() { - // mstodo- compute argmap - return null; + return ObjectMap.EMPTY_MAP; + } + + public CPPTemplateParameterMap getTemplateParameterMap() { + return CPPTemplateParameterMap.EMPTY; } public IBinding getSpecializedBinding() { 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 fe353243370..34378b8511b 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 @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Corporation - initial API and implementation + * Andrew Niefer (IBM Corporation) - initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -19,10 +19,12 @@ 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.parser.util.ObjectMap; @@ -31,17 +33,18 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; /** - * @author aniefer + * The deferred function instance collects information about the instantiation until it can + * be carried out. */ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements ICPPFunction, ICPPInternalFunction, ICPPDeferredTemplateInstance { - private IType[] fArguments; + private ICPPTemplateArgument[] fArguments; private ICPPFunctionTemplate fFunctionTemplate; - private ObjectMap fArgmap; + private CPPTemplateParameterMap fArgmap; private IParameter [] fParameters; private IFunctionType fFunctionType; - public CPPDeferredFunctionInstance( ICPPFunctionTemplate template, IType[] arguments ) throws DOMException { + public CPPDeferredFunctionInstance(ICPPFunctionTemplate template, ICPPTemplateArgument[] arguments) throws DOMException { super(template.getOwner(), new CPPASTName(template.getNameCharArray())); fArguments= arguments; fFunctionTemplate= template; @@ -55,38 +58,45 @@ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements IC return fFunctionTemplate; } + @Deprecated public ObjectMap getArgumentMap() { + return CPPTemplates.getArgumentMap(fFunctionTemplate, getTemplateParameterMap()); + } + + public CPPTemplateParameterMap getTemplateParameterMap() { + // mstodo- deferred function instance and tpmap if (fArgmap == null) { - fArgmap= ObjectMap.EMPTY_MAP; + CPPTemplateParameterMap argmap= new CPPTemplateParameterMap(); try { ICPPTemplateParameter[] params= fFunctionTemplate.getTemplateParameters(); - ObjectMap result= new ObjectMap(params.length); - for (int i=0; i < params.length; i++) { - if (i < fArguments.length) { - result.put(params[i], fArguments[i]); - } + ICPPTemplateArgument[] args= fArguments; + int len= Math.min(params.length, args.length); + for (int i = 0; i < len; i++) { + argmap.put(params[i], args[i]); } - fArgmap= result; } catch (DOMException e) { } + fArgmap= argmap; } return fArgmap; } + @Deprecated public IType[] getArguments() { + return CPPTemplates.getArguments(getTemplateArguments()); + } + + public ICPPTemplateArgument[] getTemplateArguments() { return fArguments; } public IParameter[] getParameters() throws DOMException { - ObjectMap map= getArgumentMap(); - if (map == null || map.isEmpty()) { - return ((ICPPFunction)getTemplateDefinition()).getParameters(); - } + // mstodo- deferred function instance and tpmap if( fParameters == null ){ IParameter [] params = ((ICPPFunction)getTemplateDefinition()).getParameters(); fParameters = new IParameter[ params.length ]; for (int i = 0; i < params.length; i++) { - fParameters[i] = new CPPParameterSpecialization( (ICPPParameter)params[i], null, getArgumentMap() ); + fParameters[i] = new CPPParameterSpecialization( (ICPPParameter)params[i], null, CPPTemplateParameterMap.EMPTY); } } return fParameters; @@ -100,11 +110,9 @@ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements IC if( fFunctionType == null ){ IFunctionType ft = ((ICPPFunction)getTemplateDefinition()).getType(); IType returnType = ft.getReturnType(); - // mstodo- is that necessary? - returnType = CPPTemplates.instantiateType( returnType, getArgumentMap(), null); + returnType = CPPTemplates.instantiateType(returnType, getArgumentMap(), 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 c3d6636111c..789d82e3c6f 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.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.IInternalVariable; import org.eclipse.cdt.internal.core.dom.parser.Value; @@ -29,8 +29,8 @@ public class CPPFieldSpecialization extends CPPSpecialization implements ICPPFie private IType type = null; private IValue value= null; - public CPPFieldSpecialization( IBinding orig, ICPPClassType owner, ObjectMap argMap ) { - super(orig, owner, argMap); + public CPPFieldSpecialization( IBinding orig, ICPPClassType owner, CPPTemplateParameterMap tpmap) { + super(orig, owner, tpmap); } private ICPPField getField() { 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 b1fda094073..6a141c2415c 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 @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -16,30 +16,36 @@ 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; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; -import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; /** - * @author aniefer + * The instantiation of a function template. */ public class CPPFunctionInstance extends CPPFunctionSpecialization implements ICPPTemplateInstance { - private IType[] arguments; + private ICPPTemplateArgument[] fArguments; - public CPPFunctionInstance(IBinding owner, ICPPFunction orig, ObjectMap argMap, IType[] args) { + public CPPFunctionInstance(IBinding owner, ICPPFunction orig, CPPTemplateParameterMap argMap, ICPPTemplateArgument[] args) { super(orig, owner, argMap); - this.arguments = args; + fArguments = args; } public ICPPTemplateDefinition getTemplateDefinition() { return (ICPPTemplateDefinition) getSpecializedBinding(); } + @Deprecated public IType[] getArguments() { - return arguments; + return CPPTemplates.getArguments(fArguments); + } + + public ICPPTemplateArgument[] getTemplateArguments() { + return fArguments; } /* (non-Javadoc) @@ -47,28 +53,20 @@ public class CPPFunctionInstance extends CPPFunctionSpecialization implements IC */ @Override public String toString() { - return getName() + " <" + ASTTypeUtil.getTypeListString(arguments) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ + return getName() + " <" + ASTTypeUtil.getArgumentListString(fArguments, true) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ } @Override public boolean equals(Object obj) { if( (obj instanceof ICPPTemplateInstance) && (obj instanceof ICPPFunction)){ try { + final ICPPTemplateInstance inst = (ICPPTemplateInstance)obj; ICPPFunctionType ct1= (ICPPFunctionType) ((ICPPFunction)getSpecializedBinding()).getType(); - ICPPFunctionType ct2= (ICPPFunctionType) ((ICPPFunction)((ICPPTemplateInstance)obj).getTemplateDefinition()).getType(); + ICPPFunctionType ct2= (ICPPFunctionType) ((ICPPFunction)inst.getTemplateDefinition()).getType(); if(!ct1.isSameType(ct2)) return false; - ObjectMap m1 = getArgumentMap(), m2 = ((ICPPTemplateInstance)obj).getArgumentMap(); - if( m1 == null || m2 == null || m1.size() != m2.size()) - return false; - for( int i = 0; i < m1.size(); i++ ){ - IType t1 = (IType) m1.getAt( i ); - IType t2 = (IType) m2.getAt( i ); - if(!CPPTemplates.isSameTemplateArgument(t1, t2)) - return false; - } - return true; + return CPPTemplates.haveSameArguments(this, inst); } catch(DOMException de) { CCorePlugin.log(de); } 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 c13ec790af7..229c2d4ae36 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 @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - Initial API and implementation * Bryan Wilkinson (QNX) * Markus Schorn (Wind River Systems) *******************************************************************************/ @@ -24,21 +24,22 @@ 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.index.IIndexBinding; -import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; /** - * @author aniefer + * The specialization of a friend function in the context of a class specialization, + * also used as base class for function instances. */ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPPFunction, ICPPInternalFunction { private IFunctionType type = null; private IParameter[] specializedParams = null; - public CPPFunctionSpecialization(IBinding orig, IBinding owner, ObjectMap argMap) { + public CPPFunctionSpecialization(IBinding orig, IBinding owner, CPPTemplateParameterMap argMap) { super(orig, owner, argMap); } @@ -53,7 +54,7 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP specializedParams = new IParameter[params.length]; for (int i = 0; i < params.length; i++) { specializedParams[i] = new CPPParameterSpecialization((ICPPParameter)params[i], - this, argumentMap); + this, getTemplateParameterMap()); } } return specializedParams; @@ -241,9 +242,10 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP } catch (DOMException e) { } result.append(t != null ? ASTTypeUtil.getParameterTypeString(t) : "()"); //$NON-NLS-1$ - if (argumentMap != null) { + CPPTemplateParameterMap tpmap= getTemplateParameterMap(); + if (tpmap != null) { result.append(" "); //$NON-NLS-1$ - result.append(argumentMap.toString()); + result.append(tpmap.toString()); } return result.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 c9ae10589e4..de3f617ff35 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 @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -14,6 +14,7 @@ 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.ICPPTemplateInstance; @@ -22,15 +23,14 @@ import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; /** - * @author aniefer - * + * The specialization of a friend function template in the context of a class specialization. */ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization implements ICPPFunctionTemplate, ICPPInternalTemplate { private ObjectMap instances = null; - public CPPFunctionTemplateSpecialization(IBinding specialized, ICPPClassType owner, ObjectMap argumentMap) { + public CPPFunctionTemplateSpecialization(IBinding specialized, ICPPClassType owner, CPPTemplateParameterMap argumentMap) { super(specialized, owner, argumentMap); } 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 1f761e9961e..b347087203e 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 @@ -6,24 +6,24 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - 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.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.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; -import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; /** - * @author aniefer + * The result of instantiating a method template. */ public class CPPMethodInstance extends CPPFunctionInstance implements ICPPMethod { - public CPPMethodInstance(ICPPClassType owner, ICPPMethod orig, ObjectMap argMap, IType[] args) { - super(owner, orig, argMap, args); + public CPPMethodInstance(ICPPClassType owner, ICPPMethod orig, CPPTemplateParameterMap tpmap, ICPPTemplateArgument[] args) { + super(owner, orig, tpmap, args); } /* (non-Javadoc) 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 9373ceeebb8..e71e3222d20 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 @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -17,19 +17,18 @@ 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.parser.util.ObjectMap; /** - * @author aniefer - * + * The specialization of a method in the context of a class-specialization. */ public class CPPMethodSpecialization extends CPPFunctionSpecialization implements ICPPMethod { - public CPPMethodSpecialization(IBinding orig, ICPPClassType owner, ObjectMap argMap ) { + public CPPMethodSpecialization(IBinding orig, ICPPClassType owner, CPPTemplateParameterMap 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 c1b51af9e6f..0c75f16ab86 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 @@ -6,27 +6,26 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - 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.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.parser.util.ObjectMap; /** - * @author aniefer - * + * The specialization of a method template in the context of a class specialization. */ -public class CPPMethodTemplateSpecialization extends - CPPFunctionTemplateSpecialization implements ICPPMethod { +public class CPPMethodTemplateSpecialization extends CPPFunctionTemplateSpecialization + implements ICPPMethod { - public CPPMethodTemplateSpecialization(IBinding specialized, - ICPPClassType owner, ObjectMap argumentMap) { - super(specialized, owner, argumentMap); + public CPPMethodTemplateSpecialization(IBinding specialized, ICPPClassType owner, + CPPTemplateParameterMap ctmap) { + super(specialized, owner, ctmap); } public boolean isVirtual() { 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 354acb4e51a..54267e41f70 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.parser.util.ObjectMap; /** * Binding for a specialization of a parameter. @@ -24,8 +24,8 @@ import org.eclipse.cdt.core.parser.util.ObjectMap; public class CPPParameterSpecialization extends CPPSpecialization implements ICPPParameter { private IType type = null; - public CPPParameterSpecialization(ICPPParameter orig, IBinding owner, ObjectMap argMap) { - super(orig, owner, argMap); + public CPPParameterSpecialization(ICPPParameter orig, IBinding owner, CPPTemplateParameterMap tpmap) { + super(orig, owner, tpmap); } private ICPPParameter getParameter(){ 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 d178c84846e..1a66e1a863c 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,6 +18,7 @@ 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; @@ -39,11 +40,11 @@ import org.eclipse.core.runtime.PlatformObject; public abstract class CPPSpecialization extends PlatformObject implements ICPPSpecialization, ICPPInternalBinding { private IBinding owner; private IBinding specialized; - protected ObjectMap argumentMap; + private CPPTemplateParameterMap argumentMap; protected IASTNode definition; private IASTNode[] declarations; - public CPPSpecialization(IBinding specialized, IBinding owner, ObjectMap argumentMap) { + public CPPSpecialization(IBinding specialized, IBinding owner, CPPTemplateParameterMap argumentMap) { this.specialized = specialized; this.owner = owner; this.argumentMap = argumentMap; @@ -51,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, argumentMap, (ICPPClassSpecialization) owner); + return CPPTemplates.instantiateType(type, getArgumentMap(), (ICPPClassSpecialization) owner); } else { - return CPPTemplates.instantiateType(type, argumentMap, null); + return CPPTemplates.instantiateType(type, getArgumentMap(), null); } } - + public IValue specializeValue(IValue value) { - return CPPTemplates.instantiateValue(value, argumentMap); + return CPPTemplates.instantiateValue(value, getArgumentMap()); } public IBinding getSpecializedBinding() { @@ -143,7 +144,12 @@ public abstract class CPPSpecialization extends PlatformObject implements ICPPSp return Linkage.CPP_LINKAGE; } + @Deprecated public ObjectMap getArgumentMap() { + return CPPTemplates.getArgumentMap(this, getTemplateParameterMap()); + } + + public CPPTemplateParameterMap 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 new file mode 100644 index 00000000000..a77554f1f11 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateArgument.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp; + +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.core.runtime.Assert; + +/** + * Implementation of template arguments, used by ast and index. + */ +public class CPPTemplateArgument implements ICPPTemplateArgument { + private final IType fType; + private final IValue fValue; + + public CPPTemplateArgument(IValue value, IType type) { + Assert.isNotNull(value); + fType= type; + fValue= value; + } + + public CPPTemplateArgument(IType type) { + Assert.isNotNull(type); + fType= type; + fValue= null; + } + + public boolean isNonTypeValue() { + return fValue != null; + } + + public IType getTypeValue() { + return isNonTypeValue() ? null : fType; + } + + public IValue getNonTypeValue() { + return fValue; + } + + public IType getTypeOfNonTypeValue() { + return isNonTypeValue() ? fType : null; + } + + public boolean isSameValue(ICPPTemplateArgument arg) { + if (fValue != null) { + return fValue.equals(arg.getNonTypeValue()) && fType.equals(arg.getTypeOfNonTypeValue()); + } + return fType.isSameType(arg.getTypeValue()); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java index ffa5907317f..3ada0b0bbc2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * Andrew Niefer (IBM) - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -18,7 +18,9 @@ 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.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.Linkage; @@ -28,13 +30,47 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.core.runtime.PlatformObject; /** - * @author aniefer + * Base implementation for template parameter bindings in the AST. */ -public class CPPTemplateParameter extends PlatformObject implements ICPPTemplateParameter, ICPPInternalBinding { +public abstract class CPPTemplateParameter extends PlatformObject implements ICPPTemplateParameter, ICPPInternalBinding { private IASTName [] declarations; + private final int position; public CPPTemplateParameter(IASTName name) { - declarations = new IASTName[] { name }; + declarations = new IASTName[] {name}; + + int pos= -1; + int nesting= -1; + ICPPASTTemplateParameter tp= null; + for (IASTNode node= name.getParent(); node != null; node= node.getParent()) { + ICPPASTTemplateParameter[] tps= null; + if (node instanceof ICPPASTTemplateParameter) { + tp= (ICPPASTTemplateParameter) node; + } else if (node instanceof ICPPASTTemplateDeclaration) { + if (++nesting == 0) { + tps= ((ICPPASTTemplateDeclaration) node).getTemplateParameters(); + } + } else if (node instanceof ICPPASTTemplatedTypeTemplateParameter) { + if (++nesting == 0) { + tps= ((ICPPASTTemplatedTypeTemplateParameter) node).getTemplateParameters(); + } + } + + if (pos == -1 && tps != null && tp != null) { + for (int i = 0; i < tps.length; i++) { + if (tps[i] == tp) { + pos= i; + break; + } + } + } + } + if (nesting < 0) + nesting= 0; + if (pos < 0) + pos= 0; + + position= (nesting << 16) + pos; } @Override @@ -62,6 +98,11 @@ public class CPPTemplateParameter extends PlatformObject implements ICPPTemplate return declarations[0].toCharArray(); } + + public int getParameterPosition() { + return position; + } + public IASTName getPrimaryDeclaration () { return declarations[0]; } 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 5611b83b8a9..a58d407eb2f 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 @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Corporation - initial API and implementation + * Andrew Niefer (IBM Corporation) - initial API and implementation * Markus Schorn (Wind River Systems) * Sergey Prigogin (Google) *******************************************************************************/ @@ -18,14 +18,16 @@ 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.parser.util.ObjectMap; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +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; import org.eclipse.core.runtime.Assert; /** - * @author aniefer + * Specialization of a typedef in the context of a class-specialization. */ public class CPPTypedefSpecialization extends CPPSpecialization implements ITypedef, ITypeContainer { final static class RecursionResolvingBinding extends ProblemBinding { @@ -40,8 +42,9 @@ public class CPPTypedefSpecialization extends CPPSpecialization implements IType private IType type; private int fResolutionDepth; - public CPPTypedefSpecialization(IBinding specialized, ICPPClassType owner, ObjectMap argumentMap) { - super(specialized, owner, argumentMap); + public CPPTypedefSpecialization(IBinding specialized, ICPPClassType owner, + CPPTemplateParameterMap tpmap) { + super(specialized, owner, tpmap); } private ITypedef getTypedef() { @@ -60,10 +63,16 @@ public class CPPTypedefSpecialization extends CPPSpecialization implements IType type= specializeType(getTypedef().getType()); // A typedef pointing to itself is a sure recipe for an infinite loop -- replace // with a problem binding. - if (type instanceof CPPTypedefSpecialization && - ((CPPTypedefSpecialization) type).getSpecializedBinding().equals(getSpecializedBinding()) && - ((CPPTypedefSpecialization) type).getArgumentMap().isEquivalent(argumentMap, IType.TYPE_MATCHER)) { - type = new RecursionResolvingBinding(getDefinition(), getNameCharArray()); + if (type instanceof ITypedef && type instanceof ICPPSpecialization) { + ITypedef td= (ITypedef) type; + if (CharArrayUtils.equals(td.getNameCharArray(), getNameCharArray())) { + IBinding owner= ((ICPPSpecialization) type).getOwner(); + if (owner instanceof IType) { + if (((IType)owner).isSameType((ICPPClassType) getOwner())) { + type = new RecursionResolvingBinding(getDefinition(), getNameCharArray()); + } + } + } } } } finally { 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 c5cdc6c4c73..137debe3914 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 @@ -14,6 +14,9 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; @@ -45,6 +48,7 @@ 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; @@ -75,10 +79,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; 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; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; @@ -114,6 +120,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerToMemberType; 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.CPPTemplateTemplateParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTypedefSpecialization; @@ -303,12 +310,12 @@ public class CPPTemplates { return instance; if (template instanceof ICPPClassTemplate) { - instance = new CPPDeferredClassInstance((ICPPClassTemplate) template, arguments); + instance = new CPPDeferredClassInstance((ICPPClassTemplate) template, convert(arguments)); addInstance(template, arguments, instance); return instance; } if (template instanceof ICPPFunctionTemplate) { - instance = new CPPDeferredFunctionInstance((ICPPFunctionTemplate) template, arguments); + instance = new CPPDeferredFunctionInstance((ICPPFunctionTemplate) template, convert(arguments)); addInstance(template, arguments, instance); return instance; } @@ -590,7 +597,7 @@ public class CPPTemplates { inst= getInstance(template, args); if (inst == null) { IBinding owner= binding.getOwner(); - inst= new CPPClassInstance(owner, template, argMap, args); + inst= new CPPClassInstance(owner, template, convert(argMap), convert(args)); addInstance(template, args, inst); } if (inst instanceof ICPPInternalBinding) { @@ -833,15 +840,15 @@ public class CPPTemplates { ICPPTemplateInstance instance = null; if (template instanceof ICPPClassType) { - instance = new CPPClassInstance(owner, (ICPPClassType) template, argMap, args); + instance = new CPPClassInstance(owner, (ICPPClassType) template, convert(argMap), convert(args)); } else if (owner instanceof ICPPClassType && template instanceof ICPPMethod) { if (template instanceof ICPPConstructor) { - instance = new CPPConstructorInstance((ICPPClassType) owner, (ICPPConstructor) template, argMap, args); + instance = new CPPConstructorInstance((ICPPClassType) owner, (ICPPConstructor) template, convert(argMap), convert(args)); } else { - instance = new CPPMethodInstance((ICPPClassType) owner, (ICPPMethod) template, argMap, args); + instance = new CPPMethodInstance((ICPPClassType) owner, (ICPPMethod) template, convert(argMap), convert(args)); } } else if (template instanceof ICPPFunction) { - instance = new CPPFunctionInstance(owner, (ICPPFunction) template, argMap, args); + instance = new CPPFunctionInstance(owner, (ICPPFunction) template, convert(argMap), convert(args)); } return instance; } @@ -854,26 +861,26 @@ public class CPPTemplates { ICPPSpecialization spec = null; if (decl instanceof ICPPClassTemplate) { - spec = new CPPClassTemplateSpecialization((ICPPClassTemplate) decl, owner, argMap); + spec = new CPPClassTemplateSpecialization((ICPPClassTemplate) decl, owner, convert(argMap)); } else if (decl instanceof ICPPClassType) { - spec = new CPPClassSpecialization((ICPPClassType) decl, owner, argMap); + spec = new CPPClassSpecialization((ICPPClassType) decl, owner, convert(argMap)); } else if (decl instanceof ICPPField) { - spec = new CPPFieldSpecialization(decl, owner, argMap); + spec = new CPPFieldSpecialization(decl, owner, convert(argMap)); } else if (decl instanceof ICPPFunctionTemplate) { if (decl instanceof ICPPConstructor) - spec = new CPPConstructorTemplateSpecialization(decl, owner, argMap); + spec = new CPPConstructorTemplateSpecialization(decl, owner, convert(argMap)); else if (decl instanceof ICPPMethod) - spec = new CPPMethodTemplateSpecialization(decl, owner, argMap); + spec = new CPPMethodTemplateSpecialization(decl, owner, convert(argMap)); else - spec = new CPPFunctionTemplateSpecialization(decl, owner, argMap); + spec = new CPPFunctionTemplateSpecialization(decl, owner, convert(argMap)); } else if (decl instanceof ICPPConstructor) { - spec = new CPPConstructorSpecialization(decl, owner, argMap); + spec = new CPPConstructorSpecialization(decl, owner, convert(argMap)); } else if (decl instanceof ICPPMethod) { - spec = new CPPMethodSpecialization(decl, owner, argMap); + spec = new CPPMethodSpecialization(decl, owner, convert(argMap)); } else if (decl instanceof ICPPFunction) { - spec = new CPPFunctionSpecialization(decl, owner, argMap); + spec = new CPPFunctionSpecialization(decl, owner, convert(argMap)); } else if (decl instanceof ITypedef) { - spec = new CPPTypedefSpecialization(decl, owner, argMap); + spec = new CPPTypedefSpecialization(decl, owner, convert(argMap)); } return spec; } @@ -881,7 +888,7 @@ public class CPPTemplates { public static IValue instantiateValue(IValue value, ObjectMap argMap) { if (value == null) return null; - // mstodo instantiate values + // mstodo- instantiate values return value; } @@ -1263,7 +1270,9 @@ public class CPPTemplates { * @param argA may be null * @param argB may be null * @return whether the two specified template arguments are the same + * @deprecated use {@link ICPPTemplateArgument#isSameValue(ICPPTemplateArgument)} */ + @Deprecated public static final boolean isSameTemplateArgument(IType argA, IType argB) { if (argA == argB) return true; @@ -1705,7 +1714,7 @@ public class CPPTemplates { CPPASTLiteralExpression exp = new CPPASTLiteralExpression(); exp.setValue(String.valueOf(i)); CPPBasicType temp = (CPPBasicType) t.clone(); - temp.setFromExpression(exp); // mstodo is that necessary?? + temp.setFromExpression(exp); // mstodo- is that necessary?? args[i] = temp; } } else { @@ -2076,4 +2085,119 @@ public class CPPTemplates { } return dci; } + + public static boolean haveSameArguments(ICPPTemplateInstance i1, ICPPTemplateInstance i2) { + final ICPPTemplateArgument[] m1= i1.getTemplateArguments(); + final ICPPTemplateArgument[] m2= i2.getTemplateArguments(); + + if (m1 == null || m2 == null || m1.length != m2.length) + return false; + + for (int i = 0; i < m1.length; i++) { + if (!m1[i].isSameValue(m2[i])) { + return false; + } + + // backwards compatibility, mstodo remove + if (!m1[i].isNonTypeValue() && !m2[i].isNonTypeValue()) { + if (!isSameTemplateArgument(m1[i].getTypeValue(), m2[i].getTypeValue())) { + return false; + } + } + } + + return true; + } + + /** + * @deprecated for backwards compatibility, only. + */ + @Deprecated + public static IType[] getArguments(ICPPTemplateArgument[] arguments) { + IType[] types= new IType[arguments.length]; + for (int i = 0; i < types.length; i++) { + final ICPPTemplateArgument arg = arguments[i]; + if (arg.isNonTypeValue()) { + types[i]= arg.getTypeOfNonTypeValue(); + } else { + types[i]= arg.getTypeValue(); + } + } + return types; + } + + + /** + * @deprecated for backwards compatibility, only. + */ + @Deprecated + public static ObjectMap getArgumentMap(IBinding b, ICPPTemplateParameterMap tpmap) { + // backwards compatibility + Integer[] keys= tpmap.getAllParameterPositions(); + if (keys.length == 0) + return ObjectMap.EMPTY_MAP; + + try { + List defs= new ArrayList(); + IBinding owner= b; + while (owner != null) { + if (owner instanceof ICPPTemplateDefinition) { + defs.add((ICPPTemplateDefinition) owner); + } else if (owner instanceof ICPPTemplateInstance) { + defs.add(((ICPPTemplateInstance) owner).getTemplateDefinition()); + } + owner= owner.getOwner(); + } + Collections.reverse(defs); + + ObjectMap result= new ObjectMap(keys.length); + for (int key: keys) { + int nestingLevel= key >> 16; + int numParam= key & 0xffff; + + if (0 <= numParam && 0 <= nestingLevel && nestingLevel < defs.size()) { + ICPPTemplateDefinition tdef= defs.get(nestingLevel); + ICPPTemplateParameter[] tps= tdef.getTemplateParameters(); + if (numParam < tps.length) { + ICPPTemplateArgument arg= tpmap.getArgument(key); + IType type= arg.isNonTypeValue() ? arg.getTypeOfNonTypeValue() : arg.getTypeValue(); + result.put(tps[numParam], type); + } + } + } + return result; + } catch (DOMException e) { + } + return ObjectMap.EMPTY_MAP; + } + + /** + * mstodo for intermediate use only. + * @deprecated + */ + @Deprecated + public static CPPTemplateParameterMap convert(ObjectMap argMap) { + CPPTemplateParameterMap tpmap= new CPPTemplateParameterMap(); + Object[] tps= argMap.keyArray(); + for (Object tp : tps) { + if (tp instanceof ICPPTemplateParameter) { + IType t= (IType) argMap.get(tp); + tpmap.put((ICPPTemplateParameter) tp, new CPPTemplateArgument(t)); + } + } + return tpmap; + } + + /** + * mstodo for intermediate use only. + * @deprecated + */ + @Deprecated + public static ICPPTemplateArgument[] convert(IType[] args) { + ICPPTemplateArgument[] targs= new ICPPTemplateArgument[args.length]; + for (int i = 0; i < targs.length; i++) { + targs[i]= new CPPTemplateArgument(args[i]); + } + return targs; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index c02fad456ce..eb0d2ff996f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -1586,7 +1586,7 @@ public class CPPVisitor { // Currently, CPPBasicType objects are also used to represent non-type template argument // values. We must ensure the initializer expression is attached to the type if available. - // mstodo can be removed + // mstodo- can be removed if (declarator.getInitializer() instanceof IASTInitializerExpression) { IType utype= getUltimateTypeUptoPointers(baseType); if (utype instanceof CPPBasicType) { @@ -2385,7 +2385,7 @@ public class CPPVisitor { /** * @param e1 * @return the first non id-expression by following values assigned to basic types. - * @deprecated mstodo remove + * @deprecated mstodo- remove */ @Deprecated public static final IASTExpression reverseConstantPropagationLookup(IASTExpression e1) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java index 501eb609051..14e32dc1cf3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/Conversions.java @@ -742,7 +742,7 @@ public class Conversions { if (src instanceof CPPBasicType && trg instanceof IPointerType) { //4.10-1 an integral constant expression of integer type that evaluates to 0 can be converted to a pointer type IASTExpression exp = ((CPPBasicType)src).getCreatedFromExpression(); - // mstodo improve by checking evaluation + // mstodo- improve by checking evaluation if (exp instanceof IASTLiteralExpression && ((IASTLiteralExpression)exp).getKind() == IASTLiteralExpression.lk_integer_constant) { try { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java index bc29c2ff838..18e81719619 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassInstance.java @@ -13,8 +13,10 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPTemplateParameterMap; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; public class CompositeCPPClassInstance extends CompositeCPPClassSpecialization implements ICPPTemplateInstance { @@ -23,11 +25,21 @@ public class CompositeCPPClassInstance extends CompositeCPPClassSpecialization i super(cf, rbinding); } - public IType[] getArguments() { - return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); - } - public ICPPTemplateDefinition getTemplateDefinition() { return TemplateInstanceUtil.getTemplateDefinition(cf, rbinding); } + + public ICPPTemplateArgument[] getTemplateArguments() { + return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding); + } + + @Override + public ICPPTemplateParameterMap getTemplateParameterMap() { + return TemplateInstanceUtil.getTemplateParameterMap(cf, (ICPPTemplateInstance) rbinding); + } + + @Deprecated + public IType[] getArguments() { + return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); + } } 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 6dfd6d23807..e81b497a3b6 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,12 +16,15 @@ 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; 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.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; @@ -44,13 +47,20 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple return cf.getCompositeScope((IIndexScope) ((ICPPClassType) rbinding).getCompositeScope()); } - public ObjectMap getArgumentMap() { - return TemplateInstanceUtil.getArgumentMap(cf, rbinding); - } - public ICPPClassType getSpecializedBinding() { return (ICPPClassType) TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } + + public ICPPTemplateParameterMap getTemplateParameterMap() { + try { + IBinding owner= getOwner(); + if (owner instanceof ICPPSpecialization) { + return ((ICPPSpecialization) owner).getTemplateParameterMap(); + } + } catch (DOMException e) { + } + return CPPTemplateParameterMap.EMPTY; + } public IBinding specializeMember(IBinding original) { if (specializationMap == null) { @@ -175,4 +185,9 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple public ICPPMethod[] getMethods() throws DOMException { return ClassTypeHelper.getMethods(this); } + + @Deprecated + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } } 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 9265046053c..55c9c028105 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 @@ -7,15 +7,19 @@ * * Contributors: * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ 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.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; @@ -32,8 +36,36 @@ public class CompositeCPPClassTemplatePartialSpecialization extends CompositeCPP return (ICPPClassTemplate) cf.getCompositeBinding((IIndexFragmentBinding)preresult); } - public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPClassTemplatePartialSpecialization) rbinding); } - public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } - public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } - public int getSignatureHash() throws CoreException { return ((IPDOMOverloader) rbinding).getSignatureHash(); } + public IBinding getSpecializedBinding() { + return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); + } + + public int getSignatureHash() throws CoreException { + return ((IPDOMOverloader) rbinding).getSignatureHash(); + } + + public ICPPTemplateParameterMap getTemplateParameterMap() { + try { + IBinding owner= getOwner(); + if (owner instanceof ICPPSpecialization) { + return ((ICPPSpecialization) owner).getTemplateParameterMap(); + } + } catch (DOMException e) { + } + return CPPTemplateParameterMap.EMPTY; + } + + public ICPPTemplateArgument[] getTemplateArguments() { + return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPClassTemplatePartialSpecialization) rbinding); + } + + @Deprecated + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } + + @Deprecated + public IType[] getArguments() { + return TemplateInstanceUtil.getArguments(cf, (ICPPClassTemplatePartialSpecialization) rbinding); + } } 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 4c886d9df9a..8d491f73eb7 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 @@ -18,8 +18,10 @@ 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.ICPPConstructor; 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.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; +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.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; @@ -42,10 +44,14 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp public ICPPConstructor[] getConstructors() { return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; } - - public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); } - public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } - public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } + + public ICPPTemplateParameterMap getTemplateParameterMap() { + return TemplateInstanceUtil.getTemplateParameterMap(cf, (ICPPTemplateInstance) rbinding); + } + + public IBinding getSpecializedBinding() { + return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); + } public IASTName getUnknownName() { return ((ICPPDeferredClassInstance) rbinding).getUnknownName(); @@ -61,4 +67,19 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp public ICPPClassTemplate getClassTemplate() { return (ICPPClassTemplate) cf.getCompositeBinding((IIndexFragmentBinding) ((ICPPDeferredClassInstance) rbinding).getClassTemplate()); } + + @Deprecated + public ICPPTemplateArgument[] getTemplateArguments() { + return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding); + } + + @Deprecated + public IType[] getArguments() { + return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); + } + + @Deprecated + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java index 6590ebb96f2..893570d68c3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java @@ -1,12 +1,13 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -14,8 +15,10 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; 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.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.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; @@ -26,8 +29,29 @@ public class CompositeCPPDeferredFunctionInstance extends CompositeCPPFunction super(cf, rbinding); } - public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); } - public ICPPTemplateDefinition getTemplateDefinition() { return TemplateInstanceUtil.getTemplateDefinition(cf, rbinding); } - public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } - public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } + public ICPPTemplateDefinition getTemplateDefinition() { + return TemplateInstanceUtil.getTemplateDefinition(cf, rbinding); + } + + public IBinding getSpecializedBinding() { + return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); + } + + public ICPPTemplateArgument[] getTemplateArguments() { + return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding); + } + + public ICPPTemplateParameterMap getTemplateParameterMap() { + return TemplateInstanceUtil.getTemplateParameterMap(cf, (ICPPTemplateInstance) rbinding); + } + + @Deprecated + public IType[] getArguments() { + return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); + } + + @Deprecated + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, 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 8d472d20060..dab0dad3235 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 @@ -1,18 +1,22 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ 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.index.composite.ICompositesFactory; @@ -22,12 +26,23 @@ public class CompositeCPPFieldSpecialization extends CompositeCPPField implement super(cf, rbinding); } - public ObjectMap getArgumentMap() { - return TemplateInstanceUtil.getArgumentMap(cf, rbinding); - } - public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } - + + public ICPPTemplateParameterMap getTemplateParameterMap() { + try { + IBinding owner= getOwner(); + if (owner instanceof ICPPSpecialization) { + return ((ICPPSpecialization) owner).getTemplateParameterMap(); + } + } catch (DOMException e) { + } + return CPPTemplateParameterMap.EMPTY; + } + + @Deprecated + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionInstance.java index 69b4991a584..8b103077d7a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPFunctionInstance.java @@ -1,12 +1,13 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -14,8 +15,10 @@ 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.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.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; @@ -25,8 +28,29 @@ public class CompositeCPPFunctionInstance extends CompositeCPPFunction implement super(cf, rbinding); } - public IType[] getArguments() { return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); } - public ICPPTemplateDefinition getTemplateDefinition() { return TemplateInstanceUtil.getTemplateDefinition(cf, rbinding); } - public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } - public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } + public ICPPTemplateDefinition getTemplateDefinition() { + return TemplateInstanceUtil.getTemplateDefinition(cf, rbinding); + } + + public IBinding getSpecializedBinding() { + return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); + } + + public ICPPTemplateArgument[] getTemplateArguments() { + return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding); + } + + public ICPPTemplateParameterMap getTemplateParameterMap() { + return TemplateInstanceUtil.getTemplateParameterMap(cf, (ICPPTemplateInstance) rbinding); + } + + @Deprecated + public IType[] getArguments() { + return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); + } + + @Deprecated + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } } 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 58d87c6beca..3c4d7d19df6 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian 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 @@ -7,14 +7,17 @@ * * Contributors: * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ 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.index.composite.ICompositesFactory; @@ -24,6 +27,21 @@ public class CompositeCPPFunctionSpecialization extends CompositeCPPFunction imp super(cf, ft); } + public IBinding getSpecializedBinding() { + return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); + } + + public ICPPTemplateParameterMap getTemplateParameterMap() { + try { + IBinding owner= getOwner(); + if (owner instanceof ICPPSpecialization) { + return ((ICPPSpecialization) owner).getTemplateParameterMap(); + } + } catch (DOMException e) { + } + return CPPTemplateParameterMap.EMPTY; + } + @Override public String toString() { StringBuffer result = new StringBuffer(); @@ -35,11 +53,8 @@ public class CompositeCPPFunctionSpecialization extends CompositeCPPFunction imp return result.toString(); } + @Deprecated public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); } - - public IBinding getSpecializedBinding() { - return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); - } } 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 1741bb06eb8..8e66e9aab15 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 @@ -1,17 +1,21 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ 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.index.composite.ICompositesFactory; @@ -22,12 +26,23 @@ public class CompositeCPPParameterSpecialization extends CompositeCPPParameter i super(cf, rbinding); } - public ObjectMap getArgumentMap() { - return TemplateInstanceUtil.getArgumentMap(cf, rbinding); - } - public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } + public ICPPTemplateParameterMap getTemplateParameterMap() { + try { + IBinding owner= getOwner(); + if (owner instanceof ICPPSpecialization) { + return ((ICPPSpecialization) owner).getTemplateParameterMap(); + } + } catch (DOMException e) { + } + return CPPTemplateParameterMap.EMPTY; + } + + @Deprecated + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } } 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 3062c869c47..32e19ddf554 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 @@ -7,12 +7,14 @@ * * Contributors: * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; public class CompositeCPPTemplateNonTypeParameter extends CompositeCPPVariable implements ICPPTemplateNonTypeParameter { @@ -32,4 +34,8 @@ public class CompositeCPPTemplateNonTypeParameter extends CompositeCPPVariable i public IASTExpression getDefault() { return null; } + + public int getParameterPosition() { + return ((ICPPTemplateParameter)rbinding).getParameterPosition(); + } } 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 7716593b945..a0d49c31a50 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 @@ -7,6 +7,7 @@ * * Contributors: * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -14,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.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; @@ -34,6 +36,10 @@ public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding return cf.getCompositeType(preresult); } + public int getParameterPosition() { + return ((ICPPTemplateParameter)rbinding).getParameterPosition(); + } + public boolean isSameType(IType type) { return ((IType)rbinding).isSameType(type); } 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 d3917084fd6..02c7523f7b8 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 @@ -1,18 +1,22 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ 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.index.composite.ICompositesFactory; @@ -21,11 +25,23 @@ class CompositeCPPTypedefSpecialization extends CompositeCPPTypedef implements I super(cf, delegate); } - public ObjectMap getArgumentMap() { - return TemplateInstanceUtil.getArgumentMap(cf, rbinding); - } - public IBinding getSpecializedBinding() { return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); } + + public ICPPTemplateParameterMap getTemplateParameterMap() { + try { + IBinding owner= getOwner(); + if (owner instanceof ICPPSpecialization) { + return ((ICPPSpecialization) owner).getTemplateParameterMap(); + } + } catch (DOMException e) { + } + return CPPTemplateParameterMap.EMPTY; + } + + @Deprecated + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } } 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 8029dd1c3da..702d6ce22b2 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 @@ -8,6 +8,7 @@ * Contributors: * Andrew Ferguson (Symbian) - Initial implementation * Bryan Wilkinson (QNX) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -15,12 +16,16 @@ 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; 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.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.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; @@ -29,6 +34,62 @@ import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; * For implementation re-use in the absence of multiple inheritance */ public class TemplateInstanceUtil { + public static ICPPTemplateParameterMap getTemplateParameterMap(ICompositesFactory cf, ICPPTemplateInstance rbinding) { + ICPPTemplateParameterMap preresult= rbinding.getTemplateParameterMap(); + CPPTemplateParameterMap result= new CPPTemplateParameterMap(); + Integer[] keys= preresult.getAllParameterPositions(); + + try { + for(int i = 0; i < keys.length; i++) { + ICPPTemplateArgument arg= preresult.getArgument(keys[i]); + result.put(keys[i], convert(cf, arg)); + } + } catch(DOMException de) { + CCorePlugin.log(de); + } + return result; + } + + public static ICPPTemplateArgument[] getTemplateArguments(ICompositesFactory cf, ICPPTemplateInstance rbinding) { + return convert(cf, rbinding.getTemplateArguments()); + } + + public static ICPPTemplateArgument[] getTemplateArguments(ICompositesFactory cf, ICPPClassTemplatePartialSpecialization rbinding) { + return convert(cf, rbinding.getTemplateArguments()); + } + + public static IBinding getSpecializedBinding(ICompositesFactory cf, IIndexBinding rbinding) { + IBinding preresult= ((ICPPSpecialization) rbinding).getSpecializedBinding(); + return cf.getCompositeBinding((IIndexFragmentBinding) preresult); + } + + public static ICPPTemplateDefinition getTemplateDefinition(ICompositesFactory cf, IIndexBinding rbinding) { + ICPPTemplateDefinition preresult= ((ICPPTemplateInstance)rbinding).getTemplateDefinition(); + return (ICPPTemplateDefinition) cf.getCompositeBinding((IIndexFragmentBinding)preresult); + } + + public static ICPPTemplateArgument[] convert(ICompositesFactory cf, ICPPTemplateArgument[] arguments) { + try { + ICPPTemplateArgument[] result= new ICPPTemplateArgument[arguments.length]; + for (int i = 0; i < arguments.length; i++) { + result[i]= convert(cf, arguments[i]); + } + return result; + } catch (DOMException e) { + CCorePlugin.log(e); + } + return ICPPTemplateArgument.EMPTY_ARGUMENTS; + } + + static ICPPTemplateArgument convert(ICompositesFactory cf, ICPPTemplateArgument arg) throws DOMException { + if (arg.isNonTypeValue()) { + return arg; + } + IType t= cf.getCompositeType((IIndexType) arg.getTypeValue()); + return new CPPTemplateArgument(t); + } + + @Deprecated public static ObjectMap getArgumentMap(ICompositesFactory cf, IIndexBinding rbinding) { ICPPSpecialization specn= (ICPPSpecialization) rbinding; IBinding specd= ((CPPCompositesFactory)cf).findOneBinding(specn.getSpecializedBinding()); @@ -57,17 +118,13 @@ public class TemplateInstanceUtil { return result; } - public static IBinding getSpecializedBinding(ICompositesFactory cf, IIndexBinding rbinding) { - IBinding preresult= ((ICPPSpecialization)rbinding).getSpecializedBinding(); - return cf.getCompositeBinding((IIndexFragmentBinding)preresult); - } - - - public static IType[] getArguments(ICompositesFactory cf, ICPPTemplateInstance rbinding) { + @Deprecated + public static IType[] getArguments(ICompositesFactory cf, ICPPTemplateInstance rbinding) { return getArguments(cf, rbinding.getArguments()); } - public static IType[] getArguments(ICompositesFactory cf, ICPPClassTemplatePartialSpecialization rbinding) { + @Deprecated + public static IType[] getArguments(ICompositesFactory cf, ICPPClassTemplatePartialSpecialization rbinding) { try { return getArguments(cf, rbinding.getArguments()); } catch(DOMException de) { @@ -76,7 +133,8 @@ public class TemplateInstanceUtil { } } - private static IType[] getArguments(ICompositesFactory cf, IType[] result) { + @Deprecated + private static IType[] getArguments(ICompositesFactory cf, IType[] result) { try { for(int i=0; i= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/8); + rec+=2; + for (int i=0; i= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/8); + if (len == 0) { + return ICPPTemplateArgument.EMPTY_ARGUMENTS; + } + + rec+=2; + ICPPTemplateArgument[] result= new ICPPTemplateArgument[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() { - try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - TemplateArgumentCollector visitor = new TemplateArgumentCollector(); - list.accept(visitor); - - return visitor.getTemplateArguments(); - } catch (CoreException e) { - CCorePlugin.log(e); - return IType.EMPTY_TYPE_ARRAY; - } - } - @Override protected int getRecordSize() { return RECORD_SIZE; @@ -103,6 +62,20 @@ class PDOMCPPClassInstance extends PDOMCPPClassSpecialization implements ICPPTem public int getNodeType() { return IIndexCPPBindingConstants.CPP_CLASS_INSTANCE; } + + public ICPPTemplateDefinition getTemplateDefinition() { + return (ICPPTemplateDefinition) getSpecializedBinding(); + } + + public ICPPTemplateArgument[] getTemplateArguments() { + try { + final int rec= getPDOM().getDB().getInt(record+ARGUMENTS); + return PDOMCPPArgumentList.getArguments(this, rec); + } catch (CoreException e) { + CCorePlugin.log(e); + return ICPPTemplateArgument.EMPTY_ARGUMENTS; + } + } @Override public boolean isSameType(IType type) { @@ -129,15 +102,11 @@ class PDOMCPPClassInstance extends PDOMCPPClassSpecialization implements ICPPTem if (!orig1.isSameType(orig2)) return false; - IType[] args1= getArguments(); - IType[] args2= ((ICPPTemplateInstance) type).getArguments(); - if (args1.length != args2.length) - return false; - - for (int i = 0; i < args1.length; i++) { - if (!CPPTemplates.isSameTemplateArgument(args1[i], args2[i])) - return false; - } - return true; + return CPPTemplates.haveSameArguments(this, (ICPPTemplateInstance) type); + } + + @Deprecated + public IType[] getArguments() { + return CPPTemplates.getArguments(getTemplateArguments()); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java index 9a2eecedad0..31962f4d4ee 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 @@ -6,24 +6,22 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Bryan Wilkinson (QNX) - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; -import java.util.ArrayList; -import java.util.List; - import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.IPDOMNode; -import org.eclipse.cdt.core.dom.IPDOMVisitor; 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.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.Util; @@ -31,7 +29,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; +import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; @@ -39,10 +37,10 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.runtime.CoreException; /** - * @author Bryan Wilkinson + * Partial specialization of a class template for the index. */ -class PDOMCPPClassTemplatePartialSpecialization extends - PDOMCPPClassTemplate implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization, IPDOMOverloader { +class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate + implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization, IPDOMOverloader { private static final int ARGUMENTS = PDOMCPPClassTemplate.RECORD_SIZE + 0; private static final int SIGNATURE_HASH = PDOMCPPClassTemplate.RECORD_SIZE + 4; @@ -111,40 +109,31 @@ class PDOMCPPClassTemplatePartialSpecialization extends return getPrimaryClassTemplate(); } - public void addArgument(IType type) throws CoreException { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - PDOMNode typeNode = getLinkageImpl().addType(this, type); - if (typeNode != null) - list.addMember(typeNode); - } - - private static class TemplateArgumentCollector implements IPDOMVisitor { - private List 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 void setArguments(ICPPTemplateArgument[] templateArguments) throws CoreException { + final Database db = getPDOM().getDB(); + int oldRec = db.getInt(record+ARGUMENTS); + int rec= PDOMCPPArgumentList.putArguments(this, templateArguments); + db.putInt(record+ARGUMENTS, rec); + if (oldRec != 0) { + PDOMCPPArgumentList.clearArguments(this, oldRec); } } - - public IType[] getArguments() { + + public ICPPTemplateArgument[] getTemplateArguments() { try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - TemplateArgumentCollector visitor = new TemplateArgumentCollector(); - list.accept(visitor); - - return visitor.getTemplateArguments(); + final int rec= getPDOM().getDB().getInt(record+ARGUMENTS); + return PDOMCPPArgumentList.getArguments(this, rec); } catch (CoreException e) { CCorePlugin.log(e); - return new IType[0]; + return ICPPTemplateArgument.EMPTY_ARGUMENTS; } } + @Deprecated + public IType[] getArguments() { + return CPPTemplates.getArguments(getTemplateArguments()); + } + @Override public int pdomCompareTo(PDOMBinding other) { int cmp = super.pdomCompareTo(other); @@ -164,43 +153,19 @@ class PDOMCPPClassTemplatePartialSpecialization extends } return cmp; } - - private static class NodeCollector implements IPDOMVisitor { - private List nodes = new ArrayList(); - public boolean visit(IPDOMNode node) throws CoreException { - nodes.add(node); - return false; - } - public void leave(IPDOMNode node) throws CoreException { - } - public IPDOMNode[] getNodes() { - return nodes.toArray(new IPDOMNode[nodes.size()]); - } - } - public ObjectMap getArgumentMap() { + public CPPTemplateParameterMap getTemplateParameterMap() { + CPPTemplateParameterMap result= new CPPTemplateParameterMap(); try { - PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - ICPPTemplateParameter[] params; - try { - params = getPrimaryClassTemplate().getTemplateParameters(); - } catch (DOMException e) { - return ObjectMap.EMPTY_MAP; + 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]); } - NodeCollector argVisitor = new NodeCollector(); - argList.accept(argVisitor); - IPDOMNode[] argNodes = argVisitor.getNodes(); - - ObjectMap map = new ObjectMap(params.length); - for (int i = 0; i < params.length; i++) { - map.put(params[i], argNodes[i]); - } - - return map; - } catch (CoreException e) { - CCorePlugin.log(e); + } catch (DOMException e) { } - return null; + return result; } @Override @@ -216,24 +181,44 @@ class PDOMCPPClassTemplatePartialSpecialization extends } } - if( type instanceof ICPPSpecialization ) { - ICPPClassType ct1= (ICPPClassType) getSpecializedBinding(); - ICPPClassType ct2= (ICPPClassType) ((ICPPSpecialization)type).getSpecializedBinding(); - if(!ct1.isSameType(ct2)) - return false; - - ObjectMap m1 = getArgumentMap(), m2 = ((ICPPSpecialization)type).getArgumentMap(); - if( m1 == null || m2 == null || m1.size() != m2.size()) - return false; - for( int i = 0; i < m1.size(); i++ ){ - IType t1 = (IType) m1.getAt( i ); - IType t2 = (IType) m2.getAt( i ); - if(!CPPTemplates.isSameTemplateArgument(t1, t2 )) - return false; - } - return true; - } - - return false; + if (!(type instanceof ICPPClassTemplatePartialSpecialization)) { + return false; + } + + final ICPPClassTemplatePartialSpecialization rhs = (ICPPClassTemplatePartialSpecialization)type; + try { + ICPPClassType ct1= getPrimaryClassTemplate(); + ICPPClassType ct2= rhs.getPrimaryClassTemplate(); + if(!ct1.isSameType(ct2)) + return false; + + ICPPTemplateArgument[] args1= getTemplateArguments(); + ICPPTemplateArgument[] args2= rhs.getTemplateArguments(); + if (args1.length != args2.length) + return false; + + for (int i = 0; i < args2.length; i++) { + if (args1[i].isSameValue(args2[i])) + return false; + } + } catch (DOMException e) { + return false; + } + return true; + } + + @Deprecated + public ObjectMap getArgumentMap() { + try { + ICPPTemplateParameter[] params = getPrimaryClassTemplate().getTemplateParameters(); + ICPPTemplateArgument[] args= getTemplateArguments(); + int len= Math.min(params.length, args.length); + ObjectMap result= new ObjectMap(len); + for (int i = 0; i < len; i++) { + result.put(params[i], args[i]); + } + } catch (DOMException e) { + } + return ObjectMap.EMPTY_MAP; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index 6a2d26c622e..90d31339d92 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -6,16 +6,12 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Bryan Wilkinson (QNX) - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; -import java.util.ArrayList; -import java.util.List; - import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -31,8 +27,8 @@ 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.ICPPTemplateDefinition; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; @@ -46,7 +42,8 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** - * @author Bryan Wilkinson + * Deferred class instances collect information about an instantiation until it can be + * carried out. */ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPPDeferredClassInstance, IPDOMMemberOwner, IIndexType { @@ -64,13 +61,8 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP throws CoreException { super(pdom, parent, classType, instantiated); - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - IType[] args = ((ICPPTemplateInstance) classType).getArguments(); - for (int i = 0; i < args.length; i++) { - PDOMNode typeNode = getLinkageImpl().addType(this, args[i]); - if (typeNode != null) - list.addMember(typeNode); - } + final int argListRec= PDOMCPPArgumentList.putArguments(this, classType.getTemplateArguments()); + pdom.getDB().putInt(record+ARGUMENTS, argListRec); } public PDOMCPPDeferredClassInstance(PDOM pdom, int bindingRecord) { @@ -109,21 +101,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP if (!classTemplate.isSameType((IType) rhs.getSpecializedBinding())) return false; - IType[] lhsArgs= getArguments(); - IType[] rhsArgs= rhs.getArguments(); - if (lhsArgs != rhsArgs) { - if (lhsArgs == null || rhsArgs == null) - return false; - - if (lhsArgs.length != rhsArgs.length) - return false; - - for (int i= 0; i < lhsArgs.length; i++) { - if (!CPPTemplates.isSameTemplateArgument(lhsArgs[i], rhsArgs[i])) - return false; - } - } - return true; + return CPPTemplates.haveSameArguments(this, rhs); } return false; } @@ -207,31 +185,19 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP return (ICPPTemplateDefinition) getSpecializedBinding(); } - private static class TemplateArgumentCollector implements IPDOMVisitor { - private List 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 ICPPTemplateArgument[] getTemplateArguments() { + try { + final int rec= getPDOM().getDB().getInt(record+ARGUMENTS); + return PDOMCPPArgumentList.getArguments(this, rec); + } catch (CoreException e) { + CCorePlugin.log(e); + return ICPPTemplateArgument.EMPTY_ARGUMENTS; } } + @Deprecated public IType[] getArguments() { - try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - TemplateArgumentCollector visitor = new TemplateArgumentCollector(); - list.accept(visitor); - - return visitor.getTemplateArguments(); - } catch (CoreException e) { - CCorePlugin.log(e); - return IType.EMPTY_TYPE_ARRAY; - } + return CPPTemplates.getArguments(getTemplateArguments()); } public boolean isAnonymous() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java index 5957f77fb80..f41ed40f2ce 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java @@ -1,39 +1,34 @@ /******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. + * Copyright (c) 2007, 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Bryan Wilkinson (QNX) - Initial API and implementation * Andrew Ferguson (Symbian) * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; -import java.util.ArrayList; -import java.util.List; - import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.IPDOMNode; -import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; 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.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** - * @author Bryan Wilkinson - * + * Result of instantiating a function template. */ class PDOMCPPFunctionInstance extends PDOMCPPFunctionSpecialization implements ICPPTemplateInstance { private static final int ARGUMENTS = PDOMCPPFunctionSpecialization.RECORD_SIZE + 0; @@ -44,13 +39,9 @@ class PDOMCPPFunctionInstance extends PDOMCPPFunctionSpecialization implements I throws CoreException { super(pdom, parent, function, orig); - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - IType[] args = ((ICPPTemplateInstance) function).getArguments(); - for (int i = 0; i < args.length; i++) { - PDOMNode typeNode = getLinkageImpl().addType(this, args[i]); - if (typeNode != null) - list.addMember(typeNode); - } + final ICPPTemplateInstance asInstance= (ICPPTemplateInstance) function; + final int argListRec= PDOMCPPArgumentList.putArguments(this, asInstance.getTemplateArguments()); + pdom.getDB().putInt(record+ARGUMENTS, argListRec); } public PDOMCPPFunctionInstance(PDOM pdom, int bindingRecord) { @@ -72,31 +63,19 @@ class PDOMCPPFunctionInstance extends PDOMCPPFunctionSpecialization implements I return (ICPPTemplateDefinition) getSpecializedBinding(); } - private static class TemplateArgumentCollector implements IPDOMVisitor { - private List 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 ICPPTemplateArgument[] getTemplateArguments() { + try { + final int rec= getPDOM().getDB().getInt(record+ARGUMENTS); + return PDOMCPPArgumentList.getArguments(this, rec); + } catch (CoreException e) { + CCorePlugin.log(e); + return ICPPTemplateArgument.EMPTY_ARGUMENTS; } } + @Deprecated public IType[] getArguments() { - try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); - TemplateArgumentCollector visitor = new TemplateArgumentCollector(); - list.accept(visitor); - - return visitor.getTemplateArguments(); - } catch (CoreException e) { - CCorePlugin.log(e); - return IType.EMPTY_TYPE_ARRAY; - } + return CPPTemplates.getArguments(getTemplateArguments()); } /* diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 06611e6031e..ed96f6c5e0b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Doug Schaefer (QNX) - Initial API and implementation * Markus Schorn (Wind River Systems) * Andrew Ferguson (Symbian) * Sergey Prigogin (Google) @@ -52,6 +52,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; 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; @@ -86,7 +87,7 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** - * @author Doug Schaefer + * Container for c++-entities. */ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { @@ -160,14 +161,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { public void run() { try { - IType[] args = binding.getArguments(); - for (IType arg : args) { - partial.addArgument(arg); - } + ICPPTemplateArgument[] args = binding.getTemplateArguments(); + partial.setArguments(args); } catch (CoreException e) { CCorePlugin.log(e); - } catch (DOMException e) { - CCorePlugin.log(e); } finally { partial = null; binding = null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java index d62d410a0c4..f5afd78c54b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java @@ -6,93 +6,53 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation - * Andrew Ferguson (Symbian) + * Bryan Wilkinson (QNX) - Initial API and implementation + * Andrew Ferguson (Symbian) + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; -import java.util.ArrayList; -import java.util.List; - import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.IPDOMNode; -import org.eclipse.cdt.core.dom.IPDOMVisitor; 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.ICPPSpecialization; -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; -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; import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** - * @author Bryan Wilkinson + * Base class for specializations and instances of other bindings. */ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpecialization, IPDOMOverloader { - private static final int ARGMAP_PARAMS = PDOMCPPBinding.RECORD_SIZE + 0; - private static final int ARGMAP_ARGS = PDOMCPPBinding.RECORD_SIZE + 4; - private static final int SIGNATURE_HASH = PDOMCPPBinding.RECORD_SIZE + 8; - private static final int SPECIALIZED = PDOMCPPBinding.RECORD_SIZE + 12; + private static final int ARGMAP = PDOMCPPBinding.RECORD_SIZE + 0; + private static final int SIGNATURE_HASH = PDOMCPPBinding.RECORD_SIZE + 4; + private static final int SPECIALIZED = PDOMCPPBinding.RECORD_SIZE + 8; /** * The size in bytes of a PDOMCPPSpecialization record in the database. */ @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 16; + protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12; private IBinding fSpecializedCache= null; - private ObjectMap fArgMap; + private ICPPTemplateParameterMap fArgMap; public PDOMCPPSpecialization(PDOM pdom, PDOMNode parent, ICPPSpecialization spec, IPDOMBinding specialized) throws CoreException { super(pdom, parent, spec.getNameCharArray()); pdom.getDB().putInt(record + SPECIALIZED, specialized.getRecord()); - // specializations that are no instances have the same argmap as their owner. + // specializations that are no instances have the same map as their owner. if (this instanceof ICPPTemplateInstance) { - PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl()); - PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl()); - ObjectMap argMap = spec.getArgumentMap(); - if (argMap != null) { - for (int i = 0; i < argMap.size(); i++) { - Object param = argMap.keyAt(i); - Object arg = argMap.getAt(i); - - // TODO - non-type template arguments still needs attention - if (param instanceof ICPPTemplateNonTypeParameter && arg instanceof IType) { - try { - ICPPTemplateNonTypeParameter nontype= (ICPPTemplateNonTypeParameter) param; - PDOMNode paramNode= ((PDOMCPPLinkage)getLinkageImpl()).createBinding(this, nontype); - PDOMNode argNode= getLinkageImpl().addType(this, (IType) arg); - if (paramNode != null && argNode != null) { - paramList.addMember(paramNode); - argList.addMember(argNode); - } - } catch(DOMException de) { - CCorePlugin.log(de); - } - } - - if (param instanceof IType && arg instanceof IType) { - PDOMNode paramNode = getLinkageImpl().addType(this, (IType) param); - PDOMNode argNode = getLinkageImpl().addType(this, (IType) arg); - if (paramNode != null && argNode != null) { - paramList.addMember(paramNode); - argList.addMember(argNode); - } - } - } - } + int rec= PDOMCPPTemplateParameterMap.putMap(this, spec.getTemplateParameterMap()); + pdom.getDB().putInt(record+ARGMAP, rec); } try { Integer sigHash = IndexCPPSignatureUtil.getSignatureHash(spec); @@ -116,43 +76,22 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpeci } return fSpecializedCache; } - - private static class NodeCollector implements IPDOMVisitor { - private List nodes = new ArrayList(); - public boolean visit(IPDOMNode node) throws CoreException { - nodes.add(node); - return false; - } - public void leave(IPDOMNode node) throws CoreException { - } - public IPDOMNode[] getNodes() { - return nodes.toArray(new IPDOMNode[nodes.size()]); - } + + @Deprecated + public ObjectMap getArgumentMap() { + return CPPTemplates.getArgumentMap(this, getTemplateParameterMap()); } - public ObjectMap getArgumentMap() { + public ICPPTemplateParameterMap getTemplateParameterMap() { if (fArgMap == null) { try { if (this instanceof ICPPTemplateInstance) { - PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl()); - PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl()); - NodeCollector paramVisitor = new NodeCollector(); - paramList.accept(paramVisitor); - IPDOMNode[] paramNodes = paramVisitor.getNodes(); - NodeCollector argVisitor = new NodeCollector(); - argList.accept(argVisitor); - IPDOMNode[] argNodes = argVisitor.getNodes(); - - ObjectMap map = new ObjectMap(paramNodes.length); - for (int i = 0; i < paramNodes.length; i++) { - map.put(paramNodes[i], argNodes[i]); - } - fArgMap= map; + fArgMap= PDOMCPPTemplateParameterMap.getMap(this, getInt(record + ARGMAP)); } else { // specializations that are no instances have the same argmap as their owner. IBinding owner= getOwner(); if (owner instanceof ICPPSpecialization) { - fArgMap= ((ICPPSpecialization) owner).getArgumentMap(); + fArgMap= ((ICPPSpecialization) owner).getTemplateParameterMap(); } } } catch (CoreException e) { @@ -166,38 +105,6 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements ICPPSpeci return pdom.getDB().getInt(record + SIGNATURE_HASH); } - private IType[] getArguments() { - if (!(this instanceof ICPPTemplateDefinition) - && getSpecializedBinding() instanceof ICPPTemplateDefinition) { - ICPPTemplateDefinition template = (ICPPTemplateDefinition) getSpecializedBinding(); - try { - ICPPTemplateParameter[] params = template.getTemplateParameters(); - ObjectMap argMap = getArgumentMap(); - IType[] args = new IType[params.length]; - for (int i = 0; i < params.length; i++) { - args[i] = (IType) argMap.get(params[i]); - } - return args; - } catch (DOMException e) { - } - } - - return IType.EMPTY_TYPE_ARRAY; - } - - public boolean matchesArguments(IType[] arguments) { - IType[] args = getArguments(); - if (args.length == arguments.length) { - int i = 0; - for (; i < args.length; i++) { - if (!CPPTemplates.isSameTemplateArgument(args[i], arguments[i])) - break; - } - return i == args.length; - } - return false; - } - /* * For debug purposes only */ 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 7a1294bd0f1..287f4ae89e4 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 @@ -6,40 +6,46 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Bryan Wilkinson (QNX) - Initial API and implementation * Markus Schorn (Wind River Systems) * Sergey Prigogin (Google) * Andrew Ferguson (Symbian) *******************************************************************************/ 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.cpp.ICPPTemplateNonTypeParameter; 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.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** - * @author Bryan Wilkinson + * Binding for template non-type parameter in the index. */ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMemberOwner, ICPPTemplateNonTypeParameter { private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE; + private static final int PARAMETERPOS= PDOMCPPVariable.RECORD_SIZE + 4; + /** * The size in bytes of a PDOMCPPTemplateTypeParameter record in the database. */ @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPVariable.RECORD_SIZE + 4; + protected static final int RECORD_SIZE = PDOMCPPVariable.RECORD_SIZE + 8; 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()); } public PDOMCPPTemplateNonTypeParameter(PDOM pdom, int bindingRecord) { @@ -56,6 +62,16 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe return IIndexCPPBindingConstants.CPP_TEMPLATE_NON_TYPE_PARAMETER; } + public int getParameterPosition() { + try { + final Database db = pdom.getDB(); + return db.getInt(record + PARAMETERPOS); + } catch (CoreException e) { + CCorePlugin.log(e); + return -1; + } + } + @Override public void addChild(PDOMNode member) throws CoreException { PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); 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 new file mode 100644 index 00000000000..fec284d5363 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateParameterMap.java @@ -0,0 +1,124 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +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.pdom.db.Database; +import org.eclipse.cdt.internal.core.pdom.db.IString; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; + +/** + * Collects methods to store an argument list in the database + */ +public class PDOMCPPTemplateParameterMap { + /** + * Stores the given template parameter map in the database. + * @return the record by which the arguments can be referenced. + */ + public static int putMap(PDOMNode parent, ICPPTemplateParameterMap map) throws CoreException { + final PDOMLinkage linkage= parent.getLinkage(); + final Database db= linkage.getPDOM().getDB(); + Integer[] keys= map.getAllParameterPositions(); + final short len= (short) Math.min(keys.length, (Database.MAX_MALLOC_SIZE-2)/12); + final int block= db.malloc(2+12*len); + int p= block; + + db.putShort(p, len); p+=2; + for (int i=0; i= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/12); + rec+=2; + for (int i=0; i= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/12); + if (len == 0) { + return new CPPTemplateParameterMap(); + } + + rec+=2; + CPPTemplateParameterMap result= new CPPTemplateParameterMap(); + for (int i=0; i