From 93697fa7557a7305e51c0c5b0982a404d399e6fd Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Mon, 23 Nov 2015 19:56:46 +0000 Subject: Make clang_Cursor_getMangling not mangle if the declaration isn't mangled Right now clang_Cursor_getMangling will attempt to mangle any declaration, even if the declaration isn't mangled (extern C). This results in a partially mangled name which isn't useful for much. This patch makes clang_Cursor_getMangling return an empty string if the declaration isn't mangled. Patch by Michael Wu . llvm-svn: 253909 --- clang/tools/c-index-test/c-index-test.c | 30 ++++++++++++++++++++++++++++++ clang/tools/libclang/CIndex.cpp | 21 +++++++++++++++++++++ clang/tools/libclang/libclang.exports | 1 + 3 files changed, 52 insertions(+) (limited to 'clang/tools') diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 8181642d71b..948195debae 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -1247,6 +1247,32 @@ static enum CXChildVisitResult PrintLinkage(CXCursor cursor, CXCursor p, return CXChildVisit_Recurse; } +/******************************************************************************/ +/* Visibility testing. */ +/******************************************************************************/ + +static enum CXChildVisitResult PrintVisibility(CXCursor cursor, CXCursor p, + CXClientData d) { + const char *visibility = 0; + + if (clang_isInvalid(clang_getCursorKind(cursor))) + return CXChildVisit_Recurse; + + switch (clang_getCursorVisibility(cursor)) { + case CXVisibility_Invalid: break; + case CXVisibility_Hidden: visibility = "Hidden"; break; + case CXVisibility_Protected: visibility = "Protected"; break; + case CXVisibility_Default: visibility = "Default"; break; + } + + if (visibility) { + PrintCursor(cursor, NULL); + printf("visibility=%s\n", visibility); + } + + return CXChildVisit_Recurse; +} + /******************************************************************************/ /* Typekind testing. */ /******************************************************************************/ @@ -4084,6 +4110,7 @@ static void print_usage(void) { " c-index-test -test-inclusion-stack-tu \n"); fprintf(stderr, " c-index-test -test-print-linkage-source {}*\n" + " c-index-test -test-print-visibility {}*\n" " c-index-test -test-print-type {}*\n" " c-index-test -test-print-type-size {}*\n" " c-index-test -test-print-bitwidth {}*\n" @@ -4171,6 +4198,9 @@ int cindextest_main(int argc, const char **argv) { else if (argc > 2 && strcmp(argv[1], "-test-print-linkage-source") == 0) return perform_test_load_source(argc - 2, argv + 2, "all", PrintLinkage, NULL); + else if (argc > 2 && strcmp(argv[1], "-test-print-visibility") == 0) + return perform_test_load_source(argc - 2, argv + 2, "all", PrintVisibility, + NULL); else if (argc > 2 && strcmp(argv[1], "-test-print-type") == 0) return perform_test_load_source(argc - 2, argv + 2, "all", PrintType, 0); diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index f070e39e717..589e39e797d 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -6450,6 +6450,27 @@ CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { } } // end: extern "C" +//===----------------------------------------------------------------------===// +// Operations for querying visibility of a cursor. +//===----------------------------------------------------------------------===// + +extern "C" { +CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) { + if (!clang_isDeclaration(cursor.kind)) + return CXVisibility_Invalid; + + const Decl *D = cxcursor::getCursorDecl(cursor); + if (const NamedDecl *ND = dyn_cast_or_null(D)) + switch (ND->getVisibility()) { + case HiddenVisibility: return CXVisibility_Hidden; + case ProtectedVisibility: return CXVisibility_Protected; + case DefaultVisibility: return CXVisibility_Default; + }; + + return CXVisibility_Invalid; +} +} // end: extern "C" + //===----------------------------------------------------------------------===// // Operations for querying language of a cursor. //===----------------------------------------------------------------------===// diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index 452e92a815b..993644d02fc 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -176,6 +176,7 @@ clang_getCursorSemanticParent clang_getCursorSpelling clang_getCursorType clang_getCursorUSR +clang_getCursorVisibility clang_getDeclObjCTypeEncoding clang_getDefinitionSpellingAndExtent clang_getDiagnostic -- cgit v1.2.3