CXType.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272
  1. //===- CXTypes.cpp - Implements 'CXTypes' aspect of libclang ------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===--------------------------------------------------------------------===//
  9. //
  10. // This file implements the 'CXTypes' API hooks in the Clang-C library.
  11. //
  12. //===--------------------------------------------------------------------===//
  13. #include "CIndexer.h"
  14. #include "CXCursor.h"
  15. #include "CXString.h"
  16. #include "CXTranslationUnit.h"
  17. #include "CXType.h"
  18. #include "clang/AST/Decl.h"
  19. #include "clang/AST/DeclObjC.h"
  20. #include "clang/AST/DeclTemplate.h"
  21. #include "clang/AST/Expr.h"
  22. #include "clang/AST/Type.h"
  23. #include "clang/Basic/AddressSpaces.h"
  24. #include "clang/Frontend/ASTUnit.h"
  25. using namespace clang;
  26. static CXTypeKind GetBuiltinTypeKind(const BuiltinType *BT) {
  27. #define BTCASE(K) case BuiltinType::K: return CXType_##K
  28. switch (BT->getKind()) {
  29. BTCASE(Void);
  30. BTCASE(Bool);
  31. BTCASE(Char_U);
  32. BTCASE(UChar);
  33. BTCASE(Char16);
  34. BTCASE(Char32);
  35. BTCASE(UShort);
  36. BTCASE(UInt);
  37. BTCASE(ULong);
  38. BTCASE(ULongLong);
  39. BTCASE(UInt128);
  40. BTCASE(Char_S);
  41. BTCASE(SChar);
  42. case BuiltinType::WChar_S: return CXType_WChar;
  43. case BuiltinType::WChar_U: return CXType_WChar;
  44. BTCASE(Short);
  45. BTCASE(Int);
  46. BTCASE(Long);
  47. BTCASE(LongLong);
  48. BTCASE(Int128);
  49. BTCASE(Half);
  50. BTCASE(Float);
  51. BTCASE(Double);
  52. BTCASE(LongDouble);
  53. BTCASE(ShortAccum);
  54. BTCASE(Accum);
  55. BTCASE(LongAccum);
  56. BTCASE(UShortAccum);
  57. BTCASE(UAccum);
  58. BTCASE(ULongAccum);
  59. BTCASE(Float16);
  60. BTCASE(Float128);
  61. BTCASE(NullPtr);
  62. BTCASE(Overload);
  63. BTCASE(Dependent);
  64. BTCASE(ObjCId);
  65. BTCASE(ObjCClass);
  66. BTCASE(ObjCSel);
  67. #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) BTCASE(Id);
  68. #include "clang/Basic/OpenCLImageTypes.def"
  69. #undef IMAGE_TYPE
  70. #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) BTCASE(Id);
  71. #include "clang/Basic/OpenCLExtensionTypes.def"
  72. BTCASE(OCLSampler);
  73. BTCASE(OCLEvent);
  74. BTCASE(OCLQueue);
  75. BTCASE(OCLReserveID);
  76. default:
  77. return CXType_Unexposed;
  78. }
  79. #undef BTCASE
  80. }
  81. static CXTypeKind GetTypeKind(QualType T) {
  82. const Type *TP = T.getTypePtrOrNull();
  83. if (!TP)
  84. return CXType_Invalid;
  85. #define TKCASE(K) case Type::K: return CXType_##K
  86. switch (TP->getTypeClass()) {
  87. case Type::Builtin:
  88. return GetBuiltinTypeKind(cast<BuiltinType>(TP));
  89. TKCASE(Complex);
  90. TKCASE(Pointer);
  91. TKCASE(BlockPointer);
  92. TKCASE(LValueReference);
  93. TKCASE(RValueReference);
  94. TKCASE(Record);
  95. TKCASE(Enum);
  96. TKCASE(Typedef);
  97. TKCASE(ObjCInterface);
  98. TKCASE(ObjCObject);
  99. TKCASE(ObjCObjectPointer);
  100. TKCASE(ObjCTypeParam);
  101. TKCASE(FunctionNoProto);
  102. TKCASE(FunctionProto);
  103. TKCASE(ConstantArray);
  104. TKCASE(IncompleteArray);
  105. TKCASE(VariableArray);
  106. TKCASE(DependentSizedArray);
  107. TKCASE(Vector);
  108. TKCASE(MemberPointer);
  109. TKCASE(Auto);
  110. TKCASE(Elaborated);
  111. TKCASE(Pipe);
  112. TKCASE(Attributed);
  113. default:
  114. return CXType_Unexposed;
  115. }
  116. #undef TKCASE
  117. }
  118. CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) {
  119. CXTypeKind TK = CXType_Invalid;
  120. if (TU && !T.isNull()) {
  121. // Handle attributed types as the original type
  122. if (auto *ATT = T->getAs<AttributedType>()) {
  123. if (!(TU->ParsingOptions & CXTranslationUnit_IncludeAttributedTypes)) {
  124. return MakeCXType(ATT->getModifiedType(), TU);
  125. }
  126. }
  127. // Handle paren types as the original type
  128. if (auto *PTT = T->getAs<ParenType>()) {
  129. return MakeCXType(PTT->getInnerType(), TU);
  130. }
  131. ASTContext &Ctx = cxtu::getASTUnit(TU)->getASTContext();
  132. if (Ctx.getLangOpts().ObjC) {
  133. QualType UnqualT = T.getUnqualifiedType();
  134. if (Ctx.isObjCIdType(UnqualT))
  135. TK = CXType_ObjCId;
  136. else if (Ctx.isObjCClassType(UnqualT))
  137. TK = CXType_ObjCClass;
  138. else if (Ctx.isObjCSelType(UnqualT))
  139. TK = CXType_ObjCSel;
  140. }
  141. /* Handle decayed types as the original type */
  142. if (const DecayedType *DT = T->getAs<DecayedType>()) {
  143. return MakeCXType(DT->getOriginalType(), TU);
  144. }
  145. }
  146. if (TK == CXType_Invalid)
  147. TK = GetTypeKind(T);
  148. CXType CT = { TK, { TK == CXType_Invalid ? nullptr
  149. : T.getAsOpaquePtr(), TU } };
  150. return CT;
  151. }
  152. using cxtype::MakeCXType;
  153. static inline QualType GetQualType(CXType CT) {
  154. return QualType::getFromOpaquePtr(CT.data[0]);
  155. }
  156. static inline CXTranslationUnit GetTU(CXType CT) {
  157. return static_cast<CXTranslationUnit>(CT.data[1]);
  158. }
  159. static Optional<ArrayRef<TemplateArgument>>
  160. GetTemplateArguments(QualType Type) {
  161. assert(!Type.isNull());
  162. if (const auto *Specialization = Type->getAs<TemplateSpecializationType>())
  163. return Specialization->template_arguments();
  164. if (const auto *RecordDecl = Type->getAsCXXRecordDecl()) {
  165. const auto *TemplateDecl =
  166. dyn_cast<ClassTemplateSpecializationDecl>(RecordDecl);
  167. if (TemplateDecl)
  168. return TemplateDecl->getTemplateArgs().asArray();
  169. }
  170. return None;
  171. }
  172. static Optional<QualType> TemplateArgumentToQualType(const TemplateArgument &A) {
  173. if (A.getKind() == TemplateArgument::Type)
  174. return A.getAsType();
  175. return None;
  176. }
  177. static Optional<QualType>
  178. FindTemplateArgumentTypeAt(ArrayRef<TemplateArgument> TA, unsigned index) {
  179. unsigned current = 0;
  180. for (const auto &A : TA) {
  181. if (A.getKind() == TemplateArgument::Pack) {
  182. if (index < current + A.pack_size())
  183. return TemplateArgumentToQualType(A.getPackAsArray()[index - current]);
  184. current += A.pack_size();
  185. continue;
  186. }
  187. if (current == index)
  188. return TemplateArgumentToQualType(A);
  189. current++;
  190. }
  191. return None;
  192. }
  193. CXType clang_getCursorType(CXCursor C) {
  194. using namespace cxcursor;
  195. CXTranslationUnit TU = cxcursor::getCursorTU(C);
  196. if (!TU)
  197. return MakeCXType(QualType(), TU);
  198. ASTContext &Context = cxtu::getASTUnit(TU)->getASTContext();
  199. if (clang_isExpression(C.kind)) {
  200. QualType T = cxcursor::getCursorExpr(C)->getType();
  201. return MakeCXType(T, TU);
  202. }
  203. if (clang_isDeclaration(C.kind)) {
  204. const Decl *D = cxcursor::getCursorDecl(C);
  205. if (!D)
  206. return MakeCXType(QualType(), TU);
  207. if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
  208. return MakeCXType(Context.getTypeDeclType(TD), TU);
  209. if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D))
  210. return MakeCXType(Context.getObjCInterfaceType(ID), TU);
  211. if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D))
  212. return MakeCXType(DD->getType(), TU);
  213. if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
  214. return MakeCXType(VD->getType(), TU);
  215. if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
  216. return MakeCXType(PD->getType(), TU);
  217. if (const FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D))
  218. return MakeCXType(FTD->getTemplatedDecl()->getType(), TU);
  219. return MakeCXType(QualType(), TU);
  220. }
  221. if (clang_isReference(C.kind)) {
  222. switch (C.kind) {
  223. case CXCursor_ObjCSuperClassRef: {
  224. QualType T
  225. = Context.getObjCInterfaceType(getCursorObjCSuperClassRef(C).first);
  226. return MakeCXType(T, TU);
  227. }
  228. case CXCursor_ObjCClassRef: {
  229. QualType T = Context.getObjCInterfaceType(getCursorObjCClassRef(C).first);
  230. return MakeCXType(T, TU);
  231. }
  232. case CXCursor_TypeRef: {
  233. QualType T = Context.getTypeDeclType(getCursorTypeRef(C).first);
  234. return MakeCXType(T, TU);
  235. }
  236. case CXCursor_CXXBaseSpecifier:
  237. return cxtype::MakeCXType(getCursorCXXBaseSpecifier(C)->getType(), TU);
  238. case CXCursor_MemberRef:
  239. return cxtype::MakeCXType(getCursorMemberRef(C).first->getType(), TU);
  240. case CXCursor_VariableRef:
  241. return cxtype::MakeCXType(getCursorVariableRef(C).first->getType(), TU);
  242. case CXCursor_ObjCProtocolRef:
  243. case CXCursor_TemplateRef:
  244. case CXCursor_NamespaceRef:
  245. case CXCursor_OverloadedDeclRef:
  246. default:
  247. break;
  248. }
  249. return MakeCXType(QualType(), TU);
  250. }
  251. return MakeCXType(QualType(), TU);
  252. }
  253. CXString clang_getTypeSpelling(CXType CT) {
  254. QualType T = GetQualType(CT);
  255. if (T.isNull())
  256. return cxstring::createEmpty();
  257. CXTranslationUnit TU = GetTU(CT);
  258. SmallString<64> Str;
  259. llvm::raw_svector_ostream OS(Str);
  260. PrintingPolicy PP(cxtu::getASTUnit(TU)->getASTContext().getLangOpts());
  261. T.print(OS, PP);
  262. return cxstring::createDup(OS.str());
  263. }
  264. CXType clang_getTypedefDeclUnderlyingType(CXCursor C) {
  265. using namespace cxcursor;
  266. CXTranslationUnit TU = cxcursor::getCursorTU(C);
  267. if (clang_isDeclaration(C.kind)) {
  268. const Decl *D = cxcursor::getCursorDecl(C);
  269. if (const TypedefNameDecl *TD = dyn_cast_or_null<TypedefNameDecl>(D)) {
  270. QualType T = TD->getUnderlyingType();
  271. return MakeCXType(T, TU);
  272. }
  273. return MakeCXType(QualType(), TU);
  274. }
  275. return MakeCXType(QualType(), TU);
  276. }
  277. CXType clang_getEnumDeclIntegerType(CXCursor C) {
  278. using namespace cxcursor;
  279. CXTranslationUnit TU = cxcursor::getCursorTU(C);
  280. if (clang_isDeclaration(C.kind)) {
  281. const Decl *D = cxcursor::getCursorDecl(C);
  282. if (const EnumDecl *TD = dyn_cast_or_null<EnumDecl>(D)) {
  283. QualType T = TD->getIntegerType();
  284. return MakeCXType(T, TU);
  285. }
  286. return MakeCXType(QualType(), TU);
  287. }
  288. return MakeCXType(QualType(), TU);
  289. }
  290. long long clang_getEnumConstantDeclValue(CXCursor C) {
  291. using namespace cxcursor;
  292. if (clang_isDeclaration(C.kind)) {
  293. const Decl *D = cxcursor::getCursorDecl(C);
  294. if (const EnumConstantDecl *TD = dyn_cast_or_null<EnumConstantDecl>(D)) {
  295. return TD->getInitVal().getSExtValue();
  296. }
  297. return LLONG_MIN;
  298. }
  299. return LLONG_MIN;
  300. }
  301. unsigned long long clang_getEnumConstantDeclUnsignedValue(CXCursor C) {
  302. using namespace cxcursor;
  303. if (clang_isDeclaration(C.kind)) {
  304. const Decl *D = cxcursor::getCursorDecl(C);
  305. if (const EnumConstantDecl *TD = dyn_cast_or_null<EnumConstantDecl>(D)) {
  306. return TD->getInitVal().getZExtValue();
  307. }
  308. return ULLONG_MAX;
  309. }
  310. return ULLONG_MAX;
  311. }
  312. int clang_getFieldDeclBitWidth(CXCursor C) {
  313. using namespace cxcursor;
  314. if (clang_isDeclaration(C.kind)) {
  315. const Decl *D = getCursorDecl(C);
  316. if (const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
  317. if (FD->isBitField())
  318. return FD->getBitWidthValue(getCursorContext(C));
  319. }
  320. }
  321. return -1;
  322. }
  323. CXType clang_getCanonicalType(CXType CT) {
  324. if (CT.kind == CXType_Invalid)
  325. return CT;
  326. QualType T = GetQualType(CT);
  327. CXTranslationUnit TU = GetTU(CT);
  328. if (T.isNull())
  329. return MakeCXType(QualType(), GetTU(CT));
  330. return MakeCXType(cxtu::getASTUnit(TU)->getASTContext()
  331. .getCanonicalType(T),
  332. TU);
  333. }
  334. unsigned clang_isConstQualifiedType(CXType CT) {
  335. QualType T = GetQualType(CT);
  336. return T.isLocalConstQualified();
  337. }
  338. unsigned clang_isVolatileQualifiedType(CXType CT) {
  339. QualType T = GetQualType(CT);
  340. return T.isLocalVolatileQualified();
  341. }
  342. unsigned clang_isRestrictQualifiedType(CXType CT) {
  343. QualType T = GetQualType(CT);
  344. return T.isLocalRestrictQualified();
  345. }
  346. unsigned clang_getAddressSpace(CXType CT) {
  347. QualType T = GetQualType(CT);
  348. // For non language-specific address space, use separate helper function.
  349. if (T.getAddressSpace() >= LangAS::FirstTargetAddressSpace) {
  350. return T.getQualifiers().getAddressSpaceAttributePrintValue();
  351. }
  352. // FIXME: this function returns either a LangAS or a target AS
  353. // Those values can overlap which makes this function rather unpredictable
  354. // for any caller
  355. return (unsigned)T.getAddressSpace();
  356. }
  357. CXString clang_getTypedefName(CXType CT) {
  358. QualType T = GetQualType(CT);
  359. const TypedefType *TT = T->getAs<TypedefType>();
  360. if (TT) {
  361. TypedefNameDecl *TD = TT->getDecl();
  362. if (TD)
  363. return cxstring::createDup(TD->getNameAsString().c_str());
  364. }
  365. return cxstring::createEmpty();
  366. }
  367. CXType clang_getPointeeType(CXType CT) {
  368. QualType T = GetQualType(CT);
  369. const Type *TP = T.getTypePtrOrNull();
  370. if (!TP)
  371. return MakeCXType(QualType(), GetTU(CT));
  372. try_again:
  373. switch (TP->getTypeClass()) {
  374. case Type::Pointer:
  375. T = cast<PointerType>(TP)->getPointeeType();
  376. break;
  377. case Type::BlockPointer:
  378. T = cast<BlockPointerType>(TP)->getPointeeType();
  379. break;
  380. case Type::LValueReference:
  381. case Type::RValueReference:
  382. T = cast<ReferenceType>(TP)->getPointeeType();
  383. break;
  384. case Type::ObjCObjectPointer:
  385. T = cast<ObjCObjectPointerType>(TP)->getPointeeType();
  386. break;
  387. case Type::MemberPointer:
  388. T = cast<MemberPointerType>(TP)->getPointeeType();
  389. break;
  390. case Type::Auto:
  391. case Type::DeducedTemplateSpecialization:
  392. TP = cast<DeducedType>(TP)->getDeducedType().getTypePtrOrNull();
  393. if (TP)
  394. goto try_again;
  395. break;
  396. default:
  397. T = QualType();
  398. break;
  399. }
  400. return MakeCXType(T, GetTU(CT));
  401. }
  402. CXCursor clang_getTypeDeclaration(CXType CT) {
  403. if (CT.kind == CXType_Invalid)
  404. return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
  405. QualType T = GetQualType(CT);
  406. const Type *TP = T.getTypePtrOrNull();
  407. if (!TP)
  408. return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
  409. Decl *D = nullptr;
  410. try_again:
  411. switch (TP->getTypeClass()) {
  412. case Type::Typedef:
  413. D = cast<TypedefType>(TP)->getDecl();
  414. break;
  415. case Type::ObjCObject:
  416. D = cast<ObjCObjectType>(TP)->getInterface();
  417. break;
  418. case Type::ObjCInterface:
  419. D = cast<ObjCInterfaceType>(TP)->getDecl();
  420. break;
  421. case Type::Record:
  422. case Type::Enum:
  423. D = cast<TagType>(TP)->getDecl();
  424. break;
  425. case Type::TemplateSpecialization:
  426. if (const RecordType *Record = TP->getAs<RecordType>())
  427. D = Record->getDecl();
  428. else
  429. D = cast<TemplateSpecializationType>(TP)->getTemplateName()
  430. .getAsTemplateDecl();
  431. break;
  432. case Type::Auto:
  433. case Type::DeducedTemplateSpecialization:
  434. TP = cast<DeducedType>(TP)->getDeducedType().getTypePtrOrNull();
  435. if (TP)
  436. goto try_again;
  437. break;
  438. case Type::InjectedClassName:
  439. D = cast<InjectedClassNameType>(TP)->getDecl();
  440. break;
  441. // FIXME: Template type parameters!
  442. case Type::Elaborated:
  443. TP = cast<ElaboratedType>(TP)->getNamedType().getTypePtrOrNull();
  444. goto try_again;
  445. default:
  446. break;
  447. }
  448. if (!D)
  449. return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
  450. return cxcursor::MakeCXCursor(D, GetTU(CT));
  451. }
  452. CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
  453. const char *s = nullptr;
  454. #define TKIND(X) case CXType_##X: s = "" #X ""; break
  455. switch (K) {
  456. TKIND(Invalid);
  457. TKIND(Unexposed);
  458. TKIND(Void);
  459. TKIND(Bool);
  460. TKIND(Char_U);
  461. TKIND(UChar);
  462. TKIND(Char16);
  463. TKIND(Char32);
  464. TKIND(UShort);
  465. TKIND(UInt);
  466. TKIND(ULong);
  467. TKIND(ULongLong);
  468. TKIND(UInt128);
  469. TKIND(Char_S);
  470. TKIND(SChar);
  471. case CXType_WChar: s = "WChar"; break;
  472. TKIND(Short);
  473. TKIND(Int);
  474. TKIND(Long);
  475. TKIND(LongLong);
  476. TKIND(Int128);
  477. TKIND(Half);
  478. TKIND(Float);
  479. TKIND(Double);
  480. TKIND(LongDouble);
  481. TKIND(ShortAccum);
  482. TKIND(Accum);
  483. TKIND(LongAccum);
  484. TKIND(UShortAccum);
  485. TKIND(UAccum);
  486. TKIND(ULongAccum);
  487. TKIND(Float16);
  488. TKIND(Float128);
  489. TKIND(NullPtr);
  490. TKIND(Overload);
  491. TKIND(Dependent);
  492. TKIND(ObjCId);
  493. TKIND(ObjCClass);
  494. TKIND(ObjCSel);
  495. TKIND(Complex);
  496. TKIND(Pointer);
  497. TKIND(BlockPointer);
  498. TKIND(LValueReference);
  499. TKIND(RValueReference);
  500. TKIND(Record);
  501. TKIND(Enum);
  502. TKIND(Typedef);
  503. TKIND(ObjCInterface);
  504. TKIND(ObjCObject);
  505. TKIND(ObjCObjectPointer);
  506. TKIND(ObjCTypeParam);
  507. TKIND(FunctionNoProto);
  508. TKIND(FunctionProto);
  509. TKIND(ConstantArray);
  510. TKIND(IncompleteArray);
  511. TKIND(VariableArray);
  512. TKIND(DependentSizedArray);
  513. TKIND(Vector);
  514. TKIND(MemberPointer);
  515. TKIND(Auto);
  516. TKIND(Elaborated);
  517. TKIND(Pipe);
  518. TKIND(Attributed);
  519. #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) TKIND(Id);
  520. #include "clang/Basic/OpenCLImageTypes.def"
  521. #undef IMAGE_TYPE
  522. #define EXT_OPAQUE_TYPE(ExtTYpe, Id, Ext) TKIND(Id);
  523. #include "clang/Basic/OpenCLExtensionTypes.def"
  524. TKIND(OCLSampler);
  525. TKIND(OCLEvent);
  526. TKIND(OCLQueue);
  527. TKIND(OCLReserveID);
  528. }
  529. #undef TKIND
  530. return cxstring::createRef(s);
  531. }
  532. unsigned clang_equalTypes(CXType A, CXType B) {
  533. return A.data[0] == B.data[0] && A.data[1] == B.data[1];
  534. }
  535. unsigned clang_isFunctionTypeVariadic(CXType X) {
  536. QualType T = GetQualType(X);
  537. if (T.isNull())
  538. return 0;
  539. if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>())
  540. return (unsigned)FD->isVariadic();
  541. if (T->getAs<FunctionNoProtoType>())
  542. return 1;
  543. return 0;
  544. }
  545. CXCallingConv clang_getFunctionTypeCallingConv(CXType X) {
  546. QualType T = GetQualType(X);
  547. if (T.isNull())
  548. return CXCallingConv_Invalid;
  549. if (const FunctionType *FD = T->getAs<FunctionType>()) {
  550. #define TCALLINGCONV(X) case CC_##X: return CXCallingConv_##X
  551. switch (FD->getCallConv()) {
  552. TCALLINGCONV(C);
  553. TCALLINGCONV(X86StdCall);
  554. TCALLINGCONV(X86FastCall);
  555. TCALLINGCONV(X86ThisCall);
  556. TCALLINGCONV(X86Pascal);
  557. TCALLINGCONV(X86RegCall);
  558. TCALLINGCONV(X86VectorCall);
  559. TCALLINGCONV(Win64);
  560. TCALLINGCONV(X86_64SysV);
  561. TCALLINGCONV(AAPCS);
  562. TCALLINGCONV(AAPCS_VFP);
  563. TCALLINGCONV(IntelOclBicc);
  564. TCALLINGCONV(Swift);
  565. TCALLINGCONV(PreserveMost);
  566. TCALLINGCONV(PreserveAll);
  567. case CC_SpirFunction: return CXCallingConv_Unexposed;
  568. case CC_OpenCLKernel: return CXCallingConv_Unexposed;
  569. break;
  570. }
  571. #undef TCALLINGCONV
  572. }
  573. return CXCallingConv_Invalid;
  574. }
  575. int clang_getNumArgTypes(CXType X) {
  576. QualType T = GetQualType(X);
  577. if (T.isNull())
  578. return -1;
  579. if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) {
  580. return FD->getNumParams();
  581. }
  582. if (T->getAs<FunctionNoProtoType>()) {
  583. return 0;
  584. }
  585. return -1;
  586. }
  587. CXType clang_getArgType(CXType X, unsigned i) {
  588. QualType T = GetQualType(X);
  589. if (T.isNull())
  590. return MakeCXType(QualType(), GetTU(X));
  591. if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) {
  592. unsigned numParams = FD->getNumParams();
  593. if (i >= numParams)
  594. return MakeCXType(QualType(), GetTU(X));
  595. return MakeCXType(FD->getParamType(i), GetTU(X));
  596. }
  597. return MakeCXType(QualType(), GetTU(X));
  598. }
  599. CXType clang_getResultType(CXType X) {
  600. QualType T = GetQualType(X);
  601. if (T.isNull())
  602. return MakeCXType(QualType(), GetTU(X));
  603. if (const FunctionType *FD = T->getAs<FunctionType>())
  604. return MakeCXType(FD->getReturnType(), GetTU(X));
  605. return MakeCXType(QualType(), GetTU(X));
  606. }
  607. CXType clang_getCursorResultType(CXCursor C) {
  608. if (clang_isDeclaration(C.kind)) {
  609. const Decl *D = cxcursor::getCursorDecl(C);
  610. if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
  611. return MakeCXType(MD->getReturnType(), cxcursor::getCursorTU(C));
  612. return clang_getResultType(clang_getCursorType(C));
  613. }
  614. return MakeCXType(QualType(), cxcursor::getCursorTU(C));
  615. }
  616. // FIXME: We should expose the canThrow(...) result instead of the EST.
  617. static CXCursor_ExceptionSpecificationKind
  618. getExternalExceptionSpecificationKind(ExceptionSpecificationType EST) {
  619. switch (EST) {
  620. case EST_None:
  621. return CXCursor_ExceptionSpecificationKind_None;
  622. case EST_DynamicNone:
  623. return CXCursor_ExceptionSpecificationKind_DynamicNone;
  624. case EST_Dynamic:
  625. return CXCursor_ExceptionSpecificationKind_Dynamic;
  626. case EST_MSAny:
  627. return CXCursor_ExceptionSpecificationKind_MSAny;
  628. case EST_BasicNoexcept:
  629. return CXCursor_ExceptionSpecificationKind_BasicNoexcept;
  630. case EST_NoexceptFalse:
  631. case EST_NoexceptTrue:
  632. case EST_DependentNoexcept:
  633. return CXCursor_ExceptionSpecificationKind_ComputedNoexcept;
  634. case EST_Unevaluated:
  635. return CXCursor_ExceptionSpecificationKind_Unevaluated;
  636. case EST_Uninstantiated:
  637. return CXCursor_ExceptionSpecificationKind_Uninstantiated;
  638. case EST_Unparsed:
  639. return CXCursor_ExceptionSpecificationKind_Unparsed;
  640. }
  641. llvm_unreachable("invalid EST value");
  642. }
  643. int clang_getExceptionSpecificationType(CXType X) {
  644. QualType T = GetQualType(X);
  645. if (T.isNull())
  646. return -1;
  647. if (const auto *FD = T->getAs<FunctionProtoType>())
  648. return getExternalExceptionSpecificationKind(FD->getExceptionSpecType());
  649. return -1;
  650. }
  651. int clang_getCursorExceptionSpecificationType(CXCursor C) {
  652. if (clang_isDeclaration(C.kind))
  653. return clang_getExceptionSpecificationType(clang_getCursorType(C));
  654. return -1;
  655. }
  656. unsigned clang_isPODType(CXType X) {
  657. QualType T = GetQualType(X);
  658. if (T.isNull())
  659. return 0;
  660. CXTranslationUnit TU = GetTU(X);
  661. return T.isPODType(cxtu::getASTUnit(TU)->getASTContext()) ? 1 : 0;
  662. }
  663. CXType clang_getElementType(CXType CT) {
  664. QualType ET = QualType();
  665. QualType T = GetQualType(CT);
  666. const Type *TP = T.getTypePtrOrNull();
  667. if (TP) {
  668. switch (TP->getTypeClass()) {
  669. case Type::ConstantArray:
  670. ET = cast<ConstantArrayType> (TP)->getElementType();
  671. break;
  672. case Type::IncompleteArray:
  673. ET = cast<IncompleteArrayType> (TP)->getElementType();
  674. break;
  675. case Type::VariableArray:
  676. ET = cast<VariableArrayType> (TP)->getElementType();
  677. break;
  678. case Type::DependentSizedArray:
  679. ET = cast<DependentSizedArrayType> (TP)->getElementType();
  680. break;
  681. case Type::Vector:
  682. ET = cast<VectorType> (TP)->getElementType();
  683. break;
  684. case Type::Complex:
  685. ET = cast<ComplexType> (TP)->getElementType();
  686. break;
  687. default:
  688. break;
  689. }
  690. }
  691. return MakeCXType(ET, GetTU(CT));
  692. }
  693. long long clang_getNumElements(CXType CT) {
  694. long long result = -1;
  695. QualType T = GetQualType(CT);
  696. const Type *TP = T.getTypePtrOrNull();
  697. if (TP) {
  698. switch (TP->getTypeClass()) {
  699. case Type::ConstantArray:
  700. result = cast<ConstantArrayType> (TP)->getSize().getSExtValue();
  701. break;
  702. case Type::Vector:
  703. result = cast<VectorType> (TP)->getNumElements();
  704. break;
  705. default:
  706. break;
  707. }
  708. }
  709. return result;
  710. }
  711. CXType clang_getArrayElementType(CXType CT) {
  712. QualType ET = QualType();
  713. QualType T = GetQualType(CT);
  714. const Type *TP = T.getTypePtrOrNull();
  715. if (TP) {
  716. switch (TP->getTypeClass()) {
  717. case Type::ConstantArray:
  718. ET = cast<ConstantArrayType> (TP)->getElementType();
  719. break;
  720. case Type::IncompleteArray:
  721. ET = cast<IncompleteArrayType> (TP)->getElementType();
  722. break;
  723. case Type::VariableArray:
  724. ET = cast<VariableArrayType> (TP)->getElementType();
  725. break;
  726. case Type::DependentSizedArray:
  727. ET = cast<DependentSizedArrayType> (TP)->getElementType();
  728. break;
  729. default:
  730. break;
  731. }
  732. }
  733. return MakeCXType(ET, GetTU(CT));
  734. }
  735. long long clang_getArraySize(CXType CT) {
  736. long long result = -1;
  737. QualType T = GetQualType(CT);
  738. const Type *TP = T.getTypePtrOrNull();
  739. if (TP) {
  740. switch (TP->getTypeClass()) {
  741. case Type::ConstantArray:
  742. result = cast<ConstantArrayType> (TP)->getSize().getSExtValue();
  743. break;
  744. default:
  745. break;
  746. }
  747. }
  748. return result;
  749. }
  750. long long clang_Type_getAlignOf(CXType T) {
  751. if (T.kind == CXType_Invalid)
  752. return CXTypeLayoutError_Invalid;
  753. ASTContext &Ctx = cxtu::getASTUnit(GetTU(T))->getASTContext();
  754. QualType QT = GetQualType(T);
  755. // [expr.alignof] p1: return size_t value for complete object type, reference
  756. // or array.
  757. // [expr.alignof] p3: if reference type, return size of referenced type
  758. if (QT->isReferenceType())
  759. QT = QT.getNonReferenceType();
  760. if (QT->isIncompleteType())
  761. return CXTypeLayoutError_Incomplete;
  762. if (QT->isDependentType())
  763. return CXTypeLayoutError_Dependent;
  764. // Exceptions by GCC extension - see ASTContext.cpp:1313 getTypeInfoImpl
  765. // if (QT->isFunctionType()) return 4; // Bug #15511 - should be 1
  766. // if (QT->isVoidType()) return 1;
  767. return Ctx.getTypeAlignInChars(QT).getQuantity();
  768. }
  769. CXType clang_Type_getClassType(CXType CT) {
  770. QualType ET = QualType();
  771. QualType T = GetQualType(CT);
  772. const Type *TP = T.getTypePtrOrNull();
  773. if (TP && TP->getTypeClass() == Type::MemberPointer) {
  774. ET = QualType(cast<MemberPointerType> (TP)->getClass(), 0);
  775. }
  776. return MakeCXType(ET, GetTU(CT));
  777. }
  778. long long clang_Type_getSizeOf(CXType T) {
  779. if (T.kind == CXType_Invalid)
  780. return CXTypeLayoutError_Invalid;
  781. ASTContext &Ctx = cxtu::getASTUnit(GetTU(T))->getASTContext();
  782. QualType QT = GetQualType(T);
  783. // [expr.sizeof] p2: if reference type, return size of referenced type
  784. if (QT->isReferenceType())
  785. QT = QT.getNonReferenceType();
  786. // [expr.sizeof] p1: return -1 on: func, incomplete, bitfield, incomplete
  787. // enumeration
  788. // Note: We get the cxtype, not the cxcursor, so we can't call
  789. // FieldDecl->isBitField()
  790. // [expr.sizeof] p3: pointer ok, function not ok.
  791. // [gcc extension] lib/AST/ExprConstant.cpp:1372 HandleSizeof : vla == error
  792. if (QT->isIncompleteType())
  793. return CXTypeLayoutError_Incomplete;
  794. if (QT->isDependentType())
  795. return CXTypeLayoutError_Dependent;
  796. if (!QT->isConstantSizeType())
  797. return CXTypeLayoutError_NotConstantSize;
  798. // [gcc extension] lib/AST/ExprConstant.cpp:1372
  799. // HandleSizeof : {voidtype,functype} == 1
  800. // not handled by ASTContext.cpp:1313 getTypeInfoImpl
  801. if (QT->isVoidType() || QT->isFunctionType())
  802. return 1;
  803. return Ctx.getTypeSizeInChars(QT).getQuantity();
  804. }
  805. static long long visitRecordForValidation(const RecordDecl *RD) {
  806. for (const auto *I : RD->fields()){
  807. QualType FQT = I->getType();
  808. if (FQT->isIncompleteType())
  809. return CXTypeLayoutError_Incomplete;
  810. if (FQT->isDependentType())
  811. return CXTypeLayoutError_Dependent;
  812. // recurse
  813. if (const RecordType *ChildType = I->getType()->getAs<RecordType>()) {
  814. if (const RecordDecl *Child = ChildType->getDecl()) {
  815. long long ret = visitRecordForValidation(Child);
  816. if (ret < 0)
  817. return ret;
  818. }
  819. }
  820. // else try next field
  821. }
  822. return 0;
  823. }
  824. static long long validateFieldParentType(CXCursor PC, CXType PT){
  825. if (clang_isInvalid(PC.kind))
  826. return CXTypeLayoutError_Invalid;
  827. const RecordDecl *RD =
  828. dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
  829. // validate parent declaration
  830. if (!RD || RD->isInvalidDecl())
  831. return CXTypeLayoutError_Invalid;
  832. RD = RD->getDefinition();
  833. if (!RD)
  834. return CXTypeLayoutError_Incomplete;
  835. if (RD->isInvalidDecl())
  836. return CXTypeLayoutError_Invalid;
  837. // validate parent type
  838. QualType RT = GetQualType(PT);
  839. if (RT->isIncompleteType())
  840. return CXTypeLayoutError_Incomplete;
  841. if (RT->isDependentType())
  842. return CXTypeLayoutError_Dependent;
  843. // We recurse into all record fields to detect incomplete and dependent types.
  844. long long Error = visitRecordForValidation(RD);
  845. if (Error < 0)
  846. return Error;
  847. return 0;
  848. }
  849. long long clang_Type_getOffsetOf(CXType PT, const char *S) {
  850. // check that PT is not incomplete/dependent
  851. CXCursor PC = clang_getTypeDeclaration(PT);
  852. long long Error = validateFieldParentType(PC,PT);
  853. if (Error < 0)
  854. return Error;
  855. if (!S)
  856. return CXTypeLayoutError_InvalidFieldName;
  857. // lookup field
  858. ASTContext &Ctx = cxtu::getASTUnit(GetTU(PT))->getASTContext();
  859. IdentifierInfo *II = &Ctx.Idents.get(S);
  860. DeclarationName FieldName(II);
  861. const RecordDecl *RD =
  862. dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
  863. // verified in validateFieldParentType
  864. RD = RD->getDefinition();
  865. RecordDecl::lookup_result Res = RD->lookup(FieldName);
  866. // If a field of the parent record is incomplete, lookup will fail.
  867. // and we would return InvalidFieldName instead of Incomplete.
  868. // But this erroneous results does protects again a hidden assertion failure
  869. // in the RecordLayoutBuilder
  870. if (Res.size() != 1)
  871. return CXTypeLayoutError_InvalidFieldName;
  872. if (const FieldDecl *FD = dyn_cast<FieldDecl>(Res.front()))
  873. return Ctx.getFieldOffset(FD);
  874. if (const IndirectFieldDecl *IFD = dyn_cast<IndirectFieldDecl>(Res.front()))
  875. return Ctx.getFieldOffset(IFD);
  876. // we don't want any other Decl Type.
  877. return CXTypeLayoutError_InvalidFieldName;
  878. }
  879. CXType clang_Type_getModifiedType(CXType CT) {
  880. QualType T = GetQualType(CT);
  881. if (T.isNull())
  882. return MakeCXType(QualType(), GetTU(CT));
  883. if (auto *ATT = T->getAs<AttributedType>())
  884. return MakeCXType(ATT->getModifiedType(), GetTU(CT));
  885. return MakeCXType(QualType(), GetTU(CT));
  886. }
  887. long long clang_Cursor_getOffsetOfField(CXCursor C) {
  888. if (clang_isDeclaration(C.kind)) {
  889. // we need to validate the parent type
  890. CXCursor PC = clang_getCursorSemanticParent(C);
  891. CXType PT = clang_getCursorType(PC);
  892. long long Error = validateFieldParentType(PC,PT);
  893. if (Error < 0)
  894. return Error;
  895. // proceed with the offset calculation
  896. const Decl *D = cxcursor::getCursorDecl(C);
  897. ASTContext &Ctx = cxcursor::getCursorContext(C);
  898. if (const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D))
  899. return Ctx.getFieldOffset(FD);
  900. if (const IndirectFieldDecl *IFD = dyn_cast_or_null<IndirectFieldDecl>(D))
  901. return Ctx.getFieldOffset(IFD);
  902. }
  903. return -1;
  904. }
  905. enum CXRefQualifierKind clang_Type_getCXXRefQualifier(CXType T) {
  906. QualType QT = GetQualType(T);
  907. if (QT.isNull())
  908. return CXRefQualifier_None;
  909. const FunctionProtoType *FD = QT->getAs<FunctionProtoType>();
  910. if (!FD)
  911. return CXRefQualifier_None;
  912. switch (FD->getRefQualifier()) {
  913. case RQ_None:
  914. return CXRefQualifier_None;
  915. case RQ_LValue:
  916. return CXRefQualifier_LValue;
  917. case RQ_RValue:
  918. return CXRefQualifier_RValue;
  919. }
  920. return CXRefQualifier_None;
  921. }
  922. unsigned clang_Cursor_isBitField(CXCursor C) {
  923. if (!clang_isDeclaration(C.kind))
  924. return 0;
  925. const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(cxcursor::getCursorDecl(C));
  926. if (!FD)
  927. return 0;
  928. return FD->isBitField();
  929. }
  930. CXString clang_getDeclObjCTypeEncoding(CXCursor C) {
  931. if (!clang_isDeclaration(C.kind))
  932. return cxstring::createEmpty();
  933. const Decl *D = cxcursor::getCursorDecl(C);
  934. ASTContext &Ctx = cxcursor::getCursorContext(C);
  935. std::string encoding;
  936. if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) {
  937. encoding = Ctx.getObjCEncodingForMethodDecl(OMD);
  938. } else if (const ObjCPropertyDecl *OPD = dyn_cast<ObjCPropertyDecl>(D))
  939. encoding = Ctx.getObjCEncodingForPropertyDecl(OPD, nullptr);
  940. else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
  941. encoding = Ctx.getObjCEncodingForFunctionDecl(FD);
  942. else {
  943. QualType Ty;
  944. if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
  945. Ty = Ctx.getTypeDeclType(TD);
  946. if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
  947. Ty = VD->getType();
  948. else return cxstring::createRef("?");
  949. Ctx.getObjCEncodingForType(Ty, encoding);
  950. }
  951. return cxstring::createDup(encoding);
  952. }
  953. static unsigned GetTemplateArgumentArraySize(ArrayRef<TemplateArgument> TA) {
  954. unsigned size = TA.size();
  955. for (const auto &Arg : TA)
  956. if (Arg.getKind() == TemplateArgument::Pack)
  957. size += Arg.pack_size() - 1;
  958. return size;
  959. }
  960. int clang_Type_getNumTemplateArguments(CXType CT) {
  961. QualType T = GetQualType(CT);
  962. if (T.isNull())
  963. return -1;
  964. auto TA = GetTemplateArguments(T);
  965. if (!TA)
  966. return -1;
  967. return GetTemplateArgumentArraySize(TA.getValue());
  968. }
  969. CXType clang_Type_getTemplateArgumentAsType(CXType CT, unsigned index) {
  970. QualType T = GetQualType(CT);
  971. if (T.isNull())
  972. return MakeCXType(QualType(), GetTU(CT));
  973. auto TA = GetTemplateArguments(T);
  974. if (!TA)
  975. return MakeCXType(QualType(), GetTU(CT));
  976. Optional<QualType> QT = FindTemplateArgumentTypeAt(TA.getValue(), index);
  977. return MakeCXType(QT.getValueOr(QualType()), GetTU(CT));
  978. }
  979. CXType clang_Type_getObjCObjectBaseType(CXType CT) {
  980. QualType T = GetQualType(CT);
  981. if (T.isNull())
  982. return MakeCXType(QualType(), GetTU(CT));
  983. const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
  984. if (!OT)
  985. return MakeCXType(QualType(), GetTU(CT));
  986. return MakeCXType(OT->getBaseType(), GetTU(CT));
  987. }
  988. unsigned clang_Type_getNumObjCProtocolRefs(CXType CT) {
  989. QualType T = GetQualType(CT);
  990. if (T.isNull())
  991. return 0;
  992. const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
  993. if (!OT)
  994. return 0;
  995. return OT->getNumProtocols();
  996. }
  997. CXCursor clang_Type_getObjCProtocolDecl(CXType CT, unsigned i) {
  998. QualType T = GetQualType(CT);
  999. if (T.isNull())
  1000. return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
  1001. const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
  1002. if (!OT)
  1003. return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
  1004. const ObjCProtocolDecl *PD = OT->getProtocol(i);
  1005. if (!PD)
  1006. return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
  1007. return cxcursor::MakeCXCursor(PD, GetTU(CT));
  1008. }
  1009. unsigned clang_Type_getNumObjCTypeArgs(CXType CT) {
  1010. QualType T = GetQualType(CT);
  1011. if (T.isNull())
  1012. return 0;
  1013. const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
  1014. if (!OT)
  1015. return 0;
  1016. return OT->getTypeArgs().size();
  1017. }
  1018. CXType clang_Type_getObjCTypeArg(CXType CT, unsigned i) {
  1019. QualType T = GetQualType(CT);
  1020. if (T.isNull())
  1021. return MakeCXType(QualType(), GetTU(CT));
  1022. const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
  1023. if (!OT)
  1024. return MakeCXType(QualType(), GetTU(CT));
  1025. const ArrayRef<QualType> TA = OT->getTypeArgs();
  1026. if ((size_t)i >= TA.size())
  1027. return MakeCXType(QualType(), GetTU(CT));
  1028. return MakeCXType(TA[i], GetTU(CT));
  1029. }
  1030. unsigned clang_Type_visitFields(CXType PT,
  1031. CXFieldVisitor visitor,
  1032. CXClientData client_data){
  1033. CXCursor PC = clang_getTypeDeclaration(PT);
  1034. if (clang_isInvalid(PC.kind))
  1035. return false;
  1036. const RecordDecl *RD =
  1037. dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
  1038. if (!RD || RD->isInvalidDecl())
  1039. return false;
  1040. RD = RD->getDefinition();
  1041. if (!RD || RD->isInvalidDecl())
  1042. return false;
  1043. for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
  1044. I != E; ++I){
  1045. const FieldDecl *FD = dyn_cast_or_null<FieldDecl>((*I));
  1046. // Callback to the client.
  1047. switch (visitor(cxcursor::MakeCXCursor(FD, GetTU(PT)), client_data)){
  1048. case CXVisit_Break:
  1049. return true;
  1050. case CXVisit_Continue:
  1051. break;
  1052. }
  1053. }
  1054. return true;
  1055. }
  1056. unsigned clang_Cursor_isAnonymous(CXCursor C){
  1057. if (!clang_isDeclaration(C.kind))
  1058. return 0;
  1059. const Decl *D = cxcursor::getCursorDecl(C);
  1060. if (const RecordDecl *FD = dyn_cast_or_null<RecordDecl>(D))
  1061. return FD->isAnonymousStructOrUnion();
  1062. return 0;
  1063. }
  1064. CXType clang_Type_getNamedType(CXType CT){
  1065. QualType T = GetQualType(CT);
  1066. const Type *TP = T.getTypePtrOrNull();
  1067. if (TP && TP->getTypeClass() == Type::Elaborated)
  1068. return MakeCXType(cast<ElaboratedType>(TP)->getNamedType(), GetTU(CT));
  1069. return MakeCXType(QualType(), GetTU(CT));
  1070. }
  1071. unsigned clang_Type_isTransparentTagTypedef(CXType TT){
  1072. QualType T = GetQualType(TT);
  1073. if (auto *TT = dyn_cast_or_null<TypedefType>(T.getTypePtrOrNull())) {
  1074. if (auto *D = TT->getDecl())
  1075. return D->isTransparentTag();
  1076. }
  1077. return false;
  1078. }
  1079. enum CXTypeNullabilityKind clang_Type_getNullability(CXType CT) {
  1080. QualType T = GetQualType(CT);
  1081. if (T.isNull())
  1082. return CXTypeNullability_Invalid;
  1083. ASTContext &Ctx = cxtu::getASTUnit(GetTU(CT))->getASTContext();
  1084. if (auto nullability = T->getNullability(Ctx)) {
  1085. switch (*nullability) {
  1086. case NullabilityKind::NonNull:
  1087. return CXTypeNullability_NonNull;
  1088. case NullabilityKind::Nullable:
  1089. return CXTypeNullability_Nullable;
  1090. case NullabilityKind::Unspecified:
  1091. return CXTypeNullability_Unspecified;
  1092. }
  1093. }
  1094. return CXTypeNullability_Invalid;
  1095. }