1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Removes references to deprecated API related to template arguments, bug 242668.

This commit is contained in:
Markus Schorn 2008-10-24 13:53:22 +00:00
parent 24c596e1a5
commit bbdc82b058
73 changed files with 891 additions and 657 deletions

View file

@ -41,6 +41,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.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.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
@ -50,6 +51,7 @@ import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexMacro; import org.eclipse.cdt.core.index.IIndexMacro;
import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -218,7 +220,7 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas
assertInstance(b1, ICPPInstanceCache.class); assertInstance(b1, ICPPInstanceCache.class);
ICPPInstanceCache ct= (ICPPInstanceCache) b1; ICPPInstanceCache ct= (ICPPInstanceCache) b1;
ICPPSpecialization inst= ct.getInstance(new IType[]{(IType)b0}); ICPPSpecialization inst= ct.getInstance(new ICPPTemplateArgument[]{new CPPTemplateArgument((IType)b0)});
assertInstance(inst, ICPPClassType.class); assertInstance(inst, ICPPClassType.class);
ICPPClassType c2t= (ICPPClassType) inst; ICPPClassType c2t= (ICPPClassType) inst;
ICPPBase[] bases= c2t.getBases(); ICPPBase[] bases= c2t.getBases();

View file

@ -40,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.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.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; 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.ICPPTemplateNonTypeParameter;
@ -52,6 +53,7 @@ import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecializationScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecializationScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.index.IIndexScope;
@ -1480,11 +1482,11 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
ICPPTemplateInstance inst= (ICPPTemplateInstance) t1; ICPPTemplateInstance inst= (ICPPTemplateInstance) t1;
final ICPPTemplateDefinition tmplDef = inst.getTemplateDefinition(); final ICPPTemplateDefinition tmplDef = inst.getTemplateDefinition();
IBinding inst2= CPPTemplates.instantiate(tmplDef, inst.getArguments()); IBinding inst2= CPPTemplates.instantiate(tmplDef, inst.getTemplateArguments());
assertSame(inst, inst2); assertSame(inst, inst2);
IBinding charInst1= CPPTemplates.instantiate(tmplDef, new IType[] {new CPPBasicType(IBasicType.t_char, 0)}); IBinding charInst1= CPPTemplates.instantiate(tmplDef, new ICPPTemplateArgument[] {new CPPTemplateArgument(new CPPBasicType(IBasicType.t_char, 0))});
IBinding charInst2= CPPTemplates.instantiate(tmplDef, new IType[] {new CPPBasicType(IBasicType.t_char, 0)}); IBinding charInst2= CPPTemplates.instantiate(tmplDef, new ICPPTemplateArgument[] {new CPPTemplateArgument(new CPPBasicType(IBasicType.t_char, 0))});
assertSame(charInst1, charInst2); assertSame(charInst1, charInst2);
} }
} }

View file

@ -138,7 +138,7 @@ public class ASTTypeUtil {
if (arg.isNonTypeValue()) if (arg.isNonTypeValue())
return arg.getNonTypeValue().getCanonicalRepresentation(); return arg.getNonTypeValue().getCanonicalRepresentation();
return getTypeString(arg.getTypeValue(), normalize); return getType(arg.getTypeValue(), normalize);
} }
/** /**

View file

@ -27,12 +27,6 @@ import org.eclipse.cdt.core.dom.ast.IType;
public interface ICPPClassTemplatePartialSpecialization extends ICPPClassTemplate { public interface ICPPClassTemplatePartialSpecialization extends ICPPClassTemplate {
public static final ICPPClassTemplatePartialSpecialization[] EMPTY_PARTIAL_SPECIALIZATION_ARRAY = new ICPPClassTemplatePartialSpecialization[0]; public static final ICPPClassTemplatePartialSpecialization[] EMPTY_PARTIAL_SPECIALIZATION_ARRAY = new ICPPClassTemplatePartialSpecialization[0];
/**
* get the arguments to this specialization
*/
public IType [] getArguments() throws DOMException;
/** /**
* get the ICPPTemplateDefinition which this is a specialization of * get the ICPPTemplateDefinition which this is a specialization of
*/ */
@ -44,4 +38,10 @@ public interface ICPPClassTemplatePartialSpecialization extends ICPPClassTemplat
* @since 5.1 * @since 5.1
*/ */
public ICPPTemplateArgument[] getTemplateArguments(); public ICPPTemplateArgument[] getTemplateArguments();
/**
* @deprecated use {@link #getTemplateArguments()}, instead.
*/
@Deprecated
public IType [] getArguments() throws DOMException;
} }

View file

@ -27,6 +27,12 @@ public interface ICPPTemplateArgument {
*/ */
boolean isNonTypeValue(); boolean isNonTypeValue();
/**
* Returns whether this is a type value, suitable for either a template type or a
* template template parameter.
*/
boolean isTypeValue();
/** /**
* If this is a type value (suitable for a template type and template template parameters), * If this is a type value (suitable for a template type and template template parameters),
* the type used as a value is returned. * the type used as a value is returned.

View file

@ -6,7 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * 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; package org.eclipse.cdt.core.dom.ast.cpp;
@ -16,13 +17,11 @@ import org.eclipse.cdt.core.dom.ast.IVariable;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public interface ICPPTemplateNonTypeParameter extends ICPPTemplateParameter, public interface ICPPTemplateNonTypeParameter extends ICPPTemplateParameter, IVariable {
IVariable {
/** /**
* The default value for this parameter. * @deprecated, use {@link ICPPTemplateParameter#getDefaultValue()}.
*
*/ */
@Deprecated
public IASTExpression getDefault(); public IASTExpression getDefault();
} }

View file

@ -29,4 +29,10 @@ public interface ICPPTemplateParameter extends ICPPBinding {
* @since 5.1 * @since 5.1
*/ */
int getParameterPosition(); int getParameterPosition();
/**
* Returns the default value for this template parameter, or <code>null</code>.
* @since 5.1
*/
ICPPTemplateArgument getDefaultValue();
} }

View file

@ -10,6 +10,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.ast.cpp; package org.eclipse.cdt.core.dom.ast.cpp;
/** /**
* Models the mapping of template parameters to values. * Models the mapping of template parameters to values.
* @since 5.1 * @since 5.1
@ -22,6 +23,12 @@ public interface ICPPTemplateParameterMap {
*/ */
public ICPPTemplateArgument getArgument(int paramPosition); public ICPPTemplateArgument getArgument(int paramPosition);
/**
* Returns the value for the template parameter in the map, or <code>null</code> if
* the parameter is not mapped.
*/
public ICPPTemplateArgument getArgument(ICPPTemplateParameter param);
/** /**
* Returns the array of template parameter positions, for which a mapping exists. * Returns the array of template parameter positions, for which a mapping exists.
*/ */

View file

@ -6,26 +6,22 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * Andrew Niefer (IBM Corporation) - initial API and implementation
*******************************************************************************/ *******************************************************************************/
/*
* Created on Apr 13, 2005
*/
package org.eclipse.cdt.core.dom.ast.cpp; package org.eclipse.cdt.core.dom.ast.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
/** /**
* @author aniefer * Template parameters of type template
*/ */
public interface ICPPTemplateTemplateParameter extends ICPPTemplateParameter, ICPPClassTemplate { public interface ICPPTemplateTemplateParameter extends ICPPTemplateParameter, ICPPClassTemplate {
public ICPPTemplateParameter[] getTemplateParameters() throws DOMException; public ICPPTemplateParameter[] getTemplateParameters() throws DOMException;
/** /**
* The default type for this parameter. May be null * Return the default value for this parameter, or <code>null</code>.
*
*/ */
public IType getDefault() throws DOMException; public IType getDefault() throws DOMException;
} }

View file

@ -82,6 +82,21 @@ public class Value implements IValue {
return new Value(String.valueOf(value)); return new Value(String.valueOf(value));
} }
public static IValue create(ICPPTemplateNonTypeParameter tntp) {
return new Value(evaluate(tntp));
}
public static int isTemplateParameter(IValue tval) {
final String rep= tval.getCanonicalRepresentation();
if (rep.indexOf('#') == 0 && rep.indexOf(',') == -1) {
try {
return Integer.parseInt(rep.substring(1), 16);
} catch (NumberFormatException e) {
}
}
return -1;
}
public static IValue create(IASTExpression expr, int maxRecursionDepth) { public static IValue create(IASTExpression expr, int maxRecursionDepth) {
try { try {
Object obj= evaluate(expr, maxRecursionDepth); Object obj= evaluate(expr, maxRecursionDepth);

View file

@ -29,10 +29,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
@ -112,12 +112,12 @@ public class AbstractCPPClassSpecializationScope implements ICPPClassSpecializat
public ICPPBase[] getBases() throws DOMException { public ICPPBase[] getBases() throws DOMException {
ICPPBase[] result = null; ICPPBase[] result = null;
ICPPBase[] bases = specialClass.getSpecializedBinding().getBases(); ICPPBase[] bases = specialClass.getSpecializedBinding().getBases();
final ObjectMap argmap = specialClass.getArgumentMap(); final ICPPTemplateParameterMap tpmap = specialClass.getTemplateParameterMap();
for (ICPPBase base : bases) { for (ICPPBase base : bases) {
ICPPBase specBase = base.clone(); ICPPBase specBase = base.clone();
IBinding origClass = base.getBaseClass(); IBinding origClass = base.getBaseClass();
if (origClass instanceof IType) { if (origClass instanceof IType) {
IType specClass= CPPTemplates.instantiateType((IType) origClass, argmap, specialClass); IType specClass= CPPTemplates.instantiateType((IType) origClass, tpmap, specialClass);
specClass = SemanticUtil.getUltimateType(specClass, false); specClass = SemanticUtil.getUltimateType(specClass, false);
if (specClass instanceof IBinding && !(specClass instanceof IProblemBinding)) { if (specClass instanceof IBinding && !(specClass instanceof IProblemBinding)) {
specBase.setBaseClass((IBinding) specClass); specBase.setBaseClass((IBinding) specClass);

View file

@ -17,7 +17,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; 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.ICPPTemplateDefinition;

View file

@ -26,7 +26,6 @@ import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; 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.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.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
@ -38,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; 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.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.core.parser.util.ObjectMap; 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.dom.parser.cpp.semantics.CPPTemplates;
@ -50,11 +50,11 @@ import org.eclipse.cdt.internal.core.index.IIndexType;
public class CPPClassSpecialization extends CPPSpecialization public class CPPClassSpecialization extends CPPSpecialization
implements ICPPClassSpecialization, ICPPInternalClassTypeMixinHost { implements ICPPClassSpecialization, ICPPInternalClassTypeMixinHost {
private CPPClassSpecializationScope specScope; private ICPPClassSpecializationScope specScope;
private ObjectMap specializationMap= ObjectMap.EMPTY_MAP; private ObjectMap specializationMap= ObjectMap.EMPTY_MAP;
private boolean checked; private boolean checked;
public CPPClassSpecialization(ICPPClassType specialized, IBinding owner, CPPTemplateParameterMap argumentMap) { public CPPClassSpecialization(ICPPClassType specialized, IBinding owner, ICPPTemplateParameterMap argumentMap) {
super(specialized, owner, argumentMap); super(specialized, owner, argumentMap);
} }
@ -71,7 +71,7 @@ public class CPPClassSpecialization extends CPPSpecialization
return result; return result;
} }
IBinding result= CPPTemplates.createSpecialization(this, original, getArgumentMap()); IBinding result= CPPTemplates.createSpecialization(this, original, getTemplateParameterMap());
synchronized(this) { synchronized(this) {
IBinding concurrent= (IBinding) specializationMap.get(original); IBinding concurrent= (IBinding) specializationMap.get(original);
if (concurrent != null) if (concurrent != null)

View file

@ -11,16 +11,15 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPASTTemplateId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; 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.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; 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.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -43,16 +42,10 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate
private void createArguments() { private void createArguments() {
if (arguments == null) { if (arguments == null) {
arguments= CPPTemplates.convert( arguments= CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) getTemplateName());
CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) getTemplateName()));
} }
} }
@Deprecated
public IType[] getArguments() {
return CPPTemplates.getArguments(getTemplateArguments());
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization#getPrimaryClassTemplate() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization#getPrimaryClassTemplate()
*/ */
@ -65,22 +58,22 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate
return getPrimaryClassTemplate(); return getPrimaryClassTemplate();
} }
public CPPTemplateParameterMap getTemplateParameterMap() { public ICPPTemplateParameterMap getTemplateParameterMap() {
CPPTemplateParameterMap result= new CPPTemplateParameterMap(); return CPPTemplates.createParameterMap(getPrimaryClassTemplate(), getTemplateArguments());
try { }
ICPPTemplateParameter[] params = getPrimaryClassTemplate().getTemplateParameters();
ICPPTemplateArgument[] args= getTemplateArguments(); @Override
int len= Math.min(params.length, args.length); public String toString() {
for (int i = 0; i < len; i++) { return super.toString() + '<' + ASTTypeUtil.getArgumentListString(getTemplateArguments(), true) + '>';
result.put(params[i], args[i]);
}
} catch (DOMException e) {
}
return result;
} }
@Deprecated @Deprecated
public ObjectMap getArgumentMap() { public ObjectMap getArgumentMap() {
return CPPTemplates.getArgumentMap(getPrimaryClassTemplate(), getTemplateParameterMap()); return CPPTemplates.getArgumentMap(getPrimaryClassTemplate(), getTemplateParameterMap());
} }
@Deprecated
public IType[] getArguments() {
return CPPTemplates.getArguments(getTemplateArguments());
}
} }

View file

@ -13,13 +13,13 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; 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.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; 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.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -31,7 +31,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
private ObjectMap instances = null; private ObjectMap instances = null;
public CPPClassTemplateSpecialization(ICPPClassTemplate orig, ICPPClassType owner, CPPTemplateParameterMap argumentMap) { public CPPClassTemplateSpecialization(ICPPClassTemplate orig, ICPPClassType owner, ICPPTemplateParameterMap argumentMap) {
super(orig, owner, argumentMap); super(orig, owner, argumentMap);
} }
@ -50,16 +50,16 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
public synchronized void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
instances.put(arguments, instance); instances.put(arguments, instance);
} }
public synchronized ICPPTemplateInstance getInstance(IType[] arguments) { public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) { if (instances != null) {
loop: for (int i=0; i < instances.size(); i++) { loop: for (int i=0; i < instances.size(); i++) {
IType[] args = (IType[]) instances.keyAt(i); ICPPTemplateArgument[] args = (ICPPTemplateArgument[]) instances.keyAt(i);
if (args.length == arguments.length) { if (args.length == arguments.length) {
for (int j=0; j < args.length; j++) { for (int j=0; j < args.length; j++) {
if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) { if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) {

View file

@ -12,7 +12,6 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;

View file

@ -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.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
/** /**
* Specialization of a constructor for a class-template or class-template specialization * Specialization of a constructor for a class-template or class-template specialization
@ -24,7 +24,7 @@ public class CPPConstructorSpecialization extends CPPMethodSpecialization
implements ICPPConstructor { implements ICPPConstructor {
public CPPConstructorSpecialization(IBinding orig, ICPPClassType owner, public CPPConstructorSpecialization(IBinding orig, ICPPClassType owner,
CPPTemplateParameterMap argMap) { ICPPTemplateParameterMap argMap) {
super(orig, owner, argMap); super(orig, owner, argMap);
} }

View file

@ -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.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
/** /**
* Specialization of a constructor template * Specialization of a constructor template
@ -24,7 +24,7 @@ public class CPPConstructorTemplateSpecialization extends CPPMethodTemplateSpeci
implements ICPPConstructor { implements ICPPConstructor {
public CPPConstructorTemplateSpecialization(IBinding specialized, public CPPConstructorTemplateSpecialization(IBinding specialized,
ICPPClassType owner, CPPTemplateParameterMap tpmap) { ICPPClassType owner, ICPPTemplateParameterMap tpmap) {
super(specialized, owner, tpmap); super(specialized, owner, tpmap);
} }

View file

@ -12,12 +12,12 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; 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.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; 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.ICPPTemplateDefinition;
@ -103,4 +103,9 @@ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDef
public IScope getScope() throws DOMException { public IScope getScope() throws DOMException {
return fClassTemplate.getScope(); return fClassTemplate.getScope();
} }
@Override
public String toString() {
return getName() + ASTTypeUtil.getArgumentListString(fArguments, true);
}
} }

View file

@ -19,14 +19,13 @@ import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPDeferredTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; 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.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; 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.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -40,7 +39,7 @@ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements IC
private ICPPTemplateArgument[] fArguments; private ICPPTemplateArgument[] fArguments;
private ICPPFunctionTemplate fFunctionTemplate; private ICPPFunctionTemplate fFunctionTemplate;
private CPPTemplateParameterMap fArgmap; private ICPPTemplateParameterMap fArgmap;
private IParameter [] fParameters; private IParameter [] fParameters;
private IFunctionType fFunctionType; private IFunctionType fFunctionType;
@ -63,20 +62,10 @@ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements IC
return CPPTemplates.getArgumentMap(fFunctionTemplate, getTemplateParameterMap()); return CPPTemplates.getArgumentMap(fFunctionTemplate, getTemplateParameterMap());
} }
public CPPTemplateParameterMap getTemplateParameterMap() { public ICPPTemplateParameterMap getTemplateParameterMap() {
// mstodo- deferred function instance and tpmap // mstodo- deferred function instance and tpmap
if (fArgmap == null) { if (fArgmap == null) {
CPPTemplateParameterMap argmap= new CPPTemplateParameterMap(); fArgmap= CPPTemplates.createParameterMap(fFunctionTemplate, getTemplateArguments());
try {
ICPPTemplateParameter[] params= fFunctionTemplate.getTemplateParameters();
ICPPTemplateArgument[] args= fArguments;
int len= Math.min(params.length, args.length);
for (int i = 0; i < len; i++) {
argmap.put(params[i], args[i]);
}
} catch (DOMException e) {
}
fArgmap= argmap;
} }
return fArgmap; return fArgmap;
} }
@ -110,7 +99,7 @@ public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements IC
if( fFunctionType == null ){ if( fFunctionType == null ){
IFunctionType ft = ((ICPPFunction)getTemplateDefinition()).getType(); IFunctionType ft = ((ICPPFunction)getTemplateDefinition()).getType();
IType returnType = ft.getReturnType(); IType returnType = ft.getReturnType();
returnType = CPPTemplates.instantiateType(returnType, getArgumentMap(), null); returnType = CPPTemplates.instantiateType(returnType, getTemplateParameterMap(), null);
fFunctionType = CPPVisitor.createImplicitFunctionType( returnType, getParameters(), null); fFunctionType = CPPVisitor.createImplicitFunctionType( returnType, getParameters(), null);
} }
return fFunctionType; return fFunctionType;

View file

@ -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.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.dom.parser.IInternalVariable; import org.eclipse.cdt.internal.core.dom.parser.IInternalVariable;
import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.Value;
@ -29,7 +29,7 @@ public class CPPFieldSpecialization extends CPPSpecialization implements ICPPFie
private IType type = null; private IType type = null;
private IValue value= null; private IValue value= null;
public CPPFieldSpecialization( IBinding orig, ICPPClassType owner, CPPTemplateParameterMap tpmap) { public CPPFieldSpecialization( IBinding orig, ICPPClassType owner, ICPPTemplateParameterMap tpmap) {
super(orig, owner, tpmap); super(orig, owner, tpmap);
} }

View file

@ -16,7 +16,6 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; 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.ICPPTemplateArgument;

View file

@ -24,10 +24,10 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IScope; 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.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
@ -39,7 +39,7 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP
private IFunctionType type = null; private IFunctionType type = null;
private IParameter[] specializedParams = null; private IParameter[] specializedParams = null;
public CPPFunctionSpecialization(IBinding orig, IBinding owner, CPPTemplateParameterMap argMap) { public CPPFunctionSpecialization(IBinding orig, IBinding owner, ICPPTemplateParameterMap argMap) {
super(orig, owner, argMap); super(orig, owner, argMap);
} }
@ -242,7 +242,7 @@ public class CPPFunctionSpecialization extends CPPSpecialization implements ICPP
} catch (DOMException e) { } catch (DOMException e) {
} }
result.append(t != null ? ASTTypeUtil.getParameterTypeString(t) : "()"); //$NON-NLS-1$ result.append(t != null ? ASTTypeUtil.getParameterTypeString(t) : "()"); //$NON-NLS-1$
CPPTemplateParameterMap tpmap= getTemplateParameterMap(); ICPPTemplateParameterMap tpmap= getTemplateParameterMap();
if (tpmap != null) { if (tpmap != null) {
result.append(" "); //$NON-NLS-1$ result.append(" "); //$NON-NLS-1$
result.append(tpmap.toString()); result.append(tpmap.toString());

View file

@ -13,12 +13,12 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; 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.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -30,7 +30,7 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization
private ObjectMap instances = null; private ObjectMap instances = null;
public CPPFunctionTemplateSpecialization(IBinding specialized, ICPPClassType owner, CPPTemplateParameterMap argumentMap) { public CPPFunctionTemplateSpecialization(IBinding specialized, ICPPClassType owner, ICPPTemplateParameterMap argumentMap) {
super(specialized, owner, argumentMap); super(specialized, owner, argumentMap);
} }
@ -39,16 +39,16 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
public synchronized final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public synchronized final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
instances.put(arguments, instance); instances.put(arguments, instance);
} }
public synchronized final ICPPTemplateInstance getInstance(IType[] arguments) { public synchronized final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) { if (instances != null) {
loop: for (int i=0; i < instances.size(); i++) { loop: for (int i=0; i < instances.size(); i++) {
IType[] args = (IType[]) instances.keyAt(i); ICPPTemplateArgument[] args = (ICPPTemplateArgument[]) instances.keyAt(i);
if (args.length == arguments.length) { if (args.length == arguments.length) {
for (int j=0; j < args.length; j++) { for (int j=0; j < args.length; j++) {
if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) { if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) {

View file

@ -12,7 +12,6 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;

View file

@ -17,10 +17,10 @@ import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
/** /**
* The specialization of a method in the context of a class-specialization. * The specialization of a method in the context of a class-specialization.
@ -28,7 +28,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
public class CPPMethodSpecialization extends CPPFunctionSpecialization public class CPPMethodSpecialization extends CPPFunctionSpecialization
implements ICPPMethod { implements ICPPMethod {
public CPPMethodSpecialization(IBinding orig, ICPPClassType owner, CPPTemplateParameterMap argMap ) { public CPPMethodSpecialization(IBinding orig, ICPPClassType owner, ICPPTemplateParameterMap argMap ) {
super(orig, owner, argMap ); super(orig, owner, argMap );
} }

View file

@ -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.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
/** /**
* The specialization of a method template in the context of a class specialization. * The specialization of a method template in the context of a class specialization.
@ -24,7 +24,7 @@ public class CPPMethodTemplateSpecialization extends CPPFunctionTemplateSpeciali
implements ICPPMethod { implements ICPPMethod {
public CPPMethodTemplateSpecialization(IBinding specialized, ICPPClassType owner, public CPPMethodTemplateSpecialization(IBinding specialized, ICPPClassType owner,
CPPTemplateParameterMap ctmap) { ICPPTemplateParameterMap ctmap) {
super(specialized, owner, ctmap); super(specialized, owner, ctmap);
} }

View file

@ -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.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
/** /**
* Binding for a specialization of a parameter. * Binding for a specialization of a parameter.
@ -24,7 +24,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
public class CPPParameterSpecialization extends CPPSpecialization implements ICPPParameter { public class CPPParameterSpecialization extends CPPSpecialization implements ICPPParameter {
private IType type = null; private IType type = null;
public CPPParameterSpecialization(ICPPParameter orig, IBinding owner, CPPTemplateParameterMap tpmap) { public CPPParameterSpecialization(ICPPParameter orig, IBinding owner, ICPPTemplateParameterMap tpmap) {
super(orig, owner, tpmap); super(orig, owner, tpmap);
} }

View file

@ -18,12 +18,12 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; 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.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.Linkage;
@ -40,11 +40,11 @@ import org.eclipse.core.runtime.PlatformObject;
public abstract class CPPSpecialization extends PlatformObject implements ICPPSpecialization, ICPPInternalBinding { public abstract class CPPSpecialization extends PlatformObject implements ICPPSpecialization, ICPPInternalBinding {
private IBinding owner; private IBinding owner;
private IBinding specialized; private IBinding specialized;
private CPPTemplateParameterMap argumentMap; private ICPPTemplateParameterMap argumentMap;
protected IASTNode definition; protected IASTNode definition;
private IASTNode[] declarations; private IASTNode[] declarations;
public CPPSpecialization(IBinding specialized, IBinding owner, CPPTemplateParameterMap argumentMap) { public CPPSpecialization(IBinding specialized, IBinding owner, ICPPTemplateParameterMap argumentMap) {
this.specialized = specialized; this.specialized = specialized;
this.owner = owner; this.owner = owner;
this.argumentMap = argumentMap; this.argumentMap = argumentMap;
@ -52,14 +52,14 @@ public abstract class CPPSpecialization extends PlatformObject implements ICPPSp
public IType specializeType(IType type) throws DOMException { public IType specializeType(IType type) throws DOMException {
if (owner instanceof ICPPClassSpecialization) { if (owner instanceof ICPPClassSpecialization) {
return CPPTemplates.instantiateType(type, getArgumentMap(), (ICPPClassSpecialization) owner); return CPPTemplates.instantiateType(type, getTemplateParameterMap(), (ICPPClassSpecialization) owner);
} else { } else {
return CPPTemplates.instantiateType(type, getArgumentMap(), null); return CPPTemplates.instantiateType(type, getTemplateParameterMap(), null);
} }
} }
public IValue specializeValue(IValue value) { public IValue specializeValue(IValue value) {
return CPPTemplates.instantiateValue(value, getArgumentMap()); return CPPTemplates.instantiateValue(value, getTemplateParameterMap());
} }
public IBinding getSpecializedBinding() { public IBinding getSpecializedBinding() {
@ -149,7 +149,7 @@ public abstract class CPPSpecialization extends PlatformObject implements ICPPSp
return CPPTemplates.getArgumentMap(this, getTemplateParameterMap()); return CPPTemplates.getArgumentMap(this, getTemplateParameterMap());
} }
public CPPTemplateParameterMap getTemplateParameterMap() { public ICPPTemplateParameterMap getTemplateParameterMap() {
return argumentMap; return argumentMap;
} }

View file

@ -34,12 +34,16 @@ public class CPPTemplateArgument implements ICPPTemplateArgument {
fValue= null; fValue= null;
} }
public boolean isTypeValue() {
return fValue == null;
}
public boolean isNonTypeValue() { public boolean isNonTypeValue() {
return fValue != null; return fValue != null;
} }
public IType getTypeValue() { public IType getTypeValue() {
return isNonTypeValue() ? null : fType; return isTypeValue() ? fType : null;
} }
public IValue getNonTypeValue() { public IValue getNonTypeValue() {
@ -56,4 +60,11 @@ public class CPPTemplateArgument implements ICPPTemplateArgument {
} }
return fType.isSameType(arg.getTypeValue()); return fType.isSameType(arg.getTypeValue());
} }
@Override
public String toString() {
if (fValue != null)
return fValue.toString();
return fType.toString();
}
} }

View file

@ -22,7 +22,6 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration;
@ -31,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
@ -98,16 +98,16 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
} }
} }
public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
instances.put(arguments, instance); instances.put(arguments, instance);
} }
public final ICPPTemplateInstance getInstance(IType[] arguments) { public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) { if (instances != null) {
loop: for (int i=0; i < instances.size(); i++) { loop: for (int i=0; i < instances.size(); i++) {
IType[] args = (IType[]) instances.keyAt(i); ICPPTemplateArgument[] args = (ICPPTemplateArgument[]) instances.keyAt(i);
if (args.length == arguments.length) { if (args.length == arguments.length) {
for (int j=0; j < args.length; j++) { for (int j=0; j < args.length; j++) {
if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) { if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) {

View file

@ -20,7 +20,9 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.internal.core.dom.parser.Value;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
/** /**
@ -48,6 +50,16 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements
return null; return null;
} }
public ICPPTemplateArgument getDefaultValue() {
IASTExpression d= getDefault();
if (d == null)
return null;
IValue val= Value.create(d, Value.MAX_RECURSION_DEPTH);
IType t= CPPVisitor.createType(d);
return new CPPTemplateArgument(val, t);
}
public IType getType() { public IType getType() {
if( type == null ){ if( type == null ){
IASTName name = getPrimaryDeclaration(); IASTName name = getPrimaryDeclaration();

View file

@ -8,19 +8,28 @@
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.ast.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
/** /**
* Maps template parameters to values. * Maps template parameters to values.
* @since 5.1
*/ */
public class CPPTemplateParameterMap implements ICPPTemplateParameterMap { public class CPPTemplateParameterMap implements ICPPTemplateParameterMap {
public static final CPPTemplateParameterMap EMPTY = new CPPTemplateParameterMap(); public static final CPPTemplateParameterMap EMPTY = new CPPTemplateParameterMap(0);
private ObjectMap fMap= new ObjectMap(2); private final ObjectMap fMap;
/**
* Constructs an empty parameter map.
*/
public CPPTemplateParameterMap(int initialSize) {
fMap= new ObjectMap(initialSize);
}
/** /**
* Returns whether the map contains the given parameter * Returns whether the map contains the given parameter
@ -61,13 +70,26 @@ public class CPPTemplateParameterMap implements ICPPTemplateParameterMap {
/** /**
* Puts all mappings from the supplied map into this map. * Puts all mappings from the supplied map into this map.
*/ */
public void putAll(CPPTemplateParameterMap map) { public void putAll(ICPPTemplateParameterMap map) {
final ObjectMap omap= map.fMap;
for (int i = 0; i < omap.size(); i++) { if (map instanceof CPPTemplateParameterMap) {
fMap.put(omap.keyAt(i), omap.getAt(i)); final ObjectMap omap= ((CPPTemplateParameterMap) map).fMap;
for (int i = 0; i < omap.size(); i++) {
fMap.put(omap.keyAt(i), omap.getAt(i));
}
} else {
assert false;
} }
} }
public ICPPTemplateArgument[] values() {
ICPPTemplateArgument[] result= new ICPPTemplateArgument[fMap.size()];
for (int i = 0; i < result.length; i++) {
result[i]= (ICPPTemplateArgument) fMap.getAt(i);
}
return result;
}
/** /**
* Returns the array of template parameter positions, for which a mapping exists. * Returns the array of template parameter positions, for which a mapping exists.
*/ */

View file

@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; 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.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
@ -106,7 +107,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
} }
public IType getDefault() throws DOMException { public IType getDefault() {
IASTNode[] nds = getDeclarations(); IASTNode[] nds = getDeclarations();
if (nds == null || nds.length == 0) if (nds == null || nds.length == 0)
return null; return null;
@ -118,6 +119,14 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return null; return null;
} }
public ICPPTemplateArgument getDefaultValue() {
IType d= getDefault();
if (d == null)
return null;
return new CPPTemplateArgument(d);
}
public ICPPBase[] getBases() { public ICPPBase[] getBases() {
return ICPPBase.EMPTY_BASE_ARRAY; return ICPPBase.EMPTY_BASE_ARRAY;
} }
@ -177,16 +186,16 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY;
} }
public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
if (instances == null) if (instances == null)
instances = new ObjectMap(2); instances = new ObjectMap(2);
instances.put(arguments, instance); instances.put(arguments, instance);
} }
public final ICPPTemplateInstance getInstance(IType[] arguments) { public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
if (instances != null) { if (instances != null) {
loop: for (int i=0; i < instances.size(); i++) { loop: for (int i=0; i < instances.size(); i++) {
IType[] args = (IType[]) instances.keyAt(i); ICPPTemplateArgument[] args = (ICPPTemplateArgument[]) instances.keyAt(i);
if (args.length == arguments.length) { if (args.length == arguments.length) {
for (int j=0; j < args.length; j++) { for (int j=0; j < args.length; j++) {
if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) { if (!CPPTemplates.isSameTemplateArgument(args[j], arguments[j])) {

View file

@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.IIndexType;
@ -56,6 +57,14 @@ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements
return null; return null;
} }
public ICPPTemplateArgument getDefaultValue() {
IType t= getDefault();
if (t == null)
return null;
return new CPPTemplateArgument(t);
}
public boolean isSameType(IType type) { public boolean isSameType(IType type) {
if (type == this) if (type == this)
return true; return true;

View file

@ -18,9 +18,9 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
@ -43,7 +43,7 @@ public class CPPTypedefSpecialization extends CPPSpecialization implements IType
private int fResolutionDepth; private int fResolutionDepth;
public CPPTypedefSpecialization(IBinding specialized, ICPPClassType owner, public CPPTypedefSpecialization(IBinding specialized, ICPPClassType owner,
CPPTemplateParameterMap tpmap) { ICPPTemplateParameterMap tpmap) {
super(specialized, owner, tpmap); super(specialized, owner, tpmap);
} }

View file

@ -6,7 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Sergey Prigogin (Google) - initial API and implementation * Sergey Prigogin (Google) - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
@ -16,6 +17,7 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -25,20 +27,20 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
* @author Sergey Prigogin * @author Sergey Prigogin
*/ */
public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnknownClassInstance { public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnknownClassInstance {
private final IType[] arguments; private final ICPPTemplateArgument[] arguments;
public CPPUnknownClassInstance(ICPPUnknownBinding scopeBinding, IASTName name, IType[] arguments) { public CPPUnknownClassInstance(ICPPUnknownBinding scopeBinding, IASTName name, ICPPTemplateArgument[] arguments) {
super(scopeBinding, name); super(scopeBinding, name);
this.arguments = arguments; this.arguments = arguments;
} }
public IType[] getArguments() { public ICPPTemplateArgument[] getArguments() {
return arguments; return arguments;
} }
@Override @Override
public String toString() { 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 @Override
@ -53,8 +55,8 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPUnkn
if (type instanceof ICPPUnknownClassInstance) { if (type instanceof ICPPUnknownClassInstance) {
ICPPUnknownClassInstance rhs= (ICPPUnknownClassInstance) type; ICPPUnknownClassInstance rhs= (ICPPUnknownClassInstance) type;
if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) { if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) {
IType[] lhsArgs= getArguments(); ICPPTemplateArgument[] lhsArgs= getArguments();
IType[] rhsArgs= rhs.getArguments(); ICPPTemplateArgument[] rhsArgs= rhs.getArguments();
if (lhsArgs != rhsArgs) { if (lhsArgs != rhsArgs) {
if (lhsArgs == null || rhsArgs == null) if (lhsArgs == null || rhsArgs == null)
return false; return false;

View file

@ -20,10 +20,10 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
@ -111,7 +111,7 @@ public class CPPUnknownScope implements ICPPScope, ICPPInternalUnknownScope {
IBinding b; IBinding b;
IASTNode parent = name.getParent(); IASTNode parent = name.getParent();
if (parent instanceof ICPPASTTemplateId) { if (parent instanceof ICPPASTTemplateId) {
IType[] arguments = CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) parent); ICPPTemplateArgument[] arguments = CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) parent);
b = new CPPUnknownClassInstance(binding, name, arguments); b = new CPPUnknownClassInstance(binding, name, arguments);
} else { } else {
b = new CPPUnknownClass(binding, name); b = new CPPUnknownClass(binding, name);

View file

@ -8,10 +8,11 @@
* Contributors: * Contributors:
* QNX - Initial API and implementation * QNX - Initial API and implementation
* Sergey Prigogin (Google) * Sergey Prigogin (Google)
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
@ -23,12 +24,12 @@ public interface ICPPInstanceCache {
/** /**
* Attempts to cache an instance with this template * Attempts to cache an instance with this template
*/ */
public void addInstance(IType[] arguments, ICPPTemplateInstance instance); public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance);
/** /**
* Attempts to get a cached instance from this template * Attempts to get a cached instance from this template
*/ */
public ICPPTemplateInstance getInstance(IType[] arguments); public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments);
/** /**
* Returns an array of all cached instances * Returns an array of all cached instances

View file

@ -6,11 +6,12 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Sergey Prigogin (Google) - initial API and implementation * Sergey Prigogin (Google) - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
/** /**
* Represents a partially instantiated C++ class template, declaration of which is not yet available. * Represents a partially instantiated C++ class template, declaration of which is not yet available.
@ -22,5 +23,5 @@ public interface ICPPUnknownClassInstance extends ICPPUnknownClassType {
/** /**
* Returns the arguments of the instantiation * Returns the arguments of the instantiation
*/ */
public IType[] getArguments(); public ICPPTemplateArgument[] getArguments();
} }

View file

@ -110,6 +110,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; 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.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.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; 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.ICPPTemplateNonTypeParameter;
@ -125,7 +126,6 @@ import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.core.parser.util.DebugUtil; import org.eclipse.cdt.core.parser.util.DebugUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.core.parser.util.ObjectSet; import org.eclipse.cdt.core.parser.util.ObjectSet;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
@ -287,7 +287,7 @@ public class CPPSemantics {
if (data.astName instanceof ICPPASTTemplateId && cls instanceof ICPPClassTemplate) { if (data.astName instanceof ICPPASTTemplateId && cls instanceof ICPPClassTemplate) {
if (data.tu != null) { if (data.tu != null) {
ICPPASTTemplateId id = (ICPPASTTemplateId) data.astName; ICPPASTTemplateId id = (ICPPASTTemplateId) data.astName;
IType[] args = CPPTemplates.createTemplateArgumentArray(id); ICPPTemplateArgument[] args = CPPTemplates.createTemplateArgumentArray(id);
IBinding inst= CPPTemplates.instantiate((ICPPClassTemplate) cls, args); IBinding inst= CPPTemplates.instantiate((ICPPClassTemplate) cls, args);
cls = inst instanceof ICPPClassType && !(inst instanceof ICPPDeferredTemplateInstance) ? (ICPPClassType)inst : cls; cls = inst instanceof ICPPClassType && !(inst instanceof ICPPDeferredTemplateInstance) ? (ICPPClassType)inst : cls;
} }
@ -307,28 +307,50 @@ public class CPPSemantics {
} }
// mstodo this looks like a hack?
// in template declarations the template-ids get instantiated to deferred instances, revert that. // in template declarations the template-ids get instantiated to deferred instances, revert that.
IASTName name = data.astName; IASTName name = data.astName;
if (name instanceof ICPPASTTemplateId) { if (name instanceof ICPPASTTemplateId) {
if (CPPTemplates.getTemplateDeclaration(name) != null && binding instanceof ICPPDeferredTemplateInstance) { if (binding instanceof ICPPDeferredTemplateInstance && CPPTemplates.getTemplateDeclaration(name) != null ) {
ICPPDeferredTemplateInstance deferred= (ICPPDeferredTemplateInstance) binding; ICPPDeferredTemplateInstance deferred= (ICPPDeferredTemplateInstance) binding;
boolean useOriginal= true; IBinding spec= deferred.getSpecializedBinding();
final ObjectMap argMap = deferred.getArgumentMap(); if (spec instanceof ICPPTemplateDefinition) {
if (argMap != null) { try {
for (int i = 0; useOriginal && i < argMap.size(); i++) { ICPPTemplateArgument[] args= deferred.getTemplateArguments();
final Object key = argMap.keyAt(i); ICPPTemplateParameter[] pars= ((ICPPTemplateDefinition) spec).getTemplateParameters();
if (!key.equals(argMap.getAt(i))) { if (args.length == pars.length) {
// bug 231868 non type parameters are modeled via their type :-( boolean useOriginal= true;
if (key instanceof ICPPTemplateNonTypeParameter == false) { for (int i = 0; useOriginal && i < pars.length; i++) {
useOriginal= false; ICPPTemplateParameter par= pars[i];
break; if (par instanceof ICPPTemplateNonTypeParameter) {
// mstodo change this
} else {
if (!((IType) par).isSameType(args[i].getTypeValue())) {
useOriginal= false;
}
}
}
if (useOriginal) {
binding= spec;
} }
} }
} catch (DOMException e) {
} }
} }
if (useOriginal) { // mstodo+ remove
binding= deferred.getSpecializedBinding(); // final ObjectMap argMap = deferred.getArgumentMap();
} // if (argMap != null) {
// for (int i = 0; useOriginal && i < argMap.size(); i++) {
// final Object key = argMap.keyAt(i);
// if (!key.equals(argMap.getAt(i))) {
// // bug 231868 non type parameters are modeled via their type :-(
// if (key instanceof ICPPTemplateNonTypeParameter == false) {
// useOriginal= false;
// break;
// }
// }
// }
// }
} }
} }
if (name.getParent() instanceof ICPPASTTemplateId) { if (name.getParent() instanceof ICPPASTTemplateId) {

View file

@ -27,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; 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.ICPPReferenceType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArraySet; import org.eclipse.cdt.core.parser.util.CharArraySet;
@ -34,6 +35,7 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.core.parser.util.ObjectSet; import org.eclipse.cdt.core.parser.util.ObjectSet;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunctionType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunctionType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator;
@ -292,4 +294,32 @@ public class SemanticUtil {
} }
return result; return result;
} }
public static ICPPTemplateArgument[] getSimplifiedArguments(ICPPTemplateArgument[] args) {
// Don't create a new array until it's really needed.
ICPPTemplateArgument[] result = args;
for (int i = 0; i < args.length; i++) {
final ICPPTemplateArgument arg= args[i];
ICPPTemplateArgument newArg= arg;
if (arg != null) {
if (arg.isTypeValue()) {
final IType type= arg.getTypeValue();
final IType newType= getSimplifiedType(type);
if (newType != type) {
newArg= new CPPTemplateArgument(newType);
}
}
if (result != args) {
result[i]= newArg;
} else if (arg != newArg) {
result = new ICPPTemplateArgument[args.length];
if (i > 0) {
System.arraycopy(args, 0, result, 0, i);
}
result[i]= newArg;
}
}
}
return result;
}
} }

View file

@ -29,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
@ -55,10 +56,10 @@ public class IndexCPPSignatureUtil {
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
if (binding instanceof ICPPTemplateInstance) { if (binding instanceof ICPPTemplateInstance) {
ICPPTemplateInstance inst = (ICPPTemplateInstance) binding; ICPPTemplateInstance inst = (ICPPTemplateInstance) binding;
buffer.append(getTemplateArgString(inst.getArguments(), true)); buffer.append(getTemplateArgString(inst.getTemplateArguments(), true));
} else if (binding instanceof ICPPClassTemplatePartialSpecialization) { } else if (binding instanceof ICPPClassTemplatePartialSpecialization) {
ICPPClassTemplatePartialSpecialization partial = (ICPPClassTemplatePartialSpecialization) binding; ICPPClassTemplatePartialSpecialization partial = (ICPPClassTemplatePartialSpecialization) binding;
buffer.append(getTemplateArgString(partial.getArguments(), false)); buffer.append(getTemplateArgString(partial.getTemplateArguments(), false));
} }
if (binding instanceof IFunction) { if (binding instanceof IFunction) {
@ -73,43 +74,49 @@ public class IndexCPPSignatureUtil {
* Constructs a string in the format: * Constructs a string in the format:
* <typeName1,typeName2,...> * <typeName1,typeName2,...>
*/ */
public static String getTemplateArgString(IType[] types, boolean qualifyTemplateParameters) throws CoreException, DOMException { public static String getTemplateArgString(ICPPTemplateArgument[] args, boolean qualifyTemplateParameters) throws CoreException, DOMException {
StringBuilder buffer = new StringBuilder(); StringBuilder buffer = new StringBuilder();
buffer.append('<'); buffer.append('<');
for (int i = 0; i < types.length; i++) { for (int i = 0; i < args.length; i++) {
if (i>0) { if (i>0) {
buffer.append(','); buffer.append(',');
} }
final IType type = types[i]; final ICPPTemplateArgument arg= args[i];
if (qualifyTemplateParameters && type instanceof ICPPTemplateParameter) { if (arg.isNonTypeValue()) {
List<IBinding> parents = new ArrayList<IBinding>(); buffer.append(arg.getNonTypeValue().getCanonicalRepresentation());
IBinding parent= ((ICPPTemplateParameter) type).getOwner(); } else {
while (parent != null) { final IType type= arg.getTypeValue();
parents.add(parent); if (qualifyTemplateParameters && type instanceof ICPPTemplateParameter) {
parent= parent.getOwner(); List<IBinding> parents = new ArrayList<IBinding>();
} IBinding parent= ((ICPPTemplateParameter) type).getOwner();
//identical template parameters from different template specializations must have unique signatures while (parent != null) {
Collections.reverse(parents); parents.add(parent);
for (IBinding binding : parents) { parent= parent.getOwner();
if (binding != null) { }
buffer.append(binding.getNameCharArray()); //identical template parameters from different template specializations must have unique signatures
if (binding instanceof ICPPTemplateInstance) { Collections.reverse(parents);
ICPPTemplateInstance inst= (ICPPTemplateInstance) binding; for (IBinding binding : parents) {
appendTemplateArgs(inst.getArguments(), buffer); if (binding != null) {
} buffer.append(binding.getNameCharArray());
buffer.append("::"); //$NON-NLS-1$ if (binding instanceof ICPPTemplateInstance) {
ICPPTemplateInstance inst= (ICPPTemplateInstance) binding;
appendTemplateArgs(inst.getTemplateArguments(), buffer);
}
buffer.append("::"); //$NON-NLS-1$
}
}
buffer.append(((ICPPTemplateParameter)type).getName());
} else if (type instanceof ICPPBasicType){
// mstodo remove
IASTExpression expr= ((ICPPBasicType) type).getValue();
if (expr != null) {
buffer.append(getValueString(expr));
} else {
buffer.append(ASTTypeUtil.getType(type));
} }
}
buffer.append(((ICPPTemplateParameter)type).getName());
} else if (type instanceof ICPPBasicType){
IASTExpression expr= ((ICPPBasicType) type).getValue();
if (expr != null) {
buffer.append(getValueString(expr));
} else { } else {
buffer.append(ASTTypeUtil.getType(type)); buffer.append(ASTTypeUtil.getType(type));
} }
} else {
buffer.append(ASTTypeUtil.getType(type));
} }
} }
buffer.append('>'); buffer.append('>');
@ -134,16 +141,14 @@ public class IndexCPPSignatureUtil {
} }
private static void appendTemplateArgs(Object[] values, StringBuilder buffer) { private static void appendTemplateArgs(ICPPTemplateArgument[] values, StringBuilder buffer) {
boolean needcomma= false; boolean needcomma= false;
buffer.append('<'); buffer.append('<');
for (final Object val : values) { for (final ICPPTemplateArgument val : values) {
if (val instanceof IType) { if (needcomma)
if (needcomma) buffer.append(',');
buffer.append(','); buffer.append(ASTTypeUtil.getArgumentString(val, true));
needcomma= true; needcomma= true;
buffer.append(ASTTypeUtil.getType((IType) val));
}
} }
buffer.append('>'); buffer.append('>');
} }

View file

@ -16,7 +16,6 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IScope; 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.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; 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.ICPPClassType;
@ -26,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -101,7 +101,7 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple
if (result != null) if (result != null)
return result; return result;
} }
IBinding newSpec= CPPTemplates.createSpecialization(this, original, getArgumentMap()); IBinding newSpec= CPPTemplates.createSpecialization(this, original, getTemplateParameterMap());
synchronized (specializationMap) { synchronized (specializationMap) {
IBinding oldSpec= (IBinding) specializationMap.put(original, newSpec); IBinding oldSpec= (IBinding) specializationMap.put(original, newSpec);
if (oldSpec != null) { if (oldSpec != null) {

View file

@ -13,10 +13,10 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
@ -60,11 +60,11 @@ public class CompositeCPPClassTemplate extends CompositeCPPClassType
return result; return result;
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments);
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance);
} }

View file

@ -14,13 +14,13 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader;

View file

@ -12,10 +12,10 @@
package org.eclipse.cdt.internal.core.index.composite.cpp; package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache;
@ -46,11 +46,11 @@ CompositeCPPClassSpecialization implements ICPPClassTemplate, ICPPInstanceCache{
return result; return result;
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments);
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance);
} }

View file

@ -68,7 +68,6 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp
return (ICPPClassTemplate) cf.getCompositeBinding((IIndexFragmentBinding) ((ICPPDeferredClassInstance) rbinding).getClassTemplate()); return (ICPPClassTemplate) cf.getCompositeBinding((IIndexFragmentBinding) ((ICPPDeferredClassInstance) rbinding).getClassTemplate());
} }
@Deprecated
public ICPPTemplateArgument[] getTemplateArguments() { public ICPPTemplateArgument[] getTemplateArguments() {
return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding); return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding);
} }

View file

@ -13,11 +13,11 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; 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.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
public class CompositeCPPFieldSpecialization extends CompositeCPPField implements ICPPSpecialization { public class CompositeCPPFieldSpecialization extends CompositeCPPField implements ICPPSpecialization {

View file

@ -14,11 +14,11 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; 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.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
public class CompositeCPPFunctionSpecialization extends CompositeCPPFunction implements ICPPSpecialization { public class CompositeCPPFunctionSpecialization extends CompositeCPPFunction implements ICPPSpecialization {

View file

@ -12,9 +12,9 @@
package org.eclipse.cdt.internal.core.index.composite.cpp; package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; 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.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache;
@ -36,11 +36,11 @@ public class CompositeCPPFunctionTemplate extends CompositeCPPFunction
return result; return result;
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments);
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance);
} }

View file

@ -12,9 +12,9 @@
package org.eclipse.cdt.internal.core.index.composite.cpp; package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; 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.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache;
@ -36,11 +36,11 @@ public class CompositeCPPFunctionTemplateSpecialization extends CompositeCPPFunc
return result; return result;
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments); return CompositeInstanceCache.getCache(cf, rbinding).getInstance(arguments);
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance); CompositeInstanceCache.getCache(cf, rbinding).addInstance(arguments, instance);
} }

View file

@ -13,11 +13,11 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
public class CompositeCPPParameterSpecialization extends CompositeCPPParameter implements ICPPSpecialization { public class CompositeCPPParameterSpecialization extends CompositeCPPParameter implements ICPPSpecialization {

View file

@ -11,10 +11,13 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.index.composite.cpp; package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
public class CompositeCPPTemplateNonTypeParameter extends CompositeCPPVariable implements ICPPTemplateNonTypeParameter { public class CompositeCPPTemplateNonTypeParameter extends CompositeCPPVariable implements ICPPTemplateNonTypeParameter {
@ -31,11 +34,20 @@ public class CompositeCPPTemplateNonTypeParameter extends CompositeCPPVariable i
fail(); return null; fail(); return null;
} }
public IASTExpression getDefault() {
return null;
}
public int getParameterPosition() { public int getParameterPosition() {
return ((ICPPTemplateParameter)rbinding).getParameterPosition(); return ((ICPPTemplateParameter)rbinding).getParameterPosition();
} }
public ICPPTemplateArgument getDefaultValue() {
try {
return TemplateInstanceUtil.convert(cf, ((ICPPTemplateTypeParameter)rbinding).getDefaultValue());
} catch (DOMException e) {
return null;
}
}
@Deprecated
public IASTExpression getDefault() {
return null;
}
} }

View file

@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IType; 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.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.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; 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.CPPASTName;
@ -59,4 +60,12 @@ public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding
public IASTName getUnknownName() { public IASTName getUnknownName() {
return new CPPASTName(getNameCharArray()); return new CPPASTName(getNameCharArray());
} }
public ICPPTemplateArgument getDefaultValue() {
try {
return TemplateInstanceUtil.convert(cf, ((ICPPTemplateTypeParameter)rbinding).getDefaultValue());
} catch (DOMException e) {
return null;
}
}
} }

View file

@ -13,11 +13,11 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; 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.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
class CompositeCPPTypedefSpecialization extends CompositeCPPTypedef implements ICPPSpecialization { class CompositeCPPTypedefSpecialization extends CompositeCPPTypedef implements ICPPSpecialization {

View file

@ -11,11 +11,8 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.index.composite.cpp; package org.eclipse.cdt.internal.core.index.composite.cpp;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance;
import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
/** /**
@ -29,15 +26,8 @@ class CompositeCPPUnknownClassInstance extends CompositeCPPUnknownClassType
super(cf, rbinding); super(cf, rbinding);
} }
public IType[] getArguments() { public ICPPTemplateArgument[] getArguments() {
IType[] arguments = ((ICPPUnknownClassInstance) rbinding).getArguments(); ICPPTemplateArgument[] arguments = ((ICPPUnknownClassInstance) rbinding).getArguments();
try { return TemplateInstanceUtil.convert(cf, arguments);
for (int i = 0; i < arguments.length; i++) {
arguments[i] = cf.getCompositeType((IIndexType) arguments[i]);
}
} catch (DOMException e) {
CCorePlugin.log(e);
}
return arguments;
} }
} }

View file

@ -14,7 +14,7 @@ import java.util.HashMap;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache;
import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexFragment;
@ -44,7 +44,7 @@ public class CompositeInstanceCache {
fMap= new HashMap<String, ICPPTemplateInstance>(); fMap= new HashMap<String, ICPPTemplateInstance>();
} }
synchronized public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { synchronized public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
try { try {
String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true); String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true);
fMap.put(key, instance); fMap.put(key, instance);
@ -54,7 +54,7 @@ public class CompositeInstanceCache {
} }
} }
synchronized public final ICPPTemplateInstance getInstance(IType[] arguments) { synchronized public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
try { try {
String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true); String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true);
return fMap.get(key); return fMap.get(key);
@ -71,7 +71,7 @@ public class CompositeInstanceCache {
for (ICPPTemplateInstance ti : insts) { for (ICPPTemplateInstance ti : insts) {
if (ti instanceof IIndexFragmentBinding) { if (ti instanceof IIndexFragmentBinding) {
ICPPTemplateInstance comp= (ICPPTemplateInstance) cf.getCompositeBinding((IIndexFragmentBinding) ti); ICPPTemplateInstance comp= (ICPPTemplateInstance) cf.getCompositeBinding((IIndexFragmentBinding) ti);
IType[] args= comp.getArguments(); ICPPTemplateArgument[] args= comp.getTemplateArguments();
addInstance(args, comp); addInstance(args, comp);
} }
} }

View file

@ -16,7 +16,6 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; 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.ICPPTemplateArgument;
@ -26,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.IIndexType;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
@ -36,8 +36,8 @@ import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
public class TemplateInstanceUtil { public class TemplateInstanceUtil {
public static ICPPTemplateParameterMap getTemplateParameterMap(ICompositesFactory cf, ICPPTemplateInstance rbinding) { public static ICPPTemplateParameterMap getTemplateParameterMap(ICompositesFactory cf, ICPPTemplateInstance rbinding) {
ICPPTemplateParameterMap preresult= rbinding.getTemplateParameterMap(); ICPPTemplateParameterMap preresult= rbinding.getTemplateParameterMap();
CPPTemplateParameterMap result= new CPPTemplateParameterMap();
Integer[] keys= preresult.getAllParameterPositions(); Integer[] keys= preresult.getAllParameterPositions();
CPPTemplateParameterMap result= new CPPTemplateParameterMap(keys.length);
try { try {
for(int i = 0; i < keys.length; i++) { for(int i = 0; i < keys.length; i++) {

View file

@ -99,22 +99,6 @@ public class PDOM extends PlatformObject implements IPDOM {
*/ */
public static final String FRAGMENT_PROPERTY_VALUE_FORMAT_ID= "org.eclipse.cdt.internal.core.pdom.PDOM"; //$NON-NLS-1$ public static final String FRAGMENT_PROPERTY_VALUE_FORMAT_ID= "org.eclipse.cdt.internal.core.pdom.PDOM"; //$NON-NLS-1$
private static int version(int major, int minor) {
return major << 16 + minor;
}
public static final int MAJOR_VERSION = 72;
public static final int MINOR_VERSION = 0; // minor versions must be compatible
public static final int CURRENT_VERSION= version(MAJOR_VERSION, MINOR_VERSION);
public static final int MIN_SUPPORTED_VERSION= version(MAJOR_VERSION, 0);
public static final int MAX_SUPPORTED_VERSION= version(MAJOR_VERSION+1, 0)-1;
public static String versionString(int version) {
final int major= version >> 16;
final int minor= version & 0xffff;
return "" + major + '.' + minor; //$NON-NLS-1$
}
/* /*
* PDOM internal format history * PDOM internal format history
* *
@ -178,8 +162,24 @@ public class PDOM extends PlatformObject implements IPDOM {
* 71.0 - proper support for anonymous unions, bug 206450 * 71.0 - proper support for anonymous unions, bug 206450
* 72.0 - store project-relative paths for resources that belong to the project, bug 239472 * 72.0 - store project-relative paths for resources that belong to the project, bug 239472
* 72.1 - store flag for pure virtual methods. * 72.1 - store flag for pure virtual methods.
* 73.0 - add values for variables and enumerations, bug * 73.0 - add values for variables and enumerations, bug 250788
* 74.0 - changes for proper template argument support, bug 242668
*/ */
private static int version(int major, int minor) {
return major << 16 + minor;
}
public static final int MAJOR_VERSION = 74;
public static final int MINOR_VERSION = 0; // minor versions must be compatible
public static final int CURRENT_VERSION= version(MAJOR_VERSION, MINOR_VERSION);
public static final int MIN_SUPPORTED_VERSION= version(MAJOR_VERSION, 0);
public static final int MAX_SUPPORTED_VERSION= version(MAJOR_VERSION+1, 0)-1;
public static String versionString(int version) {
final int major= version >> 16;
final int minor= version & 0xffff;
return "" + major + '.' + minor; //$NON-NLS-1$
}
public static final int LINKAGES = Database.DATA_AREA; public static final int LINKAGES = Database.DATA_AREA;
public static final int FILE_INDEX = Database.DATA_AREA + 4; public static final int FILE_INDEX = Database.DATA_AREA + 4;

View file

@ -120,7 +120,7 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements
if (result != null) if (result != null)
return result; return result;
} }
IBinding newSpec= CPPTemplates.createSpecialization(this, original, getArgumentMap()); IBinding newSpec= CPPTemplates.createSpecialization(this, original, getTemplateParameterMap());
synchronized (specializationMap) { synchronized (specializationMap) {
IBinding oldSpec= (IBinding) specializationMap.put(original, newSpec); IBinding oldSpec= (IBinding) specializationMap.put(original, newSpec);
if (oldSpec != null) { if (oldSpec != null) {
@ -372,11 +372,7 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements
@Override @Override
public String toString() { public String toString() {
String result= super.toString(); return super.toString() + " <"+ getTemplateParameterMap().toString() + ">"; //$NON-NLS-1$//$NON-NLS-2$
ObjectMap map= getArgumentMap();
for(int i=0; i<map.size(); i++)
result+=" <"+map.keyAt(i)+"=>"+getArgumentMap().getAt(i)+">"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
return result;
} }
public boolean isAnonymous() { public boolean isAnonymous() {

View file

@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; 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.ICPPTemplateParameter;
@ -220,11 +221,11 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType implements ICPPClassT
} }
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return PDOMInstanceCache.getCache(this).getInstance(arguments); return PDOMInstanceCache.getCache(this).getInstance(arguments);
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
PDOMInstanceCache.getCache(this).addInstance(arguments, instance); PDOMInstanceCache.getCache(this).addInstance(arguments, instance);
} }

View file

@ -16,13 +16,13 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; 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.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; 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.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; 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.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -154,18 +154,8 @@ class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate
return cmp; return cmp;
} }
public CPPTemplateParameterMap getTemplateParameterMap() { public ICPPTemplateParameterMap getTemplateParameterMap() {
CPPTemplateParameterMap result= new CPPTemplateParameterMap(); return CPPTemplates.createParameterMap(getPrimaryClassTemplate(), getTemplateArguments());
try {
ICPPTemplateParameter[] params = getPrimaryClassTemplate().getTemplateParameters();
ICPPTemplateArgument[] args= getTemplateArguments();
int len= Math.min(params.length, args.length);
for (int i = 0; i < len; i++) {
result.put(params[i], args[i]);
}
} catch (DOMException e) {
}
return result;
} }
@Override @Override

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.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.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; 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.ICPPTemplateNonTypeParameter;
@ -67,11 +68,11 @@ class PDOMCPPClassTemplateSpecialization extends PDOMCPPClassSpecialization
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return PDOMInstanceCache.getCache(this).getInstance(arguments); return PDOMInstanceCache.getCache(this).getInstance(arguments);
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
PDOMInstanceCache.getCache(this).addInstance(arguments, instance); PDOMInstanceCache.getCache(this).addInstance(arguments, instance);
} }

View file

@ -21,9 +21,9 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.EScopeKind;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding; 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.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexBinding;
@ -164,11 +164,11 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction
return this; return this;
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return PDOMInstanceCache.getCache(this).getInstance(arguments); return PDOMInstanceCache.getCache(this).getInstance(arguments);
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
PDOMInstanceCache.getCache(this).addInstance(arguments, instance); PDOMInstanceCache.getCache(this).addInstance(arguments, instance);
} }

View file

@ -12,9 +12,9 @@
package org.eclipse.cdt.internal.core.pdom.dom.cpp; package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException; 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.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache;
@ -51,11 +51,11 @@ class PDOMCPPFunctionTemplateSpecialization extends PDOMCPPFunctionSpecializatio
return template.getTemplateParameters(); return template.getTemplateParameters();
} }
public ICPPTemplateInstance getInstance(IType[] arguments) { public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
return PDOMInstanceCache.getCache(this).getInstance(arguments); return PDOMInstanceCache.getCache(this).getInstance(arguments);
} }
public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { public void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
PDOMInstanceCache.getCache(this).addInstance(arguments, instance); PDOMInstanceCache.getCache(this).addInstance(arguments, instance);
} }

View file

@ -16,10 +16,15 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
import org.eclipse.cdt.internal.core.dom.parser.Value;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.Database;
import org.eclipse.cdt.internal.core.pdom.db.IString;
import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@ -33,19 +38,28 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe
private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE; private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE;
private static final int PARAMETERPOS= PDOMCPPVariable.RECORD_SIZE + 4; private static final int PARAMETERPOS= PDOMCPPVariable.RECORD_SIZE + 4;
private static final int DEFAULTVAL= PDOMCPPVariable.RECORD_SIZE + 8;
/** /**
* The size in bytes of a PDOMCPPTemplateTypeParameter record in the database. * The size in bytes of a PDOMCPPTemplateTypeParameter record in the database.
*/ */
@SuppressWarnings("hiding") @SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPVariable.RECORD_SIZE + 8; protected static final int RECORD_SIZE = PDOMCPPVariable.RECORD_SIZE + 12;
public PDOMCPPTemplateNonTypeParameter(PDOM pdom, PDOMNode parent, public PDOMCPPTemplateNonTypeParameter(PDOM pdom, PDOMNode parent,
ICPPTemplateNonTypeParameter param) throws CoreException { ICPPTemplateNonTypeParameter param) throws CoreException {
super(pdom, parent, param); super(pdom, parent, param);
final Database db = pdom.getDB(); final Database db = pdom.getDB();
db.putInt(record + PARAMETERPOS, param.getParameterPosition()); db.putInt(record + PARAMETERPOS, param.getParameterPosition());
ICPPTemplateArgument val= param.getDefaultValue();
if (val != null) {
IValue sval= val.getNonTypeValue();
if (sval != null) {
IString s= db.newString(sval.getCanonicalRepresentation());
db.putInt(record + DEFAULTVAL, s.getRecord());
}
}
} }
public PDOMCPPTemplateNonTypeParameter(PDOM pdom, int bindingRecord) { public PDOMCPPTemplateNonTypeParameter(PDOM pdom, int bindingRecord) {
@ -62,6 +76,22 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe
return IIndexCPPBindingConstants.CPP_TEMPLATE_NON_TYPE_PARAMETER; return IIndexCPPBindingConstants.CPP_TEMPLATE_NON_TYPE_PARAMETER;
} }
public ICPPTemplateArgument getDefaultValue() {
try {
final Database db = pdom.getDB();
int rec= db.getInt(record + DEFAULTVAL);
if (rec == 0)
return null;
String val= db.getString(rec).getString();
if (val == null)
return null;
return new CPPTemplateArgument(Value.fromCanonicalRepresentation(val), getType());
} catch (CoreException e) {
CCorePlugin.log(e);
return null;
}
}
public int getParameterPosition() { public int getParameterPosition() {
try { try {
final Database db = pdom.getDB(); final Database db = pdom.getDB();

View file

@ -11,12 +11,12 @@
package org.eclipse.cdt.internal.core.pdom.dom.cpp; package org.eclipse.cdt.internal.core.pdom.dom.cpp;
import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; 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.Value;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap;
import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.db.Database;
import org.eclipse.cdt.internal.core.pdom.db.IString; 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.PDOMLinkage;
@ -99,11 +99,11 @@ public class PDOMCPPTemplateParameterMap {
Assert.isTrue(len >= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/12); Assert.isTrue(len >= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/12);
if (len == 0) { if (len == 0) {
return new CPPTemplateParameterMap(); return CPPTemplateParameterMap.EMPTY;
} }
rec+=2; rec+=2;
CPPTemplateParameterMap result= new CPPTemplateParameterMap(); CPPTemplateParameterMap result= new CPPTemplateParameterMap(len);
for (int i=0; i<len; i++) { for (int i=0; i<len; i++) {
final int parPos= db.getInt(rec); final int parPos= db.getInt(rec);
final int typeRec= db.getInt(rec+4); final int typeRec= db.getInt(rec+4);

View file

@ -19,10 +19,12 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.IIndexType;
@ -141,6 +143,14 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember
return null; return null;
} }
public ICPPTemplateArgument getDefaultValue() {
IType d= getDefault();
if (d == null)
return null;
return new CPPTemplateArgument(d);
}
@Override @Override
public Object clone() { fail(); return null; } public Object clone() { fail(); return null; }

View file

@ -11,23 +11,18 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp; 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.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.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; 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.IIndexCPPBindingConstants;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -42,18 +37,13 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP
protected static final int RECORD_SIZE = PDOMCPPUnknownClassType.RECORD_SIZE + 4; protected static final int RECORD_SIZE = PDOMCPPUnknownClassType.RECORD_SIZE + 4;
// Cached values. // Cached values.
IType[] arguments; ICPPTemplateArgument[] arguments;
public PDOMCPPUnknownClassInstance(PDOM pdom, PDOMNode parent, ICPPUnknownClassInstance classInstance) throws CoreException { public PDOMCPPUnknownClassInstance(PDOM pdom, PDOMNode parent, ICPPUnknownClassInstance classInstance) throws CoreException {
super(pdom, parent, classInstance); super(pdom, parent, classInstance);
PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); int rec= PDOMCPPArgumentList.putArguments(this, classInstance.getArguments());
IType[] args = classInstance.getArguments(); pdom.getDB().putInt(record + ARGUMENTS, rec);
for (IType arg : args) {
PDOMNode typeNode = getLinkageImpl().addType(this, arg);
if (typeNode != null)
list.addMember(typeNode);
}
} }
public PDOMCPPUnknownClassInstance(PDOM pdom, int bindingRecord) { public PDOMCPPUnknownClassInstance(PDOM pdom, int bindingRecord) {
@ -70,30 +60,14 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP
return IIndexCPPBindingConstants.CPP_UNKNOWN_CLASS_INSTANCE; return IIndexCPPBindingConstants.CPP_UNKNOWN_CLASS_INSTANCE;
} }
private static class TemplateArgumentCollector implements IPDOMVisitor { public ICPPTemplateArgument[] getArguments() {
private List<IType> args = new ArrayList<IType>();
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() {
if (arguments == null) { if (arguments == null) {
try { try {
PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); final int rec= getPDOM().getDB().getInt(record+ARGUMENTS);
TemplateArgumentCollector visitor = new TemplateArgumentCollector(); arguments= PDOMCPPArgumentList.getArguments(this, rec);
list.accept(visitor);
arguments = visitor.getTemplateArguments();
} catch (CoreException e) { } catch (CoreException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
return IType.EMPTY_TYPE_ARRAY; arguments= ICPPTemplateArgument.EMPTY_ARGUMENTS;
} }
} }
return arguments; return arguments;
@ -101,7 +75,7 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP
@Override @Override
public String toString() { public String toString() {
return getName() + " <" + ASTTypeUtil.getTypeListString(getArguments()) + ">"; //$NON-NLS-1$ //$NON-NLS-2$ return getName() + " <" + ASTTypeUtil.getArgumentListString(getArguments(), true) + ">"; //$NON-NLS-1$ //$NON-NLS-2$
} }
@Override @Override
@ -120,8 +94,8 @@ class PDOMCPPUnknownClassInstance extends PDOMCPPUnknownClassType implements ICP
if (type instanceof ICPPUnknownClassInstance) { if (type instanceof ICPPUnknownClassInstance) {
ICPPUnknownClassInstance rhs= (ICPPUnknownClassInstance) type; ICPPUnknownClassInstance rhs= (ICPPUnknownClassInstance) type;
if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) { if (CharArrayUtils.equals(getNameCharArray(), rhs.getNameCharArray())) {
IType[] lhsArgs= getArguments(); ICPPTemplateArgument[] lhsArgs= getArguments();
IType[] rhsArgs= rhs.getArguments(); ICPPTemplateArgument[] rhsArgs= rhs.getArguments();
if (lhsArgs != rhsArgs) { if (lhsArgs != rhsArgs) {
if (lhsArgs == null || rhsArgs == null) if (lhsArgs == null || rhsArgs == null)
return false; return false;

View file

@ -14,7 +14,7 @@ import java.util.HashMap;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil;
import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.PDOM;
@ -52,7 +52,7 @@ public class PDOMInstanceCache {
fMap= new HashMap<String, ICPPTemplateInstance>(); fMap= new HashMap<String, ICPPTemplateInstance>();
} }
synchronized public final void addInstance(IType[] arguments, ICPPTemplateInstance instance) { synchronized public final void addInstance(ICPPTemplateArgument[] arguments, ICPPTemplateInstance instance) {
try { try {
String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true); String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true);
fMap.put(key, instance); fMap.put(key, instance);
@ -62,7 +62,7 @@ public class PDOMInstanceCache {
} }
} }
synchronized public final ICPPTemplateInstance getInstance(IType[] arguments) { synchronized public final ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) {
try { try {
String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true); String key= IndexCPPSignatureUtil.getTemplateArgString(arguments, true);
return fMap.get(key); return fMap.get(key);
@ -85,7 +85,7 @@ public class PDOMInstanceCache {
if (node instanceof ICPPTemplateInstance) { if (node instanceof ICPPTemplateInstance) {
ICPPTemplateInstance inst= (ICPPTemplateInstance) node; ICPPTemplateInstance inst= (ICPPTemplateInstance) node;
if (binding.equals(inst.getTemplateDefinition())) { if (binding.equals(inst.getTemplateDefinition())) {
IType[] args= inst.getArguments(); ICPPTemplateArgument[] args= inst.getTemplateArguments();
addInstance(args, inst); addInstance(args, inst);
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2007 QNX Software Systems and others. * Copyright (c) 2006, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -12,7 +12,6 @@
* Andrew Ferguson (Symbian) * Andrew Ferguson (Symbian)
* Bryan Wilkinson (QNX) * Bryan Wilkinson (QNX)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.indexview; package org.eclipse.cdt.internal.ui.indexview;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -29,7 +28,6 @@ import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
@ -37,13 +35,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.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.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
@ -103,11 +100,11 @@ public class IndexLabelProvider extends LabelProvider {
} }
buffer.append(result); buffer.append(result);
buffer.append('<'); buffer.append('<');
IType[] types = ((ICPPTemplateInstance) element).getArguments(); ICPPTemplateArgument[] types = ((ICPPTemplateInstance) element).getTemplateArguments();
for (int i = 0; i < types.length; i++) { for (int i = 0; i < types.length; i++) {
if (i > 0) if (i > 0)
buffer.append(','); buffer.append(',');
buffer.append(ASTTypeUtil.getType(types[i])); buffer.append(ASTTypeUtil.getArgumentString(types[i], false));
} }
buffer.append('>'); buffer.append('>');
result = buffer.toString(); result = buffer.toString();
@ -115,14 +112,11 @@ public class IndexLabelProvider extends LabelProvider {
StringBuffer buffer = new StringBuffer("Part: "); //$NON-NLS-1$ StringBuffer buffer = new StringBuffer("Part: "); //$NON-NLS-1$
buffer.append(result); buffer.append(result);
buffer.append('<'); buffer.append('<');
try { ICPPTemplateArgument[] types = ((ICPPClassTemplatePartialSpecialization) element).getTemplateArguments();
IType[] types = ((ICPPClassTemplatePartialSpecialization) element).getArguments(); for (int i = 0; i < types.length; i++) {
for (int i = 0; i < types.length; i++) { if (i > 0)
if (i > 0) buffer.append(',');
buffer.append(','); buffer.append(ASTTypeUtil.getArgumentString(types[i], false));
buffer.append(ASTTypeUtil.getType(types[i]));
}
} catch (DOMException e) {
} }
buffer.append('>'); buffer.append('>');
result = buffer.toString(); result = buffer.toString();
@ -135,19 +129,9 @@ public class IndexLabelProvider extends LabelProvider {
if (!(spec instanceof ICPPTemplateDefinition) if (!(spec instanceof ICPPTemplateDefinition)
&& spec.getSpecializedBinding() instanceof ICPPTemplateDefinition) { && spec.getSpecializedBinding() instanceof ICPPTemplateDefinition) {
ICPPTemplateDefinition template = (ICPPTemplateDefinition) spec.getSpecializedBinding(); buffer.append('<');
try { buffer.append(((ICPPSpecialization) element).getTemplateParameterMap().toString());
ICPPTemplateParameter[] params = template.getTemplateParameters(); buffer.append('>');
buffer.append('<');
ObjectMap argMap = ((ICPPSpecialization) element).getArgumentMap();
for (int i = 0; i < params.length; i++) {
if (i > 0)
buffer.append(',');
buffer.append(ASTTypeUtil.getType((IType) argMap.get(params[i])));
}
buffer.append('>');
} catch (DOMException e) {
}
} }
result = buffer.toString(); result = buffer.toString();