diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 649db4af10e..13c4c9eab0b 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -2193,6 +2193,68 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa assertNotNull(num); assertEquals(1, num.longValue()); } + + // template + // struct meta { + // enum { + // a = T::value, + // b = a + // }; + // }; + + // struct S { + // static const int value = 42; + // }; + // + // template struct waldo; + // + // template <> + // struct waldo<42> { + // double operator()(); + // }; + // + // template + // struct C : public waldo::b> {}; + // + // void bar(double); + // + // void foo(C x){ + // bar(x()); + // } + public void testDependentEnumerator_482421a() throws Exception { + checkBindings(); + } + + // template + // struct meta { + // enum { + // b = T::value, + // a = b + // }; + // }; + + // struct S { + // static const int value = 42; + // }; + // + // template struct waldo; + // + // template <> + // struct waldo<42> { + // double operator()(); + // }; + // + // template + // struct C : public waldo::a> {}; + // + // void bar(double); + // + // void foo(C x){ + // bar(x()); + // } + public void testDependentEnumerator_482421b() throws Exception { + checkBindings(); + } // template // struct A { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPEnumType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPEnumType.java index 807886f84a1..78a3e89cf9a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPEnumType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPEnumType.java @@ -11,11 +11,12 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import java.util.List; + import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; import org.eclipse.cdt.core.index.IIndexName; -import org.eclipse.cdt.core.parser.util.CharArrayMap; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMBinding; @@ -33,6 +34,7 @@ public interface IPDOMCPPEnumType extends ICPPEnumeration, IPDOMBinding, IIndexT /** * Called by the scope to access the enumerators. + * Returns the enumerators in the order of declaration. */ - void loadEnumerators(CharArrayMap map); + void loadEnumerators(List enumerators); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java index 4ba004e02f8..fef42c349ba 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java @@ -14,7 +14,6 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; 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; @@ -151,8 +150,12 @@ class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope { if (map == null) { // there is no cache, build it: - map= new CharArrayMap(); - enumeration.loadEnumerators(map); + List enumerators = new ArrayList<>(); + enumeration.loadEnumerators(enumerators); + map = new CharArrayMap(); + for (IPDOMCPPEnumerator enumerator : enumerators) { + map.put(enumerator.getNameCharArray(), enumerator); + } pdom.putCachedResult(key, new SoftReference>(map)); } return map; @@ -171,14 +174,17 @@ class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope { public static IEnumerator[] getEnumerators(IPDOMCPPEnumType enumType) { try { - CharArrayMap map = getBindingMap(enumType); + // We want to return the enumerators in order of declaration, so we don't + // use the cache (getBindingsMap()) which stores them in a hash map and thus + // loses the order. + List enumerators = new ArrayList<>(); + enumType.loadEnumerators(enumerators); List result= new ArrayList(); - for (IEnumerator value : map.values()) { + for (IEnumerator value : enumerators) { if (IndexFilter.ALL_DECLARED.acceptBinding(value)) { result.add(value); } } - Collections.reverse(result); return result.toArray(new IEnumerator[result.size()]); } catch (CoreException e) { CCorePlugin.log(e); 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 3f25a4828a1..fecab6232a7 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 @@ -12,6 +12,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import java.util.List; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; @@ -23,7 +25,6 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; -import org.eclipse.cdt.core.parser.util.CharArrayMap; 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.ICPPInternalBinding; @@ -217,15 +218,14 @@ class PDOMCPPEnumeration extends PDOMCPPBinding implements IPDOMCPPEnumType, IPD } @Override - public void loadEnumerators(final CharArrayMap map) { + public void loadEnumerators(final List enumerators) { try { PDOMNodeLinkedList list = new PDOMNodeLinkedList(getLinkage(), record + OFFSET_ENUMERATOR_LIST); list.accept(new IPDOMVisitor() { @Override public boolean visit(IPDOMNode node) throws CoreException { if (node instanceof IPDOMCPPEnumerator) { - final IPDOMCPPEnumerator item = (IPDOMCPPEnumerator) node; - map.put(item.getNameCharArray(), item); + enumerators.add((IPDOMCPPEnumerator) node); } return true; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumerationSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumerationSpecialization.java index 39470ea4a09..9ea8bb6be88 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumerationSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumerationSpecialization.java @@ -11,6 +11,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import java.util.List; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; @@ -24,7 +26,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumerationSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; -import org.eclipse.cdt.core.parser.util.CharArrayMap; 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.ICPPInternalBinding; @@ -224,15 +225,14 @@ class PDOMCPPEnumerationSpecialization extends PDOMCPPSpecialization } @Override - public void loadEnumerators(final CharArrayMap map) { + public void loadEnumerators(final List enumerators) { try { PDOMNodeLinkedList list = new PDOMNodeLinkedList(getLinkage(), record + OFFSET_ENUMERATOR_LIST); list.accept(new IPDOMVisitor() { @Override public boolean visit(IPDOMNode node) throws CoreException { if (node instanceof IPDOMCPPEnumerator) { - final IPDOMCPPEnumerator item = (IPDOMCPPEnumerator) node; - map.put(item.getNameCharArray(), item); + enumerators.add((IPDOMCPPEnumerator) node); } return true; }