]> granicus.if.org Git - clang/commitdiff
Include __FUNCTION__, __PRETTY_FUNCTION_, __func__ in code-completion
authorDouglas Gregor <dgregor@apple.com>
Mon, 23 Aug 2010 21:54:33 +0000 (21:54 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 23 Aug 2010 21:54:33 +0000 (21:54 +0000)
results for expression contexts within a function.

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

lib/Sema/SemaCodeComplete.cpp
test/Index/complete-exprs.c

index 1d91c3fa812a4e22d49eb0b94dd672e6b6f6205a..d886e64bb538cdbe731d9d45b85f0f52b5fcdc94 100644 (file)
@@ -2189,6 +2189,18 @@ static void AddMacroResults(Preprocessor &PP, ResultBuilder &Results,
   Results.ExitScope();
 }
 
+static void AddPrettyFunctionResults(const LangOptions &LangOpts, 
+                                     ResultBuilder &Results) {
+  typedef CodeCompleteConsumer::Result Result;
+  
+  Results.EnterNewScope();
+  Results.AddResult(Result("__PRETTY_FUNCTION__", CCP_Constant));
+  Results.AddResult(Result("__FUNCTION__", CCP_Constant));
+  if (LangOpts.C99 || LangOpts.CPlusPlus0x)
+    Results.AddResult(Result("__func__", CCP_Constant));
+  Results.ExitScope();
+}
+
 static void HandleCodeCompleteResults(Sema *S,
                                       CodeCompleteConsumer *CodeCompleter,
                                       CodeCompletionContext Context,
@@ -2280,8 +2292,29 @@ void Sema::CodeCompleteOrdinaryName(Scope *S,
   AddOrdinaryNameResults(CompletionContext, S, *this, Results);
   Results.ExitScope();
 
+  switch (CompletionContext) {
+    case PCC_Expression:
+    case PCC_Statement:
+    case PCC_RecoveryInFunction:
+      if (S->getFnParent())
+        AddPrettyFunctionResults(PP.getLangOptions(), Results);        
+      break;
+      
+    case PCC_Namespace:
+    case PCC_Class:
+    case PCC_ObjCInterface:
+    case PCC_ObjCImplementation:
+    case PCC_ObjCInstanceVariableList:
+    case PCC_Template:
+    case PCC_MemberTemplate:
+    case PCC_ForInit:
+    case PCC_Condition:
+      break;
+  }
+  
   if (CodeCompleter->includeMacros())
     AddMacroResults(PP, Results);
+  
   HandleCodeCompleteResults(this, CodeCompleter,
                             mapCodeCompletionContext(*this, CompletionContext),
                             Results.data(),Results.size());
@@ -2373,6 +2406,11 @@ void Sema::CodeCompleteExpression(Scope *S,
       || Data.PreferredType->isMemberPointerType() 
       || Data.PreferredType->isBlockPointerType();
   
+  if (S->getFnParent() && 
+      !Data.ObjCCollection && 
+      !Data.IntegralConstantExpression)
+    AddPrettyFunctionResults(PP.getLangOptions(), Results);        
+
   if (CodeCompleter->includeMacros())
     AddMacroResults(PP, Results, PreferredTypeIsPointer);
   HandleCodeCompleteResults(this, CodeCompleter, 
index 5eead7e1fde1532bac65ca06590569e47db8af89..d6ad8abdf9f8d0448f419940c25a2e047468e150 100644 (file)
@@ -14,12 +14,14 @@ const char *str = "Hello, \nWorld";
 
 // RUN: c-index-test -code-completion-at=%s:7:9 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
 // RUN: env CINDEXTEST_EDITING=1 c-index-test -code-completion-at=%s:7:9 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
+// CHECK-CC1: NotImplemented:{TypedText __PRETTY_FUNCTION__} (60)
 // CHECK-CC1: macro definition:{TypedText __VERSION__} (70)
 // CHECK-CC1: FunctionDecl:{ResultType int}{TypedText f}{LeftParen (}{Placeholder int}{RightParen )} (12)
 // CHECK-CC1-NOT: NotImplemented:{TypedText float} (40)
 // CHECK-CC1: ParmDecl:{ResultType int}{TypedText j} (2)
 // CHECK-CC1: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )} (30)
 // RUN: env CINDEXTEST_EDITING=1 CINDEXTEST_COMPLETION_CACHING=1 c-index-test -code-completion-at=%s:7:9 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1a %s
+// CHECK-CC1a: NotImplemented:{TypedText __PRETTY_FUNCTION__} (60)
 // CHECK-CC1a: ParmDecl:{ResultType int}{TypedText j} (2)
 // CHECK-CC1a: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )} (30)
 // CHECK-CC1a: FunctionDecl:{ResultType int}{TypedText f}{LeftParen (}{Placeholder int}{RightParen )} (12)