]> granicus.if.org Git - clang/commitdiff
[libclang] Introduce clang_Cursor_isVariadic, which returns non-zero if the given...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 18 Apr 2013 23:53:05 +0000 (23:53 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 18 Apr 2013 23:53:05 +0000 (23:53 +0000)
rdar://13667150

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

include/clang-c/Index.h
test/Index/print-type.m
tools/c-index-test/c-index-test.c
tools/libclang/CIndex.cpp
tools/libclang/libclang.exports

index a4994b334bce92e4a712d784057b35fe9c81bae1..05a1d6473c9f8ba4809008c7989872010e55fe16 100644 (file)
@@ -3409,6 +3409,11 @@ typedef enum {
  */
 CINDEX_LINKAGE unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C);
 
+/**
+ * \brief Returns non-zero if the given cursor is a variadic function or method.
+ */
+CINDEX_LINKAGE unsigned clang_Cursor_isVariadic(CXCursor C);
+
 /**
  * \brief Given a cursor that represents a declaration, return the associated
  * comment's source range.  The range may include multiple consecutive comments
index 783f85bac55fd3c1d8af3a73a95b2653b05b37f1..6f146f80202bccde5b331e7396a8cf3ef5e23fb5 100644 (file)
@@ -2,7 +2,7 @@
 @property (readonly) id x;
 -(int) mymethod;
 -(const id) mymethod2:(id)x blah:(Class)y boo:(SEL)z;
--(bycopy)methodIn:(in int)i andOut:(out short *)j;
+-(bycopy)methodIn:(in int)i andOut:(out short *)j , ...;
 @end
 
 // RUN: c-index-test -test-print-type %s | FileCheck %s
@@ -10,6 +10,6 @@
 // CHECK: ObjCInstanceMethodDecl=mymethod:3:8 [type=] [typekind=Invalid] [resulttype=int] [resulttypekind=Int] [isPOD=0]
 // CHECK: ObjCInstanceMethodDecl=mymethod2:blah:boo::4:13 [type=] [typekind=Invalid] [resulttype=const id] [resulttypekind=ObjCId] [args= [id] [ObjCId] [Class] [ObjCClass] [SEL] [ObjCSel]] [isPOD=0]
 // CHECK: ParmDecl=z:4:52 (Definition) [type=SEL] [typekind=ObjCSel] [canonicaltype=SEL *] [canonicaltypekind=Pointer] [isPOD=1]
-// CHECK: ObjCInstanceMethodDecl=methodIn:andOut::5:10 [Bycopy,] [type=] [typekind=Invalid] [resulttype=id] [resulttypekind=ObjCId] [args= [int] [Int] [short *] [Pointer]] [isPOD=0]
+// CHECK: ObjCInstanceMethodDecl=methodIn:andOut::5:10 (variadic) [Bycopy,] [type=] [typekind=Invalid] [resulttype=id] [resulttypekind=ObjCId] [args= [int] [Int] [short *] [Pointer]] [isPOD=0]
 // CHECK: ParmDecl=i:5:27 (Definition) [In,] [type=int] [typekind=Int] [isPOD=1]
 // CHECK: ParmDecl=j:5:49 (Definition) [Out,] [type=short *] [typekind=Pointer] [isPOD=1]
index b8664ed75aa3fd6ad0cbd71dd5f0877d768e8ab6..9b083e49f5cd2153a4c8ef70adcdb6075dcd90b0 100644 (file)
@@ -694,6 +694,9 @@ static void PrintCursor(CXCursor Cursor,
       printf(" (static)");
     if (clang_CXXMethod_isVirtual(Cursor))
       printf(" (virtual)");
+
+    if (clang_Cursor_isVariadic(Cursor))
+      printf(" (variadic)");
     
     if (Cursor.kind == CXCursor_IBOutletCollectionAttr) {
       CXType T =
index 8a56f4da06cfdf9f1080c5675285268f2a32cf37..d29e3d86087ebb1b05c65c415c6cef43f3bfcccb 100644 (file)
@@ -5972,6 +5972,19 @@ unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) {
   return Result;
 }
 
+unsigned clang_Cursor_isVariadic(CXCursor C) {
+  if (!clang_isDeclaration(C.kind))
+    return 0;
+
+  const Decl *D = getCursorDecl(C);
+  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
+    return FD->isVariadic();
+  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
+    return MD->isVariadic();
+
+  return 0;
+}
+
 CXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
   if (!clang_isDeclaration(C.kind))
     return clang_getNullRange();
index ffea921cad72906b3181199cd924c44d37439419..c7508bc5449becee2348bd9cb64665cd12b4c578 100644 (file)
@@ -19,6 +19,7 @@ clang_Cursor_getReceiverType
 clang_Cursor_isBitField
 clang_Cursor_isDynamicCall
 clang_Cursor_isNull
+clang_Cursor_isVariadic
 clang_Cursor_getModule
 clang_Module_getParent
 clang_Module_getName