Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom')
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IInternalPDOMNode.java20
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNamedNode.java21
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java9
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPTemplateParameter.java39
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBinding.java47
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java247
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java8
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java15
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructor.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorTemplate.java5
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java24
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumeration.java22
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java38
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java3
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java109
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplateSpecialization.java3
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionType.java29
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java139
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java2
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodTemplate.java8
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateNonTypeParameter.java143
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java349
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java75
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMTemplateParameterArray.java93
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;
+ }
+}

Back to the top