diff options
-rw-r--r-- | include/clang-c/Index.h | 20 | ||||
-rw-r--r-- | test/Index/c-index-api-loadTU-test.m | 9 | ||||
-rw-r--r-- | tools/c-index-test/c-index-test.c | 8 | ||||
-rw-r--r-- | tools/libclang/CIndex.cpp | 17 | ||||
-rw-r--r-- | tools/libclang/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tools/libclang/CXCursor.cpp | 4 | ||||
-rw-r--r-- | tools/libclang/CXCursor.h | 2 | ||||
-rw-r--r-- | tools/libclang/CXType.cpp (renamed from tools/libclang/CXTypes.cpp) | 6 | ||||
-rw-r--r-- | tools/libclang/CXType.h | 29 | ||||
-rw-r--r-- | tools/libclang/libclang.darwin.exports | 1 | ||||
-rw-r--r-- | tools/libclang/libclang.exports | 7 |
11 files changed, 97 insertions, 8 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 4dfaec030d..9b80d9f3a5 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -1304,7 +1304,7 @@ CINDEX_LINKAGE CXSourceRange clang_getCursorExtent(CXCursor); /** * @} */ - + /** * \defgroup CINDEX_TYPES Type information for CXCursors * @@ -1441,6 +1441,24 @@ CINDEX_LINKAGE unsigned clang_isPODType(CXType T); /** * @} */ + +/** + * \defgroup CINDEX_TYPES Information for attributes + * + * @{ + */ + + +/** + * \brief For cursors representing an iboutletcollection attribute, + * this function returns the collection element type. + * + */ +CINDEX_LINKAGE CXType clang_getIBOutletCollectionType(CXCursor); + +/** + * @} + */ /** * \defgroup CINDEX_CURSOR_TRAVERSAL Traversing the AST with cursors diff --git a/test/Index/c-index-api-loadTU-test.m b/test/Index/c-index-api-loadTU-test.m index a86bf629ea..5fe7cd669b 100644 --- a/test/Index/c-index-api-loadTU-test.m +++ b/test/Index/c-index-api-loadTU-test.m @@ -56,7 +56,7 @@ int main (int argc, const char * argv[]) { // Test attribute traversal. #define IBOutlet __attribute__((iboutlet)) -#define IBOutletCollection(ClassName) __attribute__((iboutletcollection)) +#define IBOutletCollection(ClassName) __attribute__((iboutletcollection(ClassName))) #define IBAction void)__attribute__((ibaction) @interface TestAttributes { @@ -143,10 +143,15 @@ struct X0 {}; // CHECK: c-index-api-loadTU-test.m:63:19: ObjCIvarDecl=anOutlet:63:19 (Definition) Extent=[63:19 - 63:27] // CHECK: <invalid loc>:0:0: attribute(iboutlet)= // CHECK: c-index-api-loadTU-test.m:64:29: ObjCIvarDecl=anOutletCollection:64:29 (Definition) Extent=[64:29 - 64:47] -// CHECK: <invalid loc>:0:0: attribute(iboutletcollection)= +// CHECK: <invalid loc>:0:0: attribute(iboutletcollection)= [IBOutletCollection=ObjCObjectPointer] // CHECK: c-index-api-loadTU-test.m:64:26: TypeRef=id:0:0 Extent=[64:26 - 64:28] // CHECK: c-index-api-loadTU-test.m:66:1: ObjCInstanceMethodDecl=actionMethod::66:1 Extent=[66:1 - 66:35] // CHECK: <invalid loc>:0:0: attribute(ibaction)= // CHECK: c-index-api-loadTU-test.m:66:31: ParmDecl=arg:66:31 (Definition) Extent=[66:28 - 66:34] // CHECK: c-index-api-loadTU-test.m:66:28: TypeRef=id:0:0 Extent=[66:28 - 66:30] +// CHECK: c-index-api-loadTU-test.m:69:16: StructDecl=X0:69:16 Extent=[69:9 - 69:18] +// CHECK: c-index-api-loadTU-test.m:69:19: TypedefDecl=X1:69:19 (Definition) Extent=[69:19 - 69:21] +// CHECK: c-index-api-loadTU-test.m:69:16: TypeRef=struct X0:71:8 Extent=[69:16 - 69:18] +// CHECK: c-index-api-loadTU-test.m:70:8: StructDecl=X0:70:8 Extent=[70:1 - 70:10] +// CHECK: c-index-api-loadTU-test.m:71:8: StructDecl=X0:71:8 (Definition) Extent=[71:1 - 71:14] diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 330fa545f9..3f702904a3 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -195,6 +195,14 @@ static void PrintCursor(CXCursor Cursor) { printf(" (unavailable)"); break; } + + if (Cursor.kind == CXCursor_IBOutletCollectionAttr) { + CXType T = + clang_getCanonicalType(clang_getIBOutletCollectionType(Cursor)); + CXString S = clang_getTypeKindSpelling(T.kind); + printf(" [IBOutletCollection=%s]", clang_getCString(S)); + clang_disposeString(S); + } } } diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index c696a27c59..4ec2bf4c29 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -14,6 +14,7 @@ #include "CIndexer.h" #include "CXCursor.h" +#include "CXType.h" #include "CXSourceLocation.h" #include "CIndexDiagnostic.h" @@ -3056,6 +3057,22 @@ unsigned clang_CXXMethod_isStatic(CXCursor C) { } // end: extern "C" //===----------------------------------------------------------------------===// +// Attribute introspection. +//===----------------------------------------------------------------------===// + +extern "C" { +CXType clang_getIBOutletCollectionType(CXCursor C) { + if (C.kind != CXCursor_IBOutletCollectionAttr) + return cxtype::MakeCXType(QualType(), cxcursor::getCursorASTUnit(C)); + + IBOutletCollectionAttr *A = + cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C)); + + return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorASTUnit(C)); +} +} // end: extern "C" + +//===----------------------------------------------------------------------===// // CXString Operations. //===----------------------------------------------------------------------===// diff --git a/tools/libclang/CMakeLists.txt b/tools/libclang/CMakeLists.txt index e06eecfb14..dbb28ec3bb 100644 --- a/tools/libclang/CMakeLists.txt +++ b/tools/libclang/CMakeLists.txt @@ -27,7 +27,7 @@ add_clang_library(libclang CIndexUSRs.cpp CIndexer.cpp CXCursor.cpp - CXTypes.cpp + CXType.cpp ../../include/clang-c/Index.h ) diff --git a/tools/libclang/CXCursor.cpp b/tools/libclang/CXCursor.cpp index be3623f6e9..318fd51dfb 100644 --- a/tools/libclang/CXCursor.cpp +++ b/tools/libclang/CXCursor.cpp @@ -358,6 +358,10 @@ Stmt *cxcursor::getCursorStmt(CXCursor Cursor) { return (Stmt *)Cursor.data[1]; } +Attr *cxcursor::getCursorAttr(CXCursor Cursor) { + return (Attr *)Cursor.data[1]; +} + ASTContext &cxcursor::getCursorContext(CXCursor Cursor) { return getCursorASTUnit(Cursor)->getASTContext(); } diff --git a/tools/libclang/CXCursor.h b/tools/libclang/CXCursor.h index 1664f5a9ce..5a8428a2ec 100644 --- a/tools/libclang/CXCursor.h +++ b/tools/libclang/CXCursor.h @@ -98,6 +98,8 @@ MacroInstantiation *getCursorMacroInstantiation(CXCursor C); Decl *getCursorDecl(CXCursor Cursor); Expr *getCursorExpr(CXCursor Cursor); Stmt *getCursorStmt(CXCursor Cursor); +Attr *getCursorAttr(CXCursor Cursor); + ASTContext &getCursorContext(CXCursor Cursor); ASTUnit *getCursorASTUnit(CXCursor Cursor); diff --git a/tools/libclang/CXTypes.cpp b/tools/libclang/CXType.cpp index b49ef191e3..aa173cae32 100644 --- a/tools/libclang/CXTypes.cpp +++ b/tools/libclang/CXType.cpp @@ -13,6 +13,7 @@ #include "CIndexer.h" #include "CXCursor.h" +#include "CXType.h" #include "clang/AST/Expr.h" #include "clang/AST/Type.h" #include "clang/AST/Decl.h" @@ -85,12 +86,15 @@ static CXTypeKind GetTypeKind(QualType T) { #undef TKCASE } -static CXType MakeCXType(QualType T, ASTUnit *TU) { + +CXType cxtype::MakeCXType(QualType T, ASTUnit *TU) { CXTypeKind TK = GetTypeKind(T); CXType CT = { TK, { TK == CXType_Invalid ? 0 : T.getAsOpaquePtr(), TU }}; return CT; } +using cxtype::MakeCXType; + static inline QualType GetQualType(CXType CT) { return QualType::getFromOpaquePtr(CT.data[0]); } diff --git a/tools/libclang/CXType.h b/tools/libclang/CXType.h new file mode 100644 index 0000000000..94151ed6b9 --- /dev/null +++ b/tools/libclang/CXType.h @@ -0,0 +1,29 @@ +//===- CXTypes.h - Routines for manipulating CXTypes ----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines routines for manipulating CXCursors. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_CXTYPES_H +#define LLVM_CLANG_CXTYPES_H + +#include "clang-c/Index.h" +#include "clang/AST/Type.h" + +namespace clang { + +class ASTUnit; + +namespace cxtype { + +CXType MakeCXType(QualType T, ASTUnit *TU); + +}} // end namespace clang::cxtype +#endif diff --git a/tools/libclang/libclang.darwin.exports b/tools/libclang/libclang.darwin.exports index f2087b73f2..6a36966501 100644 --- a/tools/libclang/libclang.darwin.exports +++ b/tools/libclang/libclang.darwin.exports @@ -30,6 +30,7 @@ _clang_equalLocations _clang_equalTypes _clang_formatDiagnostic _clang_getCString +_clang_getIBOutletCollectionType _clang_getCanonicalType _clang_getClangVersion _clang_getCompletionAvailability diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index c1658f6032..8f1d626957 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -14,8 +14,8 @@ clang_createIndex clang_createTranslationUnit clang_createTranslationUnitFromSourceFile clang_defaultCodeCompleteOptions -clang_defaultEditingTranslationUnitOptions clang_defaultDiagnosticDisplayOptions +clang_defaultEditingTranslationUnitOptions clang_defaultReparseOptions clang_defaultSaveOptions clang_disposeCodeCompleteResults @@ -47,8 +47,8 @@ clang_getCursorLanguage clang_getCursorLinkage clang_getCursorLocation clang_getCursorReferenced -clang_getCursorSpelling clang_getCursorResultType +clang_getCursorSpelling clang_getCursorType clang_getCursorUSR clang_getDefinitionSpellingAndExtent @@ -63,6 +63,7 @@ clang_getDiagnosticSpelling clang_getFile clang_getFileName clang_getFileTime +clang_getIBOutletCollectionType clang_getInclusions clang_getInstantiationLocation clang_getLocation @@ -88,8 +89,8 @@ clang_isCursorDefinition clang_isDeclaration clang_isExpression clang_isInvalid -clang_isPreprocessing clang_isPODType +clang_isPreprocessing clang_isReference clang_isStatement clang_isTranslationUnit |