From 8a896c57ed29badb2bde91b150649d51536d45f9 Mon Sep 17 00:00:00 2001 From: Michi Date: Sun, 8 Feb 2015 16:08:27 +0100 Subject: [PATCH] Bug 459389 - [code assist] no members for deeply nested class templates Change-Id: Ia6b3461325a9c489d10dd1356d46e7e6b6ee61f0 Signed-off-by: Michi --- .../parser/cpp/semantics/AccessContext.java | 19 ++++++++++++++----- .../text/contentassist2/CompletionTests.java | 18 ++++++++++++++++++ 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 + // struct A { + // template + // struct AA { + // template + // struct AAA { + // }; + // }; + // }; + // + // struct B : A { + // AA::/*cursor*/ + // }; + public void testMemebersForDeeplyNestedTemplates_459389() throws Exception { + final String[] expected = { "AAA" }; + assertCompletionResults(fCursorOffset, expected, DISPLAY); + } + // struct A {}; // // template