[cfe-commits] r159627 - in /cfe/trunk: include/clang-c/Index.h test/Index/cursor-dynamic-call.mm tools/c-index-test/c-index-test.c tools/libclang/CXCursor.cpp tools/libclang/libclang.exports

Argyrios Kyrtzidis akyrtzi at gmail.com
Mon Jul 2 16:54:36 PDT 2012


Author: akirtzidis
Date: Mon Jul  2 18:54:36 2012
New Revision: 159627

URL: http://llvm.org/viewvc/llvm-project?rev=159627&view=rev
Log:
[libclang] Introduce clang_Cursor_isDynamicCall which,
given a cursor pointing to a C++ method call or an ObjC message,
returns non-zero if the method/message is "dynamic", meaning:

  For a C++ method: the call is virtual.
  For an ObjC message: the receiver is an object instance, not 'super' or a
  specific class.

rdar://11779185

Added:
    cfe/trunk/test/Index/cursor-dynamic-call.mm
Modified:
    cfe/trunk/include/clang-c/Index.h
    cfe/trunk/tools/c-index-test/c-index-test.c
    cfe/trunk/tools/libclang/CXCursor.cpp
    cfe/trunk/tools/libclang/libclang.exports

Modified: cfe/trunk/include/clang-c/Index.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=159627&r1=159626&r2=159627&view=diff
==============================================================================
--- cfe/trunk/include/clang-c/Index.h (original)
+++ cfe/trunk/include/clang-c/Index.h Mon Jul  2 18:54:36 2012
@@ -3144,6 +3144,19 @@
 CINDEX_LINKAGE int clang_Cursor_getObjCSelectorIndex(CXCursor);
 
 /**
+ * \brief Given a cursor pointing to a C++ method call or an ObjC message,
+ * returns non-zero if the method/message is "dynamic", meaning:
+ * 
+ * For a C++ method: the call is virtual.
+ * For an ObjC message: the receiver is an object instance, not 'super' or a
+ * specific class.
+ * 
+ * If the method/message is "static" or the cursor does not point to a
+ * method/message, it will return zero.
+ */
+CINDEX_LINKAGE int clang_Cursor_isDynamicCall(CXCursor C);
+
+/**
  * \brief Given a cursor that represents a declaration, return the associated
  * comment's source range.  The range may include multiple consecutive comments
  * with whitespace in between.

Added: cfe/trunk/test/Index/cursor-dynamic-call.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/cursor-dynamic-call.mm?rev=159627&view=auto
==============================================================================
--- cfe/trunk/test/Index/cursor-dynamic-call.mm (added)
+++ cfe/trunk/test/Index/cursor-dynamic-call.mm Mon Jul  2 18:54:36 2012
@@ -0,0 +1,59 @@
+
+struct SB {
+  virtual void meth();
+};
+
+struct SS : public SB {
+  void submeth() {
+    this->meth();
+    SB::meth();
+  }
+};
+
+ at interface IB
+-(void)meth;
++(void)ClsMeth;
+ at end
+
+ at interface IS : IB
+-(void)submeth;
++(void)ClsMeth;
+ at end
+
+ at implementation IS
+-(void)submeth {
+  [self meth];
+  [super meth];
+}
++(void)ClsMeth {
+  [super ClsMeth];
+}
+ at end
+
+void foo(SS *ss, IS* is, Class cls) {
+  ss->meth();
+  [is meth];
+  [IB ClsMeth];
+  [cls ClsMeth];
+}
+
+// RUN: c-index-test -cursor-at=%s:8:11 \
+// RUN:              -cursor-at=%s:9:11 \
+// RUN:              -cursor-at=%s:25:11 \
+// RUN:              -cursor-at=%s:26:11 \
+// RUN:              -cursor-at=%s:29:11 \
+// RUN:              -cursor-at=%s:34:9 \
+// RUN:              -cursor-at=%s:35:9 \
+// RUN:              -cursor-at=%s:36:9 \
+// RUN:              -cursor-at=%s:37:9 \
+// RUN:       %s | FileCheck %s
+
+// CHECK:     8:11 MemberRefExpr=meth:3:16 {{.*}} Dynamic-call
+// CHECK-NOT: 9:9 {{.*}} Dynamic-call
+// CHECK:     25:3 ObjCMessageExpr=meth:14:8 {{.*}} Dynamic-call
+// CHECK-NOT: 26:3 {{.*}} Dynamic-call
+// CHECK-NOT: 29:3 {{.*}} Dynamic-call
+// CHECK:     34:7 MemberRefExpr=meth:3:16 {{.*}} Dynamic-call
+// CHECK:     35:3 ObjCMessageExpr=meth:14:8 {{.*}} Dynamic-call
+// CHECK-NOT: 36:3 {{.*}} Dynamic-call
+// CHECK:     37:3 ObjCMessageExpr=ClsMeth:15:8 {{.*}} Dynamic-call

Modified: cfe/trunk/tools/c-index-test/c-index-test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=159627&r1=159626&r2=159627&view=diff
==============================================================================
--- cfe/trunk/tools/c-index-test/c-index-test.c (original)
+++ cfe/trunk/tools/c-index-test/c-index-test.c Mon Jul  2 18:54:36 2012
@@ -1614,6 +1614,9 @@
         clang_disposeString(Spelling);
         if (clang_Cursor_getObjCSelectorIndex(Cursor) != -1)
           printf(" Selector index=%d",clang_Cursor_getObjCSelectorIndex(Cursor));
+        if (clang_Cursor_isDynamicCall(Cursor))
+          printf(" Dynamic-call");
+
         if (completionString != NULL) {
           printf("\nCompletion string: ");
           print_completion_string(completionString, stdout);

Modified: cfe/trunk/tools/libclang/CXCursor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=159627&r1=159626&r2=159627&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CXCursor.cpp (original)
+++ cfe/trunk/tools/libclang/CXCursor.cpp Mon Jul  2 18:54:36 2012
@@ -1319,5 +1319,30 @@
   
   pool.AvailableCursors.push_back(Vec);
 }
-  
+
+int clang_Cursor_isDynamicCall(CXCursor C) {
+  const Expr *E = 0;
+  if (clang_isExpression(C.kind))
+    E = getCursorExpr(C);
+  if (!E)
+    return 0;
+
+  if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E))
+    return MsgE->getReceiverKind() == ObjCMessageExpr::Instance;
+
+  const MemberExpr *ME = 0;
+  if (isa<MemberExpr>(E))
+    ME = cast<MemberExpr>(E);
+  else if (const CallExpr *CE = dyn_cast<CallExpr>(E))
+    ME = dyn_cast_or_null<MemberExpr>(CE->getCallee());
+
+  if (ME) {
+    if (const CXXMethodDecl *
+          MD = dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl()))
+      return MD->isVirtual() && !ME->hasQualifier();
+  }
+
+  return 0;
+}
+
 } // end: extern "C"

Modified: cfe/trunk/tools/libclang/libclang.exports
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/libclang.exports?rev=159627&r1=159626&r2=159627&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/libclang.exports (original)
+++ cfe/trunk/tools/libclang/libclang.exports Mon Jul  2 18:54:36 2012
@@ -12,6 +12,7 @@
 clang_Cursor_getObjCSelectorIndex
 clang_Cursor_getSpellingNameRange
 clang_Cursor_getTranslationUnit
+clang_Cursor_isDynamicCall
 clang_Cursor_isNull
 clang_IndexAction_create
 clang_IndexAction_dispose





More information about the cfe-commits mailing list