On Monday 07 April 2014 11:10:37 Dmitri Gribenko wrote: > On Sun, Apr 6, 2014 at 1:20 AM, Kevin Funk <[email protected]> wrote: > > Hey, > > > > Title says it all, this patch adds clang_CXXMethod_isConst to libclang. > > > > Manual testing done. > > Hi Kevin, > > Please add a test in test/Index/load-classes.cpp. It would be awesome > if you also added test cases where c-index-test prints (static) and > (virtual) as well. With that, the patch LGTM. > > Dmitri
Added another patch (see 2/2): >From ccef03ce95f1766f3110b366a30ce46429275331 Mon Sep 17 00:00:00 2001 From: Kevin Funk <[email protected]> Date: Sun, 6 Apr 2014 02:10:14 +0200 Subject: [PATCH 1/2] libclang: Add clang_CXXMethod_isConst --- include/clang-c/Index.h | 6 ++++++ tools/c-index-test/c-index-test.c | 2 ++ tools/libclang/CIndex.cpp | 10 ++++++++++ tools/libclang/libclang.exports | 1 + 4 files changed, 19 insertions(+) diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 7eff0a4..386e0ff 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -4193,6 +4193,12 @@ CINDEX_LINKAGE unsigned clang_CXXMethod_isStatic(CXCursor C); CINDEX_LINKAGE unsigned clang_CXXMethod_isVirtual(CXCursor C); /** + * \brief Determine if a C++ member function or member function template is + * declared 'const'. + */ +CINDEX_LINKAGE unsigned clang_CXXMethod_isConst(CXCursor C); + +/** * \brief Given a cursor that represents a template, determine * the cursor kind of the specializations would be generated by instantiating * the template. diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index- test.c index f6b5510..6a48196 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -768,6 +768,8 @@ static void PrintCursor(CXCursor Cursor, printf(" (static)"); if (clang_CXXMethod_isVirtual(Cursor)) printf(" (virtual)"); + if (clang_CXXMethod_isConst(Cursor)) + printf(" (const)"); if (clang_CXXMethod_isPureVirtual(Cursor)) printf(" (pure)"); if (clang_Cursor_isVariadic(Cursor)) diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 04797a9..50e7c68 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -6403,6 +6403,16 @@ unsigned clang_CXXMethod_isPureVirtual(CXCursor C) { return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0; } +unsigned clang_CXXMethod_isConst(CXCursor C) { + if (!clang_isDeclaration(C.kind)) + return 0; + + const Decl *D = cxcursor::getCursorDecl(C); + const CXXMethodDecl *Method = + D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : 0; + return (Method && (Method->getTypeQualifiers() & Qualifiers::Const)) ? 1 : 0; +} + unsigned clang_CXXMethod_isStatic(CXCursor C) { if (!clang_isDeclaration(C.kind)) return 0; diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 37b6159..df8d85c 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -2,6 +2,7 @@ clang_CXCursorSet_contains clang_CXCursorSet_insert clang_CXIndex_getGlobalOptions clang_CXIndex_setGlobalOptions +clang_CXXMethod_isConst clang_CXXMethod_isPureVirtual clang_CXXMethod_isStatic clang_CXXMethod_isVirtual -- 1.9.1 >From 8acef62e4934fbb50971be21588eab5e8ef1409b Mon Sep 17 00:00:00 2001 From: Kevin Funk <[email protected]> Date: Mon, 7 Apr 2014 15:42:43 +0200 Subject: [PATCH 2/2] load-classes.cpp: Test {const,static,virtual} func --- test/Index/load-classes.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/test/Index/load-classes.cpp b/test/Index/load-classes.cpp index 9790d9e..adeff95 100644 --- a/test/Index/load-classes.cpp +++ b/test/Index/load-classes.cpp @@ -7,13 +7,17 @@ protected: ~X(); private: operator X*(); + + void constMethod() const; + static void staticMethod(); + virtual void virtualMethod(); }; X::X(int value) { } // RUN: c-index-test -test-load-source all %s | FileCheck %s -// CHECK: load-classes.cpp:3:8: StructDecl=X:3:8 (Definition) Extent=[3:1 - 10:2] +// CHECK: load-classes.cpp:3:8: StructDecl=X:3:8 (Definition) Extent=[3:1 - 14:2] // CHECK: load-classes.cpp:4:3: CXXConstructor=X:4:3 Extent=[4:3 - 4:15] [access=public] // FIXME: missing TypeRef in the constructor name // CHECK: load-classes.cpp:4:9: ParmDecl=value:4:9 (Definition) Extent=[4:5 - 4:14] @@ -25,6 +29,10 @@ X::X(int value) { // FIXME: missing TypeRef in the destructor name // CHECK: load-classes.cpp:9:3: CXXConversion=operator X *:9:3 Extent=[9:3 - 9:16] [access=private] // CHECK: load-classes.cpp:9:12: TypeRef=struct X:3:8 Extent=[9:12 - 9:13] -// CHECK: load-classes.cpp:12:4: CXXConstructor=X:12:4 (Definition) Extent=[12:1 - 13:2] [access=public] -// CHECK: load-classes.cpp:12:1: TypeRef=struct X:3:8 Extent=[12:1 - 12:2] -// CHECK: load-classes.cpp:12:10: ParmDecl=value:12:10 (Definition) Extent=[12:6 - 12:15] +// CHECK: load-classes.cpp:11:8: CXXMethod=constMethod:11:8 (const) Extent=[11:3 - 11:27] [access=private] +// CHECK: load-classes.cpp:12:15: CXXMethod=staticMethod:12:15 (static) Extent=[12:3 - 12:29] [access=private] +// CHECK: load-classes.cpp:13:16: CXXMethod=virtualMethod:13:16 (virtual) Extent=[13:3 - 13:31] [access=private] +// CHECK: load-classes.cpp:16:4: CXXConstructor=X:16:4 (Definition) Extent=[16:1 - 17:2] [access=public] +// CHECK: load-classes.cpp:16:1: TypeRef=struct X:3:8 Extent=[16:1 - 16:2] +// CHECK: load-classes.cpp:16:10: ParmDecl=value:16:10 (Definition) Extent=[16:6 - 16:15] +// CHECK: load-classes.cpp:16:17: CompoundStmt= Extent=[16:17 - 17:2] -- 1.9.1 Greets -- Kevin Funk _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
