diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2017-05-10 15:10:36 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2017-05-10 15:10:36 +0000 |
| commit | 0381cc74c773fe3e73475b982375fb66cb7ef9f9 (patch) | |
| tree | 961ab76c67fe0028481960010bed0a728fac6c77 /clang/tools | |
| parent | 30a71573729a4306b9f94a8f0a1faf770b14a21f (diff) | |
| download | bcm5719-llvm-0381cc74c773fe3e73475b982375fb66cb7ef9f9.tar.gz bcm5719-llvm-0381cc74c773fe3e73475b982375fb66cb7ef9f9.zip | |
[libclang] Introduce clang_Cursor_isExternalSymbol that provides info about decls marked with external_source_symbol attribute
llvm-svn: 302677
Diffstat (limited to 'clang/tools')
| -rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 13 | ||||
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 29 | ||||
| -rw-r--r-- | clang/tools/libclang/libclang.exports | 1 |
3 files changed, 43 insertions, 0 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 1179fbf3911..1f5d6044319 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -809,6 +809,19 @@ static void PrintCursor(CXCursor Cursor, const char *CommentSchemaFile) { if (clang_Cursor_isObjCOptional(Cursor)) printf(" (@optional)"); + { + CXString language; + CXString definedIn; + unsigned generated; + if (clang_Cursor_isExternalSymbol(Cursor, &language, &definedIn, + &generated)) { + printf(" (external lang: %s, defined: %s, gen: %d)", + clang_getCString(language), clang_getCString(definedIn), generated); + clang_disposeString(language); + clang_disposeString(definedIn); + } + } + if (Cursor.kind == CXCursor_IBOutletCollectionAttr) { CXType T = clang_getCanonicalType(clang_getIBOutletCollectionType(Cursor)); diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index c251d83e209..9c795ae9c5b 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -7479,6 +7479,35 @@ unsigned clang_Cursor_isVariadic(CXCursor C) { return 0; } +unsigned clang_Cursor_isExternalSymbol(CXCursor C, + CXString *language, CXString *definedIn, + unsigned *isGenerated) { + if (!clang_isDeclaration(C.kind)) + return 0; + + const Decl *D = getCursorDecl(C); + + auto getExternalSymAttr = [](const Decl *D) -> ExternalSourceSymbolAttr* { + if (auto *attr = D->getAttr<ExternalSourceSymbolAttr>()) + return attr; + if (auto *dcd = dyn_cast<Decl>(D->getDeclContext())) { + if (auto *attr = dcd->getAttr<ExternalSourceSymbolAttr>()) + return attr; + } + return nullptr; + }; + if (auto *attr = getExternalSymAttr(D)) { + if (language) + *language = cxstring::createDup(attr->getLanguage()); + if (definedIn) + *definedIn = cxstring::createDup(attr->getDefinedIn()); + if (isGenerated) + *isGenerated = attr->getGeneratedDeclaration(); + return 1; + } + return 0; +} + CXSourceRange clang_Cursor_getCommentRange(CXCursor C) { if (!clang_isDeclaration(C.kind)) return clang_getNullRange(); diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index 895dd804b00..d9a406e5741 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -35,6 +35,7 @@ clang_Cursor_getReceiverType clang_Cursor_isAnonymous clang_Cursor_isBitField clang_Cursor_isDynamicCall +clang_Cursor_isExternalSymbol clang_Cursor_isNull clang_Cursor_isObjCOptional clang_Cursor_isVariadic |

