diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom')
25 files changed, 1075 insertions, 377 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IInternalPDOMNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IInternalPDOMNode.java new file mode 100644 index 00000000000..8d98495725c --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IInternalPDOMNode.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom; + +import org.eclipse.cdt.core.dom.IPDOMNode; + +/** + * Common, but internal methods for all pdom nodes. + */ +public interface IInternalPDOMNode extends IPDOMNode { + public int getRecord(); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java index 7408373b7ca..7354e047308 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java @@ -18,6 +18,7 @@ import java.util.Arrays; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.index.IIndexBinding; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.Database; @@ -83,7 +84,25 @@ public abstract class PDOMNamedNode extends PDOMNode { return getDBName().equals(name); } - + + /** + * Template parameters need to update their name. + * @throws CoreException + */ + protected void updateName(char[] nameCharArray) throws CoreException { + if (fName != null && CharArrayUtils.equals(fName, nameCharArray)) + return; + + IString name= getDBName(); + if (!name.equals(nameCharArray)) { + name.delete(); + final Database db= pdom.getDB(); + db.putInt(record + NAME, db.newString(nameCharArray).getRecord()); + } + fName= nameCharArray; + } + + @Override public void delete(PDOMLinkage linkage) throws CoreException { final Database db = pdom.getDB(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java index 588e6758075..454bdc66edb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java @@ -1,12 +1,12 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 QNX Software Systems and others. + * Copyright (c) 2005, 2008 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Doug Schaefer (QNX) - Initial API and implementation * Markus Schorn (Wind River Systems) * Andrew Ferguson (Symbian) *******************************************************************************/ @@ -14,20 +14,17 @@ package org.eclipse.cdt.internal.core.pdom.dom; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.core.runtime.CoreException; /** - * @author Doug Schaefer - * * This is a basic node in the PDOM database. * PDOM nodes form a multi-root tree with linkages being the roots. * This class managed the parent pointer. */ -public abstract class PDOMNode implements IPDOMNode { +public abstract class PDOMNode implements IInternalPDOMNode { private static final int TYPE = 0; private static final int PARENT = 4; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPTemplateParameter.java new file mode 100644 index 00000000000..3a373f1fd61 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPTemplateParameter.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom.cpp; + +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.internal.core.pdom.dom.IInternalPDOMNode; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; +import org.eclipse.core.runtime.CoreException; + +/** + * Interface for template parameters stored in the index. + */ +public interface IPDOMCPPTemplateParameter extends IInternalPDOMNode, ICPPTemplateParameter { + + IPDOMCPPTemplateParameter[] EMPTY_ARRAY = {}; + + /** + * Default values are updated after the class template is stored, because we + * may have to refer to the other template parameters. + */ + void configure(ICPPTemplateParameter templateParameter); + + void update(PDOMLinkage linkage, IBinding newBinding) throws CoreException; + + /** + * parameters of template template parameters need to be deleted. + * @throws CoreException + */ + void forceDelete(PDOMLinkage pdom) throws CoreException; +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBinding.java index b7bf269d5b1..6a84debe92c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBinding.java @@ -17,8 +17,12 @@ import java.util.List; import org.eclipse.cdt.core.CCorePlugin; 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.ICPPBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; @@ -39,21 +43,42 @@ abstract class PDOMCPPBinding extends PDOMBinding implements ICPPBinding { super(pdom, parent, name); } - protected boolean hasQualifiedName(char[][] qname, int idx) { + protected boolean isSameOwner(IBinding owner1, IBinding owner2) { + if (owner1 == null) + return owner2 == null; + if (owner2 == null) + return false; + + if (owner1 instanceof IType) { + if (owner2 instanceof IType) { + return ((IType) owner1).isSameType((IType) owner2); + } + return false; + } try { - if (getDBName().equals(qname[idx])) { - PDOMNode parent= getParentNode(); - if (--idx < 0) { - return parent == null; - } - if (parent instanceof PDOMCPPBinding) { - return ((PDOMCPPBinding) parent).hasQualifiedName(qname, idx); - } + while(owner1 instanceof ICPPNamespace && owner2 instanceof ICPPNamespace) { + final char[] n1 = owner1.getNameCharArray(); + // ignore unknown namespaces + if (n1.length == 0) { + owner1= owner1.getOwner(); + continue; + } + final char[] n2= owner2.getNameCharArray(); + if (n2.length == 0) { + owner2= owner2.getOwner(); + continue; + } + if (!CharArrayUtils.equals(n1, n2)) + return false; + + owner1= owner1.getOwner(); + owner2= owner2.getOwner(); } - } catch (CoreException e) { + } catch (DOMException e) { CCorePlugin.log(e); + return false; } - return false; + return owner1 == null && owner2 == null; } final public char[][] getQualifiedNameCharArray() throws DOMException { 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 d4276a810b2..98ef3cca37e 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 @@ -6,7 +6,7 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Bryan Wilkinson (QNX) - Initial API and implementation * Andrew Ferguson (Symbian) * Markus Schorn (Wind River Systems) * Sergey Prigogin (Google) @@ -14,12 +14,11 @@ 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.dom.IPDOMNode; -import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; 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.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; @@ -32,32 +31,43 @@ 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.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; +import org.eclipse.cdt.internal.core.pdom.db.Database; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** - * @author Bryan Wilkinson + * Implementation for class templates in the index, base class for partial specializations. */ public class PDOMCPPClassTemplate extends PDOMCPPClassType implements ICPPClassTemplate, ICPPInstanceCache, IPDOMCPPTemplateParameterOwner { private static final int PARAMETERS = PDOMCPPClassType.RECORD_SIZE + 0; - private static final int FIRST_PARTIAL = PDOMCPPClassType.RECORD_SIZE + 4; + private static final short RELEVANT_PARAMETERS= PDOMCPPClassType.RECORD_SIZE + 4; + private static final int FIRST_PARTIAL = PDOMCPPClassType.RECORD_SIZE + 6; /** * The size in bytes of a PDOMCPPClassTemplate record in the database. */ @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 8; + protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 10; private ICPPTemplateParameter[] params; // Cached template parameters. - public PDOMCPPClassTemplate(PDOM pdom, PDOMNode parent, ICPPClassTemplate template) throws CoreException { + public PDOMCPPClassTemplate(PDOM pdom, PDOMCPPLinkage linkage, PDOMNode parent, ICPPClassTemplate template) throws CoreException, DOMException { super(pdom, parent, template); + + final Database db = pdom.getDB(); + final ICPPTemplateParameter[] origParams= template.getTemplateParameters(); + final IPDOMCPPTemplateParameter[] params = PDOMTemplateParameterArray.createPDOMTemplateParameters(pdom, this, origParams); + int rec= PDOMTemplateParameterArray.putArray(db, params); + db.putInt(record + PARAMETERS, rec); + db.putShort(record + RELEVANT_PARAMETERS, (short) params.length); + linkage.new ConfigureTemplateParameters(origParams, params); } public PDOMCPPClassTemplate(PDOM pdom, int bindingRecord) { @@ -74,36 +84,116 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType return IIndexCPPBindingConstants.CPP_CLASS_TEMPLATE; } - private static class TemplateParameterCollector implements IPDOMVisitor { - private List<IPDOMNode> params = new ArrayList<IPDOMNode>(); - public boolean visit(IPDOMNode node) throws CoreException { - if (node instanceof ICPPTemplateParameter) - params.add(node); - return false; - } - public void leave(IPDOMNode node) throws CoreException { - } - public ICPPTemplateParameter[] getTemplateParameters() { - return params.toArray(new ICPPTemplateParameter[params.size()]); - } - } - public ICPPTemplateParameter[] getTemplateParameters() { if (params == null) { try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); - TemplateParameterCollector visitor = new TemplateParameterCollector(); - list.accept(visitor); - params = visitor.getTemplateParameters(); + final Database db = pdom.getDB(); + int rec= db.getInt(record + PARAMETERS); + int count= Math.max(0, db.getShort(record + RELEVANT_PARAMETERS)); + if (rec == 0 || count == 0) { + params= ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY; + } else { + IPDOMCPPTemplateParameter[] allParams = PDOMTemplateParameterArray.getArray(this, rec); + count= Math.min(count, allParams.length); + if (count == allParams.length) { + params= allParams; + } else { + params= new ICPPTemplateParameter[count]; + System.arraycopy(allParams, 0, params, 0, count); + } + } } catch (CoreException e) { CCorePlugin.log(e); params = ICPPTemplateParameter.EMPTY_TEMPLATE_PARAMETER_ARRAY; } } - // Copy to a new array for safety. - ICPPTemplateParameter[] result = new ICPPTemplateParameter[params.length]; - System.arraycopy(params, 0, result, 0, params.length); - return result; + return params; + } + + @Override + public void update(PDOMLinkage linkage, IBinding newBinding) throws CoreException { + super.update(linkage, newBinding); + if (newBinding instanceof ICPPClassTemplate) { + ICPPClassTemplate ct= (ICPPClassTemplate) newBinding; + try { + updateTemplateParameters(linkage, ct.getTemplateParameters()); + } catch (DOMException e) { + CCorePlugin.log(e); + } + } + } + + private void updateTemplateParameters(PDOMLinkage linkage, ICPPTemplateParameter[] newParams) throws CoreException, DOMException { + final Database db = pdom.getDB(); + int rec= db.getInt(record + PARAMETERS); + IPDOMCPPTemplateParameter[] allParams; + if (rec == 0) { + allParams= IPDOMCPPTemplateParameter.EMPTY_ARRAY; + } else { + allParams = PDOMTemplateParameterArray.getArray(this, rec); + } + + final int newParamLength = newParams.length; + int[] props= new int[allParams.length]; + int[] result= new int[newParamLength]; + int additionalPars= 0; + boolean reorder= false; + for (int i = 0; i < props.length; i++) { + final IPDOMCPPTemplateParameter par = allParams[i]; + props[i]= getProperty(par); + } + + outer: for (int i = 0; i < newParamLength; i++) { + ICPPTemplateParameter newPar = newParams[i]; + int prop= getProperty(newPar); + for (int j = 0; j < props.length; j++) { + if (props[j] == prop) { + // reuse param + result[i]= j; + props[j]= -1; + allParams[j].update(linkage, newPar); + if (j != i) + reorder= true; + continue outer; + } + } + result[i]= -1; + additionalPars++; + } + + if (additionalPars > 0 || reorder) { + params= null; + IPDOMCPPTemplateParameter[] newAllParams= new IPDOMCPPTemplateParameter[allParams.length+additionalPars]; + for (int j = 0; j < newParamLength; j++) { + int idx= result[j]; + if (idx >= 0) { + newAllParams[j]= allParams[idx]; + allParams[idx]= null; + } else { + newAllParams[j]= PDOMTemplateParameterArray.createPDOMTemplateParameter(pdom, this, newParams[j]); + } + } + int pos= newParamLength; + for (int j = 0; j < allParams.length; j++) { + IPDOMCPPTemplateParameter unused = allParams[j]; + if (unused != null) + newAllParams[pos++]= unused; + } + if (rec != 0) + db.free(rec); + rec= PDOMTemplateParameterArray.putArray(db, newAllParams); + db.putInt(record + PARAMETERS, rec); + } + db.putShort(record + RELEVANT_PARAMETERS, (short) newParamLength); + } + + private int getProperty(ICPPTemplateParameter par) { + int result= par.getParameterPosition() & 0xffff; + if (par instanceof ICPPTemplateTypeParameter) + return result; + if (par instanceof ICPPTemplateNonTypeParameter) + return result | 0x10000; + return result | 0x20000; } private PDOMCPPClassTemplatePartialSpecialization getFirstPartial() throws CoreException { @@ -135,24 +225,6 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType } @Override - public void accept(IPDOMVisitor visitor) throws CoreException { - super.accept(visitor); - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); - list.accept(visitor); - } - - @Override - public void addChild(PDOMNode member) throws CoreException { - if (member instanceof ICPPTemplateParameter) { - params= null; // clear cache - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); - list.addMember(member); - } else { - super.addChild(member); - } - } - - @Override public boolean isSameType(IType type) { if (type instanceof ITypedef) { return type.isSameType(this); @@ -179,46 +251,14 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType ICPPClassType ctype= (ICPPClassType) type; if (ctype.getKey() != getKey()) return false; - - final char[][] qname= ctype.getQualifiedNameCharArray(); - if (!hasQualifiedName(qname, qname.length - 1)) - return false; - - 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) + char[] nchars = ctype.getNameCharArray(); + if (nchars.length == 0) { + nchars= ASTTypeUtil.createNameForAnonymous(ctype); + } + if (nchars == null || !CharArrayUtils.equals(nchars, getNameCharArray())) 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 true; + return isSameOwner(getOwner(), ctype.getOwner()); } catch (DOMException e) { return false; } @@ -239,24 +279,21 @@ public class PDOMCPPClassTemplate extends PDOMCPPClassType public ICPPTemplateParameter adaptTemplateParameter(ICPPTemplateParameter param) { // Template parameters are identified by their position in the parameter list. int pos = param.getParameterPosition(); - if (params != null) { - return pos < params.length ? params[pos] : null; - } - try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); - ICPPTemplateParameter result= (ICPPTemplateParameter) list.getNodeAt(pos); - if (param instanceof ICPPTemplateTypeParameter) { - if (result instanceof ICPPTemplateTypeParameter) - return result; - } else if (param instanceof ICPPTemplateNonTypeParameter) { - if (result instanceof ICPPTemplateNonTypeParameter) - return result; - } else if (param instanceof ICPPTemplateTemplateParameter) { - if (result instanceof ICPPTemplateTemplateParameter) - return result; - } - } catch (CoreException e) { - CCorePlugin.log(e); + ICPPTemplateParameter[] pars = getTemplateParameters(); + + if (pars == null || pos >= pars.length) + return null; + + ICPPTemplateParameter result= pars[pos]; + if (param instanceof ICPPTemplateTypeParameter) { + if (result instanceof ICPPTemplateTypeParameter) + return result; + } else if (param instanceof ICPPTemplateNonTypeParameter) { + if (result instanceof ICPPTemplateNonTypeParameter) + return result; + } else if (param instanceof ICPPTemplateTemplateParameter) { + if (result instanceof ICPPTemplateTemplateParameter) + return result; } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java index d3f4c35151a..820ff06e749 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java @@ -53,9 +53,10 @@ class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPClassTemplate.RECORD_SIZE + 16; - public PDOMCPPClassTemplatePartialSpecialization(PDOM pdom, - PDOMNode parent, ICPPClassTemplatePartialSpecialization partial, PDOMCPPClassTemplate primary) throws CoreException { - super(pdom, parent, partial); + public PDOMCPPClassTemplatePartialSpecialization(PDOM pdom, PDOMCPPLinkage linkage, + PDOMNode parent, ICPPClassTemplatePartialSpecialization partial, PDOMCPPClassTemplate primary) + throws CoreException, DOMException { + super(pdom, linkage, parent, partial); pdom.getDB().putInt(record + PRIMARY, primary.getRecord()); primary.addPartial(this); @@ -65,6 +66,7 @@ class PDOMCPPClassTemplatePartialSpecialization extends PDOMCPPClassTemplate } catch (DOMException e) { throw new CoreException(Util.createStatus(e)); } + linkage.new ConfigurePartialSpecialization(this, partial); } public PDOMCPPClassTemplatePartialSpecialization(PDOM pdom, diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 85d6525ab29..afe81dd357b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -33,6 +33,7 @@ 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.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; @@ -40,7 +41,6 @@ import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; 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.IPDOMMemberOwner; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMASTAdapter; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; @@ -260,12 +260,17 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO if (type instanceof ICPPClassType && !(type instanceof ProblemBinding)) { ICPPClassType ctype= (ICPPClassType) type; - ctype= (ICPPClassType) PDOMASTAdapter.getAdapterForAnonymousASTBinding(ctype); try { - if (ctype.getKey() == getKey()) { - char[][] qname= ctype.getQualifiedNameCharArray(); - return hasQualifiedName(qname, qname.length-1); + if (ctype.getKey() != getKey()) + return false; + char[] nchars = ctype.getNameCharArray(); + if (nchars.length == 0) { + nchars= ASTTypeUtil.createNameForAnonymous(ctype); } + if (nchars == null || !CharArrayUtils.equals(nchars, getNameCharArray())) + return false; + + return isSameOwner(getOwner(), ctype.getOwner()); } catch (DOMException e) { CCorePlugin.log(e); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructor.java index e21b3b761b4..af9d69cfa1e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructor.java @@ -21,7 +21,7 @@ import org.eclipse.core.runtime.CoreException; class PDOMCPPConstructor extends PDOMCPPMethod implements ICPPConstructor { - public PDOMCPPConstructor(PDOM pdom, PDOMNode parent, ICPPConstructor method) throws CoreException { + public PDOMCPPConstructor(PDOM pdom, PDOMNode parent, ICPPConstructor method) throws CoreException, DOMException { super(pdom, parent, method); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorTemplate.java index 6f9c41fb592..b495bff62e6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorTemplate.java @@ -24,8 +24,9 @@ import org.eclipse.core.runtime.CoreException; class PDOMCPPConstructorTemplate extends PDOMCPPMethodTemplate implements ICPPConstructor { - public PDOMCPPConstructorTemplate(PDOM pdom, PDOMNode parent, ICPPConstructor method) throws CoreException { - super(pdom, parent, method); + public PDOMCPPConstructorTemplate(PDOM pdom, PDOMCPPLinkage linkage, PDOMNode parent, ICPPConstructor method) + throws CoreException, DOMException { + super(pdom, linkage, parent, method); } public PDOMCPPConstructorTemplate(PDOM pdom, int record) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index 0c648c50c53..b32a8c858d9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -29,7 +29,9 @@ 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.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; +import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; @@ -107,7 +109,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP } public ICPPClassTemplate getClassTemplate() { - return (ICPPClassTemplate) getTemplateDefinition(); + return (ICPPClassTemplate) getSpecializedBinding(); } @Override @@ -164,7 +166,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP } public int getKey() throws DOMException{ - return 0; + return getClassTemplate().getKey(); } @Override @@ -194,13 +196,23 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP return ICPPTemplateArgument.EMPTY_ARGUMENTS; } } + + public boolean isAnonymous() { + return false; + } + + @Override + public ObjectMap getArgumentMap() { + return ObjectMap.EMPTY_MAP; + } + + @Override + public CPPTemplateParameterMap getTemplateParameterMap() { + return CPPTemplateParameterMap.EMPTY; + } @Deprecated public IType[] getArguments() { return CPPTemplates.getArguments(getTemplateArguments()); } - - public boolean isAnonymous() { - return false; - } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java index 9c5f3946e10..e96e7da998e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java @@ -15,16 +15,16 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import java.util.ArrayList; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMASTAdapter; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; @@ -110,17 +110,15 @@ class PDOMCPPEnumeration extends PDOMCPPBinding implements IEnumeration, IIndexT try { if (type instanceof IEnumeration) { - if (type instanceof ICPPBinding) { - ICPPBinding etype= (ICPPBinding) type; - etype= (ICPPBinding) PDOMASTAdapter.getAdapterForAnonymousASTBinding(etype); - char[][] qname = etype.getQualifiedNameCharArray(); - return hasQualifiedName(qname, qname.length-1); - } - else if (type instanceof PDOMCPPEnumeration) { - PDOMCPPEnumeration etype= (PDOMCPPEnumeration) type; - char[][] qname= etype.getQualifiedNameCharArray(); - return hasQualifiedName(qname, qname.length-1); + IEnumeration etype= (IEnumeration) type; + char[] nchars = etype.getNameCharArray(); + if (nchars.length == 0) { + nchars= ASTTypeUtil.createNameForAnonymous(etype); } + if (nchars == null || !CharArrayUtils.equals(nchars, getNameCharArray())) + return false; + + return isSameOwner(getOwner(), etype.getOwner()); } } catch (DOMException e) { CCorePlugin.log(e); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java index 7be137b5af2..096a0561160 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java @@ -81,26 +81,27 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 21; - public PDOMCPPFunction(PDOM pdom, PDOMNode parent, ICPPFunction function, boolean setTypes) throws CoreException { + public PDOMCPPFunction(PDOM pdom, PDOMNode parent, ICPPFunction function, boolean setTypes) throws CoreException, DOMException { super(pdom, parent, function.getNameCharArray()); Database db = pdom.getDB(); - try { - Integer sigHash = IndexCPPSignatureUtil.getSignatureHash(function); - pdom.getDB().putInt(record + SIGNATURE_HASH, sigHash != null ? sigHash.intValue() : 0); - - if (setTypes) { - initData((ICPPFunctionType) function.getType(), function.getParameters()); - } - db.putByte(record + ANNOTATION, PDOMCPPAnnotation.encodeAnnotation(function)); - storeExceptionSpec(db, function); - } catch (DOMException e) { - throw new CoreException(Util.createStatus(e)); + Integer sigHash = IndexCPPSignatureUtil.getSignatureHash(function); + pdom.getDB().putInt(record + SIGNATURE_HASH, sigHash != null ? sigHash.intValue() : 0); + + if (setTypes) { + initData(function.getType(), function.getParameters()); } + db.putByte(record + ANNOTATION, PDOMCPPAnnotation.encodeAnnotation(function)); + storeExceptionSpec(db, function); } - public void initData(ICPPFunctionType ftype, IParameter[] params) throws CoreException { - PDOMCPPFunctionType pft= setType(ftype); - setParameters(pft, params); + public void initData(ICPPFunctionType ftype, IParameter[] params) { + PDOMCPPFunctionType pft; + try { + pft = setType(ftype); + setParameters(pft, params); + } catch (CoreException e) { + CCorePlugin.log(e); + } } @Override @@ -111,7 +112,7 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl IParameter[] newParams; byte newAnnotation; try { - newType= (ICPPFunctionType) func.getType(); + newType= func.getType(); newParams = func.getParameters(); newAnnotation = PDOMCPPAnnotation.encodeAnnotation(func); } catch (DOMException e) { @@ -120,7 +121,8 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl IFunctionType oldType= getType(); PDOMCPPParameter oldParams= getFirstParameter(); - initData(newType, newParams); + PDOMCPPFunctionType pft= setType(newType); + setParameters(pft, newParams); if (oldType != null) { linkage.deleteType(oldType, record); } @@ -235,7 +237,7 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl } } - public IFunctionType getType() { + public ICPPFunctionType getType() { try { int offset= pdom.getDB().getInt(record + FUNCTION_TYPE); return offset==0 ? null : new PDOMCPPFunctionType(pdom, offset); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java index 1193e6810b8..2a5cf1b9fce 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java @@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IScope; 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.ICPPFunctionType; 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.ICPPSpecialization; @@ -172,7 +173,7 @@ class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization implements ICP } } - public IFunctionType getType() throws DOMException { + public ICPPFunctionType getType() throws DOMException { try { int offset= pdom.getDB().getInt(record + FUNCTION_TYPE); return offset==0 ? null : new PDOMCPPFunctionType(pdom, offset); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java index 83f1d4f5200..eedb7d8eaa9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java @@ -6,21 +6,15 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * QNX - Initial API and implementation + * Bryan Wilkinson (QNX) - Initial API and implementation * Markus Schorn (Wind River Systems) * Sergey Prigogin (Google) *******************************************************************************/ 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.dom.IPDOMNode; -import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; -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.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; @@ -31,14 +25,14 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; +import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** - * @author Bryan Wilkinson + * Represents a function template, base class for method/constructor templates. */ class PDOMCPPFunctionTemplate extends PDOMCPPFunction implements ICPPFunctionTemplate, ICPPInstanceCache, IPDOMMemberOwner, IPDOMCPPTemplateParameterOwner { @@ -51,9 +45,17 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction @SuppressWarnings("hiding") protected static final int RECORD_SIZE = PDOMCPPFunction.RECORD_SIZE + 4; - public PDOMCPPFunctionTemplate(PDOM pdom, PDOMNode parent, ICPPFunctionTemplate template) - throws CoreException { - super(pdom, parent, (ICPPFunction) template, false); + private IPDOMCPPTemplateParameter[] params; // Cached template parameters. + + public PDOMCPPFunctionTemplate(PDOM pdom, PDOMCPPLinkage linkage, PDOMNode parent, ICPPFunctionTemplate template) + throws CoreException, DOMException { + super(pdom, parent, template, false); + final ICPPTemplateParameter[] origParams= template.getTemplateParameters(); + params = PDOMTemplateParameterArray.createPDOMTemplateParameters(pdom, this, origParams); + final Database db = pdom.getDB(); + int rec= PDOMTemplateParameterArray.putArray(db, params); + db.putInt(record + TEMPLATE_PARAMS, rec); + linkage.new ConfigureFunctionTemplate(template, this); } public PDOMCPPFunctionTemplate(PDOM pdom, int bindingRecord) { @@ -75,48 +77,23 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction return IIndexCPPBindingConstants.CPP_FUNCTION_TEMPLATE; } - private static class TemplateParameterCollector implements IPDOMVisitor { - private List<IPDOMNode> params = new ArrayList<IPDOMNode>(); - public boolean visit(IPDOMNode node) throws CoreException { - if (node instanceof ICPPTemplateParameter) - params.add(node); - return false; - } - public void leave(IPDOMNode node) throws CoreException { - } - public ICPPTemplateParameter[] getTemplateParameters() { - return params.toArray(new ICPPTemplateParameter[params.size()]); - } - } - - public ICPPTemplateParameter[] getTemplateParameters() throws DOMException { - try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl()); - TemplateParameterCollector visitor = new TemplateParameterCollector(); - list.accept(visitor); - - return visitor.getTemplateParameters(); - } catch (CoreException e) { - CCorePlugin.log(e); - return new ICPPTemplateParameter[0]; + public IPDOMCPPTemplateParameter[] getTemplateParameters() { + if (params == null) { + try { + int rec= pdom.getDB().getInt(record + TEMPLATE_PARAMS); + if (rec == 0) { + params= IPDOMCPPTemplateParameter.EMPTY_ARRAY; + } else { + params= PDOMTemplateParameterArray.getArray(this, rec); + } + } catch (CoreException e) { + CCorePlugin.log(e); + params = IPDOMCPPTemplateParameter.EMPTY_ARRAY; + } } + return params; } - @Override - public void addChild(PDOMNode member) throws CoreException { - if (member instanceof ICPPTemplateParameter) { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl()); - list.addMember(member); - } - } - - @Override - public void accept(IPDOMVisitor visitor) throws CoreException { - super.accept(visitor); - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl()); - list.accept(visitor); - } - public ICPPTemplateInstance getInstance(ICPPTemplateArgument[] arguments) { return PDOMInstanceCache.getCache(this).getInstance(arguments); } @@ -132,21 +109,21 @@ class PDOMCPPFunctionTemplate extends PDOMCPPFunction public ICPPTemplateParameter adaptTemplateParameter(ICPPTemplateParameter param) { // Template parameters are identified by their position in the parameter list. int pos = param.getParameterPosition(); - try { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl()); - ICPPTemplateParameter result= (ICPPTemplateParameter) list.getNodeAt(pos); - if (param instanceof ICPPTemplateTypeParameter) { - if (result instanceof ICPPTemplateTypeParameter) - return result; - } else if (param instanceof ICPPTemplateNonTypeParameter) { - if (result instanceof ICPPTemplateNonTypeParameter) - return result; - } else if (param instanceof ICPPTemplateTemplateParameter) { - if (result instanceof ICPPTemplateTemplateParameter) - return result; - } - } catch (CoreException e) { - CCorePlugin.log(e); + ICPPTemplateParameter[] pars = getTemplateParameters(); + + if (pars == null || pos >= pars.length) + return null; + + ICPPTemplateParameter result= pars[pos]; + if (param instanceof ICPPTemplateTypeParameter) { + if (result instanceof ICPPTemplateTypeParameter) + return result; + } else if (param instanceof ICPPTemplateNonTypeParameter) { + if (result instanceof ICPPTemplateNonTypeParameter) + return result; + } else if (param instanceof ICPPTemplateTemplateParameter) { + if (result instanceof ICPPTemplateTemplateParameter) + return result; } return null; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java index bdc97803939..f9899e4674f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; -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.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; @@ -34,7 +33,7 @@ class PDOMCPPFunctionTemplateSpecialization extends PDOMCPPFunctionSpecializatio public PDOMCPPFunctionTemplateSpecialization(PDOM pdom, PDOMNode parent, ICPPFunctionTemplate template, PDOMBinding specialized) throws CoreException { - super(pdom, parent, (ICPPFunction) template, specialized); + super(pdom, parent, template, specialized); } public PDOMCPPFunctionTemplateSpecialization(PDOM pdom, int bindingRecord) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionType.java index 47d37cd178f..957735027be 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionType.java @@ -13,9 +13,12 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; @@ -23,6 +26,32 @@ import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCFunctionType; import org.eclipse.core.runtime.CoreException; public class PDOMCPPFunctionType extends PDOMCFunctionType implements ICPPFunctionType { + private static IType FALLBACK_RETURN_TYPE= new CPPBasicType(IBasicType.t_void, 0); + static ICPPFunctionType FALLBACK= new ICPPFunctionType() { + public IPointerType getThisType() { + return null; + } + public boolean isConst() { + return false; + } + public boolean isVolatile() { + return false; + } + public IType[] getParameterTypes() throws DOMException { + return IType.EMPTY_TYPE_ARRAY; + } + public IType getReturnType() throws DOMException { + return FALLBACK_RETURN_TYPE; + } + public boolean isSameType(IType type) { + return this == type || type.isSameType(this); + } + @Override + public Object clone() { + return this; + } + }; + /** * Offset for <code>this</code> type of this function (relative to * the beginning of the record). diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 2a52bf28604..76dac097995 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -13,9 +13,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; -import java.util.ArrayList; import java.util.LinkedList; -import java.util.List; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; @@ -28,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IFunction; +import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; @@ -57,9 +56,7 @@ 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.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.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.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; @@ -70,7 +67,6 @@ import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPBasicType; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; -import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; @@ -99,6 +95,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { public final static int CACHE_INSTANCES= 2; public final static int CACHE_INSTANCE_SCOPE= 3; + private LinkedList<Runnable> postProcesses = new LinkedList<Runnable>(); + public PDOMCPPLinkage(PDOM pdom, int record) { super(pdom, record); } @@ -126,33 +124,26 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } // Binding types - - private class ConfigureTemplate implements Runnable { - ICPPTemplateDefinition template; + class ConfigureTemplateParameters implements Runnable { + private final IPDOMCPPTemplateParameter[] fPersisted; + private final ICPPTemplateParameter[] fOriginal; - public ConfigureTemplate(ICPPTemplateDefinition template) { - this.template = template; + public ConfigureTemplateParameters(ICPPTemplateParameter[] original, IPDOMCPPTemplateParameter[] params) { + fOriginal= original; + fPersisted= params; + postProcesses.add(this); } public void run() { - try { - ICPPTemplateParameter[] params = template.getTemplateParameters(); - for (int i = 0; i < params.length; i++) { - if (params[i] != null && !(params[i] instanceof ProblemBinding)) { - addBinding(params[i], null); - } - } - } catch (CoreException e) { - CCorePlugin.log(e); - } catch (DOMException e) { - CCorePlugin.log(e); - } finally { - template = null; + for (int i = 0; i < fOriginal.length; i++) { + final IPDOMCPPTemplateParameter tp = fPersisted[i]; + if (tp != null) + tp.configure(fOriginal[i]); } } } - private class ConfigurePartialSpecialization implements Runnable { + class ConfigurePartialSpecialization implements Runnable { PDOMCPPClassTemplatePartialSpecialization partial; ICPPClassTemplatePartialSpecialization binding; @@ -160,6 +151,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { ICPPClassTemplatePartialSpecialization binding) { this.partial = partial; this.binding = binding; + postProcesses.add(this); } public void run() { @@ -177,31 +169,33 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } } - private class ConfigureFunctionTemplate implements Runnable { - PDOMCPPFunctionTemplate template; - ICPPFunction function; + class ConfigureFunctionTemplate implements Runnable { + private final PDOMCPPFunctionTemplate fTemplate; + private final IPDOMCPPTemplateParameter[] fTemplateParameters; + private final ICPPTemplateParameter[] fOriginalTemplateParameters; + private final ICPPFunctionType fOriginalFunctionType; + private final IParameter[] fOriginalParameters; - public ConfigureFunctionTemplate(PDOMCPPFunctionTemplate template, ICPPFunction binding) { - this.template = template; - this.function = binding; + public ConfigureFunctionTemplate(ICPPFunctionTemplate original, PDOMCPPFunctionTemplate template) throws DOMException { + fTemplate = template; + fTemplateParameters= template.getTemplateParameters(); + fOriginalTemplateParameters= original.getTemplateParameters(); + fOriginalFunctionType= original.getType(); + fOriginalParameters= original.getParameters(); + postProcesses.add(this); } public void run() { - try { - template.initData((ICPPFunctionType) function.getType(), function.getParameters()); - } catch (CoreException e) { - CCorePlugin.log(e); - } catch (DOMException e) { - CCorePlugin.log(e); - } finally { - template = null; - function = null; + for (int i = 0; i < fOriginalTemplateParameters.length; i++) { + final IPDOMCPPTemplateParameter tp = fTemplateParameters[i]; + if (tp != null) + tp.configure(fOriginalTemplateParameters[i]); } + + fTemplate.initData(fOriginalFunctionType, fOriginalParameters); } } - List<Runnable> postProcesses = new ArrayList<Runnable>(); - /** * Adds or returns existing binding for the given name. */ @@ -276,6 +270,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { private boolean shouldUpdate(PDOMBinding pdomBinding, IASTName fromName) throws CoreException { if (fromName != null) { + if (pdomBinding instanceof IParameter || pdomBinding instanceof ICPPTemplateParameter) + return false; if (fromName.isReference()) { return false; } @@ -300,6 +296,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { PDOMBinding createBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException { PDOMBinding pdomBinding= null; + // template parameters are created directly by their owners. + if (binding instanceof ICPPTemplateParameter) + return null; + if (binding instanceof ICPPSpecialization) { IBinding specialized = ((ICPPSpecialization)binding).getSpecializedBinding(); PDOMBinding pdomSpecialized= addBinding(specialized, null); @@ -307,15 +307,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { return null; pdomBinding = createSpecialization(parent, pdomSpecialized, binding); - } else if (binding instanceof ICPPTemplateParameter) { - if (binding instanceof ICPPTemplateTypeParameter) { - pdomBinding = new PDOMCPPTemplateTypeParameter(pdom, parent, (ICPPTemplateTypeParameter)binding); - } else if (binding instanceof ICPPTemplateNonTypeParameter) { - pdomBinding = new PDOMCPPTemplateNonTypeParameter(pdom, parent, (ICPPTemplateNonTypeParameter)binding); - } -// TODO other template parameter types -// else if (binding instanceof ICPPTemplateTemplateParameter) { -// pdomBinding = new PDOMCPPTemplateTemplateParameter(pdom, parent, (ICPPTemplateTemplateParameter)binding); } else if (binding instanceof ICPPField) { if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) { pdomBinding = new PDOMCPPField(pdom, parent, (ICPPField) binding); @@ -325,11 +316,11 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { pdomBinding = new PDOMCPPVariable(pdom, parent, var); } else if (binding instanceof ICPPFunctionTemplate) { if (binding instanceof ICPPConstructor) { - pdomBinding= new PDOMCPPConstructorTemplate(pdom, parent, (ICPPConstructor) binding); + pdomBinding= new PDOMCPPConstructorTemplate(pdom, this, parent, (ICPPConstructor) binding); } else if (binding instanceof ICPPMethod) { - pdomBinding= new PDOMCPPMethodTemplate(pdom, parent, (ICPPMethod) binding); + pdomBinding= new PDOMCPPMethodTemplate(pdom, this, parent, (ICPPMethod) binding); } else if (binding instanceof ICPPFunction) { - pdomBinding= new PDOMCPPFunctionTemplate(pdom, parent, (ICPPFunctionTemplate) binding); + pdomBinding= new PDOMCPPFunctionTemplate(pdom, this, parent, (ICPPFunctionTemplate) binding); } } else if (binding instanceof ICPPConstructor) { if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) { @@ -342,7 +333,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } else if (binding instanceof ICPPFunction) { pdomBinding = new PDOMCPPFunction(pdom, parent, (ICPPFunction) binding, true); } else if (binding instanceof ICPPClassTemplate) { - pdomBinding= new PDOMCPPClassTemplate(pdom, parent, (ICPPClassTemplate) binding); + pdomBinding= new PDOMCPPClassTemplate(pdom, this, parent, (ICPPClassTemplate) binding); } else if (binding instanceof ICPPClassType) { if (binding instanceof ICPPUnknownClassInstance) { pdomBinding= new PDOMCPPUnknownClassInstance(pdom, parent, (ICPPUnknownClassInstance) binding); @@ -378,12 +369,11 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { afterAddBinding(pdomBinding); } - pushPostProcesses(pdomBinding, binding); - return pdomBinding; } - private PDOMBinding createSpecialization(PDOMNode parent, PDOMBinding orig, IBinding special) throws CoreException { + private PDOMBinding createSpecialization(PDOMNode parent, PDOMBinding orig, IBinding special) + throws CoreException, DOMException { PDOMBinding result= null; if (special instanceof ICPPDeferredClassInstance) { if (orig instanceof ICPPClassTemplate) { @@ -402,7 +392,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } else if (special instanceof ICPPClassTemplatePartialSpecialization) { if (orig instanceof PDOMCPPClassTemplate) { result= new PDOMCPPClassTemplatePartialSpecialization( - pdom, parent, (ICPPClassTemplatePartialSpecialization) special, + pdom, this, parent, (ICPPClassTemplatePartialSpecialization) special, (PDOMCPPClassTemplate) orig); } } else if (special instanceof ICPPField) { @@ -432,24 +422,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { return result; } - private void pushPostProcesses(PDOMBinding pdomBinding, IBinding binding) throws CoreException, DOMException { - if (pdomBinding instanceof PDOMCPPClassTemplatePartialSpecialization && - binding instanceof ICPPClassTemplatePartialSpecialization) { - PDOMCPPClassTemplatePartialSpecialization pdomSpec = (PDOMCPPClassTemplatePartialSpecialization) pdomBinding; - ICPPClassTemplatePartialSpecialization spec = (ICPPClassTemplatePartialSpecialization) binding; - pushPostProcess(new ConfigurePartialSpecialization(pdomSpec, spec)); - } - if (pdomBinding instanceof PDOMCPPFunctionTemplate && binding instanceof ICPPFunction) { - PDOMCPPFunctionTemplate pdomTemplate = (PDOMCPPFunctionTemplate) pdomBinding; - ICPPFunction function = (ICPPFunction) binding; - pushPostProcess(new ConfigureFunctionTemplate(pdomTemplate, function)); - } - if (pdomBinding instanceof ICPPTemplateDefinition && binding instanceof ICPPTemplateDefinition) { - ICPPTemplateDefinition template = (ICPPTemplateDefinition) binding; - pushPostProcess(new ConfigureTemplate(template)); - } - } - private void addImplicitMethods(PDOMBinding type, ICPPClassType binding) throws CoreException { try { IScope scope = binding.getCompositeScope(); @@ -726,18 +698,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { private void handlePostProcesses() { while (!postProcesses.isEmpty()) { - popPostProcess().run(); + postProcesses.removeFirst().run(); } } - private void pushPostProcess(Runnable process) { - postProcesses.add(postProcesses.size(), process); - } - - private Runnable popPostProcess() { - return postProcesses.remove(postProcesses.size() - 1); - } - @Override public PDOMNode getNode(int record) throws CoreException { if (record == 0) @@ -804,9 +768,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { return new PDOMCPPUnknownClassInstance(pdom, record); case CPP_TEMPLATE_TYPE_PARAMETER: return new PDOMCPPTemplateTypeParameter(pdom, record); -// TODO other template parameter types -// case CPP_TEMPLATE_TEMPLATE_PARAMETER: -// return new PDOMCPPTemplateTemplateParameter(pdom, record); + case CPP_TEMPLATE_TEMPLATE_PARAMETER: + return new PDOMCPPTemplateTemplateParameter(pdom, record); case CPP_TEMPLATE_NON_TYPE_PARAMETER: return new PDOMCPPTemplateNonTypeParameter(pdom, record); case CPP_FIELD_SPECIALIZATION: diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java index 12ac9daa0ef..0712545ecb9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java @@ -60,7 +60,7 @@ class PDOMCPPMethod extends PDOMCPPFunction implements ICPPMethod { */ private static final int CV_OFFSET = PDOMCPPAnnotation.MAX_EXTRA_OFFSET + 1; - public PDOMCPPMethod(PDOM pdom, PDOMNode parent, ICPPMethod method) throws CoreException { + public PDOMCPPMethod(PDOM pdom, PDOMNode parent, ICPPMethod method) throws CoreException, DOMException { super(pdom, parent, method, true); Database db = pdom.getDB(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java index 0bbe3d8a0d1..23467dab9e5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java @@ -55,7 +55,7 @@ class PDOMCPPMethodSpecialization extends PDOMCPPFunctionSpecialization Database db = pdom.getDB(); try { - ICPPFunctionType type = (ICPPFunctionType) method.getType(); + ICPPFunctionType type = method.getType(); byte annotation = 0; annotation |= PDOMCAnnotation.encodeCVQualifiers(type) << CV_OFFSET; annotation |= PDOMCPPAnnotation.encodeExtraAnnotation(method); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodTemplate.java index 823dbe5d29c..5ee05b46622 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodTemplate.java @@ -47,14 +47,14 @@ class PDOMCPPMethodTemplate extends PDOMCPPFunctionTemplate implements ICPPMetho */ private static final int CV_OFFSET = PDOMCPPAnnotation.MAX_EXTRA_OFFSET + 1; - public PDOMCPPMethodTemplate(PDOM pdom, PDOMNode parent, - ICPPMethod method) throws CoreException { - super(pdom, parent, (ICPPFunctionTemplate) method); + public PDOMCPPMethodTemplate(PDOM pdom, PDOMCPPLinkage linkage, PDOMNode parent, ICPPMethod method) + throws CoreException, DOMException { + super(pdom, linkage, parent, (ICPPFunctionTemplate) method); Database db = pdom.getDB(); try { - ICPPFunctionType type = (ICPPFunctionType) method.getType(); + ICPPFunctionType type = method.getType(); byte annotation = 0; annotation |= PDOMCAnnotation.encodeCVQualifiers(type) << CV_OFFSET; annotation |= PDOMCPPAnnotation.encodeExtraAnnotation(method); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java index 06573644fc4..2ea00dfcf62 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java @@ -14,31 +14,35 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IType; 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.ICPPTemplateParameter; +import org.eclipse.cdt.internal.core.Util; 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.pdom.PDOM; 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.dom.IPDOMMemberOwner; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** * Binding for template non-type parameter in the index. */ -class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMemberOwner, - ICPPTemplateNonTypeParameter { +class PDOMCPPTemplateNonTypeParameter extends PDOMCPPBinding implements IPDOMMemberOwner, + ICPPTemplateNonTypeParameter, IPDOMCPPTemplateParameter { - private static final int MEMBERLIST = PDOMCPPVariable.RECORD_SIZE; - private static final int PARAMETERID= PDOMCPPVariable.RECORD_SIZE + 4; - private static final int DEFAULTVAL= PDOMCPPVariable.RECORD_SIZE + 8; + private static final int TYPE_OFFSET= PDOMCPPBinding.RECORD_SIZE; + private static final int PARAMETERID= PDOMCPPBinding.RECORD_SIZE + 4; + private static final int DEFAULTVAL= PDOMCPPBinding.RECORD_SIZE + 8; private int fCachedParamID= -1; @@ -50,17 +54,9 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe public PDOMCPPTemplateNonTypeParameter(PDOM pdom, PDOMNode parent, ICPPTemplateNonTypeParameter param) throws CoreException { - super(pdom, parent, param); + super(pdom, parent, param.getNameCharArray()); final Database db = pdom.getDB(); db.putInt(record + PARAMETERID, param.getParameterID()); - 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) { @@ -92,6 +88,40 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe return null; } } + + @Override + public void update(PDOMLinkage linkage, IBinding newBinding) throws CoreException { + if (newBinding instanceof ICPPTemplateNonTypeParameter) { + ICPPTemplateNonTypeParameter ntp= (ICPPTemplateNonTypeParameter) newBinding; + updateName(newBinding.getNameCharArray()); + final Database db = pdom.getDB(); + IType mytype= getType(); + int valueRec= db.getInt(record + DEFAULTVAL); + try { + IType newType= ntp.getType(); + setType(linkage, newType); + if (mytype != null) + linkage.deleteType(mytype, record); + if (setDefaultValue(db, ntp) && valueRec != 0) { + db.getString(valueRec).delete(); + } + } catch (DOMException e) { + throw new CoreException(Util.createStatus(e)); + } + } + } + + public void forceDelete(PDOMLinkage linkage) throws CoreException { + getDBName().delete(); + IType type= getType(); + if (type instanceof PDOMNode) { + ((PDOMNode) type).delete(linkage); + } + Database db= pdom.getDB(); + int valueRec= db.getInt(record + DEFAULTVAL); + if (valueRec != 0) + db.getString(valueRec).delete(); + } public short getParameterPosition() { readParamID(); @@ -119,24 +149,83 @@ class PDOMCPPTemplateNonTypeParameter extends PDOMCPPVariable implements IPDOMMe } } } + + private void setType(final PDOMLinkage linkage, IType newType) throws CoreException, DOMException { + PDOMNode typeNode = linkage.addType(this, newType); + pdom.getDB().putInt(record + TYPE_OFFSET, typeNode != null ? typeNode.getRecord() : 0); + } - @Override - public void addChild(PDOMNode member) throws CoreException { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); - list.addMember(member); + public void configure(ICPPTemplateParameter param) { + try { + if (param instanceof ICPPTemplateNonTypeParameter) { + ICPPTemplateNonTypeParameter nonTypeParm= (ICPPTemplateNonTypeParameter) param; + setType(getLinkage(), nonTypeParm.getType()); + final Database db= pdom.getDB(); + setDefaultValue(db, nonTypeParm); + } + } catch (CoreException e) { + CCorePlugin.log(e); + } catch (DOMException e) { + CCorePlugin.log(e); + } } - @Override - public void accept(IPDOMVisitor visitor) throws CoreException { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); - list.accept(visitor); + private boolean setDefaultValue(Database db, ICPPTemplateNonTypeParameter nonTypeParm) throws CoreException { + ICPPTemplateArgument val= nonTypeParm.getDefaultValue(); + if (val != null) { + IValue sval= val.getNonTypeValue(); + if (sval != null) { + IString s= db.newString(sval.getCanonicalRepresentation()); + db.putInt(record + DEFAULTVAL, s.getRecord()); + return true; + } + } + return false; } - - @Override - public Object clone() { fail(); return null; } + public IType getType() { + try { + int typeRec = pdom.getDB().getInt(record + TYPE_OFFSET); + return (IType)getLinkageImpl().getNode(typeRec); + } catch (CoreException e) { + CCorePlugin.log(e); + return null; + } + } + public IValue getInitialValue() { + return null; + } + public boolean isAuto() { + return false; + } + public boolean isExtern() { + return false; + } + public boolean isRegister() { + return false; + } + public boolean isStatic() { + return false; + } + public boolean isExternC() { + return false; + } + public boolean isMutable() { + return false; + } + + @Override + public Object clone() { + fail(); + return null; + } + /** + * @deprecated + */ + @Deprecated public IASTExpression getDefault() { return null; } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java new file mode 100644 index 00000000000..5ec8dc25e32 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java @@ -0,0 +1,349 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom.cpp; + +import org.eclipse.cdt.core.CCorePlugin; +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.IField; +import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; +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.ICPPConstructor; +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.ICPPScope; +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.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; +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.CPPTemplateArgument; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType; +import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; +import org.eclipse.cdt.internal.core.index.IIndexType; +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.PDOMNodeLinkedList; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; +import org.eclipse.core.runtime.CoreException; + +/** + * mstodo + * + */ +public class PDOMCPPTemplateTemplateParameter extends PDOMCPPBinding + implements ICPPTemplateTemplateParameter, ICPPUnknownBinding, ICPPUnknownType, IIndexType, + IPDOMCPPTemplateParameter, IPDOMCPPTemplateParameterOwner { + + private static final int DEFAULT_TYPE = PDOMCPPBinding.RECORD_SIZE + 0; + private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 4; + private static final int PARAMETERID= PDOMCPPBinding.RECORD_SIZE + 8; + private static final int PARAMETERS= PDOMCPPBinding.RECORD_SIZE + 12; + + /** + * The size in bytes of a PDOMCPPTemplateTypeParameter record in the database. + */ + @SuppressWarnings("hiding") + protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 14; + + private ICPPScope fUnknownScope; + private int fCachedParamID= -1; + private IPDOMCPPTemplateParameter[] params; + + public PDOMCPPTemplateTemplateParameter(PDOM pdom, PDOMNode parent, ICPPTemplateTemplateParameter param) + throws CoreException, DOMException { + super(pdom, parent, param.getNameCharArray()); + + final Database db = pdom.getDB(); + db.putInt(record + PARAMETERID, param.getParameterID()); + final ICPPTemplateParameter[] origParams= param.getTemplateParameters(); + final IPDOMCPPTemplateParameter[] params = PDOMTemplateParameterArray.createPDOMTemplateParameters(pdom, this, origParams); + int rec= PDOMTemplateParameterArray.putArray(db, params); + pdom.getDB().putInt(record + PARAMETERS, rec); + } + + public PDOMCPPTemplateTemplateParameter(PDOM pdom, int bindingRecord) { + super(pdom, bindingRecord); + } + + @Override + protected int getRecordSize() { + return RECORD_SIZE; + } + + @Override + public int getNodeType() { + return IIndexCPPBindingConstants.CPP_TEMPLATE_TEMPLATE_PARAMETER; + } + + public short getParameterPosition() { + readParamID(); + return (short) fCachedParamID; + } + + public short getTemplateNestingLevel() { + readParamID(); + return (short)(fCachedParamID >> 16); + } + + public int getParameterID() { + readParamID(); + return fCachedParamID; + } + + private void readParamID() { + if (fCachedParamID == -1) { + try { + final Database db = pdom.getDB(); + fCachedParamID= db.getInt(record + PARAMETERID); + } catch (CoreException e) { + CCorePlugin.log(e); + fCachedParamID= -2; + } + } + } + + @Override + public void addChild(PDOMNode member) throws CoreException { + PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); + list.addMember(member); + } + + @Override + public void accept(IPDOMVisitor visitor) throws CoreException { + PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); + list.accept(visitor); + } + + public boolean isSameType(IType type) { + if (type instanceof ITypedef) { + return type.isSameType(this); + } + + if (!(type instanceof ICPPTemplateTemplateParameter)) + return false; + + return getParameterID() == ((ICPPTemplateParameter) type).getParameterID(); + } + + public IType getDefault() { + try { + PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + DEFAULT_TYPE)); + if (node instanceof IType) { + return (IType) node; + } + } catch (CoreException e) { + CCorePlugin.log(e); + } + return null; + } + + public ICPPTemplateArgument getDefaultValue() { + IType d= getDefault(); + if (d == null) + return null; + + return new CPPTemplateArgument(d); + } + + @Override + public Object clone() { fail(); return null; } + + + public ICPPScope asScope() { + if (fUnknownScope == null) { + fUnknownScope= new PDOMCPPUnknownScope(this, new CPPASTName(getNameCharArray())); + } + return fUnknownScope; + } + + public IASTName getUnknownName() { + return new CPPASTName(getNameCharArray()); + } + + public void configure(ICPPTemplateParameter param) { + try { + ICPPTemplateArgument val= param.getDefaultValue(); + if (val != null) { + IType dflt= val.getTypeValue(); + if (dflt != null) { + final Database db= getPDOM().getDB(); + PDOMNode typeNode = getLinkageImpl().addType(this, dflt); + if (typeNode != null) { + db.putInt(record + DEFAULT_TYPE, typeNode.getRecord()); + } + } + } + } catch (CoreException e) { + CCorePlugin.log(e); + } + } + + @Override + public void update(PDOMLinkage linkage, IBinding newBinding) throws CoreException { + if (newBinding instanceof ICPPTemplateTemplateParameter) { + final Database db = pdom.getDB(); + ICPPTemplateTemplateParameter ttp= (ICPPTemplateTemplateParameter) newBinding; + updateName(newBinding.getNameCharArray()); + IType newDefault= null; + try { + newDefault = ttp.getDefault(); + } catch (DOMException e) { + // ignore + } + if (newDefault != null) { + IType mytype= getDefault(); + PDOMNode typeNode = getLinkageImpl().addType(this, newDefault); + if (typeNode != null) { + db.putInt(record + DEFAULT_TYPE, typeNode.getRecord()); + if (mytype != null) + linkage.deleteType(mytype, record); + } + } + int oldRec= db.getInt(record + PARAMETERS); + IPDOMCPPTemplateParameter[] oldParams= getTemplateParameters(); + try { + params= PDOMTemplateParameterArray.createPDOMTemplateParameters(pdom, this, ttp.getTemplateParameters()); + int newRec= PDOMTemplateParameterArray.putArray(db, params); + db.putInt(record + PARAMETERS, newRec); + if (oldRec != 0) + db.free(oldRec); + for (IPDOMCPPTemplateParameter opar : oldParams) { + opar.forceDelete(linkage); + } + } catch (DOMException e) { + } + } + } + + public void forceDelete(PDOMLinkage linkage) throws CoreException { + getDBName().delete(); + IType type= getDefault(); + if (type instanceof PDOMNode) { + ((PDOMNode) type).delete(linkage); + } + Database db= pdom.getDB(); + int valueRec= db.getInt(record + DEFAULT_TYPE); + if (valueRec != 0) + db.getString(valueRec).delete(); + + int oldRec= db.getInt(record + PARAMETERS); + IPDOMCPPTemplateParameter[] oldParams= getTemplateParameters(); + if (oldRec != 0) + db.free(oldRec); + for (IPDOMCPPTemplateParameter opar : oldParams) { + opar.forceDelete(linkage); + } + } + + public IPDOMCPPTemplateParameter[] getTemplateParameters() { + if (params == null) { + try { + int rec= pdom.getDB().getInt(record + PARAMETERS); + if (rec == 0) { + params= IPDOMCPPTemplateParameter.EMPTY_ARRAY; + } else { + params= PDOMTemplateParameterArray.getArray(this, rec); + } + } catch (CoreException e) { + CCorePlugin.log(e); + params = IPDOMCPPTemplateParameter.EMPTY_ARRAY; + } + } + return params; + } + + public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() { + return ICPPClassTemplatePartialSpecialization.EMPTY_PARTIAL_SPECIALIZATION_ARRAY; + } + + public IField findField(String name) { + return null; + } + + public ICPPMethod[] getAllDeclaredMethods() { + return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; + } + + public ICPPBase[] getBases() { + return ICPPBase.EMPTY_BASE_ARRAY; + } + + public ICPPConstructor[] getConstructors() { + return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; + } + + public ICPPField[] getDeclaredFields() { + return ICPPField.EMPTY_CPPFIELD_ARRAY; + } + + public ICPPMethod[] getDeclaredMethods() { + return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; + } + + public IField[] getFields() { + return ICPPField.EMPTY_CPPFIELD_ARRAY; + } + + public IBinding[] getFriends() { + return IBinding.EMPTY_BINDING_ARRAY; + } + + public ICPPMethod[] getMethods() { + return ICPPMethod.EMPTY_CPPMETHOD_ARRAY; + } + + public ICPPClassType[] getNestedClasses() { + return ICPPClassType.EMPTY_CLASS_ARRAY; + } + + public IScope getCompositeScope() { + return asScope(); + } + + public int getKey() { + return 0; + } + + public boolean isAnonymous() { + return false; + } + + public ICPPTemplateParameter adaptTemplateParameter(ICPPTemplateParameter param) { + int pos = param.getParameterPosition(); + ICPPTemplateParameter[] pars = getTemplateParameters(); + + if (pars == null || pos >= pars.length) + return null; + + ICPPTemplateParameter result= pars[pos]; + if (param instanceof ICPPTemplateTypeParameter) { + if (result instanceof ICPPTemplateTypeParameter) + return result; + } else if (param instanceof ICPPTemplateNonTypeParameter) { + if (result instanceof ICPPTemplateNonTypeParameter) + return result; + } else if (param instanceof ICPPTemplateTemplateParameter) { + if (result instanceof ICPPTemplateTemplateParameter) + return result; + } + return null; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java index 0c89c031f45..a62d741794f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java @@ -16,13 +16,13 @@ import org.eclipse.cdt.core.CCorePlugin; 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.IType; 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.ICPPTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; -import org.eclipse.cdt.internal.core.Util; 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; @@ -33,6 +33,7 @@ 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.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; @@ -40,7 +41,8 @@ import org.eclipse.core.runtime.CoreException; * Binding for template type parameters in the index. */ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMemberOwner, - ICPPTemplateTypeParameter, ICPPUnknownBinding, ICPPUnknownType, IIndexType { + ICPPTemplateTypeParameter, ICPPUnknownBinding, ICPPUnknownType, IIndexType, + IPDOMCPPTemplateParameter { private static final int DEFAULT_TYPE = PDOMCPPBinding.RECORD_SIZE + 0; private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 4; @@ -55,23 +57,12 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember private ICPPScope fUnknownScope; private int fCachedParamID= -1; - public PDOMCPPTemplateTypeParameter(PDOM pdom, PDOMNode parent, - ICPPTemplateTypeParameter param) throws CoreException { + public PDOMCPPTemplateTypeParameter(PDOM pdom, PDOMNode parent, ICPPTemplateTypeParameter param) + throws CoreException { super(pdom, parent, param.getNameCharArray()); - try { - final Database db = pdom.getDB(); - db.putInt(record + PARAMETERID, param.getParameterID()); - IType dflt = param.getDefault(); - if (dflt != null) { - PDOMNode typeNode = getLinkageImpl().addType(this, dflt); - if (typeNode != null) { - db.putInt(record + DEFAULT_TYPE, typeNode.getRecord()); - } - } - } catch (DOMException e) { - throw new CoreException(Util.createStatus(e)); - } + final Database db = pdom.getDB(); + db.putInt(record + PARAMETERID, param.getParameterID()); } public PDOMCPPTemplateTypeParameter(PDOM pdom, int bindingRecord) { @@ -172,4 +163,54 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember public IASTName getUnknownName() { return new CPPASTName(getNameCharArray()); } + + public void configure(ICPPTemplateParameter param) { + try { + ICPPTemplateArgument val= param.getDefaultValue(); + if (val != null) { + IType dflt= val.getTypeValue(); + if (dflt != null) { + final Database db= getPDOM().getDB(); + PDOMNode typeNode = getLinkageImpl().addType(this, dflt); + if (typeNode != null) { + db.putInt(record + DEFAULT_TYPE, typeNode.getRecord()); + } + } + } + } catch (CoreException e) { + CCorePlugin.log(e); + } + } + + @Override + public void update(PDOMLinkage linkage, IBinding newBinding) throws CoreException { + if (newBinding instanceof ICPPTemplateTypeParameter) { + ICPPTemplateTypeParameter ttp= (ICPPTemplateTypeParameter) newBinding; + updateName(newBinding.getNameCharArray()); + IType newDefault= null; + try { + newDefault = ttp.getDefault(); + } catch (DOMException e) { + // ignore + } + if (newDefault != null) { + final Database db = pdom.getDB(); + IType mytype= getDefault(); + PDOMNode typeNode = getLinkageImpl().addType(this, newDefault); + if (typeNode != null) { + db.putInt(record + DEFAULT_TYPE, typeNode.getRecord()); + if (mytype != null) + linkage.deleteType(mytype, record); + } + } + } + } + + public void forceDelete(PDOMLinkage linkage) throws CoreException { + getDBName().delete(); + IType type= getDefault(); + if (type instanceof PDOMNode) { + ((PDOMNode) type).delete(linkage); + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMTemplateParameterArray.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMTemplateParameterArray.java new file mode 100644 index 00000000000..f1e4a6e7ce4 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMTemplateParameterArray.java @@ -0,0 +1,93 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom.cpp; + +import org.eclipse.cdt.core.dom.ast.DOMException; +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.ICPPTemplateTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; +import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.cdt.internal.core.pdom.db.Database; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; + +/** + * Collects methods to store an argument list in the database + */ +public class PDOMTemplateParameterArray { + /** + * Stores the given template arguments in the database. + * @return the record by which the arguments can be referenced. + */ + public static int putArray(final Database db, IPDOMCPPTemplateParameter[] params) throws CoreException { + final short len= (short) Math.min(params.length, (Database.MAX_MALLOC_SIZE-2)/8); + final int block= db.malloc(2+8*len); + int p= block; + + db.putShort(p, len); p+=2; + for (int i=0; i<len; i++, p+=4) { + final IPDOMCPPTemplateParameter elem= params[i]; + db.putInt(p, elem == null ? 0 : elem.getRecord()); + } + return block; + } + + /** + * Restores an array of template arguments from the database. + */ + public static IPDOMCPPTemplateParameter[] getArray(PDOMNode parent, int rec) throws CoreException { + final PDOMLinkage linkage= parent.getLinkage(); + final Database db= linkage.getPDOM().getDB(); + final short len= db.getShort(rec); + + Assert.isTrue(len >= 0 && len <= (Database.MAX_MALLOC_SIZE-2)/8); + if (len == 0) { + return IPDOMCPPTemplateParameter.EMPTY_ARRAY; + } + + rec+=2; + IPDOMCPPTemplateParameter[] result= new IPDOMCPPTemplateParameter[len]; + for (int i=0; i<len; i++) { + final int nodeRec= db.getInt(rec); rec+=4; + result[i]= nodeRec == 0 ? null : (IPDOMCPPTemplateParameter) linkage.getNode(nodeRec); + } + return result; + } + + /** + * Creates template parameters in the pdom + */ + public static IPDOMCPPTemplateParameter[] createPDOMTemplateParameters(PDOM pdom, PDOMNode parent, ICPPTemplateParameter[] origParams) throws CoreException, DOMException { + IPDOMCPPTemplateParameter[] params= new IPDOMCPPTemplateParameter[origParams.length]; + for (int i = 0; i < origParams.length; i++) { + params[i]= createPDOMTemplateParameter(pdom, parent, origParams[i]); + } + return params; + } + + /** + * Creates a template parameter in the pdom + */ + public static IPDOMCPPTemplateParameter createPDOMTemplateParameter(PDOM pdom, PDOMNode parent, ICPPTemplateParameter origParam) throws CoreException, DOMException { + IPDOMCPPTemplateParameter param= null; + if (origParam instanceof ICPPTemplateNonTypeParameter) { + param= new PDOMCPPTemplateNonTypeParameter(pdom, parent, (ICPPTemplateNonTypeParameter) origParam); + } else if (origParam instanceof ICPPTemplateTypeParameter) { + param= new PDOMCPPTemplateTypeParameter(pdom, parent, (ICPPTemplateTypeParameter) origParam); + } else if (origParam instanceof ICPPTemplateTemplateParameter) { + param= new PDOMCPPTemplateTemplateParameter(pdom, parent, (ICPPTemplateTemplateParameter) origParam); + } + return param; + } +} |