diff options
Diffstat (limited to 'core')
3 files changed, 11 insertions, 36 deletions
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 62415d0358b..4810f34bbb2 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 @@ -17,7 +17,6 @@ package org.eclipse.cdt.internal.core.pdom.dom; 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.db.Database; @@ -123,7 +122,7 @@ public abstract class PDOMNamedNode extends PDOMNode { public IIndexFragmentBinding getParentBinding() throws CoreException { PDOMNode parent= getParentNode(); - if (parent instanceof IIndexBinding) { + if (parent instanceof IIndexFragmentBinding) { return (IIndexFragmentBinding) parent; } return null; 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 23a3780a20a..d6042ad524d 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 @@ -76,18 +76,17 @@ class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization implements ICP Database db = getDB(); try { + IParameter[] params= function.getParameters(); + IType[] paramTypes= IType.EMPTY_TYPE_ARRAY; IFunctionType ft= function.getType(); if (ft != null) { PDOMNode typeNode = getLinkage().addType(this, ft); if (typeNode != null) { db.putRecPtr(record + FUNCTION_TYPE, typeNode.getRecord()); + paramTypes= ((IFunctionType) typeNode).getParameterTypes(); } } - ft= getType(); - IParameter[] params= function.getParameters(); - IType[] paramTypes= ft.getParameterTypes(); - ICPPFunction sFunc= (ICPPFunction) ((ICPPSpecialization)function).getSpecializedBinding(); IParameter[] sParams= sFunc.getParameters(); IType[] sParamTypes= sFunc.getType().getParameterTypes(); @@ -95,11 +94,13 @@ class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization implements ICP final int length= Math.min(sParams.length, params.length); db.putInt(record + NUM_PARAMS, length); for (int i=0; i<length; ++i) { + final PDOMNode stype= linkage.addType(this, i<sParamTypes.length ? sParamTypes[i] : null); + final long stypeRec= stype == null ? 0 : stype.getRecord(); + PDOMCPPParameter sParam = new PDOMCPPParameter(getLinkage(), this, sParams[i], stypeRec); + long typeRecord= i<paramTypes.length && paramTypes[i]!=null ? ((PDOMNode)paramTypes[i]).getRecord() : 0; - //TODO shouldn't need to make new parameter (find old one) - final IType type= i<sParamTypes.length ? sParamTypes[i] : null; - PDOMCPPParameter sParam = new PDOMCPPParameter(getLinkage(), this, sParams[i], type); - setFirstParameter(new PDOMCPPParameterSpecialization(getLinkage(), this, (ICPPParameter) params[i], sParam, typeRecord)); + final ICPPParameter param = (ICPPParameter) params[i]; + setFirstParameter(new PDOMCPPParameterSpecialization(getLinkage(), this, param, sParam, typeRecord)); } db.putByte(record + ANNOTATION, PDOMCPPAnnotation.encodeAnnotation(function)); } catch (DOMException e) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java index 1819529198e..bfb84c392a4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java @@ -19,7 +19,6 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.index.IIndexFile; -import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexScope; @@ -77,30 +76,6 @@ class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter, IPDOMBind super(linkage, record); } - public PDOMCPPParameter(PDOMLinkage linkage, PDOMNode parent, IParameter param, IType type) - throws CoreException { - super(linkage, parent, param.getNameCharArray()); - - Database db = getDB(); - - db.putRecPtr(record + NEXT_PARAM, 0); - byte flags= encodeFlags(param); - db.putByte(record + FLAGS, flags); - - try { - if (type == null) - type= param.getType(); - if (type != null) { - PDOMNode typeNode = getLinkage().addType(this, type); - db.putRecPtr(record + TYPE, typeNode != null ? typeNode.getRecord() : 0); - } - byte annotations = PDOMCPPAnnotation.encodeAnnotation(param); - db.putByte(record + ANNOTATIONS, annotations); - } catch (DOMException e) { - throw new CoreException(Util.createStatus(e)); - } - } - public PDOMCPPParameter(PDOMLinkage linkage, PDOMNode parent, IParameter param, long typeRecord) throws CoreException { super(linkage, parent, param.getNameCharArray()); @@ -265,7 +240,7 @@ class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter, IPDOMBind @Override public void delete(PDOMLinkage linkage) throws CoreException { - linkage.deleteType(getType(), record); + // the parameter reuses the type from the function type, so do not delete it. PDOMCPPParameter next= getNextParameter(); if (next != null) { next.delete(linkage); |