]> granicus.if.org Git - clang/commitdiff
Add a function's cv-qualifiers to the code-completion results as an
authorDouglas Gregor <dgregor@apple.com>
Fri, 11 Dec 2009 18:44:16 +0000 (18:44 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 11 Dec 2009 18:44:16 +0000 (18:44 +0000)
informative chunk.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91139 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaCodeComplete.cpp
test/CodeCompletion/member-access.cpp

index f186165551435084fa3e00a4ac8861b466fec856..140cb5c8a7f154c60be7fc294136fc5f644600a4 100644 (file)
@@ -947,10 +947,11 @@ static void AddTemplateParameterChunks(ASTContext &Context,
 
 /// \brief Add a qualifier to the given code-completion string, if the
 /// provided nested-name-specifier is non-NULL.
-void AddQualifierToCompletionString(CodeCompletionString *Result, 
-                                    NestedNameSpecifier *Qualifier, 
-                                    bool QualifierIsInformative,
-                                    ASTContext &Context) {
+static void 
+AddQualifierToCompletionString(CodeCompletionString *Result, 
+                               NestedNameSpecifier *Qualifier, 
+                               bool QualifierIsInformative,
+                               ASTContext &Context) {
   if (!Qualifier)
     return;
   
@@ -965,6 +966,23 @@ void AddQualifierToCompletionString(CodeCompletionString *Result,
     Result->AddTextChunk(PrintedNNS);
 }
 
+static void AddFunctionTypeQualsToCompletionString(CodeCompletionString *Result,
+                                                   FunctionDecl *Function) {
+  const FunctionProtoType *Proto
+    = Function->getType()->getAs<FunctionProtoType>();
+  if (!Proto || !Proto->getTypeQuals())
+    return;
+
+  std::string QualsStr;
+  if (Proto->getTypeQuals() & Qualifiers::Const)
+    QualsStr += " const";
+  if (Proto->getTypeQuals() & Qualifiers::Volatile)
+    QualsStr += " volatile";
+  if (Proto->getTypeQuals() & Qualifiers::Restrict)
+    QualsStr += " restrict";
+  Result->AddInformativeChunk(QualsStr);
+}
+
 /// \brief If possible, create a new code completion string for the given
 /// result.
 ///
@@ -1038,6 +1056,7 @@ CodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S) {
     Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
     AddFunctionParameterChunks(S.Context, Function, Result);
     Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen));
+    AddFunctionTypeQualsToCompletionString(Result, Function);
     return Result;
   }
   
@@ -1091,6 +1110,7 @@ CodeCompleteConsumer::Result::CreateCodeCompletionString(Sema &S) {
     Result->AddChunk(Chunk(CodeCompletionString::CK_LeftParen));
     AddFunctionParameterChunks(S.Context, Function, Result);
     Result->AddChunk(Chunk(CodeCompletionString::CK_RightParen));
+    AddFunctionTypeQualsToCompletionString(Result, Function);
     return Result;
   }
   
index 6fefb64c705f896327eaf53870d712d7411366cd..d03180b182de798b82e05837e80f10a44e5a8fc7 100644 (file)
@@ -11,7 +11,7 @@ struct Base2 {
 
 struct Base3 : Base1, Base2 {
   void memfun1(float);
-  void memfun1(double);
+  void memfun1(double) const;
   void memfun2(int);
 };
 
@@ -34,7 +34,7 @@ void test(const Proxy &p) {
   // CHECK-CC1: member3 : 0
   // CHECK-CC1: member4 : 0
   // CHECK-CC1: memfun1 : 0 : [#Base3::#]memfun1(<#float#>)
-  // CHECK-CC1: memfun1 : 0 : [#Base3::#]memfun1(<#double#>)
+  // CHECK-CC1: memfun1 : 0 : [#Base3::#]memfun1(<#double#>)[# const#]
   // CHECK-CC1: memfun2 : 0 : [#Base3::#]memfun2(<#int#>)
   // CHECK-CC1: memfun3 : 0 : memfun3(<#int#>)
   // CHECK-CC1: memfun1 : 0 (Hidden) : Base2::memfun1(<#int#>)