1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-31 12:55:40 +02:00

A cleaner fix for bug 214447.

This commit is contained in:
Sergey Prigogin 2008-03-24 01:12:01 +00:00
parent fe4c7c9960
commit 205c57b244
24 changed files with 186 additions and 216 deletions

View file

@ -19,7 +19,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisiblityLabel;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerASTVisitor;
/**
* @author jcamelon

View file

@ -42,6 +42,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.index.IIndexType;
/**
@ -115,10 +116,10 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements
}
@Override
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance(arguments);
if (instance == null) {
instance = new CPPDeferredClassInstance(this, arguments);
instance = new CPPDeferredClassInstance(this, argMap, arguments);
addSpecialization(arguments, instance);
}
return instance;
@ -141,7 +142,8 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements
}
public void addPartialSpecialization(ICPPClassTemplatePartialSpecialization spec) {
partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.append(ICPPClassTemplatePartialSpecialization.class, partialSpecializations, spec);
partialSpecializations = (ICPPClassTemplatePartialSpecialization[]) ArrayUtil.append(
ICPPClassTemplatePartialSpecialization.class, partialSpecializations, spec);
}
public ICPPASTCompositeTypeSpecifier getCompositeTypeSpecifier() {

View file

@ -77,7 +77,7 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate impl
//If the argument is a template parameter, we can't instantiate yet, defer for later
if( CPPTemplates.typeContainsTemplateParameter( arg ) ){
return deferredInstance( args );
return deferredInstance( argMap, args );
}
try {
if( !CPPTemplates.deduceTemplateArgument( argMap, spec, arg ) )

View file

@ -110,7 +110,7 @@ public class CPPClassTemplateSpecialization extends CPPClassSpecialization
return CPPTemplates.instantiateTemplate(this, arguments, argumentMap);
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
return null;
}

View file

@ -24,20 +24,19 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
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.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
/**
* Represents a partially instantiated C++ class template, who's arguments contain at least one template
* type parameter.
* Represents a partially instantiated class template, where instance arguments contain at least one
* template type parameter.
*
* @author aniefer
*/
public class CPPDeferredClassInstance extends CPPInstance
implements ICPPClassType, ICPPDeferredTemplateInstance, ICPPInternalDeferredClassInstance {
public CPPDeferredClassInstance(ICPPClassTemplate orig, IType[] arguments) {
super(null, orig, buildArgumentMap(orig, arguments), arguments);
public CPPDeferredClassInstance(ICPPClassTemplate orig, ObjectMap argMap, IType[] arguments) {
super(null, orig, argMap, arguments);
}
/* (non-Javadoc)
@ -177,34 +176,4 @@ public class CPPDeferredClassInstance extends CPPInstance
private ICPPClassTemplate getClassTemplate() {
return (ICPPClassTemplate) getSpecializedBinding();
}
private static ObjectMap buildArgumentMap(ICPPClassTemplate template, IType[] arguments) {
ICPPTemplateParameter[] parameters = null;
try {
parameters = template.getTemplateParameters();
} catch (DOMException e) {
}
if (parameters == null || parameters.length == 0) {
return null;
}
int numParams = parameters.length;
ObjectMap map = new ObjectMap(numParams);
int numArgs = arguments.length;
boolean trivial = true;
for (int i = 0; i < numParams && i < numArgs; i++) {
ICPPTemplateParameter param = parameters[i];
IType arg = arguments[i];
if (!CPPTemplates.matchTemplateParameterAndArgument(param, arg, map)) {
return null;
}
map.put(param, arg);
if (!arg.equals(param)) {
trivial = false;
}
}
return trivial ? null : map;
}
}

View file

@ -32,7 +32,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
/**
* @author aniefer
*/
public class CPPField extends CPPVariable implements ICPPField, ICPPInternalBinding {
public class CPPField extends CPPVariable implements ICPPField {
public static class CPPFieldProblem extends CPPVariable.CPPVariableProblem implements ICPPField {
/**
* @param id

View file

@ -33,6 +33,7 @@ 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.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
/**
@ -278,7 +279,7 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateDefinition#deferredInstance(org.eclipse.cdt.core.dom.ast.IType[])
*/
@Override
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance( arguments );
if( instance == null ){
instance = new CPPDeferredFunctionInstance( this, arguments );

View file

@ -13,7 +13,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
@ -24,8 +23,8 @@ import org.eclipse.cdt.core.parser.util.ObjectMap;
* @author aniefer
*
*/
public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization implements
ICPPFunctionTemplate, ICPPFunction, ICPPInternalTemplate {
public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization
implements ICPPFunctionTemplate, ICPPInternalTemplate {
private ObjectMap instances = null;
@ -73,8 +72,7 @@ public class CPPFunctionTemplateSpecialization extends CPPFunctionSpecialization
return CPPTemplates.instantiateTemplate( this, arguments, argumentMap );
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
// TODO Auto-generated method stub
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
return null;
}
}

View file

@ -103,7 +103,7 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
}
}
public abstract ICPPSpecialization deferredInstance(IType[] arguments);
public abstract ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments);
public IBinding instantiate(ICPPASTTemplateId templateId) {//IASTNode[] arguments) {
IASTNode[] args = templateId.getTemplateArguments();

View file

@ -50,7 +50,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
*/
public CPPTemplateTemplateParameter(IASTName name) {
super(name);
// TODO Auto-generated constructor stub
}
public ICPPScope getUnknownScope() {
@ -123,7 +122,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter#getDefault()
*/
public IType getDefault() throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -131,7 +129,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getBases()
*/
public ICPPBase[] getBases() {
// TODO Auto-generated method stub
return ICPPBase.EMPTY_BASE_ARRAY;
}
@ -139,7 +136,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getFields()
*/
public IField[] getFields() throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -147,7 +143,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#findField(java.lang.String)
*/
public IField findField(String name) throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -155,7 +150,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredFields()
*/
public ICPPField[] getDeclaredFields() throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -163,7 +157,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getMethods()
*/
public ICPPMethod[] getMethods() throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -171,7 +164,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getAllDeclaredMethods()
*/
public ICPPMethod[] getAllDeclaredMethods() throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -179,7 +171,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredMethods()
*/
public ICPPMethod[] getDeclaredMethods() throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -194,7 +185,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getFriends()
*/
public IBinding[] getFriends() throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -202,7 +192,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#getKey()
*/
public int getKey() throws DOMException {
// TODO Auto-generated method stub
return 0;
}
@ -210,7 +199,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#getCompositeScope()
*/
public IScope getCompositeScope() throws DOMException {
// TODO Auto-generated method stub
return null;
}
@ -219,8 +207,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
*/
@Override
public void addDefinition(IASTNode node) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
@ -228,8 +214,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
*/
@Override
public void addDeclaration(IASTNode node) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
@ -248,13 +232,13 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
}
public IBinding instantiate(IType[] arguments) {
return deferredInstance( arguments );
return deferredInstance(null, arguments);
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance(arguments);
if (instance == null) {
instance = new CPPDeferredClassInstance( this, arguments );
instance = new CPPDeferredClassInstance(this, argMap, arguments);
addSpecialization(arguments, instance);
}
return instance;
@ -295,7 +279,6 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap)
*/
public IBinding resolveUnknown(ObjectMap argMap) {
// TODO Auto-generated method stub
return null;
}

View file

@ -1382,7 +1382,7 @@ public class CPPTemplates {
}
}
//14.5.4.1 If none of the specializations is more specialized than all the other matchnig
//14.5.4.1 If none of the specializations is more specialized than all the other matching
//specializations, then the use of the class template is ambiguous and the program is ill-formed.
if (!bestMatchIsBest) {
//TODO problem
@ -1599,6 +1599,7 @@ public class CPPTemplates {
ICPPTemplateParameter param = null;
IType arg = null;
IType[] actualArgs = new IType[numParams];
boolean argsContainTemplateParameters = false;
for (int i = 0; i < numParams; i++) {
arg = null;
@ -1606,10 +1607,6 @@ public class CPPTemplates {
if (i < numArgs) {
arg = arguments[i];
//If the argument is a template parameter, we can't instantiate yet, defer for later
if (typeContainsTemplateParameter(arg)) {
return ((ICPPInternalTemplateInstantiator) template).deferredInstance(arguments);
}
} else {
IType defaultType = null;
try {
@ -1641,14 +1638,26 @@ public class CPPTemplates {
}
if (CPPTemplates.matchTemplateParameterAndArgument(param, arg, map)) {
if (!param.equals(arg)) {
map.put(param, arg);
}
actualArgs[i] = arg;
if (typeContainsTemplateParameter(arg)) {
argsContainTemplateParameters = true;
}
} else {
//TODO problem
return null;
}
}
if (map.isEmpty()) {
map = null;
}
if (argsContainTemplateParameters) {
return ((ICPPInternalTemplateInstantiator) template).deferredInstance(map, arguments);
}
ICPPSpecialization instance = ((ICPPInternalTemplateInstantiator) template).getInstance(actualArgs);
if (instance != null) {
return instance;

View file

@ -63,10 +63,10 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPInte
instances.put(arguments, specialization);
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance(arguments);
if (instance == null) {
instance = new CPPDeferredClassInstance(this, arguments);
instance = new CPPDeferredClassInstance(this, argMap, arguments);
addSpecialization(arguments, instance);
}
return instance;
@ -93,7 +93,7 @@ public class CPPUnknownClassInstance extends CPPUnknownClass implements ICPPInte
}
public IBinding instantiate(IType[] arguments) {
return deferredInstance(arguments);
return deferredInstance(null, arguments);
}
public IType[] getArguments() {

View file

@ -7,22 +7,23 @@
*
* Contributors:
* QNX - Initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.parser.util.ObjectMap;
/**
* @author Bryan Wilkinson
*
*/
public interface ICPPInternalTemplateInstantiator {
public IBinding instantiate(IType[] arguments);
public ICPPSpecialization deferredInstance( IType [] arguments );
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments);
public ICPPSpecialization getInstance(IType[] arguments);
}

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator;
import org.eclipse.cdt.internal.core.index.CIndex;
@ -63,8 +64,8 @@ ICPPClassTemplate, ICPPInternalTemplateInstantiator {
return result;
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
return InternalTemplateInstantiatorUtil.deferredInstance(arguments, cf, rbinding);
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
return InternalTemplateInstantiatorUtil.deferredInstance(argMap, arguments, cf, rbinding);
}
public ICPPSpecialization getInstance(IType[] arguments) {

View file

@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
@ -46,8 +47,8 @@ CompositeCPPClassSpecialization implements ICPPClassTemplate, ICPPInternalTempla
return result;
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
return InternalTemplateInstantiatorUtil.deferredInstance(arguments, cf, rbinding);
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
return InternalTemplateInstantiatorUtil.deferredInstance(argMap, arguments, cf, rbinding);
}
public ICPPSpecialization getInstance(IType[] arguments) {

View file

@ -41,8 +41,8 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp
}
// TODO - what happens to the arguments?
public ICPPSpecialization deferredInstance(IType[] arguments) {
ICPPSpecialization spec= ((ICPPInternalTemplateInstantiator)rbinding).deferredInstance(arguments);
public ICPPSpecialization deferredInstance(IType[] arguments, ObjectMap argMap) {
ICPPSpecialization spec= ((ICPPInternalTemplateInstantiator) rbinding).deferredInstance(argMap, arguments);
return (ICPPSpecialization) cf.getCompositeBinding((IIndexFragmentBinding)spec);
}

View file

@ -17,6 +17,7 @@ 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.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
@ -35,8 +36,8 @@ public class CompositeCPPFunctionTemplate extends CompositeCPPFunction implement
return result;
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
return InternalTemplateInstantiatorUtil.deferredInstance(arguments, cf, rbinding);
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
return InternalTemplateInstantiatorUtil.deferredInstance(argMap, arguments, cf, rbinding);
}
public ICPPSpecialization getInstance(IType[] arguments) {

View file

@ -17,6 +17,7 @@ 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.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
@ -37,7 +38,7 @@ public class CompositeCPPFunctionTemplateSpecialization
return result;
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
fail(); return null;
}

View file

@ -16,6 +16,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator;
import org.eclipse.cdt.internal.core.index.CIndex;
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
@ -23,8 +24,8 @@ import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
import org.eclipse.core.runtime.CoreException;
public class InternalTemplateInstantiatorUtil {
public static ICPPSpecialization deferredInstance(IType[] arguments, ICompositesFactory cf, IIndexBinding rbinding) {
ICPPSpecialization spec= ((ICPPInternalTemplateInstantiator)rbinding).deferredInstance(arguments);
public static ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments, ICompositesFactory cf, IIndexBinding rbinding) {
ICPPSpecialization spec= ((ICPPInternalTemplateInstantiator)rbinding).deferredInstance(argMap, arguments);
if (spec instanceof IIndexFragmentBinding) {
return (ICPPSpecialization) cf.getCompositeBinding((IIndexFragmentBinding) spec);
} else {

View file

@ -38,6 +38,7 @@ import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredClassInstance;
@ -54,11 +55,9 @@ import org.eclipse.core.runtime.CoreException;
/**
* @author Bryan Wilkinson
*
*/
class PDOMCPPClassTemplate extends PDOMCPPClassType
implements ICPPClassTemplate, ICPPInternalTemplateInstantiator,
ICPPTemplateScope {
implements ICPPClassTemplate, ICPPInternalTemplateInstantiator, ICPPTemplateScope {
private static final int PARAMETERS = PDOMCPPClassType.RECORD_SIZE + 0;
private static final int INSTANCES = PDOMCPPClassType.RECORD_SIZE + 4;
@ -71,8 +70,7 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
@SuppressWarnings("hiding")
protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 16;
public PDOMCPPClassTemplate(PDOM pdom, PDOMNode parent, ICPPClassTemplate template)
throws CoreException {
public PDOMCPPClassTemplate(PDOM pdom, PDOMNode parent, ICPPClassTemplate template) throws CoreException {
super(pdom, parent, (ICPPClassType) template);
}
@ -130,16 +128,15 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException {
try {
ArrayList<PDOMCPPClassTemplatePartialSpecialization> partials = new ArrayList<PDOMCPPClassTemplatePartialSpecialization>();
ArrayList<PDOMCPPClassTemplatePartialSpecialization> partials =
new ArrayList<PDOMCPPClassTemplatePartialSpecialization>();
for (PDOMCPPClassTemplatePartialSpecialization partial = getFirstPartial();
partial != null;
partial = partial.getNextPartial()) {
partials.add(partial);
}
return partials
.toArray(new ICPPClassTemplatePartialSpecialization[partials
.size()]);
return partials.toArray(new ICPPClassTemplatePartialSpecialization[partials.size()]);
} catch (CoreException e) {
CCorePlugin.log(e);
return new ICPPClassTemplatePartialSpecialization[0];
@ -172,7 +169,8 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
}
};
BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), filter, false, true);
BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), filter,
false, true);
accept(visitor);
return CPPSemantics.resolveAmbiguities(name, visitor.getBindings());
} catch (CoreException e) {
@ -182,7 +180,8 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
}
@Override
public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup, IIndexFileSet fileSet) throws DOMException {
public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup, IIndexFileSet fileSet)
throws DOMException {
IBinding[] result = null;
try {
if ((!prefixLookup && getDBName().compare(name.toCharArray(), true) == 0)
@ -202,7 +201,8 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
}
};
BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), filter, prefixLookup, !prefixLookup);
BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), filter,
prefixLookup, !prefixLookup);
accept(visitor);
result = (IBinding[]) ArrayUtil.addAll(IBinding.class, result, visitor.getBindings());
} catch (CoreException e) {
@ -242,7 +242,8 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
throws DOMException {
IBinding[] result = null;
try {
BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), null, prefixLookup, !prefixLookup);
BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), null,
prefixLookup, !prefixLookup);
PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl());
list.accept(visitor);
result = (IBinding[]) ArrayUtil.addAll(IBinding.class, result, visitor.getBindings());
@ -309,10 +310,10 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
}
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance(arguments);
if (instance == null) {
instance = new CPPDeferredClassInstance( this, arguments );
instance = new CPPDeferredClassInstance(this, argMap, arguments);
}
return instance;
}
@ -411,7 +412,8 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
return false;
for (int i = 0; same && i < params.length; i++) {
ICPPTemplateParameter p= params[i], op= oparams[i];
ICPPTemplateParameter p= params[i];
ICPPTemplateParameter op= oparams[i];
if (p instanceof IType && op instanceof IType) {
same &= (((IType)p).isSameType((IType)op));
} else {
@ -421,8 +423,8 @@ class PDOMCPPClassTemplate extends PDOMCPPClassType
return same;
}
} catch(DOMException de) {
CCorePlugin.log(de);
} catch (DOMException e) {
CCorePlugin.log(e);
return false;
}

View file

@ -25,7 +25,6 @@ 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.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.Util;
@ -41,7 +40,6 @@ import org.eclipse.core.runtime.CoreException;
/**
* @author Bryan Wilkinson
*
*/
class PDOMCPPClassTemplatePartialSpecialization extends
PDOMCPPClassTemplate implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization, IPDOMOverloader {
@ -118,16 +116,16 @@ class PDOMCPPClassTemplatePartialSpecialization extends
}
private static class TemplateArgumentCollector implements IPDOMVisitor {
private List args = new ArrayList();
private List<IType> args = new ArrayList<IType>();
public boolean visit(IPDOMNode node) throws CoreException {
if (node instanceof IType)
args.add(node);
args.add((IType) node);
return false;
}
public void leave(IPDOMNode node) throws CoreException {
}
public IType[] getTemplateArguments() {
return (IType[])args.toArray(new IType[args.size()]);
return args.toArray(new IType[args.size()]);
}
}
@ -182,7 +180,7 @@ class PDOMCPPClassTemplatePartialSpecialization extends
//If the argument is a template parameter, we can't instantiate yet, defer for later
if( CPPTemplates.typeContainsTemplateParameter( arg ) ){
return deferredInstance( args );
return deferredInstance( argMap, args );
}
try {
if( !CPPTemplates.deduceTemplateArgument( argMap, spec, arg ) )
@ -199,11 +197,11 @@ class PDOMCPPClassTemplatePartialSpecialization extends
return null;
}
return (ICPPTemplateInstance) CPPTemplates.createInstance( (ICPPScope) getScope(), this, argMap, args );
return CPPTemplates.createInstance( (ICPPScope) getScope(), this, argMap, args );
}
private static class NodeCollector implements IPDOMVisitor {
private List nodes = new ArrayList();
private List<IPDOMNode> nodes = new ArrayList<IPDOMNode>();
public boolean visit(IPDOMNode node) throws CoreException {
nodes.add(node);
return false;
@ -211,7 +209,7 @@ class PDOMCPPClassTemplatePartialSpecialization extends
public void leave(IPDOMNode node) throws CoreException {
}
public IPDOMNode[] getNodes() {
return (IPDOMNode[])nodes.toArray(new IPDOMNode[nodes.size()]);
return nodes.toArray(new IPDOMNode[nodes.size()]);
}
}

View file

@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredClassInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator;
@ -74,10 +75,10 @@ class PDOMCPPClassTemplateSpecialization extends
return template.getTemplateParameters();
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance( arguments );
if( instance == null ){
instance = new CPPDeferredClassInstance( this, arguments );
instance = new CPPDeferredClassInstance( this, argMap, arguments );
}
return instance;
}

View file

@ -31,6 +31,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredFunctionInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates;
@ -47,7 +48,6 @@ import org.eclipse.core.runtime.CoreException;
/**
* @author Bryan Wilkinson
*
*/
class PDOMCPPFunctionTemplate extends PDOMCPPFunction implements
ICPPFunctionTemplate, ICPPInternalTemplateInstantiator,
@ -114,7 +114,7 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction implements
}
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance(arguments);
if( instance == null ){
instance = new CPPDeferredFunctionInstance( this, arguments );
@ -224,7 +224,8 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction implements
throws DOMException {
IBinding[] result = null;
try {
BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), null, prefixLookup, !prefixLookup);
BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), null,
prefixLookup, !prefixLookup);
PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl());
list.accept(visitor);
result = (IBinding[]) ArrayUtil.addAll(IBinding.class, result, visitor.getBindings());

View file

@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredFunctionInstance;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator;
@ -69,7 +70,7 @@ class PDOMCPPFunctionTemplateSpecialization extends
return template.getTemplateParameters();
}
public ICPPSpecialization deferredInstance(IType[] arguments) {
public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) {
ICPPSpecialization instance = getInstance(arguments);
if( instance == null ){
instance = new CPPDeferredFunctionInstance( this, arguments );