CXCursor.cpp 51 KB

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