Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichi2015-02-08 15:08:27 +0000
committerGerrit Code Review @ Eclipse.org2015-02-08 19:38:04 +0000
commit8a896c57ed29badb2bde91b150649d51536d45f9 (patch)
treea34d08494d477b65be1bf6d3906999d05f371e0f
parent23938e2b3dae7ef6ba8ec7a5438fd769c731ab48 (diff)
downloadorg.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>
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/AccessContext.java19
-rw-r--r--core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java18
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>

Back to the top