forked from OSchip/llvm-project
Add libclang API hook "clang_getIBOutletCollectionType" to query the collection type for iboutletcollection attributes.
llvm-svn: 112139
This commit is contained in:
parent
f241019e24
commit
a594082210
|
@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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]
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue