From 6cab1923dccb409b236f048b629d5f7325c5ad75 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 2 Dec 2010 12:31:05 +0000 Subject: [PATCH] Bug 330762: Content assist for deferred base classes. --- .../dom/parser/cpp/semantics/AccessContext.java | 5 +++++ .../dom/parser/cpp/semantics/BaseClassLookup.java | 7 ++++++- .../tests/text/contentassist2/CompletionTests.java | 13 +++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) 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 3a99c2d5c6d..53c4f2a5874 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 @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; /** * The context that determines access to private and protected class members. @@ -128,6 +129,10 @@ public class AccessContext { if (bases != null) { for (ICPPBase base : bases) { IBinding baseBinding = base.getBaseClass(); + if (baseBinding instanceof ICPPDeferredClassInstance) { + // Support content assist for members of deferred instances. + baseBinding= ((ICPPDeferredClassInstance) baseBinding).getTemplateDefinition(); + } if (!(baseBinding instanceof ICPPClassType)) { continue; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java index 6cef2cc00e4..640c3594fb2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/BaseClassLookup.java @@ -31,6 +31,7 @@ import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; @@ -203,7 +204,11 @@ class BaseClassLookup { continue; } - final ICPPClassType grandBaseClass = (ICPPClassType) grandBaseBinding; + ICPPClassType grandBaseClass = (ICPPClassType) grandBaseBinding; + if (data.contentAssist && grandBaseClass instanceof ICPPDeferredClassInstance) { + // Support content assist for members of deferred instances. + grandBaseClass= ((ICPPDeferredClassInstance) grandBaseClass).getClassTemplate(); + } if (grandBaseBindings != null && !grandBaseBindings.add(grandBaseClass)) continue; 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 978cd2f35f3..13fe0f2bbf0 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 @@ -1340,4 +1340,17 @@ public class CompletionTests extends AbstractContentAssistTest { final String[] expected= { "Reference" }; assertCompletionResults(fCursorOffset, expected, COMPARE_ID_STRINGS); } + + // template struct BaseClass { + // void BaseMethod(); + // }; + // template struct DerivedClass : BaseClass { + // void DerivedMethod() { + // this->BaseM/*cursor*/ + // } + // }; + public void testDeferredBaseClass_Bug330762() throws Exception { + final String[] expected= { "BaseMethod(void)" }; + assertCompletionResults(fCursorOffset, expected, COMPARE_ID_STRINGS); + } } \ No newline at end of file