summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Wu <mwu.code@gmail.com>2018-08-03 05:20:23 +0000
committerMichael Wu <mwu.code@gmail.com>2018-08-03 05:20:23 +0000
commit1fc060c4f780c95c33a3724c1981bb5d3fbb9737 (patch)
treef6c09d176261f6eec506cd2a2aca2a49140bc267
parent4042ae53b138dddb400aa62c3668c29075ca9e92 (diff)
[libclang 6/8] Add support for reading implicit attributes
Summary: Having access to implicit attributes is sometimes useful so users of libclang don't have to duplicate some of the logic in sema. This depends on D49081 since it also adds a CXTranslationUnit flag. Reviewers: yvvan, jbcoe Reviewed By: yvvan Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D49631 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@338815 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang-c/Index.h7
-rw-r--r--test/Index/implicit-attrs.m6
-rw-r--r--tools/c-index-test/c-index-test.c22
-rw-r--r--tools/libclang/CIndex.cpp4
4 files changed, 37 insertions, 2 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h
index a0ca0128c8..481f65ac43 100644
--- a/include/clang-c/Index.h
+++ b/include/clang-c/Index.h
@@ -1336,7 +1336,12 @@ enum CXTranslationUnit_Flags {
/**
* Used to indicate that attributed types should be included in CXType.
*/
- CXTranslationUnit_IncludeAttributedTypes = 0x1000
+ CXTranslationUnit_IncludeAttributedTypes = 0x1000,
+
+ /**
+ * Used to indicate that implicit attributes should be visited.
+ */
+ CXTranslationUnit_VisitImplicitAttributes = 0x2000
};
/**
diff --git a/test/Index/implicit-attrs.m b/test/Index/implicit-attrs.m
new file mode 100644
index 0000000000..ca651cdb79
--- /dev/null
+++ b/test/Index/implicit-attrs.m
@@ -0,0 +1,6 @@
+@interface Foo
+-(instancetype)init;
+@end
+
+// RUN: env CINDEXTEST_VISIT_IMPLICIT_ATTRIBUTES=1 c-index-test -test-print-decl-attributes %s -fobjc-arc | FileCheck %s
+// CHECK: ObjCInstanceMethodDecl=init:2:16 attribute(ns_consumes_self)= attribute(ns_returns_retained)=
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index 336e35bc76..41dbbe73a4 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -86,6 +86,8 @@ static unsigned getDefaultParsingOptions() {
options |= CXTranslationUnit_LimitSkipFunctionBodiesToPreamble;
if (getenv("CINDEXTEST_INCLUDE_ATTRIBUTED_TYPES"))
options |= CXTranslationUnit_IncludeAttributedTypes;
+ if (getenv("CINDEXTEST_VISIT_IMPLICIT_ATTRIBUTES"))
+ options |= CXTranslationUnit_VisitImplicitAttributes;
return options;
}
@@ -1783,6 +1785,23 @@ static enum CXChildVisitResult PrintTypeDeclaration(CXCursor cursor, CXCursor p,
}
/******************************************************************************/
+/* Declaration attributes testing */
+/******************************************************************************/
+
+static enum CXChildVisitResult PrintDeclAttributes(CXCursor cursor, CXCursor p,
+ CXClientData d) {
+ if (clang_isDeclaration(cursor.kind)) {
+ printf("\n");
+ PrintCursor(cursor, NULL);
+ return CXChildVisit_Recurse;
+ } else if (clang_isAttribute(cursor.kind)) {
+ printf(" ");
+ PrintCursor(cursor, NULL);
+ }
+ return CXChildVisit_Continue;
+}
+
+/******************************************************************************/
/* Target information testing. */
/******************************************************************************/
@@ -4793,6 +4812,9 @@ int cindextest_main(int argc, const char **argv) {
else if (argc > 2 && strcmp(argv[1], "-test-print-type-declaration") == 0)
return perform_test_load_source(argc - 2, argv + 2, "all",
PrintTypeDeclaration, 0);
+ else if (argc > 2 && strcmp(argv[1], "-test-print-decl-attributes") == 0)
+ return perform_test_load_source(argc - 2, argv + 2, "all",
+ PrintDeclAttributes, 0);
else if (argc > 2 && strcmp(argv[1], "-test-print-bitwidth") == 0)
return perform_test_load_source(argc - 2, argv + 2, "all",
PrintBitWidth, 0);
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 2f96d3058a..9ab0009b3f 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -1802,7 +1802,9 @@ bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
bool CursorVisitor::VisitAttributes(Decl *D) {
for (const auto *I : D->attrs())
- if (!I->isImplicit() && Visit(MakeCXCursor(I, D, TU)))
+ if ((TU->ParsingOptions & CXTranslationUnit_VisitImplicitAttributes ||
+ !I->isImplicit()) &&
+ Visit(MakeCXCursor(I, D, TU)))
return true;
return false;