]> granicus.if.org Git - clang/commitdiff
[libclang] Introduce clang_Cursor_getObjCSelectorIndex() function.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 30 Mar 2012 22:15:48 +0000 (22:15 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 30 Mar 2012 22:15:48 +0000 (22:15 +0000)
After getting a cursor with clang_getCursor for a particular source location,
allows querying the cursor in order to find out if the location points to a
selector identifier in an objc method or message expression, and which selector index it is.

rdar://11158946

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

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

index a65bb635b26b216e7332bc91da18859674a8c548..4568a764e0ec4f682d6b4cc39b5ab7e598df2c2c 100644 (file)
@@ -3001,6 +3001,20 @@ CINDEX_LINKAGE unsigned clang_isCursorDefinition(CXCursor);
  */
 CINDEX_LINKAGE CXCursor clang_getCanonicalCursor(CXCursor);
 
+
+/**
+ * \brief If the cursor points to a selector identifier in a objc method or
+ * message expression, this returns the selector index.
+ *
+ * After getting a cursor with \see clang_getCursor, this can be called to
+ * determine if the location points to a selector identifier.
+ *
+ * \returns The selector index if the cursor is an objc method or message
+ * expression and the cursor is pointing to a selector identifier, or -1
+ * otherwise.
+ */
+CINDEX_LINKAGE int clang_Cursor_getObjCSelectorIndex(CXCursor);
+
 /**
  * @}
  */
index d73b23a18f1448aa1cec99e5628971f37096c61e..60e35eedd427806cd1b129af49f8d79483d542d7 100644 (file)
@@ -83,5 +83,5 @@ void foo3(Test3 *test3) {
 
 // RUN: c-index-test -cursor-at=%s:56:24 -cursor-at=%s:60:14 \
 // RUN:   %s | FileCheck -check-prefix=CHECK-SPELLRANGE %s
-// CHECK-SPELLRANGE: 56:8 ObjCInstanceMethodDecl=setFoo:withBar::56:8 Extent=[56:1 - 56:37] Spelling=setFoo:withBar: ([56:8 - 56:14][56:22 - 56:29])
-// CHECK-SPELLRANGE: 60:3 ObjCMessageExpr=setFoo:withBar::56:8 Extent=[60:3 - 60:29] Spelling=setFoo:withBar: ([60:10 - 60:16][60:19 - 60:26])
+// CHECK-SPELLRANGE: 56:8 ObjCInstanceMethodDecl=setFoo:withBar::56:8 Extent=[56:1 - 56:37] Spelling=setFoo:withBar: ([56:8 - 56:14][56:22 - 56:29]) Selector index=1
+// CHECK-SPELLRANGE: 60:3 ObjCMessageExpr=setFoo:withBar::56:8 Extent=[60:3 - 60:29] Spelling=setFoo:withBar: ([60:10 - 60:16][60:19 - 60:26]) Selector index=0
index e774e78086c5be687b031c0049e9367c2c2cce66..873233575cb24d7cb6661c27e68bdc1646007908 100644 (file)
@@ -1464,6 +1464,8 @@ static int inspect_cursor_at(int argc, const char **argv) {
           printf(")");
         }
         clang_disposeString(Spelling);
+        if (clang_Cursor_getObjCSelectorIndex(Cursor) != -1)
+          printf(" Selector index=%d",clang_Cursor_getObjCSelectorIndex(Cursor));
         if (completionString != NULL) {
           printf("\nCompletion string: ");
           print_completion_string(completionString, stdout);
index c63a969fe46d7a49fd7bea9b389f82a92937c2ba..1896132fa01eb04e1c88ac5d34896ec8cfe0352d 100644 (file)
@@ -4425,6 +4425,10 @@ CXCursor clang_getCanonicalCursor(CXCursor C) {
   
   return C;
 }
+
+int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
+  return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
+}
   
 unsigned clang_getNumOverloadedDecls(CXCursor C) {
   if (C.kind != CXCursor_OverloadedDeclRef)
index 2fe3f1d53c6c08de3a6e3db37e8dcecd30bdcf29..95cfb025cbafa514101e4d2c7dcf9f8edf145cab 100644 (file)
@@ -6,6 +6,7 @@ clang_CXXMethod_isStatic
 clang_CXXMethod_isVirtual
 clang_Cursor_getSpellingNameRange
 clang_Cursor_getTranslationUnit
+clang_Cursor_getObjCSelectorIndex
 clang_Cursor_isNull
 clang_IndexAction_create
 clang_IndexAction_dispose