diff options
author | Markus Schorn | 2008-07-25 12:52:22 +0000 |
---|---|---|
committer | Markus Schorn | 2008-07-25 12:52:22 +0000 |
commit | 91778c287bbe11ccae0da1ed54f314f4bbda39f3 (patch) | |
tree | a908dfbe33b25ffbb1b3f524b5aca7d4266b6cb8 /core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java | |
parent | d548722c4eb1557b158bb81f3fb9ff2ae06fe517 (diff) | |
download | org.eclipse.cdt-91778c287bbe11ccae0da1ed54f314f4bbda39f3.tar.gz org.eclipse.cdt-91778c287bbe11ccae0da1ed54f314f4bbda39f3.tar.xz org.eclipse.cdt-91778c287bbe11ccae0da1ed54f314f4bbda39f3.zip |
Reworked parts of template instantiation, fixes bug 236197.
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java')
-rw-r--r-- | core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java | 213 |
1 files changed, 68 insertions, 145 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java index 5cd421f4874..202cbf87ffe 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java @@ -21,28 +21,25 @@ import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; +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.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.ICPPTemplateDefinition; 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.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.index.IIndexName; 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.CPPDeferredClassInstance; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; 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.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -54,19 +51,16 @@ import org.eclipse.core.runtime.CoreException; /** * @author Bryan Wilkinson */ -public class PDOMCPPClassTemplate extends PDOMCPPClassType - implements ICPPClassTemplate, ICPPInternalTemplateInstantiator, ICPPTemplateScope { +public class PDOMCPPClassTemplate extends PDOMCPPClassType implements ICPPClassTemplate, ICPPInstanceCache { private static final int PARAMETERS = PDOMCPPClassType.RECORD_SIZE + 0; - private static final int INSTANCES = PDOMCPPClassType.RECORD_SIZE + 4; - private static final int SPECIALIZATIONS = PDOMCPPClassType.RECORD_SIZE + 8; - private static final int FIRST_PARTIAL = PDOMCPPClassType.RECORD_SIZE + 12; + private static final int FIRST_PARTIAL = PDOMCPPClassType.RECORD_SIZE + 4; /** * The size in bytes of a PDOMCPPClassTemplate record in the database. */ @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 16; + protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 8; private ICPPTemplateParameter[] params; // Cached template parameters. @@ -147,11 +141,7 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType return new ICPPClassTemplatePartialSpecialization[0]; } } - - public ICPPTemplateDefinition getTemplateDefinition() throws DOMException { - return null; - } - + private class PDOMCPPTemplateScope implements ICPPTemplateScope, IIndexScope { public IBinding[] find(String name) throws DOMException { return CPPSemantics.findBindings(this, name, false); @@ -227,103 +217,18 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType super.accept(visitor); PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); list.accept(visitor); - list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); - list.accept(visitor); } - public void specializationsAccept(IPDOMVisitor visitor) throws CoreException { - PDOMNodeLinkedList list= new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); - list.accept(visitor); - } - @Override - public void addMember(PDOMNode member) throws CoreException { + public void addChild(PDOMNode member) throws CoreException { if (member instanceof ICPPTemplateParameter) { PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); list.addMember(member); - } else if (member instanceof ICPPTemplateInstance) { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); - list.addMember(member); - } else if (member instanceof ICPPSpecialization) { - if (this.equals(((ICPPSpecialization)member).getSpecializedBinding())) { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); - list.addMember(member); - } else { - super.addMember(member); - } } else { - super.addMember(member); - } - } - - public ICPPSpecialization deferredInstance(ObjectMap argMap, IType[] arguments) { - ICPPSpecialization instance = getInstance(arguments); - if (instance == null) { - instance = new CPPDeferredClassInstance(this, argMap, arguments); - } - return instance; - } - - private static class InstanceFinder implements IPDOMVisitor { - private ICPPSpecialization instance = null; - private IType[] arguments; - - public InstanceFinder(IType[] arguments) { - this.arguments = arguments; - } - - public boolean visit(IPDOMNode node) throws CoreException { - if (instance == null && node instanceof PDOMCPPSpecialization) { - PDOMCPPSpecialization spec = (PDOMCPPSpecialization) node; - if (spec.matchesArguments(arguments)) { - instance = spec; - } - } - return false; - } - public void leave(IPDOMNode node) throws CoreException { - } - public ICPPSpecialization getInstance() { - return instance; - } - } - - public ICPPSpecialization getInstance(IType[] arguments) { - try { - InstanceFinder visitor = new InstanceFinder(arguments); - - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); - list.accept(visitor); - - if (visitor.getInstance() == null) { - list = new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); - list.accept(visitor); - } - - return visitor.getInstance(); - } catch (CoreException e) { - CCorePlugin.log(e); + super.addChild(member); } - return null; } - - public IBinding instantiate(IType[] arguments) { - ICPPTemplateDefinition template = null; - try { - template = CPPTemplates.matchTemplatePartialSpecialization(this, arguments); - } catch (DOMException e) { - return e.getProblem(); - } - - if (template instanceof IProblemBinding) - return template; - if (template != null && template instanceof ICPPClassTemplatePartialSpecialization) { - return ((PDOMCPPClassTemplate) template).instantiate(arguments); - } - return CPPTemplates.instantiateTemplate(this, arguments, null); - } - @Override public boolean isSameType(IType type) { if (type instanceof ITypedef) { @@ -337,56 +242,74 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType } } - try { - if (type instanceof ICPPClassTemplate && !(type instanceof ProblemBinding)) { - boolean same= !(type instanceof ICPPClassTemplatePartialSpecialization); - ICPPClassType ctype= (ICPPClassType) type; - try { - if (same && ctype.getKey() == getKey()) { - char[][] qname= ctype.getQualifiedNameCharArray(); - same= hasQualifiedName(qname, qname.length - 1); - } - } catch (DOMException e) { - CCorePlugin.log(e); - } - if (!same) - return false; - - ICPPTemplateParameter[] params= getTemplateParameters(); - ICPPTemplateParameter[] oparams= ((ICPPClassTemplate) type).getTemplateParameters(); + // need a class template + if (type instanceof ICPPClassTemplate == false || type instanceof ProblemBinding) + return false; + + // exclude other kinds of class templates + if (type instanceof ICPPClassTemplatePartialSpecialization || + type instanceof ICPPTemplateTemplateParameter || + type instanceof ICPPClassSpecialization) + return false; - if (params == null && oparams == null) - return true; + try { + ICPPClassType ctype= (ICPPClassType) type; + if (ctype.getKey() != getKey()) + return false; - if (params == null || oparams == null) - return false; + final char[][] qname= ctype.getQualifiedNameCharArray(); + if (!hasQualifiedName(qname, qname.length - 1)) + return false; - if (params.length != oparams.length) - return false; - - for (int i = 0; same && i < params.length; i++) { - ICPPTemplateParameter p= params[i]; - ICPPTemplateParameter op= oparams[i]; - if (p instanceof IType && op instanceof IType) { - same &= (((IType)p).isSameType((IType)op)); - } else { - if(p instanceof ICPPTemplateNonTypeParameter - && op instanceof ICPPTemplateNonTypeParameter) { - IType pt= ((ICPPTemplateNonTypeParameter)p).getType(); - IType opt= ((ICPPTemplateNonTypeParameter)op).getType(); - return pt!=null && opt!=null ? pt.isSameType(opt) : pt == opt; - } + ICPPTemplateParameter[] params1= getTemplateParameters(); + ICPPTemplateParameter[] params2= ((ICPPClassTemplate) type).getTemplateParameters(); + + if (params1 == params2) + return true; + + if (params1 == null || params2 == null) + return false; + + if (params1.length != params2.length) + return false; + + for (int i = 0; i < params1.length; i++) { + ICPPTemplateParameter p1= params1[i]; + ICPPTemplateParameter p2= params2[i]; + if (p1 instanceof IType && p2 instanceof IType) { + IType t1= (IType) p1; + IType t2= (IType) p2; + if (!t1.isSameType(t2)) { return false; } + } else if (p1 instanceof ICPPTemplateNonTypeParameter + && p2 instanceof ICPPTemplateNonTypeParameter) { + IType t1= ((ICPPTemplateNonTypeParameter)p1).getType(); + IType t2= ((ICPPTemplateNonTypeParameter)p2).getType(); + if (t1 != t2) { + if (t1 == null || t2 == null || !t1.isSameType(t2)) { + return false; + } + } + } else { + return false; } - - return same; } + return true; } catch (DOMException e) { - CCorePlugin.log(e); return false; } - - return false; + } + + public ICPPTemplateInstance getInstance(IType[] arguments) { + return PDOMInstanceCache.getCache(this).getInstance(arguments); + } + + public void addInstance(IType[] arguments, ICPPTemplateInstance instance) { + PDOMInstanceCache.getCache(this).addInstance(arguments, instance); + } + + public ICPPTemplateInstance[] getAllInstances() { + return PDOMInstanceCache.getCache(this).getAllInstances(); } } |