]> granicus.if.org Git - clang/commitdiff
Suggest "const" and "volatile" code completions after a function
authorDouglas Gregor <dgregor@apple.com>
Fri, 27 Aug 2010 17:35:51 +0000 (17:35 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 27 Aug 2010 17:35:51 +0000 (17:35 +0000)
declarator, the very definition of "low-hanging fruit".

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

include/clang/Sema/CodeCompleteConsumer.h
include/clang/Sema/Sema.h
lib/Frontend/ASTUnit.cpp
lib/Parse/ParseDecl.cpp
lib/Sema/SemaCodeComplete.cpp
test/Index/complete-memfunc-cvquals.cpp

index 28210576e0251740844946008f9b54939a789237..edc6331af074aff6f53b2b14104ccdf61e0812bd 100644 (file)
@@ -201,7 +201,9 @@ public:
     /// unless they come from an appropriate natural-language dictionary.
     CCC_NaturalLanguage,
     /// \brief Code completion for a selector, as in an @selector expression.
-    CCC_SelectorName
+    CCC_SelectorName,
+    /// \brief Code completion within a type-qualifier list.
+    CCC_TypeQualifiers
   };
 
 private:
index 43f99ae284008c66b12cbbf077c6d0ba2159960b..974381668b72e8591c766dccea2090148c9bf6ec 100644 (file)
@@ -4332,6 +4332,7 @@ public:
                                                SourceLocation OpLoc,
                                                bool IsArrow);
   virtual void CodeCompleteTag(Scope *S, unsigned TagSpec);
+  virtual void CodeCompleteTypeQualifiers(DeclSpec &DS);
   virtual void CodeCompleteCase(Scope *S);
   virtual void CodeCompleteCall(Scope *S, Expr *Fn,
                                 Expr **Args, unsigned NumArgs);
index 851c6669fee0c89a816abecfb851527888da72f3..c76488b2c62c6592d4a77be7da6d30597e38578e 100644 (file)
@@ -1555,6 +1555,7 @@ void CalculateHiddenNames(const CodeCompletionContext &Context,
   case CodeCompletionContext::CCC_PreprocessorDirective:
   case CodeCompletionContext::CCC_NaturalLanguage:
   case CodeCompletionContext::CCC_SelectorName:
+  case CodeCompletionContext::CCC_TypeQualifiers:
     // We're looking for nothing, or we're looking for names that cannot
     // be hidden.
     return;
index 0cc9103c058d59ccb12bd1e18303746091a3280c..c73b6085ead8f82366e31bb544ac967820fb22d3 100644 (file)
@@ -2442,6 +2442,11 @@ void Parser::ParseTypeQualifierListOpt(DeclSpec &DS, bool GNUAttributesAllowed,
     SourceLocation Loc = Tok.getLocation();
 
     switch (Tok.getKind()) {
+    case tok::code_completion:
+      Actions.CodeCompleteTypeQualifiers(DS);
+      ConsumeCodeCompletionToken();
+      break;
+        
     case tok::kw_const:
       isInvalid = DS.SetTypeQual(DeclSpec::TQ_const   , Loc, PrevSpec, DiagID,
                                  getLang());
index 384cf524c9eda4cc616e5cf05cfa90310c741cf5..57ec3297dc0d57bfb008eca910bd6cae333d64df 100644 (file)
@@ -2761,6 +2761,22 @@ void Sema::CodeCompleteTag(Scope *S, unsigned TagSpec) {
                             Results.data(),Results.size());
 }
 
+void Sema::CodeCompleteTypeQualifiers(DeclSpec &DS) {
+  ResultBuilder Results(*this);
+  Results.EnterNewScope();
+  if (!(DS.getTypeQualifiers() & DeclSpec::TQ_const))
+    Results.AddResult("const");
+  if (!(DS.getTypeQualifiers() & DeclSpec::TQ_volatile))
+    Results.AddResult("volatile");
+  if (getLangOptions().C99 &&
+      !(DS.getTypeQualifiers() & DeclSpec::TQ_restrict))
+    Results.AddResult("restrict");
+  Results.ExitScope();
+  HandleCodeCompleteResults(this, CodeCompleter, 
+                            CodeCompletionContext::CCC_TypeQualifiers,
+                            Results.data(), Results.size());
+}
+
 void Sema::CodeCompleteCase(Scope *S) {
   if (getCurFunction()->SwitchStack.empty() || !CodeCompleter)
     return;
index 08acdd18c1f8b5d76e5cc1f9861dbe000b7a1179..6635bed6ff92a0e91a0e777f13ea713d077482e5 100644 (file)
@@ -76,3 +76,11 @@ void Foo::bingo() volatile {
 // CHECK-IMPLICIT-VOLATILE: FunctionDecl:{ResultType void}{TypedText babble}{LeftParen (}{RightParen )}{Informative  const volatile} (15)
 // CHECK-IMPLICIT-VOLATILE-NOT: baz
 // CHECK-IMPLICIT-VOLATILE: FunctionDecl:{ResultType void}{TypedText bingo}{LeftParen (}{RightParen )}{Informative  volatile} (14)
+
+// RUN: c-index-test -code-completion-at=%s:4:17 %s | FileCheck -check-prefix=CHECK-CVQUAL-AFTER %s
+// CHECK-CVQUAL-AFTER: NotImplemented:{TypedText const} (30)
+// CHECK-CVQUAL-AFTER: NotImplemented:{TypedText volatile} (30)
+
+// RUN: c-index-test -code-completion-at=%s:4:23 %s | FileCheck -check-prefix=CHECK-CVQUAL-AFTER2 %s
+// CHECK-CVQUAL-AFTER2-NOT: NotImplemented:{TypedText const} (30)
+// CHECK-CVQUAL-AFTER2: NotImplemented:{TypedText volatile} (30)