CXCursor.cpp 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623
  1. //===- CXCursor.cpp - Routines for manipulating CXCursors -----------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file defines routines for manipulating CXCursors. It should be the
  10. // only file that has internal knowledge of the encoding of the data in
  11. // CXCursor.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "CXTranslationUnit.h"
  15. #include "CXCursor.h"
  16. #include "CXString.h"
  17. #include "CXType.h"
  18. #include "clang-c/Index.h"
  19. #include "clang/AST/Attr.h"
  20. #include "clang/AST/Decl.h"
  21. #include "clang/AST/DeclCXX.h"
  22. #include "clang/AST/DeclObjC.h"
  23. #include "clang/AST/DeclTemplate.h"
  24. #include "clang/AST/Expr.h"
  25. #include "clang/AST/ExprCXX.h"
  26. #include "clang/AST/ExprObjC.h"
  27. #include "clang/Frontend/ASTUnit.h"
  28. #include "llvm/Support/ErrorHandling.h"
  29. using namespace clang;
  30. using namespace cxcursor;
  31. CXCursor cxcursor::MakeCXCursorInvalid(CXCursorKind K, CXTranslationUnit TU) {
  32. assert(K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid);
  33. CXCursor C = { K, 0, { nullptr, nullptr, TU } };
  34. return C;
  35. }
  36. static CXCursorKind GetCursorKind(const Attr *A) {
  37. assert(A && "Invalid arguments!");
  38. switch (A->getKind()) {
  39. default: break;
  40. case attr::IBAction: return CXCursor_IBActionAttr;
  41. case attr::IBOutlet: return CXCursor_IBOutletAttr;
  42. case attr::IBOutletCollection: return CXCursor_IBOutletCollectionAttr;
  43. case attr::Final: return CXCursor_CXXFinalAttr;
  44. case attr::Override: return CXCursor_CXXOverrideAttr;
  45. case attr::Annotate: return CXCursor_AnnotateAttr;
  46. case attr::AsmLabel: return CXCursor_AsmLabelAttr;
  47. case attr::Packed: return CXCursor_PackedAttr;
  48. case attr::Pure: return CXCursor_PureAttr;
  49. case attr::Const: return CXCursor_ConstAttr;
  50. case attr::NoDuplicate: return CXCursor_NoDuplicateAttr;
  51. case attr::CUDAConstant: return CXCursor_CUDAConstantAttr;
  52. case attr::CUDADevice: return CXCursor_CUDADeviceAttr;
  53. case attr::CUDAGlobal: return CXCursor_CUDAGlobalAttr;
  54. case attr::CUDAHost: return CXCursor_CUDAHostAttr;
  55. case attr::CUDAShared: return CXCursor_CUDASharedAttr;
  56. case attr::Visibility: return CXCursor_VisibilityAttr;
  57. case attr::DLLExport: return CXCursor_DLLExport;
  58. case attr::DLLImport: return CXCursor_DLLImport;
  59. case attr::NSReturnsRetained: return CXCursor_NSReturnsRetained;
  60. case attr::NSReturnsNotRetained: return CXCursor_NSReturnsNotRetained;
  61. case attr::NSReturnsAutoreleased: return CXCursor_NSReturnsAutoreleased;
  62. case attr::NSConsumesSelf: return CXCursor_NSConsumesSelf;
  63. case attr::NSConsumed: return CXCursor_NSConsumed;
  64. case attr::ObjCException: return CXCursor_ObjCException;
  65. case attr::ObjCNSObject: return CXCursor_ObjCNSObject;
  66. case attr::ObjCIndependentClass: return CXCursor_ObjCIndependentClass;
  67. case attr::ObjCPreciseLifetime: return CXCursor_ObjCPreciseLifetime;
  68. case attr::ObjCReturnsInnerPointer: return CXCursor_ObjCReturnsInnerPointer;
  69. case attr::ObjCRequiresSuper: return CXCursor_ObjCRequiresSuper;
  70. case attr::ObjCRootClass: return CXCursor_ObjCRootClass;
  71. case attr::ObjCSubclassingRestricted: return CXCursor_ObjCSubclassingRestricted;
  72. case attr::ObjCExplicitProtocolImpl: return CXCursor_ObjCExplicitProtocolImpl;
  73. case attr::ObjCDesignatedInitializer: return CXCursor_ObjCDesignatedInitializer;
  74. case attr::ObjCRuntimeVisible: return CXCursor_ObjCRuntimeVisible;
  75. case attr::ObjCBoxable: return CXCursor_ObjCBoxable;
  76. case attr::FlagEnum: return CXCursor_FlagEnum;
  77. case attr::Convergent: return CXCursor_ConvergentAttr;
  78. case attr::WarnUnused: return CXCursor_WarnUnusedAttr;
  79. case attr::WarnUnusedResult: return CXCursor_WarnUnusedResultAttr;
  80. case attr::Aligned: return CXCursor_AlignedAttr;
  81. }
  82. return CXCursor_UnexposedAttr;
  83. }
  84. CXCursor cxcursor::MakeCXCursor(const Attr *A, const Decl *Parent,
  85. CXTranslationUnit TU) {
  86. assert(A && Parent && TU && "Invalid arguments!");
  87. CXCursor C = { GetCursorKind(A), 0, { Parent, A, TU } };
  88. return C;
  89. }
  90. CXCursor cxcursor::MakeCXCursor(const Decl *D, CXTranslationUnit TU,
  91. SourceRange RegionOfInterest,
  92. bool FirstInDeclGroup) {
  93. assert(D && TU && "Invalid arguments!");
  94. CXCursorKind K = getCursorKindForDecl(D);
  95. if (K == CXCursor_ObjCClassMethodDecl ||
  96. K == CXCursor_ObjCInstanceMethodDecl) {
  97. int SelectorIdIndex = -1;
  98. // Check if cursor points to a selector id.
  99. if (RegionOfInterest.isValid() &&
  100. RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) {
  101. SmallVector<SourceLocation, 16> SelLocs;
  102. cast<ObjCMethodDecl>(D)->getSelectorLocs(SelLocs);
  103. SmallVectorImpl<SourceLocation>::iterator I =
  104. llvm::find(SelLocs, RegionOfInterest.getBegin());
  105. if (I != SelLocs.end())
  106. SelectorIdIndex = I - SelLocs.begin();
  107. }
  108. CXCursor C = { K, SelectorIdIndex,
  109. { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }};
  110. return C;
  111. }
  112. CXCursor C = { K, 0, { D, (void*)(intptr_t) (FirstInDeclGroup ? 1 : 0), TU }};
  113. return C;
  114. }
  115. CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent,
  116. CXTranslationUnit TU,
  117. SourceRange RegionOfInterest) {
  118. assert(S && TU && "Invalid arguments!");
  119. CXCursorKind K = CXCursor_NotImplemented;
  120. switch (S->getStmtClass()) {
  121. case Stmt::NoStmtClass:
  122. break;
  123. case Stmt::CaseStmtClass:
  124. K = CXCursor_CaseStmt;
  125. break;
  126. case Stmt::DefaultStmtClass:
  127. K = CXCursor_DefaultStmt;
  128. break;
  129. case Stmt::IfStmtClass:
  130. K = CXCursor_IfStmt;
  131. break;
  132. case Stmt::SwitchStmtClass:
  133. K = CXCursor_SwitchStmt;
  134. break;
  135. case Stmt::WhileStmtClass:
  136. K = CXCursor_WhileStmt;
  137. break;
  138. case Stmt::DoStmtClass:
  139. K = CXCursor_DoStmt;
  140. break;
  141. case Stmt::ForStmtClass:
  142. K = CXCursor_ForStmt;
  143. break;
  144. case Stmt::GotoStmtClass:
  145. K = CXCursor_GotoStmt;
  146. break;
  147. case Stmt::IndirectGotoStmtClass:
  148. K = CXCursor_IndirectGotoStmt;
  149. break;
  150. case Stmt::ContinueStmtClass:
  151. K = CXCursor_ContinueStmt;
  152. break;
  153. case Stmt::BreakStmtClass:
  154. K = CXCursor_BreakStmt;
  155. break;
  156. case Stmt::ReturnStmtClass:
  157. K = CXCursor_ReturnStmt;
  158. break;
  159. case Stmt::GCCAsmStmtClass:
  160. K = CXCursor_GCCAsmStmt;
  161. break;
  162. case Stmt::MSAsmStmtClass:
  163. K = CXCursor_MSAsmStmt;
  164. break;
  165. case Stmt::ObjCAtTryStmtClass:
  166. K = CXCursor_ObjCAtTryStmt;
  167. break;
  168. case Stmt::ObjCAtCatchStmtClass:
  169. K = CXCursor_ObjCAtCatchStmt;
  170. break;
  171. case Stmt::ObjCAtFinallyStmtClass:
  172. K = CXCursor_ObjCAtFinallyStmt;
  173. break;
  174. case Stmt::ObjCAtThrowStmtClass:
  175. K = CXCursor_ObjCAtThrowStmt;
  176. break;
  177. case Stmt::ObjCAtSynchronizedStmtClass:
  178. K = CXCursor_ObjCAtSynchronizedStmt;
  179. break;
  180. case Stmt::ObjCAutoreleasePoolStmtClass:
  181. K = CXCursor_ObjCAutoreleasePoolStmt;
  182. break;
  183. case Stmt::ObjCForCollectionStmtClass:
  184. K = CXCursor_ObjCForCollectionStmt;
  185. break;
  186. case Stmt::CXXCatchStmtClass:
  187. K = CXCursor_CXXCatchStmt;
  188. break;
  189. case Stmt::CXXTryStmtClass:
  190. K = CXCursor_CXXTryStmt;
  191. break;
  192. case Stmt::CXXForRangeStmtClass:
  193. K = CXCursor_CXXForRangeStmt;
  194. break;
  195. case Stmt::SEHTryStmtClass:
  196. K = CXCursor_SEHTryStmt;
  197. break;
  198. case Stmt::SEHExceptStmtClass:
  199. K = CXCursor_SEHExceptStmt;
  200. break;
  201. case Stmt::SEHFinallyStmtClass:
  202. K = CXCursor_SEHFinallyStmt;
  203. break;
  204. case Stmt::SEHLeaveStmtClass:
  205. K = CXCursor_SEHLeaveStmt;
  206. break;
  207. case Stmt::CoroutineBodyStmtClass:
  208. case Stmt::CoreturnStmtClass:
  209. K = CXCursor_UnexposedStmt;
  210. break;
  211. case Stmt::ArrayTypeTraitExprClass:
  212. case Stmt::AsTypeExprClass:
  213. case Stmt::AtomicExprClass:
  214. case Stmt::BinaryConditionalOperatorClass:
  215. case Stmt::TypeTraitExprClass:
  216. case Stmt::CoawaitExprClass:
  217. case Stmt::ConceptSpecializationExprClass:
  218. case Stmt::DependentCoawaitExprClass:
  219. case Stmt::CoyieldExprClass:
  220. case Stmt::CXXBindTemporaryExprClass:
  221. case Stmt::CXXDefaultArgExprClass:
  222. case Stmt::CXXDefaultInitExprClass:
  223. case Stmt::CXXFoldExprClass:
  224. case Stmt::CXXStdInitializerListExprClass:
  225. case Stmt::CXXScalarValueInitExprClass:
  226. case Stmt::CXXUuidofExprClass:
  227. case Stmt::ChooseExprClass:
  228. case Stmt::DesignatedInitExprClass:
  229. case Stmt::DesignatedInitUpdateExprClass:
  230. case Stmt::ArrayInitLoopExprClass:
  231. case Stmt::ArrayInitIndexExprClass:
  232. case Stmt::ExprWithCleanupsClass:
  233. case Stmt::ExpressionTraitExprClass:
  234. case Stmt::ExtVectorElementExprClass:
  235. case Stmt::ImplicitCastExprClass:
  236. case Stmt::ImplicitValueInitExprClass:
  237. case Stmt::NoInitExprClass:
  238. case Stmt::MaterializeTemporaryExprClass:
  239. case Stmt::ObjCIndirectCopyRestoreExprClass:
  240. case Stmt::OffsetOfExprClass:
  241. case Stmt::ParenListExprClass:
  242. case Stmt::PredefinedExprClass:
  243. case Stmt::ShuffleVectorExprClass:
  244. case Stmt::SourceLocExprClass:
  245. case Stmt::ConvertVectorExprClass:
  246. case Stmt::VAArgExprClass:
  247. case Stmt::ObjCArrayLiteralClass:
  248. case Stmt::ObjCDictionaryLiteralClass:
  249. case Stmt::ObjCBoxedExprClass:
  250. case Stmt::ObjCSubscriptRefExprClass:
  251. K = CXCursor_UnexposedExpr;
  252. break;
  253. case Stmt::OpaqueValueExprClass:
  254. if (Expr *Src = cast<OpaqueValueExpr>(S)->getSourceExpr())
  255. return MakeCXCursor(Src, Parent, TU, RegionOfInterest);
  256. K = CXCursor_UnexposedExpr;
  257. break;
  258. case Stmt::PseudoObjectExprClass:
  259. return MakeCXCursor(cast<PseudoObjectExpr>(S)->getSyntacticForm(),
  260. Parent, TU, RegionOfInterest);
  261. case Stmt::CompoundStmtClass:
  262. K = CXCursor_CompoundStmt;
  263. break;
  264. case Stmt::NullStmtClass:
  265. K = CXCursor_NullStmt;
  266. break;
  267. case Stmt::LabelStmtClass:
  268. K = CXCursor_LabelStmt;
  269. break;
  270. case Stmt::AttributedStmtClass:
  271. K = CXCursor_UnexposedStmt;
  272. break;
  273. case Stmt::DeclStmtClass:
  274. K = CXCursor_DeclStmt;
  275. break;
  276. case Stmt::CapturedStmtClass:
  277. K = CXCursor_UnexposedStmt;
  278. break;
  279. case Stmt::IntegerLiteralClass:
  280. K = CXCursor_IntegerLiteral;
  281. break;
  282. case Stmt::FixedPointLiteralClass:
  283. K = CXCursor_FixedPointLiteral;
  284. break;
  285. case Stmt::FloatingLiteralClass:
  286. K = CXCursor_FloatingLiteral;
  287. break;
  288. case Stmt::ImaginaryLiteralClass:
  289. K = CXCursor_ImaginaryLiteral;
  290. break;
  291. case Stmt::StringLiteralClass:
  292. K = CXCursor_StringLiteral;
  293. break;
  294. case Stmt::CharacterLiteralClass:
  295. K = CXCursor_CharacterLiteral;
  296. break;
  297. case Stmt::ConstantExprClass:
  298. return MakeCXCursor(cast<ConstantExpr>(S)->getSubExpr(),
  299. Parent, TU, RegionOfInterest);
  300. case Stmt::ParenExprClass:
  301. K = CXCursor_ParenExpr;
  302. break;
  303. case Stmt::UnaryOperatorClass:
  304. K = CXCursor_UnaryOperator;
  305. break;
  306. case Stmt::UnaryExprOrTypeTraitExprClass:
  307. case Stmt::CXXNoexceptExprClass:
  308. K = CXCursor_UnaryExpr;
  309. break;
  310. case Stmt::MSPropertySubscriptExprClass:
  311. case Stmt::ArraySubscriptExprClass:
  312. K = CXCursor_ArraySubscriptExpr;
  313. break;
  314. case Stmt::OMPArraySectionExprClass:
  315. K = CXCursor_OMPArraySectionExpr;
  316. break;
  317. case Stmt::BinaryOperatorClass:
  318. K = CXCursor_BinaryOperator;
  319. break;
  320. case Stmt::CompoundAssignOperatorClass:
  321. K = CXCursor_CompoundAssignOperator;
  322. break;
  323. case Stmt::ConditionalOperatorClass:
  324. K = CXCursor_ConditionalOperator;
  325. break;
  326. case Stmt::CStyleCastExprClass:
  327. K = CXCursor_CStyleCastExpr;
  328. break;
  329. case Stmt::CompoundLiteralExprClass:
  330. K = CXCursor_CompoundLiteralExpr;
  331. break;
  332. case Stmt::InitListExprClass:
  333. K = CXCursor_InitListExpr;
  334. break;
  335. case Stmt::AddrLabelExprClass:
  336. K = CXCursor_AddrLabelExpr;
  337. break;
  338. case Stmt::StmtExprClass:
  339. K = CXCursor_StmtExpr;
  340. break;
  341. case Stmt::GenericSelectionExprClass:
  342. K = CXCursor_GenericSelectionExpr;
  343. break;
  344. case Stmt::GNUNullExprClass:
  345. K = CXCursor_GNUNullExpr;
  346. break;
  347. case Stmt::CXXStaticCastExprClass:
  348. K = CXCursor_CXXStaticCastExpr;
  349. break;
  350. case Stmt::CXXDynamicCastExprClass:
  351. K = CXCursor_CXXDynamicCastExpr;
  352. break;
  353. case Stmt::CXXReinterpretCastExprClass:
  354. K = CXCursor_CXXReinterpretCastExpr;
  355. break;
  356. case Stmt::CXXConstCastExprClass:
  357. K = CXCursor_CXXConstCastExpr;
  358. break;
  359. case Stmt::CXXFunctionalCastExprClass:
  360. K = CXCursor_CXXFunctionalCastExpr;
  361. break;
  362. case Stmt::CXXTypeidExprClass:
  363. K = CXCursor_CXXTypeidExpr;
  364. break;
  365. case Stmt::CXXBoolLiteralExprClass:
  366. K = CXCursor_CXXBoolLiteralExpr;
  367. break;
  368. case Stmt::CXXNullPtrLiteralExprClass:
  369. K = CXCursor_CXXNullPtrLiteralExpr;
  370. break;
  371. case Stmt::CXXThisExprClass:
  372. K = CXCursor_CXXThisExpr;
  373. break;
  374. case Stmt::CXXThrowExprClass:
  375. K = CXCursor_CXXThrowExpr;
  376. break;
  377. case Stmt::CXXNewExprClass:
  378. K = CXCursor_CXXNewExpr;
  379. break;
  380. case Stmt::CXXDeleteExprClass:
  381. K = CXCursor_CXXDeleteExpr;
  382. break;
  383. case Stmt::ObjCStringLiteralClass:
  384. K = CXCursor_ObjCStringLiteral;
  385. break;
  386. case Stmt::ObjCEncodeExprClass:
  387. K = CXCursor_ObjCEncodeExpr;
  388. break;
  389. case Stmt::ObjCSelectorExprClass:
  390. K = CXCursor_ObjCSelectorExpr;
  391. break;
  392. case Stmt::ObjCProtocolExprClass:
  393. K = CXCursor_ObjCProtocolExpr;
  394. break;
  395. case Stmt::ObjCBoolLiteralExprClass:
  396. K = CXCursor_ObjCBoolLiteralExpr;
  397. break;
  398. case Stmt::ObjCAvailabilityCheckExprClass:
  399. K = CXCursor_ObjCAvailabilityCheckExpr;
  400. break;
  401. case Stmt::ObjCBridgedCastExprClass:
  402. K = CXCursor_ObjCBridgedCastExpr;
  403. break;
  404. case Stmt::BlockExprClass:
  405. K = CXCursor_BlockExpr;
  406. break;
  407. case Stmt::PackExpansionExprClass:
  408. K = CXCursor_PackExpansionExpr;
  409. break;
  410. case Stmt::SizeOfPackExprClass:
  411. K = CXCursor_SizeOfPackExpr;
  412. break;
  413. case Stmt::DeclRefExprClass:
  414. if (const ImplicitParamDecl *IPD =
  415. dyn_cast_or_null<ImplicitParamDecl>(cast<DeclRefExpr>(S)->getDecl())) {
  416. if (const ObjCMethodDecl *MD =
  417. dyn_cast<ObjCMethodDecl>(IPD->getDeclContext())) {
  418. if (MD->getSelfDecl() == IPD) {
  419. K = CXCursor_ObjCSelfExpr;
  420. break;
  421. }
  422. }
  423. }
  424. K = CXCursor_DeclRefExpr;
  425. break;
  426. case Stmt::DependentScopeDeclRefExprClass:
  427. case Stmt::SubstNonTypeTemplateParmExprClass:
  428. case Stmt::SubstNonTypeTemplateParmPackExprClass:
  429. case Stmt::FunctionParmPackExprClass:
  430. case Stmt::UnresolvedLookupExprClass:
  431. case Stmt::TypoExprClass: // A typo could actually be a DeclRef or a MemberRef
  432. K = CXCursor_DeclRefExpr;
  433. break;
  434. case Stmt::CXXDependentScopeMemberExprClass:
  435. case Stmt::CXXPseudoDestructorExprClass:
  436. case Stmt::MemberExprClass:
  437. case Stmt::MSPropertyRefExprClass:
  438. case Stmt::ObjCIsaExprClass:
  439. case Stmt::ObjCIvarRefExprClass:
  440. case Stmt::ObjCPropertyRefExprClass:
  441. case Stmt::UnresolvedMemberExprClass:
  442. K = CXCursor_MemberRefExpr;
  443. break;
  444. case Stmt::CallExprClass:
  445. case Stmt::CXXOperatorCallExprClass:
  446. case Stmt::CXXMemberCallExprClass:
  447. case Stmt::CUDAKernelCallExprClass:
  448. case Stmt::CXXConstructExprClass:
  449. case Stmt::CXXInheritedCtorInitExprClass:
  450. case Stmt::CXXTemporaryObjectExprClass:
  451. case Stmt::CXXUnresolvedConstructExprClass:
  452. case Stmt::UserDefinedLiteralClass:
  453. K = CXCursor_CallExpr;
  454. break;
  455. case Stmt::LambdaExprClass:
  456. K = CXCursor_LambdaExpr;
  457. break;
  458. case Stmt::ObjCMessageExprClass: {
  459. K = CXCursor_ObjCMessageExpr;
  460. int SelectorIdIndex = -1;
  461. // Check if cursor points to a selector id.
  462. if (RegionOfInterest.isValid() &&
  463. RegionOfInterest.getBegin() == RegionOfInterest.getEnd()) {
  464. SmallVector<SourceLocation, 16> SelLocs;
  465. cast<ObjCMessageExpr>(S)->getSelectorLocs(SelLocs);
  466. SmallVectorImpl<SourceLocation>::iterator I =
  467. llvm::find(SelLocs, RegionOfInterest.getBegin());
  468. if (I != SelLocs.end())
  469. SelectorIdIndex = I - SelLocs.begin();
  470. }
  471. CXCursor C = { K, 0, { Parent, S, TU } };
  472. return getSelectorIdentifierCursor(SelectorIdIndex, C);
  473. }
  474. case Stmt::MSDependentExistsStmtClass:
  475. K = CXCursor_UnexposedStmt;
  476. break;
  477. case Stmt::OMPParallelDirectiveClass:
  478. K = CXCursor_OMPParallelDirective;
  479. break;
  480. case Stmt::OMPSimdDirectiveClass:
  481. K = CXCursor_OMPSimdDirective;
  482. break;
  483. case Stmt::OMPForDirectiveClass:
  484. K = CXCursor_OMPForDirective;
  485. break;
  486. case Stmt::OMPForSimdDirectiveClass:
  487. K = CXCursor_OMPForSimdDirective;
  488. break;
  489. case Stmt::OMPSectionsDirectiveClass:
  490. K = CXCursor_OMPSectionsDirective;
  491. break;
  492. case Stmt::OMPSectionDirectiveClass:
  493. K = CXCursor_OMPSectionDirective;
  494. break;
  495. case Stmt::OMPSingleDirectiveClass:
  496. K = CXCursor_OMPSingleDirective;
  497. break;
  498. case Stmt::OMPMasterDirectiveClass:
  499. K = CXCursor_OMPMasterDirective;
  500. break;
  501. case Stmt::OMPCriticalDirectiveClass:
  502. K = CXCursor_OMPCriticalDirective;
  503. break;
  504. case Stmt::OMPParallelForDirectiveClass:
  505. K = CXCursor_OMPParallelForDirective;
  506. break;
  507. case Stmt::OMPParallelForSimdDirectiveClass:
  508. K = CXCursor_OMPParallelForSimdDirective;
  509. break;
  510. case Stmt::OMPParallelSectionsDirectiveClass:
  511. K = CXCursor_OMPParallelSectionsDirective;
  512. break;
  513. case Stmt::OMPTaskDirectiveClass:
  514. K = CXCursor_OMPTaskDirective;
  515. break;
  516. case Stmt::OMPTaskyieldDirectiveClass:
  517. K = CXCursor_OMPTaskyieldDirective;
  518. break;
  519. case Stmt::OMPBarrierDirectiveClass:
  520. K = CXCursor_OMPBarrierDirective;
  521. break;
  522. case Stmt::OMPTaskwaitDirectiveClass:
  523. K = CXCursor_OMPTaskwaitDirective;
  524. break;
  525. case Stmt::OMPTaskgroupDirectiveClass:
  526. K = CXCursor_OMPTaskgroupDirective;
  527. break;
  528. case Stmt::OMPFlushDirectiveClass:
  529. K = CXCursor_OMPFlushDirective;
  530. break;
  531. case Stmt::OMPOrderedDirectiveClass:
  532. K = CXCursor_OMPOrderedDirective;
  533. break;
  534. case Stmt::OMPAtomicDirectiveClass:
  535. K = CXCursor_OMPAtomicDirective;
  536. break;
  537. case Stmt::OMPTargetDirectiveClass:
  538. K = CXCursor_OMPTargetDirective;
  539. break;
  540. case Stmt::OMPTargetDataDirectiveClass:
  541. K = CXCursor_OMPTargetDataDirective;
  542. break;
  543. case Stmt::OMPTargetEnterDataDirectiveClass:
  544. K = CXCursor_OMPTargetEnterDataDirective;
  545. break;
  546. case Stmt::OMPTargetExitDataDirectiveClass:
  547. K = CXCursor_OMPTargetExitDataDirective;
  548. break;
  549. case Stmt::OMPTargetParallelDirectiveClass:
  550. K = CXCursor_OMPTargetParallelDirective;
  551. break;
  552. case Stmt::OMPTargetParallelForDirectiveClass:
  553. K = CXCursor_OMPTargetParallelForDirective;
  554. break;
  555. case Stmt::OMPTargetUpdateDirectiveClass:
  556. K = CXCursor_OMPTargetUpdateDirective;
  557. break;
  558. case Stmt::OMPTeamsDirectiveClass:
  559. K = CXCursor_OMPTeamsDirective;
  560. break;
  561. case Stmt::OMPCancellationPointDirectiveClass:
  562. K = CXCursor_OMPCancellationPointDirective;
  563. break;
  564. case Stmt::OMPCancelDirectiveClass:
  565. K = CXCursor_OMPCancelDirective;
  566. break;
  567. case Stmt::OMPTaskLoopDirectiveClass:
  568. K = CXCursor_OMPTaskLoopDirective;
  569. break;
  570. case Stmt::OMPTaskLoopSimdDirectiveClass:
  571. K = CXCursor_OMPTaskLoopSimdDirective;
  572. break;
  573. case Stmt::OMPMasterTaskLoopDirectiveClass:
  574. K = CXCursor_OMPMasterTaskLoopDirective;
  575. break;
  576. case Stmt::OMPParallelMasterTaskLoopDirectiveClass:
  577. K = CXCursor_OMPParallelMasterTaskLoopDirective;
  578. break;
  579. case Stmt::OMPDistributeDirectiveClass:
  580. K = CXCursor_OMPDistributeDirective;
  581. break;
  582. case Stmt::OMPDistributeParallelForDirectiveClass:
  583. K = CXCursor_OMPDistributeParallelForDirective;
  584. break;
  585. case Stmt::OMPDistributeParallelForSimdDirectiveClass:
  586. K = CXCursor_OMPDistributeParallelForSimdDirective;
  587. break;
  588. case Stmt::OMPDistributeSimdDirectiveClass:
  589. K = CXCursor_OMPDistributeSimdDirective;
  590. break;
  591. case Stmt::OMPTargetParallelForSimdDirectiveClass:
  592. K = CXCursor_OMPTargetParallelForSimdDirective;
  593. break;
  594. case Stmt::OMPTargetSimdDirectiveClass:
  595. K = CXCursor_OMPTargetSimdDirective;
  596. break;
  597. case Stmt::OMPTeamsDistributeDirectiveClass:
  598. K = CXCursor_OMPTeamsDistributeDirective;
  599. break;
  600. case Stmt::OMPTeamsDistributeSimdDirectiveClass:
  601. K = CXCursor_OMPTeamsDistributeSimdDirective;
  602. break;
  603. case Stmt::OMPTeamsDistributeParallelForSimdDirectiveClass:
  604. K = CXCursor_OMPTeamsDistributeParallelForSimdDirective;
  605. break;
  606. case Stmt::OMPTeamsDistributeParallelForDirectiveClass:
  607. K = CXCursor_OMPTeamsDistributeParallelForDirective;
  608. break;
  609. case Stmt::OMPTargetTeamsDirectiveClass:
  610. K = CXCursor_OMPTargetTeamsDirective;
  611. break;
  612. case Stmt::OMPTargetTeamsDistributeDirectiveClass:
  613. K = CXCursor_OMPTargetTeamsDistributeDirective;
  614. break;
  615. case Stmt::OMPTargetTeamsDistributeParallelForDirectiveClass:
  616. K = CXCursor_OMPTargetTeamsDistributeParallelForDirective;
  617. break;
  618. case Stmt::OMPTargetTeamsDistributeParallelForSimdDirectiveClass:
  619. K = CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective;
  620. break;
  621. case Stmt::OMPTargetTeamsDistributeSimdDirectiveClass:
  622. K = CXCursor_OMPTargetTeamsDistributeSimdDirective;
  623. break;
  624. case Stmt::BuiltinBitCastExprClass:
  625. K = CXCursor_BuiltinBitCastExpr;
  626. }
  627. CXCursor C = { K, 0, { Parent, S, TU } };
  628. return C;
  629. }
  630. CXCursor cxcursor::MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super,
  631. SourceLocation Loc,
  632. CXTranslationUnit TU) {
  633. assert(Super && TU && "Invalid arguments!");
  634. void *RawLoc = Loc.getPtrEncoding();
  635. CXCursor C = { CXCursor_ObjCSuperClassRef, 0, { Super, RawLoc, TU } };
  636. return C;
  637. }
  638. std::pair<const ObjCInterfaceDecl *, SourceLocation>
  639. cxcursor::getCursorObjCSuperClassRef(CXCursor C) {
  640. assert(C.kind == CXCursor_ObjCSuperClassRef);
  641. return std::make_pair(static_cast<const ObjCInterfaceDecl *>(C.data[0]),
  642. SourceLocation::getFromPtrEncoding(C.data[1]));
  643. }
  644. CXCursor cxcursor::MakeCursorObjCProtocolRef(const ObjCProtocolDecl *Proto,
  645. SourceLocation Loc,
  646. CXTranslationUnit TU) {
  647. assert(Proto && TU && "Invalid arguments!");
  648. void *RawLoc = Loc.getPtrEncoding();
  649. CXCursor C = { CXCursor_ObjCProtocolRef, 0, { Proto, RawLoc, TU } };
  650. return C;
  651. }
  652. std::pair<const ObjCProtocolDecl *, SourceLocation>
  653. cxcursor::getCursorObjCProtocolRef(CXCursor C) {
  654. assert(C.kind == CXCursor_ObjCProtocolRef);
  655. return std::make_pair(static_cast<const ObjCProtocolDecl *>(C.data[0]),
  656. SourceLocation::getFromPtrEncoding(C.data[1]));
  657. }
  658. CXCursor cxcursor::MakeCursorObjCClassRef(const ObjCInterfaceDecl *Class,
  659. SourceLocation Loc,
  660. CXTranslationUnit TU) {
  661. // 'Class' can be null for invalid code.
  662. if (!Class)
  663. return MakeCXCursorInvalid(CXCursor_InvalidCode);
  664. assert(TU && "Invalid arguments!");
  665. void *RawLoc = Loc.getPtrEncoding();
  666. CXCursor C = { CXCursor_ObjCClassRef, 0, { Class, RawLoc, TU } };
  667. return C;
  668. }
  669. std::pair<const ObjCInterfaceDecl *, SourceLocation>
  670. cxcursor::getCursorObjCClassRef(CXCursor C) {
  671. assert(C.kind == CXCursor_ObjCClassRef);
  672. return std::make_pair(static_cast<const ObjCInterfaceDecl *>(C.data[0]),
  673. SourceLocation::getFromPtrEncoding(C.data[1]));
  674. }
  675. CXCursor cxcursor::MakeCursorTypeRef(const TypeDecl *Type, SourceLocation Loc,
  676. CXTranslationUnit TU) {
  677. assert(Type && TU && "Invalid arguments!");
  678. void *RawLoc = Loc.getPtrEncoding();
  679. CXCursor C = { CXCursor_TypeRef, 0, { Type, RawLoc, TU } };
  680. return C;
  681. }
  682. std::pair<const TypeDecl *, SourceLocation>
  683. cxcursor::getCursorTypeRef(CXCursor C) {
  684. assert(C.kind == CXCursor_TypeRef);
  685. return std::make_pair(static_cast<const TypeDecl *>(C.data[0]),
  686. SourceLocation::getFromPtrEncoding(C.data[1]));
  687. }
  688. CXCursor cxcursor::MakeCursorTemplateRef(const TemplateDecl *Template,
  689. SourceLocation Loc,
  690. CXTranslationUnit TU) {
  691. assert(Template && TU && "Invalid arguments!");
  692. void *RawLoc = Loc.getPtrEncoding();
  693. CXCursor C = { CXCursor_TemplateRef, 0, { Template, RawLoc, TU } };
  694. return C;
  695. }
  696. std::pair<const TemplateDecl *, SourceLocation>
  697. cxcursor::getCursorTemplateRef(CXCursor C) {
  698. assert(C.kind == CXCursor_TemplateRef);
  699. return std::make_pair(static_cast<const TemplateDecl *>(C.data[0]),
  700. SourceLocation::getFromPtrEncoding(C.data[1]));
  701. }
  702. CXCursor cxcursor::MakeCursorNamespaceRef(const NamedDecl *NS,
  703. SourceLocation Loc,
  704. CXTranslationUnit TU) {
  705. assert(NS && (isa<NamespaceDecl>(NS) || isa<NamespaceAliasDecl>(NS)) && TU &&
  706. "Invalid arguments!");
  707. void *RawLoc = Loc.getPtrEncoding();
  708. CXCursor C = { CXCursor_NamespaceRef, 0, { NS, RawLoc, TU } };
  709. return C;
  710. }
  711. std::pair<const NamedDecl *, SourceLocation>
  712. cxcursor::getCursorNamespaceRef(CXCursor C) {
  713. assert(C.kind == CXCursor_NamespaceRef);
  714. return std::make_pair(static_cast<const NamedDecl *>(C.data[0]),
  715. SourceLocation::getFromPtrEncoding(C.data[1]));
  716. }
  717. CXCursor cxcursor::MakeCursorVariableRef(const VarDecl *Var, SourceLocation Loc,
  718. CXTranslationUnit TU) {
  719. assert(Var && TU && "Invalid arguments!");
  720. void *RawLoc = Loc.getPtrEncoding();
  721. CXCursor C = { CXCursor_VariableRef, 0, { Var, RawLoc, TU } };
  722. return C;
  723. }
  724. std::pair<const VarDecl *, SourceLocation>
  725. cxcursor::getCursorVariableRef(CXCursor C) {
  726. assert(C.kind == CXCursor_VariableRef);
  727. return std::make_pair(static_cast<const VarDecl *>(C.data[0]),
  728. SourceLocation::getFromPtrEncoding(C.data[1]));
  729. }
  730. CXCursor cxcursor::MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc,
  731. CXTranslationUnit TU) {
  732. assert(Field && TU && "Invalid arguments!");
  733. void *RawLoc = Loc.getPtrEncoding();
  734. CXCursor C = { CXCursor_MemberRef, 0, { Field, RawLoc, TU } };
  735. return C;
  736. }
  737. std::pair<const FieldDecl *, SourceLocation>
  738. cxcursor::getCursorMemberRef(CXCursor C) {
  739. assert(C.kind == CXCursor_MemberRef);
  740. return std::make_pair(static_cast<const FieldDecl *>(C.data[0]),
  741. SourceLocation::getFromPtrEncoding(C.data[1]));
  742. }
  743. CXCursor cxcursor::MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B,
  744. CXTranslationUnit TU){
  745. CXCursor C = { CXCursor_CXXBaseSpecifier, 0, { B, nullptr, TU } };
  746. return C;
  747. }
  748. const CXXBaseSpecifier *cxcursor::getCursorCXXBaseSpecifier(CXCursor C) {
  749. assert(C.kind == CXCursor_CXXBaseSpecifier);
  750. return static_cast<const CXXBaseSpecifier*>(C.data[0]);
  751. }
  752. CXCursor cxcursor::MakePreprocessingDirectiveCursor(SourceRange Range,
  753. CXTranslationUnit TU) {
  754. CXCursor C = { CXCursor_PreprocessingDirective, 0,
  755. { Range.getBegin().getPtrEncoding(),
  756. Range.getEnd().getPtrEncoding(),
  757. TU }
  758. };
  759. return C;
  760. }
  761. SourceRange cxcursor::getCursorPreprocessingDirective(CXCursor C) {
  762. assert(C.kind == CXCursor_PreprocessingDirective);
  763. SourceRange Range(SourceLocation::getFromPtrEncoding(C.data[0]),
  764. SourceLocation::getFromPtrEncoding(C.data[1]));
  765. ASTUnit *TU = getCursorASTUnit(C);
  766. return TU->mapRangeFromPreamble(Range);
  767. }
  768. CXCursor cxcursor::MakeMacroDefinitionCursor(const MacroDefinitionRecord *MI,
  769. CXTranslationUnit TU) {
  770. CXCursor C = {CXCursor_MacroDefinition, 0, {MI, nullptr, TU}};
  771. return C;
  772. }
  773. const MacroDefinitionRecord *cxcursor::getCursorMacroDefinition(CXCursor C) {
  774. assert(C.kind == CXCursor_MacroDefinition);
  775. return static_cast<const MacroDefinitionRecord *>(C.data[0]);
  776. }
  777. CXCursor cxcursor::MakeMacroExpansionCursor(MacroExpansion *MI,
  778. CXTranslationUnit TU) {
  779. CXCursor C = { CXCursor_MacroExpansion, 0, { MI, nullptr, TU } };
  780. return C;
  781. }
  782. CXCursor cxcursor::MakeMacroExpansionCursor(MacroDefinitionRecord *MI,
  783. SourceLocation Loc,
  784. CXTranslationUnit TU) {
  785. assert(Loc.isValid());
  786. CXCursor C = {CXCursor_MacroExpansion, 0, {MI, Loc.getPtrEncoding(), TU}};
  787. return C;
  788. }
  789. const IdentifierInfo *cxcursor::MacroExpansionCursor::getName() const {
  790. if (isPseudo())
  791. return getAsMacroDefinition()->getName();
  792. return getAsMacroExpansion()->getName();
  793. }
  794. const MacroDefinitionRecord *
  795. cxcursor::MacroExpansionCursor::getDefinition() const {
  796. if (isPseudo())
  797. return getAsMacroDefinition();
  798. return getAsMacroExpansion()->getDefinition();
  799. }
  800. SourceRange cxcursor::MacroExpansionCursor::getSourceRange() const {
  801. if (isPseudo())
  802. return getPseudoLoc();
  803. return getAsMacroExpansion()->getSourceRange();
  804. }
  805. CXCursor cxcursor::MakeInclusionDirectiveCursor(InclusionDirective *ID,
  806. CXTranslationUnit TU) {
  807. CXCursor C = { CXCursor_InclusionDirective, 0, { ID, nullptr, TU } };
  808. return C;
  809. }
  810. const InclusionDirective *cxcursor::getCursorInclusionDirective(CXCursor C) {
  811. assert(C.kind == CXCursor_InclusionDirective);
  812. return static_cast<const InclusionDirective *>(C.data[0]);
  813. }
  814. CXCursor cxcursor::MakeCursorLabelRef(LabelStmt *Label, SourceLocation Loc,
  815. CXTranslationUnit TU) {
  816. assert(Label && TU && "Invalid arguments!");
  817. void *RawLoc = Loc.getPtrEncoding();
  818. CXCursor C = { CXCursor_LabelRef, 0, { Label, RawLoc, TU } };
  819. return C;
  820. }
  821. std::pair<const LabelStmt *, SourceLocation>
  822. cxcursor::getCursorLabelRef(CXCursor C) {
  823. assert(C.kind == CXCursor_LabelRef);
  824. return std::make_pair(static_cast<const LabelStmt *>(C.data[0]),
  825. SourceLocation::getFromPtrEncoding(C.data[1]));
  826. }
  827. CXCursor cxcursor::MakeCursorOverloadedDeclRef(const OverloadExpr *E,
  828. CXTranslationUnit TU) {
  829. assert(E && TU && "Invalid arguments!");
  830. OverloadedDeclRefStorage Storage(E);
  831. void *RawLoc = E->getNameLoc().getPtrEncoding();
  832. CXCursor C = {
  833. CXCursor_OverloadedDeclRef, 0,
  834. { Storage.getOpaqueValue(), RawLoc, TU }
  835. };
  836. return C;
  837. }
  838. CXCursor cxcursor::MakeCursorOverloadedDeclRef(const Decl *D,
  839. SourceLocation Loc,
  840. CXTranslationUnit TU) {
  841. assert(D && TU && "Invalid arguments!");
  842. void *RawLoc = Loc.getPtrEncoding();
  843. OverloadedDeclRefStorage Storage(D);
  844. CXCursor C = {
  845. CXCursor_OverloadedDeclRef, 0,
  846. { Storage.getOpaqueValue(), RawLoc, TU }
  847. };
  848. return C;
  849. }
  850. CXCursor cxcursor::MakeCursorOverloadedDeclRef(TemplateName Name,
  851. SourceLocation Loc,
  852. CXTranslationUnit TU) {
  853. assert(Name.getAsOverloadedTemplate() && TU && "Invalid arguments!");
  854. void *RawLoc = Loc.getPtrEncoding();
  855. OverloadedDeclRefStorage Storage(Name.getAsOverloadedTemplate());
  856. CXCursor C = {
  857. CXCursor_OverloadedDeclRef, 0,
  858. { Storage.getOpaqueValue(), RawLoc, TU }
  859. };
  860. return C;
  861. }
  862. std::pair<cxcursor::OverloadedDeclRefStorage, SourceLocation>
  863. cxcursor::getCursorOverloadedDeclRef(CXCursor C) {
  864. assert(C.kind == CXCursor_OverloadedDeclRef);
  865. return std::make_pair(OverloadedDeclRefStorage::getFromOpaqueValue(
  866. const_cast<void *>(C.data[0])),
  867. SourceLocation::getFromPtrEncoding(C.data[1]));
  868. }
  869. const Decl *cxcursor::getCursorDecl(CXCursor Cursor) {
  870. return static_cast<const Decl *>(Cursor.data[0]);
  871. }
  872. const Expr *cxcursor::getCursorExpr(CXCursor Cursor) {
  873. return dyn_cast_or_null<Expr>(getCursorStmt(Cursor));
  874. }
  875. const Stmt *cxcursor::getCursorStmt(CXCursor Cursor) {
  876. if (Cursor.kind == CXCursor_ObjCSuperClassRef ||
  877. Cursor.kind == CXCursor_ObjCProtocolRef ||
  878. Cursor.kind == CXCursor_ObjCClassRef)
  879. return nullptr;
  880. return static_cast<const Stmt *>(Cursor.data[1]);
  881. }
  882. const Attr *cxcursor::getCursorAttr(CXCursor Cursor) {
  883. return static_cast<const Attr *>(Cursor.data[1]);
  884. }
  885. ASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
  886. return getCursorASTUnit(Cursor)->getASTContext();
  887. }
  888. ASTUnit *cxcursor::getCursorASTUnit(CXCursor Cursor) {
  889. CXTranslationUnit TU = getCursorTU(Cursor);
  890. if (!TU)
  891. return nullptr;
  892. return cxtu::getASTUnit(TU);
  893. }
  894. CXTranslationUnit cxcursor::getCursorTU(CXCursor Cursor) {
  895. return static_cast<CXTranslationUnit>(const_cast<void*>(Cursor.data[2]));
  896. }
  897. void cxcursor::getOverriddenCursors(CXCursor cursor,
  898. SmallVectorImpl<CXCursor> &overridden) {
  899. assert(clang_isDeclaration(cursor.kind));
  900. const NamedDecl *D = dyn_cast_or_null<NamedDecl>(getCursorDecl(cursor));
  901. if (!D)
  902. return;
  903. CXTranslationUnit TU = getCursorTU(cursor);
  904. SmallVector<const NamedDecl *, 8> OverDecls;
  905. D->getASTContext().getOverriddenMethods(D, OverDecls);
  906. for (SmallVectorImpl<const NamedDecl *>::iterator
  907. I = OverDecls.begin(), E = OverDecls.end(); I != E; ++I) {
  908. overridden.push_back(MakeCXCursor(*I, TU));
  909. }
  910. }
  911. std::pair<int, SourceLocation>
  912. cxcursor::getSelectorIdentifierIndexAndLoc(CXCursor cursor) {
  913. if (cursor.kind == CXCursor_ObjCMessageExpr) {
  914. if (cursor.xdata != -1)
  915. return std::make_pair(cursor.xdata,
  916. cast<ObjCMessageExpr>(getCursorExpr(cursor))
  917. ->getSelectorLoc(cursor.xdata));
  918. } else if (cursor.kind == CXCursor_ObjCClassMethodDecl ||
  919. cursor.kind == CXCursor_ObjCInstanceMethodDecl) {
  920. if (cursor.xdata != -1)
  921. return std::make_pair(cursor.xdata,
  922. cast<ObjCMethodDecl>(getCursorDecl(cursor))
  923. ->getSelectorLoc(cursor.xdata));
  924. }
  925. return std::make_pair(-1, SourceLocation());
  926. }
  927. CXCursor cxcursor::getSelectorIdentifierCursor(int SelIdx, CXCursor cursor) {
  928. CXCursor newCursor = cursor;
  929. if (cursor.kind == CXCursor_ObjCMessageExpr) {
  930. if (SelIdx == -1 ||
  931. unsigned(SelIdx) >= cast<ObjCMessageExpr>(getCursorExpr(cursor))
  932. ->getNumSelectorLocs())
  933. newCursor.xdata = -1;
  934. else
  935. newCursor.xdata = SelIdx;
  936. } else if (cursor.kind == CXCursor_ObjCClassMethodDecl ||
  937. cursor.kind == CXCursor_ObjCInstanceMethodDecl) {
  938. if (SelIdx == -1 ||
  939. unsigned(SelIdx) >= cast<ObjCMethodDecl>(getCursorDecl(cursor))
  940. ->getNumSelectorLocs())
  941. newCursor.xdata = -1;
  942. else
  943. newCursor.xdata = SelIdx;
  944. }
  945. return newCursor;
  946. }
  947. CXCursor cxcursor::getTypeRefCursor(CXCursor cursor) {
  948. if (cursor.kind != CXCursor_CallExpr)
  949. return cursor;
  950. if (cursor.xdata == 0)
  951. return cursor;
  952. const Expr *E = getCursorExpr(cursor);
  953. TypeSourceInfo *Type = nullptr;
  954. if (const CXXUnresolvedConstructExpr *
  955. UnCtor = dyn_cast<CXXUnresolvedConstructExpr>(E)) {
  956. Type = UnCtor->getTypeSourceInfo();
  957. } else if (const CXXTemporaryObjectExpr *Tmp =
  958. dyn_cast<CXXTemporaryObjectExpr>(E)){
  959. Type = Tmp->getTypeSourceInfo();
  960. }
  961. if (!Type)
  962. return cursor;
  963. CXTranslationUnit TU = getCursorTU(cursor);
  964. QualType Ty = Type->getType();
  965. TypeLoc TL = Type->getTypeLoc();
  966. SourceLocation Loc = TL.getBeginLoc();
  967. if (const ElaboratedType *ElabT = Ty->getAs<ElaboratedType>()) {
  968. Ty = ElabT->getNamedType();
  969. ElaboratedTypeLoc ElabTL = TL.castAs<ElaboratedTypeLoc>();
  970. Loc = ElabTL.getNamedTypeLoc().getBeginLoc();
  971. }
  972. if (const TypedefType *Typedef = Ty->getAs<TypedefType>())
  973. return MakeCursorTypeRef(Typedef->getDecl(), Loc, TU);
  974. if (const TagType *Tag = Ty->getAs<TagType>())
  975. return MakeCursorTypeRef(Tag->getDecl(), Loc, TU);
  976. if (const TemplateTypeParmType *TemplP = Ty->getAs<TemplateTypeParmType>())
  977. return MakeCursorTypeRef(TemplP->getDecl(), Loc, TU);
  978. return cursor;
  979. }
  980. bool cxcursor::operator==(CXCursor X, CXCursor Y) {
  981. return X.kind == Y.kind && X.data[0] == Y.data[0] && X.data[1] == Y.data[1] &&
  982. X.data[2] == Y.data[2];
  983. }
  984. // FIXME: Remove once we can model DeclGroups and their appropriate ranges
  985. // properly in the ASTs.
  986. bool cxcursor::isFirstInDeclGroup(CXCursor C) {
  987. assert(clang_isDeclaration(C.kind));
  988. return ((uintptr_t) (C.data[1])) != 0;
  989. }
  990. //===----------------------------------------------------------------------===//
  991. // libclang CXCursor APIs
  992. //===----------------------------------------------------------------------===//
  993. int clang_Cursor_isNull(CXCursor cursor) {
  994. return clang_equalCursors(cursor, clang_getNullCursor());
  995. }
  996. CXTranslationUnit clang_Cursor_getTranslationUnit(CXCursor cursor) {
  997. return getCursorTU(cursor);
  998. }
  999. int clang_Cursor_getNumArguments(CXCursor C) {
  1000. if (clang_isDeclaration(C.kind)) {
  1001. const Decl *D = cxcursor::getCursorDecl(C);
  1002. if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
  1003. return MD->param_size();
  1004. if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D))
  1005. return FD->param_size();
  1006. }
  1007. if (clang_isExpression(C.kind)) {
  1008. const Expr *E = cxcursor::getCursorExpr(C);
  1009. if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
  1010. return CE->getNumArgs();
  1011. }
  1012. if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) {
  1013. return CE->getNumArgs();
  1014. }
  1015. }
  1016. return -1;
  1017. }
  1018. CXCursor clang_Cursor_getArgument(CXCursor C, unsigned i) {
  1019. if (clang_isDeclaration(C.kind)) {
  1020. const Decl *D = cxcursor::getCursorDecl(C);
  1021. if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D)) {
  1022. if (i < MD->param_size())
  1023. return cxcursor::MakeCXCursor(MD->parameters()[i],
  1024. cxcursor::getCursorTU(C));
  1025. } else if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) {
  1026. if (i < FD->param_size())
  1027. return cxcursor::MakeCXCursor(FD->parameters()[i],
  1028. cxcursor::getCursorTU(C));
  1029. }
  1030. }
  1031. if (clang_isExpression(C.kind)) {
  1032. const Expr *E = cxcursor::getCursorExpr(C);
  1033. if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
  1034. if (i < CE->getNumArgs()) {
  1035. return cxcursor::MakeCXCursor(CE->getArg(i),
  1036. getCursorDecl(C),
  1037. cxcursor::getCursorTU(C));
  1038. }
  1039. }
  1040. if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) {
  1041. if (i < CE->getNumArgs()) {
  1042. return cxcursor::MakeCXCursor(CE->getArg(i),
  1043. getCursorDecl(C),
  1044. cxcursor::getCursorTU(C));
  1045. }
  1046. }
  1047. }
  1048. return clang_getNullCursor();
  1049. }
  1050. int clang_Cursor_getNumTemplateArguments(CXCursor C) {
  1051. if (clang_getCursorKind(C) != CXCursor_FunctionDecl) {
  1052. return -1;
  1053. }
  1054. const FunctionDecl *FD = llvm::dyn_cast_or_null<clang::FunctionDecl>(
  1055. getCursorDecl(C));
  1056. if (!FD) {
  1057. return -1;
  1058. }
  1059. const FunctionTemplateSpecializationInfo* SpecInfo =
  1060. FD->getTemplateSpecializationInfo();
  1061. if (!SpecInfo) {
  1062. return -1;
  1063. }
  1064. return SpecInfo->TemplateArguments->size();
  1065. }
  1066. enum CXGetTemplateArgumentStatus {
  1067. /** The operation completed successfully */
  1068. CXGetTemplateArgumentStatus_Success = 0,
  1069. /** The specified cursor did not represent a FunctionDecl. */
  1070. CXGetTemplateArgumentStatus_CursorNotFunctionDecl = -1,
  1071. /** The specified cursor was not castable to a FunctionDecl. */
  1072. CXGetTemplateArgumentStatus_BadFunctionDeclCast = -2,
  1073. /** A NULL FunctionTemplateSpecializationInfo was retrieved. */
  1074. CXGetTemplateArgumentStatus_NullTemplSpecInfo = -3,
  1075. /** An invalid (OOB) argument index was specified */
  1076. CXGetTemplateArgumentStatus_InvalidIndex = -4
  1077. };
  1078. static int clang_Cursor_getTemplateArgument(
  1079. CXCursor C, unsigned I, TemplateArgument *TA) {
  1080. if (clang_getCursorKind(C) != CXCursor_FunctionDecl) {
  1081. return CXGetTemplateArgumentStatus_CursorNotFunctionDecl;
  1082. }
  1083. const FunctionDecl *FD = llvm::dyn_cast_or_null<clang::FunctionDecl>(
  1084. getCursorDecl(C));
  1085. if (!FD) {
  1086. return CXGetTemplateArgumentStatus_BadFunctionDeclCast;
  1087. }
  1088. const FunctionTemplateSpecializationInfo* SpecInfo =
  1089. FD->getTemplateSpecializationInfo();
  1090. if (!SpecInfo) {
  1091. return CXGetTemplateArgumentStatus_NullTemplSpecInfo;
  1092. }
  1093. if (I >= SpecInfo->TemplateArguments->size()) {
  1094. return CXGetTemplateArgumentStatus_InvalidIndex;
  1095. }
  1096. *TA = SpecInfo->TemplateArguments->get(I);
  1097. return 0;
  1098. }
  1099. enum CXTemplateArgumentKind clang_Cursor_getTemplateArgumentKind(CXCursor C,
  1100. unsigned I) {
  1101. TemplateArgument TA;
  1102. if (clang_Cursor_getTemplateArgument(C, I, &TA)) {
  1103. return CXTemplateArgumentKind_Invalid;
  1104. }
  1105. switch (TA.getKind()) {
  1106. case TemplateArgument::Null: return CXTemplateArgumentKind_Null;
  1107. case TemplateArgument::Type: return CXTemplateArgumentKind_Type;
  1108. case TemplateArgument::Declaration:
  1109. return CXTemplateArgumentKind_Declaration;
  1110. case TemplateArgument::NullPtr: return CXTemplateArgumentKind_NullPtr;
  1111. case TemplateArgument::Integral: return CXTemplateArgumentKind_Integral;
  1112. case TemplateArgument::Template: return CXTemplateArgumentKind_Template;
  1113. case TemplateArgument::TemplateExpansion:
  1114. return CXTemplateArgumentKind_TemplateExpansion;
  1115. case TemplateArgument::Expression: return CXTemplateArgumentKind_Expression;
  1116. case TemplateArgument::Pack: return CXTemplateArgumentKind_Pack;
  1117. }
  1118. return CXTemplateArgumentKind_Invalid;
  1119. }
  1120. CXType clang_Cursor_getTemplateArgumentType(CXCursor C, unsigned I) {
  1121. TemplateArgument TA;
  1122. if (clang_Cursor_getTemplateArgument(C, I, &TA) !=
  1123. CXGetTemplateArgumentStatus_Success) {
  1124. return cxtype::MakeCXType(QualType(), getCursorTU(C));
  1125. }
  1126. if (TA.getKind() != TemplateArgument::Type) {
  1127. return cxtype::MakeCXType(QualType(), getCursorTU(C));
  1128. }
  1129. return cxtype::MakeCXType(TA.getAsType(), getCursorTU(C));
  1130. }
  1131. long long clang_Cursor_getTemplateArgumentValue(CXCursor C, unsigned I) {
  1132. TemplateArgument TA;
  1133. if (clang_Cursor_getTemplateArgument(C, I, &TA) !=
  1134. CXGetTemplateArgumentStatus_Success) {
  1135. assert(0 && "Unable to retrieve TemplateArgument");
  1136. return 0;
  1137. }
  1138. if (TA.getKind() != TemplateArgument::Integral) {
  1139. assert(0 && "Passed template argument is not Integral");
  1140. return 0;
  1141. }
  1142. return TA.getAsIntegral().getSExtValue();
  1143. }
  1144. unsigned long long clang_Cursor_getTemplateArgumentUnsignedValue(CXCursor C,
  1145. unsigned I) {
  1146. TemplateArgument TA;
  1147. if (clang_Cursor_getTemplateArgument(C, I, &TA) !=
  1148. CXGetTemplateArgumentStatus_Success) {
  1149. assert(0 && "Unable to retrieve TemplateArgument");
  1150. return 0;
  1151. }
  1152. if (TA.getKind() != TemplateArgument::Integral) {
  1153. assert(0 && "Passed template argument is not Integral");
  1154. return 0;
  1155. }
  1156. return TA.getAsIntegral().getZExtValue();
  1157. }
  1158. //===----------------------------------------------------------------------===//
  1159. // CXCursorSet.
  1160. //===----------------------------------------------------------------------===//
  1161. typedef llvm::DenseMap<CXCursor, unsigned> CXCursorSet_Impl;
  1162. static inline CXCursorSet packCXCursorSet(CXCursorSet_Impl *setImpl) {
  1163. return (CXCursorSet) setImpl;
  1164. }
  1165. static inline CXCursorSet_Impl *unpackCXCursorSet(CXCursorSet set) {
  1166. return (CXCursorSet_Impl*) set;
  1167. }
  1168. namespace llvm {
  1169. template<> struct DenseMapInfo<CXCursor> {
  1170. public:
  1171. static inline CXCursor getEmptyKey() {
  1172. return MakeCXCursorInvalid(CXCursor_InvalidFile);
  1173. }
  1174. static inline CXCursor getTombstoneKey() {
  1175. return MakeCXCursorInvalid(CXCursor_NoDeclFound);
  1176. }
  1177. static inline unsigned getHashValue(const CXCursor &cursor) {
  1178. return llvm::DenseMapInfo<std::pair<const void *, const void *> >
  1179. ::getHashValue(std::make_pair(cursor.data[0], cursor.data[1]));
  1180. }
  1181. static inline bool isEqual(const CXCursor &x, const CXCursor &y) {
  1182. return x.kind == y.kind &&
  1183. x.data[0] == y.data[0] &&
  1184. x.data[1] == y.data[1];
  1185. }
  1186. };
  1187. }
  1188. CXCursorSet clang_createCXCursorSet() {
  1189. return packCXCursorSet(new CXCursorSet_Impl());
  1190. }
  1191. void clang_disposeCXCursorSet(CXCursorSet set) {
  1192. delete unpackCXCursorSet(set);
  1193. }
  1194. unsigned clang_CXCursorSet_contains(CXCursorSet set, CXCursor cursor) {
  1195. CXCursorSet_Impl *setImpl = unpackCXCursorSet(set);
  1196. if (!setImpl)
  1197. return 0;
  1198. return setImpl->find(cursor) != setImpl->end();
  1199. }
  1200. unsigned clang_CXCursorSet_insert(CXCursorSet set, CXCursor cursor) {
  1201. // Do not insert invalid cursors into the set.
  1202. if (cursor.kind >= CXCursor_FirstInvalid &&
  1203. cursor.kind <= CXCursor_LastInvalid)
  1204. return 1;
  1205. CXCursorSet_Impl *setImpl = unpackCXCursorSet(set);
  1206. if (!setImpl)
  1207. return 1;
  1208. unsigned &entry = (*setImpl)[cursor];
  1209. unsigned flag = entry == 0 ? 1 : 0;
  1210. entry = 1;
  1211. return flag;
  1212. }
  1213. CXCompletionString clang_getCursorCompletionString(CXCursor cursor) {
  1214. enum CXCursorKind kind = clang_getCursorKind(cursor);
  1215. if (clang_isDeclaration(kind)) {
  1216. const Decl *decl = getCursorDecl(cursor);
  1217. if (const NamedDecl *namedDecl = dyn_cast_or_null<NamedDecl>(decl)) {
  1218. ASTUnit *unit = getCursorASTUnit(cursor);
  1219. CodeCompletionResult Result(namedDecl, CCP_Declaration);
  1220. CodeCompletionString *String
  1221. = Result.CreateCodeCompletionString(unit->getASTContext(),
  1222. unit->getPreprocessor(),
  1223. CodeCompletionContext::CCC_Other,
  1224. unit->getCodeCompletionTUInfo().getAllocator(),
  1225. unit->getCodeCompletionTUInfo(),
  1226. true);
  1227. return String;
  1228. }
  1229. } else if (kind == CXCursor_MacroDefinition) {
  1230. const MacroDefinitionRecord *definition = getCursorMacroDefinition(cursor);
  1231. const IdentifierInfo *Macro = definition->getName();
  1232. ASTUnit *unit = getCursorASTUnit(cursor);
  1233. CodeCompletionResult Result(
  1234. Macro,
  1235. unit->getPreprocessor().getMacroDefinition(Macro).getMacroInfo());
  1236. CodeCompletionString *String = Result.CreateCodeCompletionString(
  1237. unit->getASTContext(), unit->getPreprocessor(),
  1238. CodeCompletionContext::CCC_Other,
  1239. unit->getCodeCompletionTUInfo().getAllocator(),
  1240. unit->getCodeCompletionTUInfo(), false);
  1241. return String;
  1242. }
  1243. return nullptr;
  1244. }
  1245. namespace {
  1246. struct OverridenCursorsPool {
  1247. typedef SmallVector<CXCursor, 2> CursorVec;
  1248. std::vector<CursorVec*> AllCursors;
  1249. std::vector<CursorVec*> AvailableCursors;
  1250. ~OverridenCursorsPool() {
  1251. for (std::vector<CursorVec*>::iterator I = AllCursors.begin(),
  1252. E = AllCursors.end(); I != E; ++I) {
  1253. delete *I;
  1254. }
  1255. }
  1256. };
  1257. }
  1258. void *cxcursor::createOverridenCXCursorsPool() {
  1259. return new OverridenCursorsPool();
  1260. }
  1261. void cxcursor::disposeOverridenCXCursorsPool(void *pool) {
  1262. delete static_cast<OverridenCursorsPool*>(pool);
  1263. }
  1264. void clang_getOverriddenCursors(CXCursor cursor,
  1265. CXCursor **overridden,
  1266. unsigned *num_overridden) {
  1267. if (overridden)
  1268. *overridden = nullptr;
  1269. if (num_overridden)
  1270. *num_overridden = 0;
  1271. CXTranslationUnit TU = cxcursor::getCursorTU(cursor);
  1272. if (!overridden || !num_overridden || !TU)
  1273. return;
  1274. if (!clang_isDeclaration(cursor.kind))
  1275. return;
  1276. OverridenCursorsPool &pool =
  1277. *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool);
  1278. OverridenCursorsPool::CursorVec *Vec = nullptr;
  1279. if (!pool.AvailableCursors.empty()) {
  1280. Vec = pool.AvailableCursors.back();
  1281. pool.AvailableCursors.pop_back();
  1282. }
  1283. else {
  1284. Vec = new OverridenCursorsPool::CursorVec();
  1285. pool.AllCursors.push_back(Vec);
  1286. }
  1287. // Clear out the vector, but don't free the memory contents. This
  1288. // reduces malloc() traffic.
  1289. Vec->clear();
  1290. // Use the first entry to contain a back reference to the vector.
  1291. // This is a complete hack.
  1292. CXCursor backRefCursor = MakeCXCursorInvalid(CXCursor_InvalidFile, TU);
  1293. backRefCursor.data[0] = Vec;
  1294. assert(cxcursor::getCursorTU(backRefCursor) == TU);
  1295. Vec->push_back(backRefCursor);
  1296. // Get the overridden cursors.
  1297. cxcursor::getOverriddenCursors(cursor, *Vec);
  1298. // Did we get any overridden cursors? If not, return Vec to the pool
  1299. // of available cursor vectors.
  1300. if (Vec->size() == 1) {
  1301. pool.AvailableCursors.push_back(Vec);
  1302. return;
  1303. }
  1304. // Now tell the caller about the overridden cursors.
  1305. assert(Vec->size() > 1);
  1306. *overridden = &((*Vec)[1]);
  1307. *num_overridden = Vec->size() - 1;
  1308. }
  1309. void clang_disposeOverriddenCursors(CXCursor *overridden) {
  1310. if (!overridden)
  1311. return;
  1312. // Use pointer arithmetic to get back the first faux entry
  1313. // which has a back-reference to the TU and the vector.
  1314. --overridden;
  1315. OverridenCursorsPool::CursorVec *Vec =
  1316. static_cast<OverridenCursorsPool::CursorVec *>(
  1317. const_cast<void *>(overridden->data[0]));
  1318. CXTranslationUnit TU = getCursorTU(*overridden);
  1319. assert(Vec && TU);
  1320. OverridenCursorsPool &pool =
  1321. *static_cast<OverridenCursorsPool*>(TU->OverridenCursorsPool);
  1322. pool.AvailableCursors.push_back(Vec);
  1323. }
  1324. int clang_Cursor_isDynamicCall(CXCursor C) {
  1325. const Expr *E = nullptr;
  1326. if (clang_isExpression(C.kind))
  1327. E = getCursorExpr(C);
  1328. if (!E)
  1329. return 0;
  1330. if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E)) {
  1331. if (MsgE->getReceiverKind() != ObjCMessageExpr::Instance)
  1332. return false;
  1333. if (auto *RecE = dyn_cast<ObjCMessageExpr>(
  1334. MsgE->getInstanceReceiver()->IgnoreParenCasts())) {
  1335. if (RecE->getMethodFamily() == OMF_alloc)
  1336. return false;
  1337. }
  1338. return true;
  1339. }
  1340. if (auto *PropRefE = dyn_cast<ObjCPropertyRefExpr>(E)) {
  1341. return !PropRefE->isSuperReceiver();
  1342. }
  1343. const MemberExpr *ME = nullptr;
  1344. if (isa<MemberExpr>(E))
  1345. ME = cast<MemberExpr>(E);
  1346. else if (const CallExpr *CE = dyn_cast<CallExpr>(E))
  1347. ME = dyn_cast_or_null<MemberExpr>(CE->getCallee());
  1348. if (ME) {
  1349. if (const CXXMethodDecl *
  1350. MD = dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl()))
  1351. return MD->isVirtual() &&
  1352. ME->performsVirtualDispatch(
  1353. cxcursor::getCursorContext(C).getLangOpts());
  1354. }
  1355. return 0;
  1356. }
  1357. CXType clang_Cursor_getReceiverType(CXCursor C) {
  1358. CXTranslationUnit TU = cxcursor::getCursorTU(C);
  1359. const Expr *E = nullptr;
  1360. if (clang_isExpression(C.kind))
  1361. E = getCursorExpr(C);
  1362. if (const ObjCMessageExpr *MsgE = dyn_cast_or_null<ObjCMessageExpr>(E))
  1363. return cxtype::MakeCXType(MsgE->getReceiverType(), TU);
  1364. if (auto *PropRefE = dyn_cast<ObjCPropertyRefExpr>(E)) {
  1365. return cxtype::MakeCXType(
  1366. PropRefE->getReceiverType(cxcursor::getCursorContext(C)), TU);
  1367. }
  1368. const MemberExpr *ME = nullptr;
  1369. if (isa<MemberExpr>(E))
  1370. ME = cast<MemberExpr>(E);
  1371. else if (const CallExpr *CE = dyn_cast<CallExpr>(E))
  1372. ME = dyn_cast_or_null<MemberExpr>(CE->getCallee());
  1373. if (ME) {
  1374. if (dyn_cast_or_null<CXXMethodDecl>(ME->getMemberDecl())) {
  1375. auto receiverTy = ME->getBase()->IgnoreImpCasts()->getType();
  1376. return cxtype::MakeCXType(receiverTy, TU);
  1377. }
  1378. }
  1379. return cxtype::MakeCXType(QualType(), TU);
  1380. }