1
0
Fork 0
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:
Markus Schorn 2008-11-21 10:51:32 +00:00
parent 793eff3eb2
commit 55049d6b86
15 changed files with 129 additions and 62 deletions

View file

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

View file

@ -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>.

View file

@ -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")

View file

@ -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++) {

View file

@ -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) {

View file

@ -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);
}
/**

View file

@ -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 {

View file

@ -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() {

View file

@ -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;
}
}

View file

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

View file

@ -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);
}

View file

@ -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;
}

View file

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

View file

@ -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;
}
}
}

View file

@ -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() {