aboutsummaryrefslogtreecommitdiff
path: root/tools/libclang/CXType.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/libclang/CXType.cpp')
-rw-r--r--tools/libclang/CXType.cpp132
1 files changed, 127 insertions, 5 deletions
diff --git a/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp
index 7c0f307944a1..b8009ddc1c1a 100644
--- a/tools/libclang/CXType.cpp
+++ b/tools/libclang/CXType.cpp
@@ -70,6 +70,8 @@ static CXTypeKind GetBuiltinTypeKind(const BuiltinType *BT) {
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) BTCASE(Id);
#include "clang/Basic/OpenCLImageTypes.def"
#undef IMAGE_TYPE
+#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) BTCASE(Id);
+#include "clang/Basic/OpenCLExtensionTypes.def"
BTCASE(OCLSampler);
BTCASE(OCLEvent);
BTCASE(OCLQueue);
@@ -98,7 +100,9 @@ static CXTypeKind GetTypeKind(QualType T) {
TKCASE(Enum);
TKCASE(Typedef);
TKCASE(ObjCInterface);
+ TKCASE(ObjCObject);
TKCASE(ObjCObjectPointer);
+ TKCASE(ObjCTypeParam);
TKCASE(FunctionNoProto);
TKCASE(FunctionProto);
TKCASE(ConstantArray);
@@ -110,6 +114,7 @@ static CXTypeKind GetTypeKind(QualType T) {
TKCASE(Auto);
TKCASE(Elaborated);
TKCASE(Pipe);
+ TKCASE(Attributed);
default:
return CXType_Unexposed;
}
@@ -123,7 +128,9 @@ CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) {
if (TU && !T.isNull()) {
// Handle attributed types as the original type
if (auto *ATT = T->getAs<AttributedType>()) {
- return MakeCXType(ATT->getModifiedType(), TU);
+ if (!(TU->ParsingOptions & CXTranslationUnit_IncludeAttributedTypes)) {
+ return MakeCXType(ATT->getModifiedType(), TU);
+ }
}
// Handle paren types as the original type
if (auto *PTT = T->getAs<ParenType>()) {
@@ -131,7 +138,7 @@ CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) {
}
ASTContext &Ctx = cxtu::getASTUnit(TU)->getASTContext();
- if (Ctx.getLangOpts().ObjC1) {
+ if (Ctx.getLangOpts().ObjC) {
QualType UnqualT = T.getUnqualifiedType();
if (Ctx.isObjCIdType(UnqualT))
TK = CXType_ObjCId;
@@ -437,6 +444,7 @@ CXType clang_getPointeeType(CXType CT) {
if (!TP)
return MakeCXType(QualType(), GetTU(CT));
+try_again:
switch (TP->getTypeClass()) {
case Type::Pointer:
T = cast<PointerType>(TP)->getPointeeType();
@@ -454,6 +462,12 @@ CXType clang_getPointeeType(CXType CT) {
case Type::MemberPointer:
T = cast<MemberPointerType>(TP)->getPointeeType();
break;
+ case Type::Auto:
+ case Type::DeducedTemplateSpecialization:
+ TP = cast<DeducedType>(TP)->getDeducedType().getTypePtrOrNull();
+ if (TP)
+ goto try_again;
+ break;
default:
T = QualType();
break;
@@ -575,7 +589,9 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
TKIND(Enum);
TKIND(Typedef);
TKIND(ObjCInterface);
+ TKIND(ObjCObject);
TKIND(ObjCObjectPointer);
+ TKIND(ObjCTypeParam);
TKIND(FunctionNoProto);
TKIND(FunctionProto);
TKIND(ConstantArray);
@@ -587,9 +603,12 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
TKIND(Auto);
TKIND(Elaborated);
TKIND(Pipe);
+ TKIND(Attributed);
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) TKIND(Id);
#include "clang/Basic/OpenCLImageTypes.def"
#undef IMAGE_TYPE
+#define EXT_OPAQUE_TYPE(ExtTYpe, Id, Ext) TKIND(Id);
+#include "clang/Basic/OpenCLExtensionTypes.def"
TKIND(OCLSampler);
TKIND(OCLEvent);
TKIND(OCLQueue);
@@ -632,6 +651,7 @@ CXCallingConv clang_getFunctionTypeCallingConv(CXType X) {
TCALLINGCONV(X86Pascal);
TCALLINGCONV(X86RegCall);
TCALLINGCONV(X86VectorCall);
+ TCALLINGCONV(AArch64VectorCall);
TCALLINGCONV(Win64);
TCALLINGCONV(X86_64SysV);
TCALLINGCONV(AAPCS);
@@ -992,6 +1012,17 @@ long long clang_Type_getOffsetOf(CXType PT, const char *S) {
return CXTypeLayoutError_InvalidFieldName;
}
+CXType clang_Type_getModifiedType(CXType CT) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return MakeCXType(QualType(), GetTU(CT));
+
+ if (auto *ATT = T->getAs<AttributedType>())
+ return MakeCXType(ATT->getModifiedType(), GetTU(CT));
+
+ return MakeCXType(QualType(), GetTU(CT));
+}
+
long long clang_Cursor_getOffsetOfField(CXCursor C) {
if (clang_isDeclaration(C.kind)) {
// we need to validate the parent type
@@ -1098,6 +1129,74 @@ CXType clang_Type_getTemplateArgumentAsType(CXType CT, unsigned index) {
return MakeCXType(QT.getValueOr(QualType()), GetTU(CT));
}
+CXType clang_Type_getObjCObjectBaseType(CXType CT) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return MakeCXType(QualType(), GetTU(CT));
+
+ const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
+ if (!OT)
+ return MakeCXType(QualType(), GetTU(CT));
+
+ return MakeCXType(OT->getBaseType(), GetTU(CT));
+}
+
+unsigned clang_Type_getNumObjCProtocolRefs(CXType CT) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return 0;
+
+ const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
+ if (!OT)
+ return 0;
+
+ return OT->getNumProtocols();
+}
+
+CXCursor clang_Type_getObjCProtocolDecl(CXType CT, unsigned i) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
+
+ const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
+ if (!OT)
+ return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
+
+ const ObjCProtocolDecl *PD = OT->getProtocol(i);
+ if (!PD)
+ return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
+
+ return cxcursor::MakeCXCursor(PD, GetTU(CT));
+}
+
+unsigned clang_Type_getNumObjCTypeArgs(CXType CT) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return 0;
+
+ const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
+ if (!OT)
+ return 0;
+
+ return OT->getTypeArgs().size();
+}
+
+CXType clang_Type_getObjCTypeArg(CXType CT, unsigned i) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return MakeCXType(QualType(), GetTU(CT));
+
+ const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
+ if (!OT)
+ return MakeCXType(QualType(), GetTU(CT));
+
+ const ArrayRef<QualType> TA = OT->getTypeArgs();
+ if ((size_t)i >= TA.size())
+ return MakeCXType(QualType(), GetTU(CT));
+
+ return MakeCXType(TA[i], GetTU(CT));
+}
+
unsigned clang_Type_visitFields(CXType PT,
CXFieldVisitor visitor,
CXClientData client_data){
@@ -1130,11 +1229,15 @@ unsigned clang_Cursor_isAnonymous(CXCursor C){
if (!clang_isDeclaration(C.kind))
return 0;
const Decl *D = cxcursor::getCursorDecl(C);
- if (const RecordDecl *FD = dyn_cast_or_null<RecordDecl>(D))
- return FD->isAnonymousStructOrUnion();
+ if (const NamespaceDecl *ND = dyn_cast_or_null<NamespaceDecl>(D)) {
+ return ND->isAnonymousNamespace();
+ } else if (const TagDecl *TD = dyn_cast_or_null<TagDecl>(D)) {
+ return TD->getTypedefNameForAnonDecl() == nullptr &&
+ TD->getIdentifier() == nullptr;
+ }
+
return 0;
}
-
CXType clang_Type_getNamedType(CXType CT){
QualType T = GetQualType(CT);
const Type *TP = T.getTypePtrOrNull();
@@ -1153,3 +1256,22 @@ unsigned clang_Type_isTransparentTagTypedef(CXType TT){
}
return false;
}
+
+enum CXTypeNullabilityKind clang_Type_getNullability(CXType CT) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return CXTypeNullability_Invalid;
+
+ ASTContext &Ctx = cxtu::getASTUnit(GetTU(CT))->getASTContext();
+ if (auto nullability = T->getNullability(Ctx)) {
+ switch (*nullability) {
+ case NullabilityKind::NonNull:
+ return CXTypeNullability_NonNull;
+ case NullabilityKind::Nullable:
+ return CXTypeNullability_Nullable;
+ case NullabilityKind::Unspecified:
+ return CXTypeNullability_Unspecified;
+ }
+ }
+ return CXTypeNullability_Invalid;
+}