mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Improve API of ICPPTemplateParameter, see bug 253080.
This commit is contained in:
parent
793eff3eb2
commit
55049d6b86
15 changed files with 129 additions and 62 deletions
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -20,35 +20,41 @@ 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.
|
||||
* <p>
|
||||
* The nesting level is determined by counting the template declarations that enclose the one that
|
||||
* declares this parameter. The position is then computed by
|
||||
* <code>(nesting-level << 16) + position-in-parameter-list</code>.
|
||||
* <p>
|
||||
* Example:
|
||||
* The nesting level is determined by counting enclosing template declarations,
|
||||
* for example:
|
||||
* <pre>
|
||||
* namespace ns {
|
||||
* template<typename T> class X { // parameter position: 0x00000000
|
||||
* template<typename U> class Y1 { // parameter position: 0x00010000
|
||||
* template<typename T> class X { // nesting level 0
|
||||
* template<typename U> class Y1 { // nesting level 1
|
||||
* };
|
||||
* class Y2 {
|
||||
* template typename<V> class Z { // parameter position: 0x00010000
|
||||
* template typename<V> class Z { // nesting level 1
|
||||
* void m();
|
||||
* };
|
||||
* };
|
||||
* };
|
||||
* }
|
||||
* template<typename T> // parameter position 0x00000000
|
||||
* template <typename V> // parameter position 0x00010000
|
||||
* template<typename T> // nesting level 0
|
||||
* template <typename V> // nesting level 1
|
||||
* void ns::X<T>::Y2::Z<V>::m() {}
|
||||
* </pre>
|
||||
* @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 <code>null</code>.
|
||||
|
|
|
@ -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 <code>null</code> 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")
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
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();
|
||||
return db.getInt(record + PARAMETERPOS);
|
||||
fCachedParamID= db.getInt(record + PARAMETERID);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return -1;
|
||||
fCachedParamID= -2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {
|
||||
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();
|
||||
return db.getInt(record + PARAMETERPOS);
|
||||
fCachedParamID= db.getInt(record + PARAMETERID);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return -1;
|
||||
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() {
|
||||
|
|
Loading…
Add table
Reference in a new issue