]> granicus.if.org Git - clang/commitdiff
When code-completion finds a declaration only because it is usable as
authorDouglas Gregor <dgregor@apple.com>
Tue, 22 Sep 2009 23:22:24 +0000 (23:22 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 22 Sep 2009 23:22:24 +0000 (23:22 +0000)
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
lib/Sema/SemaCodeComplete.cpp
test/CodeCompletion/tag.cpp

index 6a10b28be918c87605eb09c62782c6f73e679efe..d18b4a732f22bec69df3672144e760fdb61e9e90 100644 (file)
@@ -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 {
index f57480e13e8106d7b229ae5edab63852428f3c1d..f0be3c68b83b5c1f834dc2f777d0fa559a494470 100644 (file)
@@ -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;
   }
   
index 2642b7c73176ebdc3b3ad131552da52d4a90994f..b00ff1fabdaabffe14d07c9891082084b6fe2a38 100644 (file)
@@ -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