From 6741a8d019b2908ddd9ae80d086448eff4fba303 Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Thu, 26 Apr 2007 16:41:39 +0000 Subject: [PATCH] 183986: extract a Comparator from PDOMBinding --- .../DefaultFragmentBindingComparator.java | 43 +++++++++++ .../core/index/IIndexBindingConstants.java | 22 ++++++ .../core/index/IIndexCBindingConstants.java | 27 +++++++ .../core/index/IIndexCPPBindingConstants.java | 56 ++++++++++++++ .../core/index/IIndexFragmentBinding.java | 7 +- .../IIndexFragmentBindingComparator.java | 40 ++++++++++ .../IndexCPPSignatureUtil.java} | 37 +++++----- .../composite/AbstractCompositeFactory.java | 42 ++++++++++- .../internal/core/pdom/dom/PDOMBinding.java | 73 ++++++++++--------- .../dom/PDOMFragmentBindingComparator.java | 27 +++++++ .../internal/core/pdom/dom/PDOMLinkage.java | 9 +-- .../cdt/internal/core/pdom/dom/PDOMNode.java | 4 +- .../core/pdom/dom/c/PDOMCLinkage.java | 14 +--- .../core/pdom/dom/c/PDOMCParameter.java | 4 + .../core/pdom/dom/cpp/CPPFindBinding.java | 5 +- ...CPPClassTemplatePartialSpecialization.java | 8 +- .../core/pdom/dom/cpp/PDOMCPPFunction.java | 26 ++++++- .../pdom/dom/cpp/PDOMCPPFunctionInstance.java | 6 +- .../cpp/PDOMCPPFunctionSpecialization.java | 6 +- .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 43 +---------- .../core/pdom/dom/cpp/PDOMCPPParameter.java | 4 + .../pdom/dom/cpp/PDOMCPPSpecialization.java | 3 +- 22 files changed, 373 insertions(+), 133 deletions(-) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/DefaultFragmentBindingComparator.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexBindingConstants.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCBindingConstants.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentBindingComparator.java rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/{pdom/dom/cpp/PDOMCPPOverloaderUtil.java => index/IndexCPPSignatureUtil.java} (89%) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFragmentBindingComparator.java diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/DefaultFragmentBindingComparator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/DefaultFragmentBindingComparator.java new file mode 100644 index 00000000000..749e46e8a12 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/DefaultFragmentBindingComparator.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian 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: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.index; + +/** + * Binding comparator suitable for C/C++ across index implementations. This will not be used + * unless we ever have non-PDOM implementations of IIndexFragment, and in that case we may find + * this implementation is too slow. + */ +public class DefaultFragmentBindingComparator implements IIndexFragmentBindingComparator { + public int compare(IIndexFragmentBinding a, IIndexFragmentBinding b) { + int cmp= compareQualifiedNames(a.getQualifiedName(),b.getQualifiedName()); + if(cmp==0) { + int ac= a.getBindingConstant(), bc= b.getBindingConstant(); + cmp= acbc ? 1 : 0); + if(cmp==0) { + cmp= IndexCPPSignatureUtil.compareSignatures(a, b); + } + } + return cmp; + } + + private int compareQualifiedNames(String[] afqn, String[] bfqn) { + if(afqn.length < bfqn.length) + return -1; + if(afqn.length > bfqn.length) + return 1; + for(int i=0; i + * Compares two index fragment bindings using the following scheme: + *
    + *
  • Compares the fully qualfied names, by pair-wise lexicographic comparison + * of individual name components, starting with the innermost scoped name. If + * all pair-wise comparisons are equal, then the comparison routine continues, otherwise returning + *
      + *
    • -1 if the first differing component name of a was < the pairwise equivalent from b + *
    • 1 if the first differing component name of a was > the pairwise equivalent from b + *
    In case binding a has fewer component names than binding b then + * -1 is returned, otherwise 1 is returned. + *
  • Compares a course-grained binding type dependent on language. For C/C++ the + * type comparison is performed by comparing the bindings associated constant as defined in + * IIndexCNodeConstants or IIndexCPPNodeConstants. If these are equal comparison continues + *
  • Compares fine grained binding information dependent on the binding language. For C++ the + * type comparison is relevant for binding types that are further differentiated by type signatures via + * {@link IndexCPPSignatureUtil} + *
+ * @param a a non null {@link IIndexFragmentBinding} + * @param b a non null {@link IIndexFragmentBinding} + * @return -1, 0, 1 or Integer.MIN_VALUE if this comparator cannot compare the two + */ + public int compare(IIndexFragmentBinding a, IIndexFragmentBinding b); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPOverloaderUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java similarity index 89% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPOverloaderUtil.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java index c5188d41dd1..deae0258b96 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPOverloaderUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexCPPSignatureUtil.java @@ -8,7 +8,7 @@ * Contributors: * QNX - Initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.internal.core.pdom.dom.cpp; +package org.eclipse.cdt.internal.core.index; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IName; @@ -29,9 +29,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; -import org.eclipse.cdt.internal.core.index.IIndexInternalTemplateParameter; -import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.runtime.CoreException; /** @@ -40,7 +37,7 @@ import org.eclipse.core.runtime.CoreException; * * @author Bryan Wilkinson */ -class PDOMCPPOverloaderUtil { +public class IndexCPPSignatureUtil { /** * Returns the signature for the binding. Returns an empty string if a @@ -172,19 +169,23 @@ class PDOMCPPOverloaderUtil { String sig= getFunctionParameterString(type); return sig.length() == 0 ? null : new Integer(sig.hashCode()); } - - public static int compare(IPDOMOverloader a, Object b) { - if(b instanceof IPDOMOverloader) { - IPDOMOverloader bb= (IPDOMOverloader) b; - try { - int mySM = a.getSignatureMemento(); - int otherSM = bb.getSignatureMemento(); - return mySM == otherSM ? 0 : mySM < otherSM ? -1 : 1; - } catch(CoreException ce) { - CCorePlugin.log(ce); - } - } else { - throw new PDOMNotImplementedError(b.getClass().toString()); + + /** + * Compares two bindings for signature information. Signature information covers + * function signatures, or template specialization/instance arguments. + * @param a + * @param b + * @return + */ + public static int compareSignatures(IBinding a, IBinding b) { + try { + int siga= getSignature(a).hashCode(); + int sigb= getSignature(b).hashCode(); + return sigasigb ? 1 : 0); + } catch(CoreException ce) { + CCorePlugin.log(ce); + } catch(DOMException de) { + CCorePlugin.log(de); } return 0; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/AbstractCompositeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/AbstractCompositeFactory.java index d183b2bb704..866e798e953 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/AbstractCompositeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/AbstractCompositeFactory.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite; +import java.util.Comparator; import java.util.TreeSet; import org.eclipse.cdt.core.CCorePlugin; @@ -17,7 +18,10 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.internal.core.index.CIndex; +import org.eclipse.cdt.internal.core.index.DefaultFragmentBindingComparator; +import org.eclipse.cdt.internal.core.index.IIndexFragmentBindingComparator; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMFragmentBindingComparator; import org.eclipse.core.runtime.CoreException; /** @@ -25,9 +29,16 @@ import org.eclipse.core.runtime.CoreException; */ public abstract class AbstractCompositeFactory implements ICompositesFactory { protected IIndex index; + private Comparator fragmentComparator; public AbstractCompositeFactory(IIndex index) { - this.index = index; + this.index= index; + this.fragmentComparator= new FragmentBindingComparator( + new IIndexFragmentBindingComparator[] { + new PDOMFragmentBindingComparator(), + new DefaultFragmentBindingComparator() + } + ); } /* @@ -54,14 +65,14 @@ public abstract class AbstractCompositeFactory implements ICompositesFactory { * @param fragmentBindings * @return an array of unique bindings */ - protected static IIndexFragmentBinding[] mergeBindingArrays(IIndexFragmentBinding[][] fragmentBindings) { - TreeSet ts = new TreeSet(); + protected IIndexFragmentBinding[] mergeBindingArrays(IIndexFragmentBinding[][] fragmentBindings) { + TreeSet ts = new TreeSet(fragmentComparator); for(int i=0; i
  • -1 if b0 < b1 + *
  • 0 if b0 == b1 + *
  • 1 if b0 > b1 + * + * @throws CoreException + */ private static int comparePDOMBindingQNs(PDOMBinding b0, PDOMBinding b1) { try { int cmp = 0; @@ -267,40 +283,31 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen } } - public int compareTo(Object other) { - if(other==null) - return 1; - - if(other instanceof IBinding) { - if(!(other instanceof PDOMBinding)) { - try { - other= getLinkageImpl().adaptBinding((IBinding)other); - } catch(CoreException ce) { - CCorePlugin.log(ce); - } - } - if(other instanceof PDOMBinding) { - PDOMBinding otherBinding = (PDOMBinding) other; - int cmp = comparePDOMBindingQNs(this, otherBinding); - if(cmp==0) { - int t1 = getNodeType(); - int t2 = otherBinding.getNodeType(); - return t1 < t2 ? -1 : (t1 > t2 ? 1 : 0); - } - return cmp; - } - if(other==null) - return 1; - throw new PDOMNotImplementedError(""+other); //$NON-NLS-1$ + /** + * Compares two PDOMBinding objects in accordance with + * {@link IIndexFragmentBindingComparator#compare(IIndexFragmentBinding, IIndexFragmentBinding)} + * @param other + * @return + */ + public int pdomCompareTo(PDOMBinding other) { + PDOMBinding otherBinding = (PDOMBinding) other; + int cmp = comparePDOMBindingQNs(this, otherBinding); + if(cmp==0) { + int t1 = getNodeType(); + int t2 = otherBinding.getNodeType(); + return t1 < t2 ? -1 : (t1 > t2 ? 1 : 0); } - return -1; + return cmp; } - public boolean equals(Object o) { - if (o instanceof PDOMNode) { - PDOMNode node= (PDOMNode) o; - return pdom==node.pdom && record == node.record; - } - return compareTo(o)==0; + /** + * Returns whether pdomCompareTo returns zero + */ + public final boolean pdomEquals(PDOMBinding other) { + return pdomCompareTo(other)==0; } -} + + public final int getBindingConstant() { + return getNodeType(); + } +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFragmentBindingComparator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFragmentBindingComparator.java new file mode 100644 index 00000000000..a4fb24642e4 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFragmentBindingComparator.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian 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: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom; + +import org.eclipse.cdt.internal.core.index.IIndexFragmentBindingComparator; +import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; + +/** + * {@link IIndexFragmentBindingComparator} suitable for comparing two PDOMBindings + * + */ +public class PDOMFragmentBindingComparator implements IIndexFragmentBindingComparator { + public int compare(IIndexFragmentBinding a, IIndexFragmentBinding b) { + if(a instanceof PDOMBinding && b instanceof PDOMBinding) { + return ((PDOMBinding) a).pdomCompareTo((PDOMBinding) b); + } + return Integer.MIN_VALUE; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java index 98221fcc5fc..45aa44db83b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java @@ -41,6 +41,7 @@ import org.eclipse.cdt.core.index.IIndexLinkage; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecializationScope; +import org.eclipse.cdt.internal.core.index.IIndexBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.index.composite.CompositeScope; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -57,7 +58,7 @@ import org.eclipse.core.runtime.CoreException; * This class represents a collection of symbols that can be linked together at * link time. These are generally global symbols specific to a given language. */ -public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage { +public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage, IIndexBindingConstants { // record offsets private static final int ID_OFFSET = PDOMNamedNode.RECORD_SIZE + 0; @@ -68,12 +69,6 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage // node types protected static final int LINKAGE= 0; // special one for myself - static final int POINTER_TYPE= 1; - static final int ARRAY_TYPE= 2; - static final int QUALIFIER_TYPE= 3; - static final int FILE_LOCAL_SCOPE_TYPE= 4; - - protected static final int LAST_NODE_TYPE = FILE_LOCAL_SCOPE_TYPE; public PDOMLinkage(PDOM pdom, int record) { super(pdom, record); 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 128098c9c79..efb5edad9c4 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 @@ -67,7 +67,7 @@ public abstract class PDOMNode implements IPDOMNode { return record; } - public boolean equals(Object obj) { + public final boolean equals(Object obj) { if (obj == this) return true; if (obj instanceof PDOMNode) { @@ -78,7 +78,7 @@ public abstract class PDOMNode implements IPDOMNode { return super.equals(obj); } - public int hashCode() { + public final int hashCode() { return System.identityHashCode(pdom) + 41*record; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java index 5117d43ddf1..083df3ab287 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java @@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.c.ICBasicType; import org.eclipse.cdt.internal.core.Util; +import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator; import org.eclipse.cdt.internal.core.pdom.dom.FindBinding; @@ -43,7 +44,7 @@ import org.eclipse.core.runtime.CoreException; /** * @author Doug Schaefer */ -class PDOMCLinkage extends PDOMLinkage { +class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { public PDOMCLinkage(PDOM pdom, int record) { super(pdom, record); @@ -60,17 +61,6 @@ class PDOMCLinkage extends PDOMLinkage { public String getID() { return C_LINKAGE_ID; } - - public static final int CVARIABLE = PDOMLinkage.LAST_NODE_TYPE + 1; - public static final int CFUNCTION = PDOMLinkage.LAST_NODE_TYPE + 2; - public static final int CSTRUCTURE = PDOMLinkage.LAST_NODE_TYPE + 3; - public static final int CFIELD = PDOMLinkage.LAST_NODE_TYPE + 4; - public static final int CENUMERATION = PDOMLinkage.LAST_NODE_TYPE + 5; - public static final int CENUMERATOR = PDOMLinkage.LAST_NODE_TYPE + 6; - public static final int CTYPEDEF = PDOMLinkage.LAST_NODE_TYPE + 7; - public static final int CPARAMETER = PDOMLinkage.LAST_NODE_TYPE + 8; - public static final int CBASICTYPE = PDOMLinkage.LAST_NODE_TYPE + 9; - public static final int CFUNCTIONTYPE = PDOMLinkage.LAST_NODE_TYPE + 10; public PDOMBinding addBinding(IBinding binding) throws CoreException { PDOMBinding pdomBinding = adaptBinding(binding); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java index 6f69fef5354..e005ef5a05a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCParameter.java @@ -173,4 +173,8 @@ class PDOMCParameter extends PDOMNamedNode implements IParameter, IIndexFragment public boolean isGloballyQualified() throws DOMException { throw new PDOMNotImplementedError(); } + + public int getBindingConstant() { + return getNodeType(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/CPPFindBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/CPPFindBinding.java index c8f693695fb..de8e14e2453 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/CPPFindBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/CPPFindBinding.java @@ -15,6 +15,7 @@ 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.internal.core.index.IndexCPPSignatureUtil; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.BTree; import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; @@ -107,7 +108,7 @@ public class CPPFindBinding extends FindBinding { public static PDOMBinding findBinding(BTree btree, PDOMLinkage linkage, IBinding binding) throws CoreException { Integer memento = null; try { - memento = PDOMCPPOverloaderUtil.getSignatureMemento(binding); + memento = IndexCPPSignatureUtil.getSignatureMemento(binding); } catch (DOMException e) { } if(memento != null) { @@ -119,7 +120,7 @@ public class CPPFindBinding extends FindBinding { public static PDOMBinding findBinding(PDOMNode node, PDOMLinkage linkage, IBinding binding) throws CoreException { Integer memento = null; try { - memento = PDOMCPPOverloaderUtil.getSignatureMemento(binding); + memento = IndexCPPSignatureUtil.getSignatureMemento(binding); } catch (DOMException e) { } if(memento != 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 842ace4fa7d..7b9afad2b5d 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 @@ -28,9 +28,11 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates; +import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; 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.IPDOMOverloader; +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; import org.eclipse.core.runtime.CoreException; @@ -59,7 +61,7 @@ class PDOMCPPClassTemplatePartialSpecialization extends primary.addPartial(this); try { - Integer memento = PDOMCPPOverloaderUtil.getSignatureMemento(partial); + Integer memento = IndexCPPSignatureUtil.getSignatureMemento(partial); pdom.getDB().putInt(record + SIGNATURE_MEMENTO, memento != null ? memento.intValue() : 0); } catch (DOMException e) { throw new CoreException(Util.createStatus(e)); @@ -140,8 +142,8 @@ class PDOMCPPClassTemplatePartialSpecialization extends } } - public int compareTo(Object other) { - int cmp = super.compareTo(other); + public int pdomCompareTo(PDOMBinding other) { + int cmp = super.pdomCompareTo(other); if(cmp==0) { if(other instanceof PDOMCPPClassTemplatePartialSpecialization) { try { 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 89f9223b46c..4f47203334a 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 @@ -23,9 +23,11 @@ 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.internal.core.Util; +import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; 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.IPDOMOverloader; +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; import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCAnnotation; @@ -75,7 +77,7 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl super(pdom, parent, function.getNameCharArray()); Database db = pdom.getDB(); try { - Integer memento = PDOMCPPOverloaderUtil.getSignatureMemento(function); + Integer memento = IndexCPPSignatureUtil.getSignatureMemento(function); pdom.getDB().putInt(record + SIGNATURE_MEMENTO, memento != null ? memento.intValue() : 0); if(setTypes) { @@ -200,9 +202,9 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl throw new PDOMNotImplementedError(); } - public int compareTo(Object other) { - int cmp= super.compareTo(other); - return cmp==0 ? PDOMCPPOverloaderUtil.compare(this, other) : cmp; + public int pdomCompareTo(PDOMBinding other) { + int cmp= super.pdomCompareTo(other); + return cmp==0 ? compareSignatures(this, other) : cmp; } public String toString() { @@ -214,4 +216,20 @@ class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, IPDOMOverl } return result.toString(); } + + protected static int compareSignatures(IPDOMOverloader a, Object b) { + if(b instanceof IPDOMOverloader) { + IPDOMOverloader bb= (IPDOMOverloader) b; + try { + int mySM = a.getSignatureMemento(); + int otherSM = bb.getSignatureMemento(); + return mySM == otherSM ? 0 : mySM < otherSM ? -1 : 1; + } catch(CoreException ce) { + CCorePlugin.log(ce); + } + } else { + throw new PDOMNotImplementedError(b.getClass().toString()); + } + return 0; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java index 7f574e07645..d7b83e3430a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java @@ -182,8 +182,8 @@ class PDOMCPPFunctionInstance extends PDOMCPPInstance implements ICPPFunction { return false; } - public int compareTo(Object other) { - int cmp= super.compareTo(other); - return cmp==0 ? PDOMCPPOverloaderUtil.compare(this, other) : cmp; + public int pdomCompareTo(PDOMBinding other) { + int cmp= super.pdomCompareTo(other); + return cmp==0 ? PDOMCPPFunction.compareSignatures(this, other) : cmp; } } 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 e57a228f439..d4ffc38335c 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 @@ -195,8 +195,8 @@ class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization implements ICP return false; } - public int compareTo(Object other) { - int cmp= super.compareTo(other); - return cmp==0 ? PDOMCPPOverloaderUtil.compare(this, other) : cmp; + public int pdomCompareTo(PDOMBinding other) { + int cmp= super.pdomCompareTo(other); + return cmp==0 ? PDOMCPPFunction.compareSignatures(this, other) : cmp; } } 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 d824f7fb177..fc01830615b 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 @@ -56,6 +56,7 @@ 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.CPPBlockScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction; +import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; @@ -70,7 +71,7 @@ import org.eclipse.core.runtime.CoreException; * @author Doug Schaefer * */ -class PDOMCPPLinkage extends PDOMLinkage { +class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { public PDOMCPPLinkage(PDOM pdom, int record) { super(pdom, record); } @@ -92,45 +93,7 @@ class PDOMCPPLinkage extends PDOMLinkage { } // Binding types - public static final int CPPVARIABLE = PDOMLinkage.LAST_NODE_TYPE + 1; - public static final int CPPFUNCTION = PDOMLinkage.LAST_NODE_TYPE + 2; - public static final int CPPCLASSTYPE = PDOMLinkage.LAST_NODE_TYPE + 3; - public static final int CPPFIELD = PDOMLinkage.LAST_NODE_TYPE + 4; - public static final int CPPMETHOD = PDOMLinkage.LAST_NODE_TYPE + 5; - public static final int CPPNAMESPACE = PDOMLinkage.LAST_NODE_TYPE + 6; - public static final int CPPNAMESPACEALIAS = PDOMLinkage.LAST_NODE_TYPE + 7; - public static final int CPPBASICTYPE = PDOMLinkage.LAST_NODE_TYPE + 8; - public static final int CPPPARAMETER = PDOMLinkage.LAST_NODE_TYPE + 9; - public static final int CPPENUMERATION = PDOMLinkage.LAST_NODE_TYPE + 10; - public static final int CPPENUMERATOR = PDOMLinkage.LAST_NODE_TYPE + 11; - public static final int CPPTYPEDEF = PDOMLinkage.LAST_NODE_TYPE + 12; - public static final int CPP_POINTER_TO_MEMBER_TYPE= PDOMLinkage.LAST_NODE_TYPE + 13; - public static final int CPP_CONSTRUCTOR= PDOMLinkage.LAST_NODE_TYPE + 14; - public static final int CPP_REFERENCE_TYPE= PDOMLinkage.LAST_NODE_TYPE + 15; - public static final int CPP_FUNCTION_TEMPLATE= PDOMLinkage.LAST_NODE_TYPE + 16; - public static final int CPP_METHOD_TEMPLATE= PDOMLinkage.LAST_NODE_TYPE + 17; - public static final int CPP_CONSTRUCTOR_TEMPLATE= PDOMLinkage.LAST_NODE_TYPE + 18; - public static final int CPP_CLASS_TEMPLATE= PDOMLinkage.LAST_NODE_TYPE + 19; - public static final int CPP_CLASS_TEMPLATE_PARTIAL_SPEC= PDOMLinkage.LAST_NODE_TYPE + 20; - public static final int CPP_FUNCTION_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 21; - public static final int CPP_METHOD_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 22; - public static final int CPP_CONSTRUCTOR_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 23; - public static final int CPP_DEFERRED_FUNCTION_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 24; - public static final int CPP_CLASS_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 25; - public static final int CPP_DEFERRED_CLASS_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 26; - public static final int CPP_PARAMETER_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 27; - public static final int CPP_FIELD_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 28; - public static final int CPP_FUNCTION_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 29; - public static final int CPP_METHOD_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 30; - public static final int CPP_CONSTRUCTOR_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 31; - public static final int CPP_CLASS_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 32; - public static final int CPP_FUNCTION_TEMPLATE_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 33; - public static final int CPP_METHOD_TEMPLATE_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 34; - public static final int CPP_CONSTRUCTOR_TEMPLATE_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 35; - public static final int CPP_CLASS_TEMPLATE_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 36; - public static final int CPP_TYPEDEF_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 37; - public static final int CPP_TEMPLATE_TYPE_PARAMETER= PDOMLinkage.LAST_NODE_TYPE + 38; - public static final int CPP_FUNCTION_TYPE= PDOMLinkage.LAST_NODE_TYPE + 39; + private class ConfigureTemplate implements Runnable { ICPPTemplateDefinition template; 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 13c2ac79807..5ebf7522382 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 @@ -229,4 +229,8 @@ class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter, IIndexFra public boolean isFileLocal() throws CoreException { return true; } + + public int getBindingConstant() { + return getNodeType(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java index fabc11b2a37..c6f8ce40702 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.index.IndexCPPSignatureUtil; 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.IPDOMOverloader; @@ -73,7 +74,7 @@ abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements } } try { - Integer memento = PDOMCPPOverloaderUtil.getSignatureMemento(spec); + Integer memento = IndexCPPSignatureUtil.getSignatureMemento(spec); pdom.getDB().putInt(record + SIGNATURE_MEMENTO, memento != null ? memento.intValue() : 0); } catch (DOMException e) { }