From 3e7253f155e1e40542a6815689adef5abc65b17b Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 22 Sep 2009 23:22:24 +0000 Subject: [PATCH] When code-completion finds a declaration only because it is usable as the start of a nested-name-specifier, add the "::" after the nested-name-specifier to the code-completion string. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82587 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Sema/CodeCompleteConsumer.h | 11 ++++++++--- lib/Sema/SemaCodeComplete.cpp | 9 ++++++++- test/CodeCompletion/tag.cpp | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/include/clang/Sema/CodeCompleteConsumer.h b/include/clang/Sema/CodeCompleteConsumer.h index 6a10b28be9..d18b4a732f 100644 --- a/include/clang/Sema/CodeCompleteConsumer.h +++ b/include/clang/Sema/CodeCompleteConsumer.h @@ -173,6 +173,10 @@ public: /// \brief Whether this result was found via lookup into a base class. bool QualifierIsInformative : 1; + /// \brief Whether this declaration is the beginning of a + /// nested-name-specifier and, therefore, should be followed by '::'. + bool StartsNestedNameSpecifier : 1; + /// \brief If the result should have a nested-name-specifier, this is it. /// When \c QualifierIsInformative, the nested-name-specifier is /// informative rather than required. @@ -183,13 +187,14 @@ public: NestedNameSpecifier *Qualifier = 0, bool QualifierIsInformative = false) : Kind(RK_Declaration), Declaration(Declaration), Rank(Rank), - Hidden(false), QualifierIsInformative(QualifierIsInformative), - Qualifier(Qualifier) { } + Hidden(false), QualifierIsInformative(QualifierIsInformative), + StartsNestedNameSpecifier(false), Qualifier(Qualifier) { } /// \brief Build a result that refers to a keyword or symbol. Result(const char *Keyword, unsigned Rank) : Kind(RK_Keyword), Keyword(Keyword), Rank(Rank), Hidden(false), - QualifierIsInformative(0), Qualifier(0) { } + QualifierIsInformative(0), StartsNestedNameSpecifier(false), + Qualifier(0) { } /// \brief Retrieve the declaration stored in this result. NamedDecl *getDeclaration() const { diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp index f57480e13e..f0be3c68b8 100644 --- a/lib/Sema/SemaCodeComplete.cpp +++ b/lib/Sema/SemaCodeComplete.cpp @@ -313,6 +313,11 @@ void ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) { R.QualifierIsInformative = false; } + // If the filter is for nested-name-specifiers, then this result starts a + // nested-name-specifier. + if (Filter == &ResultBuilder::IsNestedNameSpecifier) + R.StartsNestedNameSpecifier = true; + // Insert this result into the set of results and into the current shadow // map. SMap.insert(std::make_pair(R.Declaration->getDeclName(), @@ -849,11 +854,13 @@ CodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S) { return Result; } - if (Qualifier) { + if (Qualifier || StartsNestedNameSpecifier) { CodeCompletionString *Result = new CodeCompletionString; AddQualifierToCompletionString(Result, Qualifier, QualifierIsInformative, S.Context); Result->AddTextChunk(ND->getNameAsString().c_str()); + if (StartsNestedNameSpecifier) + Result->AddTextChunk("::"); return Result; } diff --git a/test/CodeCompletion/tag.cpp b/test/CodeCompletion/tag.cpp index 2642b7c731..b00ff1fabd 100644 --- a/test/CodeCompletion/tag.cpp +++ b/test/CodeCompletion/tag.cpp @@ -21,6 +21,6 @@ namespace N { // CHECK-CC1: A : 4 // CHECK-CC1: X : 4 // CHECK-CC1: Y : 4 - // CHECK-CC1: M : 9 - // CHECK-CC1: N : 9 + // CHECK-CC1: M : 9 : M:: + // CHECK-CC1: N : 9 : N:: // RUN: true