diff options
author | Michi | 2015-02-08 15:08:27 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2015-02-08 19:38:04 +0000 |
commit | 8a896c57ed29badb2bde91b150649d51536d45f9 (patch) | |
tree | a34d08494d477b65be1bf6d3906999d05f371e0f | |
parent | 23938e2b3dae7ef6ba8ec7a5438fd769c731ab48 (diff) | |
download | org.eclipse.cdt-8a896c57ed29badb2bde91b150649d51536d45f9.tar.gz org.eclipse.cdt-8a896c57ed29badb2bde91b150649d51536d45f9.tar.xz org.eclipse.cdt-8a896c57ed29badb2bde91b150649d51536d45f9.zip |
Bug 459389 - [code assist] no members for deeply nested class templates
Change-Id: Ia6b3461325a9c489d10dd1356d46e7e6b6ee61f0
Signed-off-by: Michi <woskimi@yahoo.de>
2 files changed, 32 insertions, 5 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java index ecfe772042c..5e68ab6bd5e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java @@ -180,9 +180,16 @@ public class AccessContext { return false; accessLevel = getMemberAccessLevel(derivedClass, accessLevel); - if (owner.isSameType(derivedClass) || - (derivedClass instanceof ICPPClassSpecialization && - owner.equals(((ICPPClassSpecialization) derivedClass).getSpecializedBinding()))) { + + if (!(owner instanceof ICPPSpecialization)) { + while (derivedClass instanceof ICPPSpecialization) { + IBinding specialized = ((ICPPSpecialization) derivedClass).getSpecializedBinding(); + if (specialized instanceof ICPPClassType) { + derivedClass = (ICPPClassType) specialized; + } + } + } + if (owner.isSameType(derivedClass)) { return isAccessible(bindingVisibility, accessLevel); } @@ -302,8 +309,10 @@ public class AccessContext { if (maxdepth > 0) { for (ICPPBase cppBase : ClassTypeHelper.getBases(derived, point)) { IBinding base = cppBase.getBaseClass(); - if (!(target instanceof ICPPSpecialization) && base instanceof ICPPSpecialization) { - base = ((ICPPSpecialization) base).getSpecializedBinding(); + if (!(target instanceof ICPPSpecialization)) { + while (base instanceof ICPPSpecialization) { + base = ((ICPPSpecialization) base).getSpecializedBinding(); + } } if (base instanceof ICPPClassType) { ICPPClassType tbase = (ICPPClassType) base; diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java index 65de1caa120..017b0021eec 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java @@ -772,6 +772,24 @@ public class CompletionTests extends AbstractContentAssistTest { assertCompletionResults(fCursorOffset, expected, ID); } + // template <typename T> + // struct A { + // template <typename U> + // struct AA { + // template <typename V> + // struct AAA { + // }; + // }; + // }; + // + // struct B : A<B> { + // AA<B>::/*cursor*/ + // }; + public void testMemebersForDeeplyNestedTemplates_459389() throws Exception { + final String[] expected = { "AAA<typename V>" }; + assertCompletionResults(fCursorOffset, expected, DISPLAY); + } + // struct A {}; // // template<typename T> |