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 70e3e79e474..3cf1b9bc373 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 @@ -315,7 +315,7 @@ public class ASTTypeUtil { final ICPPTemplateParameter tpar = (ICPPTemplateParameter) type; if (normalize) { result.append('#'); - result.append(Integer.toString(tpar.getParameterPosition(), 16)); + result.append(Integer.toString(tpar.getParameterID(), 16)); } else { result.append(tpar.getName()); } 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 43954502856..eb44be0589a 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 @@ -18,38 +18,44 @@ package org.eclipse.cdt.core.dom.ast.cpp; */ 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 offset of this parameter 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. + * Returns the zero-based position of this parameter within the template parameter list it belongs to. + * @since 5.1 + */ + short getParameterPosition(); + + /** + * Returns the nesting-level of the template declaration this parameter belongs to. *

- * The nesting level is determined by counting the template declarations that enclose the one that - * declares this parameter. The position is then computed by - * (nesting-level << 16) + position-in-parameter-list. - *

- * Example: + * The nesting level is determined by counting enclosing template declarations, + * for example: *

 	 * namespace ns {
-	 *    template class X {       // parameter position: 0x00000000
-	 *       template class Y1 {   // parameter position: 0x00010000
+	 *    template class X {       // nesting level 0
+	 *       template class Y1 {   // nesting level 1
 	 *       };
 	 *       class Y2 {
-	 *          template typename class Z { // parameter position: 0x00010000
+	 *          template typename class Z { // nesting level 1
 	 *             void m();
 	 *          };  
 	 *       };
 	 *    };
 	 * }
-	 * template                    // parameter position 0x00000000
-	 *    template                 // parameter position 0x00010000
+	 * template                    // nesting level 0
+	 *    template                 // nesting level 1
 	 *       void ns::X::Y2::Z::m() {}
 	 * 
* @since 5.1 */ - int getParameterPosition(); - + short getTemplateNestingLevel(); + + /** + * Returns {@code (getTemplateNestingLevel() << 16) + getParameterPosition()}. + * @since 5.1 + */ + int getParameterID(); + /** * Returns the default value for this template parameter, or null. * @since 5.1 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 b0c4ba1586d..d4e7a38702a 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 @@ -99,7 +99,7 @@ public class Value implements IValue { } /** - * Tests whether the value is a template parameter, returns the parameter position of the + * Tests whether the value is a template parameter, returns the parameter id of the * parameter, or null if it is not a template parameter. */ public static int isTemplateParameter(IValue tval) { @@ -265,7 +265,7 @@ public class Value implements IValue { @SuppressWarnings("nls") private static String evaluate(ICPPTemplateParameter param) { - return "#" + Integer.toHexString(param.getParameterPosition()); + return "#" + Integer.toHexString(param.getParameterID()); } @SuppressWarnings("nls") diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java index f6d246fa610..fb1d6c8cc52 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java @@ -247,7 +247,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC } public IBinding resolveTemplateParameter(ICPPTemplateParameter templateParameter) { - int pos= templateParameter.getParameterPosition() & 0xffff; + int pos= templateParameter.getParameterPosition(); int tdeclLen= declarations == null ? 0 : declarations.length; for (int i= -1; i < tdeclLen; i++) { 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 875bbad1189..6463d051d71 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 @@ -38,11 +38,11 @@ import org.eclipse.core.runtime.PlatformObject; public abstract class CPPTemplateParameter extends PlatformObject implements ICPPTemplateParameter, ICPPInternalBinding, ICPPTwoPhaseBinding { private IASTName[] declarations; - private final int position; + private final int fParameterID; public CPPTemplateParameter(IASTName name) { declarations = new IASTName[] {name}; - position= computeParameterPosition(name); + fParameterID= computeParameterPosition(name); } private int computeParameterPosition(IASTName name) { @@ -105,8 +105,16 @@ public abstract class CPPTemplateParameter extends PlatformObject return declarations[0].toCharArray(); } - public int getParameterPosition() { - return position; + public int getParameterID() { + return fParameterID; + } + + public short getParameterPosition() { + return (short) fParameterID; + } + + public short getTemplateNestingLevel() { + return (short) (fParameterID >> 16); } public IASTName getPrimaryDeclaration () { @@ -239,7 +247,7 @@ public abstract class CPPTemplateParameter extends PlatformObject // use parameter from the index try { ICPPTemplateParameter[] params = template.getTemplateParameters(); - final int pos= position & 0xffff; + final int pos= getParameterPosition(); if (pos < params.length) return params[pos]; } catch (DOMException e) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameterMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameterMap.java index 7c7b155c291..739c87e11e7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameterMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameterMap.java @@ -35,36 +35,36 @@ public class CPPTemplateParameterMap implements ICPPTemplateParameterMap { * Returns whether the map contains the given parameter */ public boolean contains(ICPPTemplateParameter templateParameter) { - return fMap.containsKey(templateParameter.getParameterPosition()); + return fMap.containsKey(templateParameter.getParameterID()); } /** * Adds the mapping to the map. */ public void put(ICPPTemplateParameter param, ICPPTemplateArgument value) { - fMap.put(param.getParameterPosition(), value); + fMap.put(param.getParameterID(), value); } /** * Adds the mapping to the map. */ - public void put(int parameterPos, ICPPTemplateArgument value) { - fMap.put(parameterPos, value); + public void put(int parameterID, ICPPTemplateArgument value) { + fMap.put(parameterID, value); } /** * Returns the value for the given parameter. */ public ICPPTemplateArgument getArgument(ICPPTemplateParameter param) { - return (ICPPTemplateArgument) fMap.get(param.getParameterPosition()); + return (ICPPTemplateArgument) fMap.get(param.getParameterID()); } /** - * Returns the value for the template parameter at the given position. - * @see ICPPTemplateParameter#getParameterPosition() + * Returns the value for the template parameter with the given id. + * @see ICPPTemplateParameter#getParameterID() */ - public ICPPTemplateArgument getArgument(int paramPosition) { - return (ICPPTemplateArgument) fMap.get(paramPosition); + public ICPPTemplateArgument getArgument(int paramID) { + return (ICPPTemplateArgument) fMap.get(paramID); } /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java index 773a908fb47..6eeae80b2e9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java @@ -168,7 +168,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement if (!(type instanceof ICPPTemplateTemplateParameter)) return false; - return getParameterPosition() == ((ICPPTemplateParameter) type).getParameterPosition(); + return getParameterID() == ((ICPPTemplateParameter) type).getParameterID(); } public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java index 6e09ee9902a..a7debcbf46a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java @@ -73,7 +73,7 @@ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements if (!(type instanceof ICPPTemplateTypeParameter)) return false; - return getParameterPosition() == ((ICPPTemplateParameter) type).getParameterPosition(); + return getParameterID() == ((ICPPTemplateParameter) type).getParameterID(); } public IASTName getUnknownName() { 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 67fb0f1d0ef..ac25268ec54 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 @@ -253,7 +253,7 @@ public class CPPTemplates { private static boolean argIsParameter(ICPPTemplateArgument arg, ICPPTemplateParameter param) { if (param instanceof ICPPTemplateNonTypeParameter) { - return arg.isNonTypeValue() && Value.isTemplateParameter(arg.getNonTypeValue()) == param.getParameterPosition(); + return arg.isNonTypeValue() && Value.isTemplateParameter(arg.getNonTypeValue()) == param.getParameterID(); } if (param instanceof IType) { return arg.isTypeValue() && ((IType) param).isSameType(arg.getTypeValue()); @@ -1917,7 +1917,7 @@ public class CPPTemplates { return false; } else { int parpos= Value.isTemplateParameter(arg.getNonTypeValue()); - if (parpos != par.getParameterPosition()) + if (parpos != par.getParameterID()) return false; } } 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 b0a67d9d351..12b2495a58f 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 @@ -34,10 +34,18 @@ public class CompositeCPPTemplateNonTypeParameter extends CompositeCPPVariable i fail(); return null; } - public int getParameterPosition() { + public short getParameterPosition() { return ((ICPPTemplateParameter)rbinding).getParameterPosition(); } + + public short getTemplateNestingLevel() { + return ((ICPPTemplateParameter)rbinding).getTemplateNestingLevel(); + } + public int getParameterID() { + return ((ICPPTemplateParameter)rbinding).getParameterID(); + } + public ICPPTemplateArgument getDefaultValue() { try { return TemplateInstanceUtil.convert(cf, ((ICPPTemplateTypeParameter)rbinding).getDefaultValue()); 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 de6db323197..7c936536bb7 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 @@ -37,10 +37,18 @@ public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding return cf.getCompositeType(preresult); } - public int getParameterPosition() { + public short getParameterPosition() { return ((ICPPTemplateParameter)rbinding).getParameterPosition(); } + public short getTemplateNestingLevel() { + return ((ICPPTemplateParameter)rbinding).getTemplateNestingLevel(); + } + + public int getParameterID() { + return ((ICPPTemplateParameter)rbinding).getParameterID(); + } + public boolean isSameType(IType type) { return ((IType)rbinding).isSameType(type); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java index e0fa963acb1..389a5a47dd5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java @@ -237,7 +237,7 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType public ICPPTemplateParameter adaptTemplateParameter(ICPPTemplateParameter param) { // Template parameters are identified by their position in the parameter list. - int pos = param.getParameterPosition() & 0xFFFF; + int pos = param.getParameterPosition(); if (params != null) { return pos < params.length ? params[pos] : null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java index ec200d59513..adf700e116f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java @@ -128,7 +128,7 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction public ICPPTemplateParameter adaptTemplateParameter(ICPPTemplateParameter param) { // Template parameters are identified by their position in the parameter list. - int pos = param.getParameterPosition() & 0xFFFF; + int pos = param.getParameterPosition(); try { PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl()); return (ICPPTemplateParameter) list.getNodeAt(pos); 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 094f06f4b9b..06573644fc4 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 @@ -37,9 +37,10 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe ICPPTemplateNonTypeParameter { private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE; - private static final int PARAMETERPOS= PDOMCPPVariable.RECORD_SIZE + 4; + private static final int PARAMETERID= PDOMCPPVariable.RECORD_SIZE + 4; private static final int DEFAULTVAL= PDOMCPPVariable.RECORD_SIZE + 8; + private int fCachedParamID= -1; /** * The size in bytes of a PDOMCPPTemplateTypeParameter record in the database. @@ -51,7 +52,7 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe ICPPTemplateNonTypeParameter param) throws CoreException { super(pdom, parent, param); final Database db = pdom.getDB(); - db.putInt(record + PARAMETERPOS, param.getParameterPosition()); + db.putInt(record + PARAMETERID, param.getParameterID()); ICPPTemplateArgument val= param.getDefaultValue(); if (val != null) { IValue sval= val.getNonTypeValue(); @@ -92,13 +93,30 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe } } - public int getParameterPosition() { - try { - final Database db = pdom.getDB(); - return db.getInt(record + PARAMETERPOS); - } catch (CoreException e) { - CCorePlugin.log(e); - return -1; + public short getParameterPosition() { + readParamID(); + return (short) fCachedParamID; + } + + public short getTemplateNestingLevel() { + readParamID(); + return (short)(fCachedParamID >> 16); + } + + public int getParameterID() { + readParamID(); + return fCachedParamID; + } + + private void readParamID() { + if (fCachedParamID == -1) { + try { + final Database db = pdom.getDB(); + fCachedParamID= db.getInt(record + PARAMETERID); + } catch (CoreException e) { + CCorePlugin.log(e); + fCachedParamID= -2; + } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java index 4ced778fcf3..c41d3410c9c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java @@ -43,14 +43,16 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember private static final int DEFAULT_TYPE = PDOMCPPBinding.RECORD_SIZE + 0; private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 4; - private static final int PARAMETERPOS= PDOMCPPBinding.RECORD_SIZE + 8; + private static final int PARAMETERID= PDOMCPPBinding.RECORD_SIZE + 8; /** * The size in bytes of a PDOMCPPTemplateTypeParameter record in the database. */ @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12; + private ICPPScope fUnknownScope; + private int fCachedParamID= -1; public PDOMCPPTemplateTypeParameter(PDOM pdom, PDOMNode parent, ICPPTemplateTypeParameter param) throws CoreException { @@ -58,7 +60,7 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember try { final Database db = pdom.getDB(); - db.putInt(record + PARAMETERPOS, param.getParameterPosition()); + db.putInt(record + PARAMETERID, param.getParameterID()); IType dflt = param.getDefault(); if (dflt != null) { PDOMNode typeNode = getLinkageImpl().addType(this, dflt); @@ -85,13 +87,30 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember return IIndexCPPBindingConstants.CPP_TEMPLATE_TYPE_PARAMETER; } - public int getParameterPosition() { - try { - final Database db = pdom.getDB(); - return db.getInt(record + PARAMETERPOS); - } catch (CoreException e) { - CCorePlugin.log(e); - return -1; + public short getParameterPosition() { + readParamID(); + return (short) fCachedParamID; + } + + public short getTemplateNestingLevel() { + readParamID(); + return (short)(fCachedParamID >> 16); + } + + public int getParameterID() { + readParamID(); + return fCachedParamID; + } + + private void readParamID() { + if (fCachedParamID == -1) { + try { + final Database db = pdom.getDB(); + fCachedParamID= db.getInt(record + PARAMETERID); + } catch (CoreException e) { + CCorePlugin.log(e); + fCachedParamID= -2; + } } } @@ -115,7 +134,7 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember if (!(type instanceof ICPPTemplateTypeParameter)) return false; - return getParameterPosition() == ((ICPPTemplateParameter) type).getParameterPosition(); + return getParameterID() == ((ICPPTemplateParameter) type).getParameterID(); } public IType getDefault() {