From ad4729d9540897568c8ffe576f7e465ef21da400 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 8 Sep 2011 11:47:59 +0200 Subject: [PATCH] Bug 356057: Updating unnamed enumerations. --- .../index/tests/IndexUpdateTests.java | 96 ++++++++++++++- .../core/index/IIndexBindingConstants.java | 7 +- .../core/index/IIndexCBindingConstants.java | 17 +-- .../core/index/IIndexCPPBindingConstants.java | 3 +- .../eclipse/cdt/internal/core/pdom/PDOM.java | 15 ++- .../internal/core/pdom/dom/FindBinding.java | 7 +- .../core/pdom/dom/c/PDOMCEnumeration.java | 114 ++++++++++++------ .../core/pdom/dom/c/PDOMCEnumerator.java | 41 ++----- .../core/pdom/dom/c/PDOMCLinkage.java | 43 +++---- .../core/pdom/dom/cpp/CPPFindBinding.java | 1 - .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 18 +-- 11 files changed, 228 insertions(+), 134 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java index d7792c838ec..879b11ef2e2 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexUpdateTests.java @@ -117,6 +117,15 @@ public class IndexUpdateTests extends IndexTestBase { assertTrue(CCorePlugin.getIndexManager().joinIndexer(INDEXER_WAIT_TIME, npm())); } + private void updateHeader() throws Exception { + // Append variable comment to the end of the file to change its contents. + // Indexer would not reindex the file if its contents remain the same. + IProject project= fHeader.getProject(); + fHeader= TestSourceReader.createFile(project, "header.h", + fContents[++fContentUsed].toString() + "\n// " + fContentUsed); + TestSourceReader.waitUntilFileIsIndexed(fIndex, fHeader, INDEXER_WAIT_TIME); + } + private void setupFile(int totalFileVersions, boolean cpp) throws Exception { if (fContents == null) { fContents= getContentsForTest(totalFileVersions); @@ -135,7 +144,7 @@ public class IndexUpdateTests extends IndexTestBase { fContents[++fContentUsed].toString() + "\n// " + fContentUsed); TestSourceReader.waitUntilFileIsIndexed(fIndex, fFile, INDEXER_WAIT_TIME); } - + @Override public void tearDown() throws Exception { fIndex= null; @@ -1339,4 +1348,89 @@ public class IndexUpdateTests extends IndexTestBase { fIndex.releaseReadLock(); } } + + // typedef enum { + // AE_ON = 0 + // } Adaptiv_T; + // struct mystruct { + // Adaptiv_T eAdapt; + // }; + + // int main() { + // mystruct ms; + // ms.eAdapt = AE_ON; + // } + + // // insert line + // typedef enum { + // AE_ON = 0 + // } Adaptiv_T; + // struct mystruct { + // Adaptiv_T eAdapt; + // }; + public void testAnonymousEnum_Bug356057cpp() throws Exception { + setupHeader(3, true); + setupFile(3, true); + String name1; + fIndex.acquireReadLock(); + try { + final IEnumerator e = (IEnumerator) findBinding("AE_ON"); + assertNotNull(e); + name1= e.getOwner().getName(); + } finally { + fIndex.releaseReadLock(); + } + updateHeader(); + fIndex.acquireReadLock(); + try { + final IEnumerator e = (IEnumerator) findBinding("AE_ON"); + assertNotNull(e); + assertFalse(name1.equals(e.getOwner().getName())); + } finally { + fIndex.releaseReadLock(); + } + } + + // typedef enum { + // AE_ON = 0 + // } Adaptiv_T; + // struct mystruct { + // Adaptiv_T eAdapt; + // }; + + // int main() { + // mystruct ms; + // ms.eAdapt = AE_ON; + // } + + // // insert line + // typedef enum { + // AE_ON = 0 + // } Adaptiv_T; + // struct mystruct { + // Adaptiv_T eAdapt; + // }; + public void testAnonymousEnum_Bug356057c() throws Exception { + setupHeader(3, false); + setupFile(3, false); + String name1; + fIndex.acquireReadLock(); + try { + final IEnumerator e = (IEnumerator) findBinding("AE_ON"); + assertNotNull(e); + name1= e.getOwner().getName(); + } finally { + fIndex.releaseReadLock(); + } + updateHeader(); + fIndex.acquireReadLock(); + try { + final IEnumerator e = (IEnumerator) findBinding("AE_ON"); + assertNotNull(e); + assertFalse(name1.equals(e.getOwner().getName())); + } finally { + fIndex.releaseReadLock(); + } + } } + diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexBindingConstants.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexBindingConstants.java index e52028562b4..07ea94e2747 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexBindingConstants.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexBindingConstants.java @@ -14,7 +14,8 @@ package org.eclipse.cdt.internal.core.index; * Constants used by IIndexFragment implementations for identifying persisted binding types */ public interface IIndexBindingConstants { - int MACRO_DEFINITION = 4; - int MACRO_CONTAINER = 5; - int LAST_CONSTANT= MACRO_CONTAINER; + int ENUMERATOR= 3; + int MACRO_DEFINITION = 4; + int MACRO_CONTAINER = 5; + int LAST_CONSTANT= MACRO_CONTAINER; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCBindingConstants.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCBindingConstants.java index e5046545405..0ad92d9dc32 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCBindingConstants.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCBindingConstants.java @@ -14,12 +14,13 @@ package org.eclipse.cdt.internal.core.index; * Constants used by IIndexFragment implementations for identifying persisted binding types */ public interface IIndexCBindingConstants { - int CVARIABLE = IIndexBindingConstants.LAST_CONSTANT + 1; - int CFUNCTION = IIndexBindingConstants.LAST_CONSTANT + 2; - int CSTRUCTURE = IIndexBindingConstants.LAST_CONSTANT + 3; - int CFIELD = IIndexBindingConstants.LAST_CONSTANT + 4; - int CENUMERATION = IIndexBindingConstants.LAST_CONSTANT + 5; - int CENUMERATOR = IIndexBindingConstants.LAST_CONSTANT + 6; - int CTYPEDEF = IIndexBindingConstants.LAST_CONSTANT + 7; - int CPARAMETER = IIndexBindingConstants.LAST_CONSTANT + 8; + int CENUMERATOR = IIndexBindingConstants.ENUMERATOR; + + int CVARIABLE = IIndexBindingConstants.LAST_CONSTANT + 1; + int CFUNCTION = IIndexBindingConstants.LAST_CONSTANT + 2; + int CSTRUCTURE = IIndexBindingConstants.LAST_CONSTANT + 3; + int CFIELD = IIndexBindingConstants.LAST_CONSTANT + 4; + int CENUMERATION = IIndexBindingConstants.LAST_CONSTANT + 5; + int CTYPEDEF = IIndexBindingConstants.LAST_CONSTANT + 7; + int CPARAMETER = IIndexBindingConstants.LAST_CONSTANT + 8; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java index 86adcfec0dc..6185ba51929 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java @@ -15,6 +15,8 @@ package org.eclipse.cdt.internal.core.index; * Constants used by IIndexFragment implementations for identifying persisted binding types. */ public interface IIndexCPPBindingConstants { + int CPPENUMERATOR = IIndexBindingConstants.ENUMERATOR; + int CPPVARIABLE = IIndexBindingConstants.LAST_CONSTANT + 1; int CPPFUNCTION = IIndexBindingConstants.LAST_CONSTANT + 2; int CPPCLASSTYPE = IIndexBindingConstants.LAST_CONSTANT + 3; @@ -24,7 +26,6 @@ public interface IIndexCPPBindingConstants { int CPPNAMESPACEALIAS = IIndexBindingConstants.LAST_CONSTANT + 7; int CPPPARAMETER = IIndexBindingConstants.LAST_CONSTANT + 9; int CPPENUMERATION = IIndexBindingConstants.LAST_CONSTANT + 10; - int CPPENUMERATOR = IIndexBindingConstants.LAST_CONSTANT + 11; int CPPTYPEDEF = IIndexBindingConstants.LAST_CONSTANT + 12; int CPP_CONSTRUCTOR= IIndexBindingConstants.LAST_CONSTANT + 14; int CPP_FUNCTION_TEMPLATE= IIndexBindingConstants.LAST_CONSTANT + 16; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 76b2f69c3e7..79f9fecac9d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -196,7 +196,7 @@ public class PDOM extends PlatformObject implements IPDOM { * 96.0 - storing pack expansions in the template parameter map, bug 294730. * 97.0 - storing file contents hash in PDOMFile, bug 302083. * #98.0# - strongly typed enums, bug 305975. <> - * 99.0 - correct marshalling of basic types, bug 319186. + * #99.0# - correct marshalling of basic types, bug 319186. <> * * CDT 8.0 development (versions not supported on the 7.0.x branch) * 110.0 - update index on encoding change, bug 317435. @@ -204,12 +204,15 @@ public class PDOM extends PlatformObject implements IPDOM { * 111.1 - defaulted and deleted functions, bug 305978 * 112.0 - inline namespaces, bug 305980 * 113.0 - Changed marshaling of values, bug 327878 - * 114.0 - Partial specializations for class template specializations, bug 332884. - * 115.0 - Corrected signatures for function templates, bug 335062. + * #114.0# - Partial specializations for class template specializations, bug 332884. + * - Corrected signatures for function templates, bug 335062. <> + * + * CDT 8.1 development (versions not supported on teh 8.0.x branch) + * 120.0 - Enumerators in global index, bug 356235 */ - private static final int MIN_SUPPORTED_VERSION= version(114, 0); - private static final int MAX_SUPPORTED_VERSION= version(114, Short.MAX_VALUE); - private static final int DEFAULT_VERSION = version(114, 0); + private static final int MIN_SUPPORTED_VERSION= version(120, 0); + private static final int MAX_SUPPORTED_VERSION= version(120, Short.MAX_VALUE); + private static final int DEFAULT_VERSION = version(120, 0); private static int version(int major, int minor) { return (major << 16) + minor; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBinding.java index a9f7d5b52ab..57450629dc0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBinding.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.pdom.dom; import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.cdt.internal.core.index.IIndexBindingConstants; import org.eclipse.cdt.internal.core.pdom.db.BTree; import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator; @@ -44,6 +45,11 @@ public class FindBinding { if (t1 == t2) { t1 = PDOMNode.getNodeType(database, record1); t2 = PDOMNode.getNodeType(database, record2); + if (t1 == t2 && t1 == IIndexBindingConstants.ENUMERATOR) { + // Allow to insert multiple enumerators into the global index. + t1= record1; + t2= record2; + } } cmp= t1 < t2 ? -1 : (t1 > t2 ? 1 : 0); } @@ -164,7 +170,6 @@ public class FindBinding { public static PDOMBinding findBinding(IPDOMNode node, final PDOMLinkage linkage, final char[] name, final int[] constants, long localToFileRec) throws CoreException { - // mstodo faster searches final DefaultFindBindingVisitor visitor = new DefaultFindBindingVisitor(linkage, name, constants, localToFileRec); try { node.accept(visitor); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumeration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumeration.java index 10c58ac4cac..26cdc22c179 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumeration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumeration.java @@ -11,20 +11,28 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.c; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; import java.util.ArrayList; -import java.util.Collections; +import java.util.List; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.ast.DOMException; +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.IBinding; 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.parser.util.CharArrayUtils; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants; 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.dom.PDOMASTAdapter; +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.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; @@ -33,12 +41,10 @@ import org.eclipse.core.runtime.CoreException; /** * Enumerations in the database. */ -class PDOMCEnumeration extends PDOMBinding implements IEnumeration, IIndexType { - - private static final int FIRST_ENUMERATOR = PDOMBinding.RECORD_SIZE + 0; - private static final int OFFSET_MIN_VALUE= FIRST_ENUMERATOR + Database.PTR_SIZE; +class PDOMCEnumeration extends PDOMBinding implements IEnumeration, IIndexType, IPDOMMemberOwner { + private static final int OFFSET_ENUMERATOR_LIST = PDOMBinding.RECORD_SIZE; + private static final int OFFSET_MIN_VALUE= OFFSET_ENUMERATOR_LIST + Database.PTR_SIZE; private static final int OFFSET_MAX_VALUE= OFFSET_MIN_VALUE + 8; - @SuppressWarnings("hiding") protected static final int RECORD_SIZE = OFFSET_MAX_VALUE + 8; @@ -80,35 +86,71 @@ class PDOMCEnumeration extends PDOMBinding implements IEnumeration, IIndexType { return IIndexCBindingConstants.CENUMERATION; } - public IEnumerator[] getEnumerators() throws DOMException { + public IEnumerator[] getEnumerators() { + List result = getCachedEnumerators(true); + return result.toArray(new IEnumerator[result.size()]); + } + + private List getCachedEnumerators(boolean create) { + final Long key= record; + final PDOM pdom = getPDOM(); + @SuppressWarnings("unchecked") + Reference> cached= (Reference>) pdom.getCachedResult(key); + List result= cached == null ? null : cached.get(); + + if (result == null && create) { + // there is no cache, build it: + result= loadEnumerators(); + pdom.putCachedResult(key, new SoftReference>(result)); + } + return result; + } + + private List loadEnumerators() { + final ArrayList result= new ArrayList(); try { - ArrayList enums = new ArrayList(); - for (PDOMCEnumerator enumerator = getFirstEnumerator(); - enumerator != null; - enumerator = enumerator.getNextEnumerator()) { - enums.add(enumerator); - } - - // Reverse the list since they are last in first out - Collections.reverse(enums); - return enums.toArray(new IEnumerator[enums.size()]); + PDOMNodeLinkedList list = new PDOMNodeLinkedList(getLinkage(), record + OFFSET_ENUMERATOR_LIST); + list.accept(new IPDOMVisitor() { + public boolean visit(IPDOMNode node) throws CoreException { + if (node instanceof PDOMCEnumerator) { + result.add((PDOMCEnumerator) node); + } + return true; + } + public void leave(IPDOMNode node) {} + }); } catch (CoreException e) { CCorePlugin.log(e); - return new IEnumerator[0]; + } + result.trimToSize(); + return result; + } + + @Override + public void accept(IPDOMVisitor visitor) throws CoreException { + for (PDOMCEnumerator enumerator : getCachedEnumerators(true)) { + visitor.visit(enumerator); + visitor.leave(enumerator); } } - private PDOMCEnumerator getFirstEnumerator() throws CoreException { - long value = getDB().getRecPtr(record + FIRST_ENUMERATOR); - return value != 0 ? new PDOMCEnumerator(getLinkage(), value) : null; + @Override + public void addChild(PDOMNode node) throws CoreException { + if (node instanceof PDOMCEnumerator) { + PDOMNodeLinkedList list = new PDOMNodeLinkedList(getLinkage(), record + OFFSET_ENUMERATOR_LIST); + list.addMember(node); + List cache = getCachedEnumerators(false); + if (cache != null) + cache.add((PDOMCEnumerator) node); + } } - - public void addEnumerator(PDOMCEnumerator enumerator) throws CoreException { - PDOMCEnumerator first = getFirstEnumerator(); - enumerator.setNextEnumerator(first); - getDB().putRecPtr(record + FIRST_ENUMERATOR, enumerator.getRecord()); + + @Override + public boolean mayHaveChildren() { + return true; } - + + public long getMinValue() { if (fMinValue != null) { return fMinValue.longValue(); @@ -149,18 +191,20 @@ class PDOMCEnumeration extends PDOMBinding implements IEnumeration, IIndexType { if (type instanceof IEnumeration) { IEnumeration etype= (IEnumeration) type; - etype= (IEnumeration) PDOMASTAdapter.getAdapterForAnonymousASTBinding(etype); - try { - return getDBName().equals(etype.getNameCharArray()); - } catch (CoreException e) { - CCorePlugin.log(e); + char[] nchars = etype.getNameCharArray(); + if (nchars.length == 0) { + nchars= ASTTypeUtil.createNameForAnonymous(etype); } + if (nchars == null || !CharArrayUtils.equals(nchars, getNameCharArray())) + return false; + + return SemanticUtil.isSameOwner(getOwner(), etype.getOwner()); } return false; } @Override public Object clone() { - throw new UnsupportedOperationException(); + throw new IllegalArgumentException("Enums must not be cloned"); //$NON-NLS-1$ } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumerator.java index 554979910eb..da9da2ba9a8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCEnumerator.java @@ -29,22 +29,17 @@ import org.eclipse.core.runtime.CoreException; * Binding for c enumerator in the index. */ class PDOMCEnumerator extends PDOMBinding implements IEnumerator { - - private static final int ENUMERATION = PDOMBinding.RECORD_SIZE + 0; - private static final int NEXT_ENUMERATOR = PDOMBinding.RECORD_SIZE + 4; - private static final int VALUE= PDOMBinding.RECORD_SIZE + 8; + private static final int VALUE= PDOMBinding.RECORD_SIZE + 0; @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 12; + protected static final int RECORD_SIZE = VALUE + 4; - public PDOMCEnumerator(PDOMLinkage linkage, PDOMNode parent, IEnumerator enumerator, PDOMCEnumeration enumeration) + public PDOMCEnumerator(PDOMLinkage linkage, PDOMNode parent, IEnumerator enumerator) throws CoreException { super(linkage, parent, enumerator.getNameCharArray()); final Database db = getDB(); - db.putRecPtr(record + ENUMERATION, enumeration.getRecord()); storeValue(db, enumerator); - enumeration.addEnumerator(this); } public PDOMCEnumerator(PDOMLinkage linkage, long record) { @@ -75,35 +70,13 @@ class PDOMCEnumerator extends PDOMBinding implements IEnumerator { storeValue(getDB(), (IEnumerator) newBinding); } - - public PDOMCEnumerator getNextEnumerator() throws CoreException { - long value = getDB().getRecPtr(record + NEXT_ENUMERATOR); - return value != 0 ? new PDOMCEnumerator(getLinkage(), value) : null; - } - - public void setNextEnumerator(PDOMCEnumerator enumerator) throws CoreException { - long value = enumerator != null ? enumerator.getRecord() : 0; - getDB().putRecPtr(record + NEXT_ENUMERATOR, value); - } - public IType getType() throws DOMException { - return getEnumeration(); - } - - private PDOMCEnumeration getEnumeration() { - try { - return new PDOMCEnumeration(getLinkage(), getDB().getRecPtr(record + ENUMERATION)); - } catch (CoreException e) { - CCorePlugin.log(e); - return null; - } + IIndexFragmentBinding owner = getOwner(); + if (owner instanceof IType) + return (IType) owner; + return null; } - @Override - public IIndexFragmentBinding getOwner() { - return getEnumeration(); - } - public IValue getValue() { try { int val= getDB().getInt(record + VALUE); 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 9b2dd8fdd6c..2a8e142b953 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 @@ -14,7 +14,6 @@ package org.eclipse.cdt.internal.core.pdom.dom.c; import org.eclipse.cdt.core.CCorePlugin; -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.ICompositeType; @@ -110,6 +109,7 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { private PDOMBinding createBinding(PDOMNode parent, IBinding binding, long localToFile) throws CoreException { PDOMBinding pdomBinding= null; + PDOMNode insertIntoIndex= null; if (binding instanceof IField) { // must be before IVariable if (parent instanceof IPDOMMemberOwner) pdomBinding = new PDOMCField(this, (IPDOMMemberOwner)parent, (IField) binding); @@ -124,15 +124,11 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { } else if (binding instanceof IEnumeration) { pdomBinding = new PDOMCEnumeration(this, parent, (IEnumeration) binding); } else if (binding instanceof IEnumerator) { - try { - IType enumeration= ((IEnumerator)binding).getType(); - if (enumeration instanceof IEnumeration) { - PDOMBinding pdomEnumeration = adaptBinding((IEnumeration) enumeration); - if (pdomEnumeration instanceof PDOMCEnumeration) - pdomBinding = new PDOMCEnumerator(this, parent, (IEnumerator) binding, (PDOMCEnumeration)pdomEnumeration); - } - } catch (DOMException e) { - CCorePlugin.log(e); + assert parent instanceof IEnumeration; + pdomBinding = new PDOMCEnumerator(this, parent, (IEnumerator) binding); + insertIntoIndex= parent.getParentNode(); + if (insertIntoIndex == null) { + insertIntoIndex= this; } } else if (binding instanceof ITypedef) { pdomBinding = new PDOMCTypedef(this, parent, (ITypedef)binding); @@ -141,7 +137,12 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { if (pdomBinding != null) { pdomBinding.setLocalToFileRec(localToFile); parent.addChild(pdomBinding); - insertIntoNestedBindingsIndex(pdomBinding); + if (insertIntoIndex != null) { + insertIntoIndex.addChild(pdomBinding); + } + if (parent != this && insertIntoIndex != this) { + insertIntoNestedBindingsIndex(pdomBinding); + } } return pdomBinding; } @@ -214,10 +215,6 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { } IBinding owner= binding.getOwner(); - // For plain c the enumeration type is not the parent of the enumeration item. - if (owner instanceof IEnumeration) { - owner= owner.getOwner(); - } if (owner == null) { return this; } @@ -263,23 +260,11 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { if (parent == null) { parent= getAdaptedParent(binding); } - PDOMNode inheritFileLocal= parent; - if (binding instanceof IEnumerator) { - try { - IType enumeration= ((IEnumerator)binding).getType(); - if (enumeration instanceof IEnumeration) { - inheritFileLocal= adaptBinding((IEnumeration) enumeration); - } - } catch (DOMException e) { - CCorePlugin.log(e); - } - } - if (parent == this) { final int[] bindingTypes = new int[] {getBindingType(binding)}; final char[] nameChars = binding.getNameCharArray(); PDOMBinding nonLocal= FindBinding.findBinding(getIndex(), this, nameChars, bindingTypes, 0); - long localToFileRec= getLocalToFileRec(inheritFileLocal, binding, nonLocal); + long localToFileRec= getLocalToFileRec(parent, binding, nonLocal); if (localToFileRec == 0) return nonLocal; localToFileHolder[0]= localToFileRec; @@ -289,7 +274,7 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants { final int[] bindingTypes = new int[] {getBindingType(binding)}; final char[] nameChars = binding.getNameCharArray(); PDOMBinding nonLocal= FindBinding.findBinding(parent, this, nameChars, bindingTypes, 0); - long localToFileRec= getLocalToFileRec(inheritFileLocal, binding, nonLocal); + long localToFileRec= getLocalToFileRec(parent, binding, nonLocal); if (localToFileRec == 0) return nonLocal; localToFileHolder[0]= localToFileRec; 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 621cdd74531..f4f040c9d5c 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 @@ -104,7 +104,6 @@ public class CPPFindBinding extends FindBinding { public static PDOMBinding findBinding(PDOMNode node, PDOMLinkage linkage, char[] name, int constant, int sigHash, long localToFileRec) throws CoreException { - // mstodo faster searches CPPFindBindingVisitor visitor= new CPPFindBindingVisitor(linkage, name, constant, sigHash, localToFileRec); try { 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 0df80e84e1a..cad18e550a2 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 @@ -638,21 +638,9 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { if (parent == null) { parent= adaptOrAddParent(false, binding); } - PDOMNode inheritFileLocal= parent; - if (binding instanceof IEnumerator) { - try { - IType enumeration= ((IEnumerator) binding).getType(); - if (enumeration instanceof IEnumeration) { - inheritFileLocal= adaptBinding((IEnumeration) enumeration); - } - } catch (DOMException e) { - CCorePlugin.log(e); - } - } - if (parent == this) { PDOMBinding glob= CPPFindBinding.findBinding(getIndex(), this, binding, 0); - final long loc= getLocalToFileRec(inheritFileLocal, binding, glob); + final long loc= getLocalToFileRec(parent, binding, glob); if (loc == 0) return glob; fileLocalRecHolder[0]= loc; @@ -661,7 +649,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { if (parent instanceof PDOMCPPNamespace) { final BTree btree = ((PDOMCPPNamespace) parent).getIndex(); PDOMBinding glob= CPPFindBinding.findBinding(btree, this, binding, 0); - final long loc= getLocalToFileRec(inheritFileLocal, binding, glob); + final long loc= getLocalToFileRec(parent, binding, glob); if (loc == 0) return glob; fileLocalRecHolder[0]= loc; @@ -673,7 +661,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { } if (parent instanceof IPDOMMemberOwner) { PDOMBinding glob= CPPFindBinding.findBinding(parent, this, binding, 0); - final long loc= getLocalToFileRec(inheritFileLocal, binding, glob); + final long loc= getLocalToFileRec(parent, binding, glob); if (loc == 0) return glob; fileLocalRecHolder[0]= loc;