Add libclang API hook "clang_getIBOutletCollectionType" to query the collection type for iboutletcollection attributes.

llvm-svn: 112139
This commit is contained in:
Ted Kremenek 2010-08-26 01:42:22 +00:00
parent f241019e24
commit a594082210
11 changed files with 97 additions and 8 deletions

View File

@ -1304,7 +1304,7 @@ CINDEX_LINKAGE CXSourceRange clang_getCursorExtent(CXCursor);
/** /**
* @} * @}
*/ */
/** /**
* \defgroup CINDEX_TYPES Type information for CXCursors * \defgroup CINDEX_TYPES Type information for CXCursors
* *
@ -1438,6 +1438,24 @@ CINDEX_LINKAGE CXType clang_getCursorResultType(CXCursor C);
*/ */
CINDEX_LINKAGE unsigned clang_isPODType(CXType T); 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);
/** /**
* @} * @}
*/ */

View File

@ -56,7 +56,7 @@ int main (int argc, const char * argv[]) {
// Test attribute traversal. // Test attribute traversal.
#define IBOutlet __attribute__((iboutlet)) #define IBOutlet __attribute__((iboutlet))
#define IBOutletCollection(ClassName) __attribute__((iboutletcollection)) #define IBOutletCollection(ClassName) __attribute__((iboutletcollection(ClassName)))
#define IBAction void)__attribute__((ibaction) #define IBAction void)__attribute__((ibaction)
@interface TestAttributes { @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: 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: <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: 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: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: 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: <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: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: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]

View File

@ -195,6 +195,14 @@ static void PrintCursor(CXCursor Cursor) {
printf(" (unavailable)"); printf(" (unavailable)");
break; 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);
}
} }
} }

View File

@ -14,6 +14,7 @@
#include "CIndexer.h" #include "CIndexer.h"
#include "CXCursor.h" #include "CXCursor.h"
#include "CXType.h"
#include "CXSourceLocation.h" #include "CXSourceLocation.h"
#include "CIndexDiagnostic.h" #include "CIndexDiagnostic.h"
@ -3055,6 +3056,22 @@ unsigned clang_CXXMethod_isStatic(CXCursor C) {
} // end: extern "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. // CXString Operations.
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@ -27,7 +27,7 @@ add_clang_library(libclang
CIndexUSRs.cpp CIndexUSRs.cpp
CIndexer.cpp CIndexer.cpp
CXCursor.cpp CXCursor.cpp
CXTypes.cpp CXType.cpp
../../include/clang-c/Index.h ../../include/clang-c/Index.h
) )

View File

@ -358,6 +358,10 @@ Stmt *cxcursor::getCursorStmt(CXCursor Cursor) {
return (Stmt *)Cursor.data[1]; return (Stmt *)Cursor.data[1];
} }
Attr *cxcursor::getCursorAttr(CXCursor Cursor) {
return (Attr *)Cursor.data[1];
}
ASTContext &cxcursor::getCursorContext(CXCursor Cursor) { ASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
return getCursorASTUnit(Cursor)->getASTContext(); return getCursorASTUnit(Cursor)->getASTContext();
} }

View File

@ -98,6 +98,8 @@ MacroInstantiation *getCursorMacroInstantiation(CXCursor C);
Decl *getCursorDecl(CXCursor Cursor); Decl *getCursorDecl(CXCursor Cursor);
Expr *getCursorExpr(CXCursor Cursor); Expr *getCursorExpr(CXCursor Cursor);
Stmt *getCursorStmt(CXCursor Cursor); Stmt *getCursorStmt(CXCursor Cursor);
Attr *getCursorAttr(CXCursor Cursor);
ASTContext &getCursorContext(CXCursor Cursor); ASTContext &getCursorContext(CXCursor Cursor);
ASTUnit *getCursorASTUnit(CXCursor Cursor); ASTUnit *getCursorASTUnit(CXCursor Cursor);

View File

@ -13,6 +13,7 @@
#include "CIndexer.h" #include "CIndexer.h"
#include "CXCursor.h" #include "CXCursor.h"
#include "CXType.h"
#include "clang/AST/Expr.h" #include "clang/AST/Expr.h"
#include "clang/AST/Type.h" #include "clang/AST/Type.h"
#include "clang/AST/Decl.h" #include "clang/AST/Decl.h"
@ -85,12 +86,15 @@ static CXTypeKind GetTypeKind(QualType T) {
#undef TKCASE #undef TKCASE
} }
static CXType MakeCXType(QualType T, ASTUnit *TU) {
CXType cxtype::MakeCXType(QualType T, ASTUnit *TU) {
CXTypeKind TK = GetTypeKind(T); CXTypeKind TK = GetTypeKind(T);
CXType CT = { TK, { TK == CXType_Invalid ? 0 : T.getAsOpaquePtr(), TU }}; CXType CT = { TK, { TK == CXType_Invalid ? 0 : T.getAsOpaquePtr(), TU }};
return CT; return CT;
} }
using cxtype::MakeCXType;
static inline QualType GetQualType(CXType CT) { static inline QualType GetQualType(CXType CT) {
return QualType::getFromOpaquePtr(CT.data[0]); return QualType::getFromOpaquePtr(CT.data[0]);
} }

View File

@ -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

View File

@ -30,6 +30,7 @@ _clang_equalLocations
_clang_equalTypes _clang_equalTypes
_clang_formatDiagnostic _clang_formatDiagnostic
_clang_getCString _clang_getCString
_clang_getIBOutletCollectionType
_clang_getCanonicalType _clang_getCanonicalType
_clang_getClangVersion _clang_getClangVersion
_clang_getCompletionAvailability _clang_getCompletionAvailability

View File

@ -14,8 +14,8 @@ clang_createIndex
clang_createTranslationUnit clang_createTranslationUnit
clang_createTranslationUnitFromSourceFile clang_createTranslationUnitFromSourceFile
clang_defaultCodeCompleteOptions clang_defaultCodeCompleteOptions
clang_defaultEditingTranslationUnitOptions
clang_defaultDiagnosticDisplayOptions clang_defaultDiagnosticDisplayOptions
clang_defaultEditingTranslationUnitOptions
clang_defaultReparseOptions clang_defaultReparseOptions
clang_defaultSaveOptions clang_defaultSaveOptions
clang_disposeCodeCompleteResults clang_disposeCodeCompleteResults
@ -47,8 +47,8 @@ clang_getCursorLanguage
clang_getCursorLinkage clang_getCursorLinkage
clang_getCursorLocation clang_getCursorLocation
clang_getCursorReferenced clang_getCursorReferenced
clang_getCursorSpelling
clang_getCursorResultType clang_getCursorResultType
clang_getCursorSpelling
clang_getCursorType clang_getCursorType
clang_getCursorUSR clang_getCursorUSR
clang_getDefinitionSpellingAndExtent clang_getDefinitionSpellingAndExtent
@ -63,6 +63,7 @@ clang_getDiagnosticSpelling
clang_getFile clang_getFile
clang_getFileName clang_getFileName
clang_getFileTime clang_getFileTime
clang_getIBOutletCollectionType
clang_getInclusions clang_getInclusions
clang_getInstantiationLocation clang_getInstantiationLocation
clang_getLocation clang_getLocation
@ -88,8 +89,8 @@ clang_isCursorDefinition
clang_isDeclaration clang_isDeclaration
clang_isExpression clang_isExpression
clang_isInvalid clang_isInvalid
clang_isPreprocessing
clang_isPODType clang_isPODType
clang_isPreprocessing
clang_isReference clang_isReference
clang_isStatement clang_isStatement
clang_isTranslationUnit clang_isTranslationUnit