1 //===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===// 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 implements the main API hooks in the Clang-C Source Indexing 10 // library. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CIndexDiagnostic.h" 15 #include "CIndexer.h" 16 #include "CLog.h" 17 #include "CXCursor.h" 18 #include "CXSourceLocation.h" 19 #include "CXString.h" 20 #include "CXTranslationUnit.h" 21 #include "CXType.h" 22 #include "CursorVisitor.h" 23 #include "clang-c/FatalErrorHandler.h" 24 #include "clang/AST/Attr.h" 25 #include "clang/AST/DeclObjCCommon.h" 26 #include "clang/AST/Mangle.h" 27 #include "clang/AST/OpenMPClause.h" 28 #include "clang/AST/StmtVisitor.h" 29 #include "clang/Basic/Diagnostic.h" 30 #include "clang/Basic/DiagnosticCategories.h" 31 #include "clang/Basic/DiagnosticIDs.h" 32 #include "clang/Basic/Stack.h" 33 #include "clang/Basic/TargetInfo.h" 34 #include "clang/Basic/Version.h" 35 #include "clang/Frontend/ASTUnit.h" 36 #include "clang/Frontend/CompilerInstance.h" 37 #include "clang/Index/CommentToXML.h" 38 #include "clang/Lex/HeaderSearch.h" 39 #include "clang/Lex/Lexer.h" 40 #include "clang/Lex/PreprocessingRecord.h" 41 #include "clang/Lex/Preprocessor.h" 42 #include "llvm/ADT/Optional.h" 43 #include "llvm/ADT/STLExtras.h" 44 #include "llvm/ADT/StringSwitch.h" 45 #include "llvm/Config/llvm-config.h" 46 #include "llvm/Support/Compiler.h" 47 #include "llvm/Support/CrashRecoveryContext.h" 48 #include "llvm/Support/Format.h" 49 #include "llvm/Support/ManagedStatic.h" 50 #include "llvm/Support/MemoryBuffer.h" 51 #include "llvm/Support/Program.h" 52 #include "llvm/Support/SaveAndRestore.h" 53 #include "llvm/Support/Signals.h" 54 #include "llvm/Support/TargetSelect.h" 55 #include "llvm/Support/Threading.h" 56 #include "llvm/Support/Timer.h" 57 #include "llvm/Support/raw_ostream.h" 58 #include "llvm/Support/thread.h" 59 #include <mutex> 60 61 #if LLVM_ENABLE_THREADS != 0 && defined(__APPLE__) 62 #define USE_DARWIN_THREADS 63 #endif 64 65 #ifdef USE_DARWIN_THREADS 66 #include <pthread.h> 67 #endif 68 69 using namespace clang; 70 using namespace clang::cxcursor; 71 using namespace clang::cxtu; 72 using namespace clang::cxindex; 73 74 CXTranslationUnit cxtu::MakeCXTranslationUnit(CIndexer *CIdx, 75 std::unique_ptr<ASTUnit> AU) { 76 if (!AU) 77 return nullptr; 78 assert(CIdx); 79 CXTranslationUnit D = new CXTranslationUnitImpl(); 80 D->CIdx = CIdx; 81 D->TheASTUnit = AU.release(); 82 D->StringPool = new cxstring::CXStringPool(); 83 D->Diagnostics = nullptr; 84 D->OverridenCursorsPool = createOverridenCXCursorsPool(); 85 D->CommentToXML = nullptr; 86 D->ParsingOptions = 0; 87 D->Arguments = {}; 88 return D; 89 } 90 91 bool cxtu::isASTReadError(ASTUnit *AU) { 92 for (ASTUnit::stored_diag_iterator D = AU->stored_diag_begin(), 93 DEnd = AU->stored_diag_end(); 94 D != DEnd; ++D) { 95 if (D->getLevel() >= DiagnosticsEngine::Error && 96 DiagnosticIDs::getCategoryNumberForDiag(D->getID()) == 97 diag::DiagCat_AST_Deserialization_Issue) 98 return true; 99 } 100 return false; 101 } 102 103 cxtu::CXTUOwner::~CXTUOwner() { 104 if (TU) 105 clang_disposeTranslationUnit(TU); 106 } 107 108 /// Compare two source ranges to determine their relative position in 109 /// the translation unit. 110 static RangeComparisonResult RangeCompare(SourceManager &SM, SourceRange R1, 111 SourceRange R2) { 112 assert(R1.isValid() && "First range is invalid?"); 113 assert(R2.isValid() && "Second range is invalid?"); 114 if (R1.getEnd() != R2.getBegin() && 115 SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin())) 116 return RangeBefore; 117 if (R2.getEnd() != R1.getBegin() && 118 SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin())) 119 return RangeAfter; 120 return RangeOverlap; 121 } 122 123 /// Determine if a source location falls within, before, or after a 124 /// a given source range. 125 static RangeComparisonResult LocationCompare(SourceManager &SM, 126 SourceLocation L, SourceRange R) { 127 assert(R.isValid() && "First range is invalid?"); 128 assert(L.isValid() && "Second range is invalid?"); 129 if (L == R.getBegin() || L == R.getEnd()) 130 return RangeOverlap; 131 if (SM.isBeforeInTranslationUnit(L, R.getBegin())) 132 return RangeBefore; 133 if (SM.isBeforeInTranslationUnit(R.getEnd(), L)) 134 return RangeAfter; 135 return RangeOverlap; 136 } 137 138 /// Translate a Clang source range into a CIndex source range. 139 /// 140 /// Clang internally represents ranges where the end location points to the 141 /// start of the token at the end. However, for external clients it is more 142 /// useful to have a CXSourceRange be a proper half-open interval. This routine 143 /// does the appropriate translation. 144 CXSourceRange cxloc::translateSourceRange(const SourceManager &SM, 145 const LangOptions &LangOpts, 146 const CharSourceRange &R) { 147 // We want the last character in this location, so we will adjust the 148 // location accordingly. 149 SourceLocation EndLoc = R.getEnd(); 150 bool IsTokenRange = R.isTokenRange(); 151 if (EndLoc.isValid() && EndLoc.isMacroID() && 152 !SM.isMacroArgExpansion(EndLoc)) { 153 CharSourceRange Expansion = SM.getExpansionRange(EndLoc); 154 EndLoc = Expansion.getEnd(); 155 IsTokenRange = Expansion.isTokenRange(); 156 } 157 if (IsTokenRange && EndLoc.isValid()) { 158 unsigned Length = 159 Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc), SM, LangOpts); 160 EndLoc = EndLoc.getLocWithOffset(Length); 161 } 162 163 CXSourceRange Result = { 164 {&SM, &LangOpts}, R.getBegin().getRawEncoding(), EndLoc.getRawEncoding()}; 165 return Result; 166 } 167 168 CharSourceRange cxloc::translateCXRangeToCharRange(CXSourceRange R) { 169 return CharSourceRange::getCharRange( 170 SourceLocation::getFromRawEncoding(R.begin_int_data), 171 SourceLocation::getFromRawEncoding(R.end_int_data)); 172 } 173 174 //===----------------------------------------------------------------------===// 175 // Cursor visitor. 176 //===----------------------------------------------------------------------===// 177 178 static SourceRange getRawCursorExtent(CXCursor C); 179 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr); 180 181 RangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) { 182 return RangeCompare(AU->getSourceManager(), R, RegionOfInterest); 183 } 184 185 /// Visit the given cursor and, if requested by the visitor, 186 /// its children. 187 /// 188 /// \param Cursor the cursor to visit. 189 /// 190 /// \param CheckedRegionOfInterest if true, then the caller already checked 191 /// that this cursor is within the region of interest. 192 /// 193 /// \returns true if the visitation should be aborted, false if it 194 /// should continue. 195 bool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) { 196 if (clang_isInvalid(Cursor.kind)) 197 return false; 198 199 if (clang_isDeclaration(Cursor.kind)) { 200 const Decl *D = getCursorDecl(Cursor); 201 if (!D) { 202 assert(0 && "Invalid declaration cursor"); 203 return true; // abort. 204 } 205 206 // Ignore implicit declarations, unless it's an objc method because 207 // currently we should report implicit methods for properties when indexing. 208 if (D->isImplicit() && !isa<ObjCMethodDecl>(D)) 209 return false; 210 } 211 212 // If we have a range of interest, and this cursor doesn't intersect with it, 213 // we're done. 214 if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) { 215 SourceRange Range = getRawCursorExtent(Cursor); 216 if (Range.isInvalid() || CompareRegionOfInterest(Range)) 217 return false; 218 } 219 220 switch (Visitor(Cursor, Parent, ClientData)) { 221 case CXChildVisit_Break: 222 return true; 223 224 case CXChildVisit_Continue: 225 return false; 226 227 case CXChildVisit_Recurse: { 228 bool ret = VisitChildren(Cursor); 229 if (PostChildrenVisitor) 230 if (PostChildrenVisitor(Cursor, ClientData)) 231 return true; 232 return ret; 233 } 234 } 235 236 llvm_unreachable("Invalid CXChildVisitResult!"); 237 } 238 239 static bool visitPreprocessedEntitiesInRange(SourceRange R, 240 PreprocessingRecord &PPRec, 241 CursorVisitor &Visitor) { 242 SourceManager &SM = Visitor.getASTUnit()->getSourceManager(); 243 FileID FID; 244 245 if (!Visitor.shouldVisitIncludedEntities()) { 246 // If the begin/end of the range lie in the same FileID, do the optimization 247 // where we skip preprocessed entities that do not come from the same 248 // FileID. 249 FID = SM.getFileID(SM.getFileLoc(R.getBegin())); 250 if (FID != SM.getFileID(SM.getFileLoc(R.getEnd()))) 251 FID = FileID(); 252 } 253 254 const auto &Entities = PPRec.getPreprocessedEntitiesInRange(R); 255 return Visitor.visitPreprocessedEntities(Entities.begin(), Entities.end(), 256 PPRec, FID); 257 } 258 259 bool CursorVisitor::visitFileRegion() { 260 if (RegionOfInterest.isInvalid()) 261 return false; 262 263 ASTUnit *Unit = cxtu::getASTUnit(TU); 264 SourceManager &SM = Unit->getSourceManager(); 265 266 std::pair<FileID, unsigned> Begin = SM.getDecomposedLoc( 267 SM.getFileLoc(RegionOfInterest.getBegin())), 268 End = SM.getDecomposedLoc( 269 SM.getFileLoc(RegionOfInterest.getEnd())); 270 271 if (End.first != Begin.first) { 272 // If the end does not reside in the same file, try to recover by 273 // picking the end of the file of begin location. 274 End.first = Begin.first; 275 End.second = SM.getFileIDSize(Begin.first); 276 } 277 278 assert(Begin.first == End.first); 279 if (Begin.second > End.second) 280 return false; 281 282 FileID File = Begin.first; 283 unsigned Offset = Begin.second; 284 unsigned Length = End.second - Begin.second; 285 286 if (!VisitDeclsOnly && !VisitPreprocessorLast) 287 if (visitPreprocessedEntitiesInRegion()) 288 return true; // visitation break. 289 290 if (visitDeclsFromFileRegion(File, Offset, Length)) 291 return true; // visitation break. 292 293 if (!VisitDeclsOnly && VisitPreprocessorLast) 294 return visitPreprocessedEntitiesInRegion(); 295 296 return false; 297 } 298 299 static bool isInLexicalContext(Decl *D, DeclContext *DC) { 300 if (!DC) 301 return false; 302 303 for (DeclContext *DeclDC = D->getLexicalDeclContext(); DeclDC; 304 DeclDC = DeclDC->getLexicalParent()) { 305 if (DeclDC == DC) 306 return true; 307 } 308 return false; 309 } 310 311 bool CursorVisitor::visitDeclsFromFileRegion(FileID File, unsigned Offset, 312 unsigned Length) { 313 ASTUnit *Unit = cxtu::getASTUnit(TU); 314 SourceManager &SM = Unit->getSourceManager(); 315 SourceRange Range = RegionOfInterest; 316 317 SmallVector<Decl *, 16> Decls; 318 Unit->findFileRegionDecls(File, Offset, Length, Decls); 319 320 // If we didn't find any file level decls for the file, try looking at the 321 // file that it was included from. 322 while (Decls.empty() || Decls.front()->isTopLevelDeclInObjCContainer()) { 323 bool Invalid = false; 324 const SrcMgr::SLocEntry &SLEntry = SM.getSLocEntry(File, &Invalid); 325 if (Invalid) 326 return false; 327 328 SourceLocation Outer; 329 if (SLEntry.isFile()) 330 Outer = SLEntry.getFile().getIncludeLoc(); 331 else 332 Outer = SLEntry.getExpansion().getExpansionLocStart(); 333 if (Outer.isInvalid()) 334 return false; 335 336 std::tie(File, Offset) = SM.getDecomposedExpansionLoc(Outer); 337 Length = 0; 338 Unit->findFileRegionDecls(File, Offset, Length, Decls); 339 } 340 341 assert(!Decls.empty()); 342 343 bool VisitedAtLeastOnce = false; 344 DeclContext *CurDC = nullptr; 345 SmallVectorImpl<Decl *>::iterator DIt = Decls.begin(); 346 for (SmallVectorImpl<Decl *>::iterator DE = Decls.end(); DIt != DE; ++DIt) { 347 Decl *D = *DIt; 348 if (D->getSourceRange().isInvalid()) 349 continue; 350 351 if (isInLexicalContext(D, CurDC)) 352 continue; 353 354 CurDC = dyn_cast<DeclContext>(D); 355 356 if (TagDecl *TD = dyn_cast<TagDecl>(D)) 357 if (!TD->isFreeStanding()) 358 continue; 359 360 RangeComparisonResult CompRes = 361 RangeCompare(SM, D->getSourceRange(), Range); 362 if (CompRes == RangeBefore) 363 continue; 364 if (CompRes == RangeAfter) 365 break; 366 367 assert(CompRes == RangeOverlap); 368 VisitedAtLeastOnce = true; 369 370 if (isa<ObjCContainerDecl>(D)) { 371 FileDI_current = &DIt; 372 FileDE_current = DE; 373 } else { 374 FileDI_current = nullptr; 375 } 376 377 if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true)) 378 return true; // visitation break. 379 } 380 381 if (VisitedAtLeastOnce) 382 return false; 383 384 // No Decls overlapped with the range. Move up the lexical context until there 385 // is a context that contains the range or we reach the translation unit 386 // level. 387 DeclContext *DC = DIt == Decls.begin() 388 ? (*DIt)->getLexicalDeclContext() 389 : (*(DIt - 1))->getLexicalDeclContext(); 390 391 while (DC && !DC->isTranslationUnit()) { 392 Decl *D = cast<Decl>(DC); 393 SourceRange CurDeclRange = D->getSourceRange(); 394 if (CurDeclRange.isInvalid()) 395 break; 396 397 if (RangeCompare(SM, CurDeclRange, Range) == RangeOverlap) { 398 if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true)) 399 return true; // visitation break. 400 } 401 402 DC = D->getLexicalDeclContext(); 403 } 404 405 return false; 406 } 407 408 bool CursorVisitor::visitPreprocessedEntitiesInRegion() { 409 if (!AU->getPreprocessor().getPreprocessingRecord()) 410 return false; 411 412 PreprocessingRecord &PPRec = *AU->getPreprocessor().getPreprocessingRecord(); 413 SourceManager &SM = AU->getSourceManager(); 414 415 if (RegionOfInterest.isValid()) { 416 SourceRange MappedRange = AU->mapRangeToPreamble(RegionOfInterest); 417 SourceLocation B = MappedRange.getBegin(); 418 SourceLocation E = MappedRange.getEnd(); 419 420 if (AU->isInPreambleFileID(B)) { 421 if (SM.isLoadedSourceLocation(E)) 422 return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec, 423 *this); 424 425 // Beginning of range lies in the preamble but it also extends beyond 426 // it into the main file. Split the range into 2 parts, one covering 427 // the preamble and another covering the main file. This allows subsequent 428 // calls to visitPreprocessedEntitiesInRange to accept a source range that 429 // lies in the same FileID, allowing it to skip preprocessed entities that 430 // do not come from the same FileID. 431 bool breaked = visitPreprocessedEntitiesInRange( 432 SourceRange(B, AU->getEndOfPreambleFileID()), PPRec, *this); 433 if (breaked) 434 return true; 435 return visitPreprocessedEntitiesInRange( 436 SourceRange(AU->getStartOfMainFileID(), E), PPRec, *this); 437 } 438 439 return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec, *this); 440 } 441 442 bool OnlyLocalDecls = !AU->isMainFileAST() && AU->getOnlyLocalDecls(); 443 444 if (OnlyLocalDecls) 445 return visitPreprocessedEntities(PPRec.local_begin(), PPRec.local_end(), 446 PPRec); 447 448 return visitPreprocessedEntities(PPRec.begin(), PPRec.end(), PPRec); 449 } 450 451 template <typename InputIterator> 452 bool CursorVisitor::visitPreprocessedEntities(InputIterator First, 453 InputIterator Last, 454 PreprocessingRecord &PPRec, 455 FileID FID) { 456 for (; First != Last; ++First) { 457 if (!FID.isInvalid() && !PPRec.isEntityInFileID(First, FID)) 458 continue; 459 460 PreprocessedEntity *PPE = *First; 461 if (!PPE) 462 continue; 463 464 if (MacroExpansion *ME = dyn_cast<MacroExpansion>(PPE)) { 465 if (Visit(MakeMacroExpansionCursor(ME, TU))) 466 return true; 467 468 continue; 469 } 470 471 if (MacroDefinitionRecord *MD = dyn_cast<MacroDefinitionRecord>(PPE)) { 472 if (Visit(MakeMacroDefinitionCursor(MD, TU))) 473 return true; 474 475 continue; 476 } 477 478 if (InclusionDirective *ID = dyn_cast<InclusionDirective>(PPE)) { 479 if (Visit(MakeInclusionDirectiveCursor(ID, TU))) 480 return true; 481 482 continue; 483 } 484 } 485 486 return false; 487 } 488 489 /// Visit the children of the given cursor. 490 /// 491 /// \returns true if the visitation should be aborted, false if it 492 /// should continue. 493 bool CursorVisitor::VisitChildren(CXCursor Cursor) { 494 if (clang_isReference(Cursor.kind) && 495 Cursor.kind != CXCursor_CXXBaseSpecifier) { 496 // By definition, references have no children. 497 return false; 498 } 499 500 // Set the Parent field to Cursor, then back to its old value once we're 501 // done. 502 SetParentRAII SetParent(Parent, StmtParent, Cursor); 503 504 if (clang_isDeclaration(Cursor.kind)) { 505 Decl *D = const_cast<Decl *>(getCursorDecl(Cursor)); 506 if (!D) 507 return false; 508 509 return VisitAttributes(D) || Visit(D); 510 } 511 512 if (clang_isStatement(Cursor.kind)) { 513 if (const Stmt *S = getCursorStmt(Cursor)) 514 return Visit(S); 515 516 return false; 517 } 518 519 if (clang_isExpression(Cursor.kind)) { 520 if (const Expr *E = getCursorExpr(Cursor)) 521 return Visit(E); 522 523 return false; 524 } 525 526 if (clang_isTranslationUnit(Cursor.kind)) { 527 CXTranslationUnit TU = getCursorTU(Cursor); 528 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 529 530 int VisitOrder[2] = {VisitPreprocessorLast, !VisitPreprocessorLast}; 531 for (unsigned I = 0; I != 2; ++I) { 532 if (VisitOrder[I]) { 533 if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() && 534 RegionOfInterest.isInvalid()) { 535 for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(), 536 TLEnd = CXXUnit->top_level_end(); 537 TL != TLEnd; ++TL) { 538 const Optional<bool> V = handleDeclForVisitation(*TL); 539 if (!V.hasValue()) 540 continue; 541 return V.getValue(); 542 } 543 } else if (VisitDeclContext( 544 CXXUnit->getASTContext().getTranslationUnitDecl())) 545 return true; 546 continue; 547 } 548 549 // Walk the preprocessing record. 550 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) 551 visitPreprocessedEntitiesInRegion(); 552 } 553 554 return false; 555 } 556 557 if (Cursor.kind == CXCursor_CXXBaseSpecifier) { 558 if (const CXXBaseSpecifier *Base = getCursorCXXBaseSpecifier(Cursor)) { 559 if (TypeSourceInfo *BaseTSInfo = Base->getTypeSourceInfo()) { 560 return Visit(BaseTSInfo->getTypeLoc()); 561 } 562 } 563 } 564 565 if (Cursor.kind == CXCursor_IBOutletCollectionAttr) { 566 const IBOutletCollectionAttr *A = 567 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(Cursor)); 568 if (const ObjCObjectType *ObjT = A->getInterface()->getAs<ObjCObjectType>()) 569 return Visit(cxcursor::MakeCursorObjCClassRef( 570 ObjT->getInterface(), 571 A->getInterfaceLoc()->getTypeLoc().getBeginLoc(), TU)); 572 } 573 574 // If pointing inside a macro definition, check if the token is an identifier 575 // that was ever defined as a macro. In such a case, create a "pseudo" macro 576 // expansion cursor for that token. 577 SourceLocation BeginLoc = RegionOfInterest.getBegin(); 578 if (Cursor.kind == CXCursor_MacroDefinition && 579 BeginLoc == RegionOfInterest.getEnd()) { 580 SourceLocation Loc = AU->mapLocationToPreamble(BeginLoc); 581 const MacroInfo *MI = 582 getMacroInfo(cxcursor::getCursorMacroDefinition(Cursor), TU); 583 if (MacroDefinitionRecord *MacroDef = 584 checkForMacroInMacroDefinition(MI, Loc, TU)) 585 return Visit(cxcursor::MakeMacroExpansionCursor(MacroDef, BeginLoc, TU)); 586 } 587 588 // Nothing to visit at the moment. 589 return false; 590 } 591 592 bool CursorVisitor::VisitBlockDecl(BlockDecl *B) { 593 if (TypeSourceInfo *TSInfo = B->getSignatureAsWritten()) 594 if (Visit(TSInfo->getTypeLoc())) 595 return true; 596 597 if (Stmt *Body = B->getBody()) 598 return Visit(MakeCXCursor(Body, StmtParent, TU, RegionOfInterest)); 599 600 return false; 601 } 602 603 Optional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) { 604 if (RegionOfInterest.isValid()) { 605 SourceRange Range = getFullCursorExtent(Cursor, AU->getSourceManager()); 606 if (Range.isInvalid()) 607 return None; 608 609 switch (CompareRegionOfInterest(Range)) { 610 case RangeBefore: 611 // This declaration comes before the region of interest; skip it. 612 return None; 613 614 case RangeAfter: 615 // This declaration comes after the region of interest; we're done. 616 return false; 617 618 case RangeOverlap: 619 // This declaration overlaps the region of interest; visit it. 620 break; 621 } 622 } 623 return true; 624 } 625 626 bool CursorVisitor::VisitDeclContext(DeclContext *DC) { 627 DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end(); 628 629 // FIXME: Eventually remove. This part of a hack to support proper 630 // iteration over all Decls contained lexically within an ObjC container. 631 SaveAndRestore<DeclContext::decl_iterator *> DI_saved(DI_current, &I); 632 SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E); 633 634 for (; I != E; ++I) { 635 Decl *D = *I; 636 if (D->getLexicalDeclContext() != DC) 637 continue; 638 // Filter out synthesized property accessor redeclarations. 639 if (isa<ObjCImplDecl>(DC)) 640 if (auto *OMD = dyn_cast<ObjCMethodDecl>(D)) 641 if (OMD->isSynthesizedAccessorStub()) 642 continue; 643 const Optional<bool> V = handleDeclForVisitation(D); 644 if (!V.hasValue()) 645 continue; 646 return V.getValue(); 647 } 648 return false; 649 } 650 651 Optional<bool> CursorVisitor::handleDeclForVisitation(const Decl *D) { 652 CXCursor Cursor = MakeCXCursor(D, TU, RegionOfInterest); 653 654 // Ignore synthesized ivars here, otherwise if we have something like: 655 // @synthesize prop = _prop; 656 // and '_prop' is not declared, we will encounter a '_prop' ivar before 657 // encountering the 'prop' synthesize declaration and we will think that 658 // we passed the region-of-interest. 659 if (auto *ivarD = dyn_cast<ObjCIvarDecl>(D)) { 660 if (ivarD->getSynthesize()) 661 return None; 662 } 663 664 // FIXME: ObjCClassRef/ObjCProtocolRef for forward class/protocol 665 // declarations is a mismatch with the compiler semantics. 666 if (Cursor.kind == CXCursor_ObjCInterfaceDecl) { 667 auto *ID = cast<ObjCInterfaceDecl>(D); 668 if (!ID->isThisDeclarationADefinition()) 669 Cursor = MakeCursorObjCClassRef(ID, ID->getLocation(), TU); 670 671 } else if (Cursor.kind == CXCursor_ObjCProtocolDecl) { 672 auto *PD = cast<ObjCProtocolDecl>(D); 673 if (!PD->isThisDeclarationADefinition()) 674 Cursor = MakeCursorObjCProtocolRef(PD, PD->getLocation(), TU); 675 } 676 677 const Optional<bool> V = shouldVisitCursor(Cursor); 678 if (!V.hasValue()) 679 return None; 680 if (!V.getValue()) 681 return false; 682 if (Visit(Cursor, true)) 683 return true; 684 return None; 685 } 686 687 bool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 688 llvm_unreachable("Translation units are visited directly by Visit()"); 689 } 690 691 bool CursorVisitor::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 692 if (VisitTemplateParameters(D->getTemplateParameters())) 693 return true; 694 695 return Visit(MakeCXCursor(D->getTemplatedDecl(), TU, RegionOfInterest)); 696 } 697 698 bool CursorVisitor::VisitTypeAliasDecl(TypeAliasDecl *D) { 699 if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo()) 700 return Visit(TSInfo->getTypeLoc()); 701 702 return false; 703 } 704 705 bool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) { 706 if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo()) 707 return Visit(TSInfo->getTypeLoc()); 708 709 return false; 710 } 711 712 bool CursorVisitor::VisitTagDecl(TagDecl *D) { return VisitDeclContext(D); } 713 714 bool CursorVisitor::VisitClassTemplateSpecializationDecl( 715 ClassTemplateSpecializationDecl *D) { 716 bool ShouldVisitBody = false; 717 switch (D->getSpecializationKind()) { 718 case TSK_Undeclared: 719 case TSK_ImplicitInstantiation: 720 // Nothing to visit 721 return false; 722 723 case TSK_ExplicitInstantiationDeclaration: 724 case TSK_ExplicitInstantiationDefinition: 725 break; 726 727 case TSK_ExplicitSpecialization: 728 ShouldVisitBody = true; 729 break; 730 } 731 732 // Visit the template arguments used in the specialization. 733 if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) { 734 TypeLoc TL = SpecType->getTypeLoc(); 735 if (TemplateSpecializationTypeLoc TSTLoc = 736 TL.getAs<TemplateSpecializationTypeLoc>()) { 737 for (unsigned I = 0, N = TSTLoc.getNumArgs(); I != N; ++I) 738 if (VisitTemplateArgumentLoc(TSTLoc.getArgLoc(I))) 739 return true; 740 } 741 } 742 743 return ShouldVisitBody && VisitCXXRecordDecl(D); 744 } 745 746 bool CursorVisitor::VisitClassTemplatePartialSpecializationDecl( 747 ClassTemplatePartialSpecializationDecl *D) { 748 // FIXME: Visit the "outer" template parameter lists on the TagDecl 749 // before visiting these template parameters. 750 if (VisitTemplateParameters(D->getTemplateParameters())) 751 return true; 752 753 // Visit the partial specialization arguments. 754 const ASTTemplateArgumentListInfo *Info = D->getTemplateArgsAsWritten(); 755 const TemplateArgumentLoc *TemplateArgs = Info->getTemplateArgs(); 756 for (unsigned I = 0, N = Info->NumTemplateArgs; I != N; ++I) 757 if (VisitTemplateArgumentLoc(TemplateArgs[I])) 758 return true; 759 760 return VisitCXXRecordDecl(D); 761 } 762 763 bool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 764 if (const auto *TC = D->getTypeConstraint()) 765 if (Visit(MakeCXCursor(TC->getImmediatelyDeclaredConstraint(), StmtParent, 766 TU, RegionOfInterest))) 767 return true; 768 769 // Visit the default argument. 770 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) 771 if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo()) 772 if (Visit(DefArg->getTypeLoc())) 773 return true; 774 775 return false; 776 } 777 778 bool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) { 779 if (Expr *Init = D->getInitExpr()) 780 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest)); 781 return false; 782 } 783 784 bool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) { 785 unsigned NumParamList = DD->getNumTemplateParameterLists(); 786 for (unsigned i = 0; i < NumParamList; i++) { 787 TemplateParameterList *Params = DD->getTemplateParameterList(i); 788 if (VisitTemplateParameters(Params)) 789 return true; 790 } 791 792 if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo()) 793 if (Visit(TSInfo->getTypeLoc())) 794 return true; 795 796 // Visit the nested-name-specifier, if present. 797 if (NestedNameSpecifierLoc QualifierLoc = DD->getQualifierLoc()) 798 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 799 return true; 800 801 return false; 802 } 803 804 static bool HasTrailingReturnType(FunctionDecl *ND) { 805 const QualType Ty = ND->getType(); 806 if (const FunctionType *AFT = Ty->getAs<FunctionType>()) { 807 if (const FunctionProtoType *FT = dyn_cast<FunctionProtoType>(AFT)) 808 return FT->hasTrailingReturn(); 809 } 810 811 return false; 812 } 813 814 /// Compare two base or member initializers based on their source order. 815 static int CompareCXXCtorInitializers(CXXCtorInitializer *const *X, 816 CXXCtorInitializer *const *Y) { 817 return (*X)->getSourceOrder() - (*Y)->getSourceOrder(); 818 } 819 820 bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) { 821 unsigned NumParamList = ND->getNumTemplateParameterLists(); 822 for (unsigned i = 0; i < NumParamList; i++) { 823 TemplateParameterList *Params = ND->getTemplateParameterList(i); 824 if (VisitTemplateParameters(Params)) 825 return true; 826 } 827 828 if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) { 829 // Visit the function declaration's syntactic components in the order 830 // written. This requires a bit of work. 831 TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens(); 832 FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>(); 833 const bool HasTrailingRT = HasTrailingReturnType(ND); 834 835 // If we have a function declared directly (without the use of a typedef), 836 // visit just the return type. Otherwise, just visit the function's type 837 // now. 838 if ((FTL && !isa<CXXConversionDecl>(ND) && !HasTrailingRT && 839 Visit(FTL.getReturnLoc())) || 840 (!FTL && Visit(TL))) 841 return true; 842 843 // Visit the nested-name-specifier, if present. 844 if (NestedNameSpecifierLoc QualifierLoc = ND->getQualifierLoc()) 845 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 846 return true; 847 848 // Visit the declaration name. 849 if (!isa<CXXDestructorDecl>(ND)) 850 if (VisitDeclarationNameInfo(ND->getNameInfo())) 851 return true; 852 853 // FIXME: Visit explicitly-specified template arguments! 854 855 // Visit the function parameters, if we have a function type. 856 if (FTL && VisitFunctionTypeLoc(FTL, true)) 857 return true; 858 859 // Visit the function's trailing return type. 860 if (FTL && HasTrailingRT && Visit(FTL.getReturnLoc())) 861 return true; 862 863 // FIXME: Attributes? 864 } 865 866 if (ND->doesThisDeclarationHaveABody() && !ND->isLateTemplateParsed()) { 867 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) { 868 // Find the initializers that were written in the source. 869 SmallVector<CXXCtorInitializer *, 4> WrittenInits; 870 for (auto *I : Constructor->inits()) { 871 if (!I->isWritten()) 872 continue; 873 874 WrittenInits.push_back(I); 875 } 876 877 // Sort the initializers in source order 878 llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(), 879 &CompareCXXCtorInitializers); 880 881 // Visit the initializers in source order 882 for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) { 883 CXXCtorInitializer *Init = WrittenInits[I]; 884 if (Init->isAnyMemberInitializer()) { 885 if (Visit(MakeCursorMemberRef(Init->getAnyMember(), 886 Init->getMemberLocation(), TU))) 887 return true; 888 } else if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo()) { 889 if (Visit(TInfo->getTypeLoc())) 890 return true; 891 } 892 893 // Visit the initializer value. 894 if (Expr *Initializer = Init->getInit()) 895 if (Visit(MakeCXCursor(Initializer, ND, TU, RegionOfInterest))) 896 return true; 897 } 898 } 899 900 if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest))) 901 return true; 902 } 903 904 return false; 905 } 906 907 bool CursorVisitor::VisitFieldDecl(FieldDecl *D) { 908 if (VisitDeclaratorDecl(D)) 909 return true; 910 911 if (Expr *BitWidth = D->getBitWidth()) 912 return Visit(MakeCXCursor(BitWidth, StmtParent, TU, RegionOfInterest)); 913 914 if (Expr *Init = D->getInClassInitializer()) 915 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest)); 916 917 return false; 918 } 919 920 bool CursorVisitor::VisitVarDecl(VarDecl *D) { 921 if (VisitDeclaratorDecl(D)) 922 return true; 923 924 if (Expr *Init = D->getInit()) 925 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest)); 926 927 return false; 928 } 929 930 bool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 931 if (VisitDeclaratorDecl(D)) 932 return true; 933 934 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) 935 if (Expr *DefArg = D->getDefaultArgument()) 936 return Visit(MakeCXCursor(DefArg, StmtParent, TU, RegionOfInterest)); 937 938 return false; 939 } 940 941 bool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 942 // FIXME: Visit the "outer" template parameter lists on the FunctionDecl 943 // before visiting these template parameters. 944 if (VisitTemplateParameters(D->getTemplateParameters())) 945 return true; 946 947 auto *FD = D->getTemplatedDecl(); 948 return VisitAttributes(FD) || VisitFunctionDecl(FD); 949 } 950 951 bool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) { 952 // FIXME: Visit the "outer" template parameter lists on the TagDecl 953 // before visiting these template parameters. 954 if (VisitTemplateParameters(D->getTemplateParameters())) 955 return true; 956 957 auto *CD = D->getTemplatedDecl(); 958 return VisitAttributes(CD) || VisitCXXRecordDecl(CD); 959 } 960 961 bool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 962 if (VisitTemplateParameters(D->getTemplateParameters())) 963 return true; 964 965 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() && 966 VisitTemplateArgumentLoc(D->getDefaultArgument())) 967 return true; 968 969 return false; 970 } 971 972 bool CursorVisitor::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) { 973 // Visit the bound, if it's explicit. 974 if (D->hasExplicitBound()) { 975 if (auto TInfo = D->getTypeSourceInfo()) { 976 if (Visit(TInfo->getTypeLoc())) 977 return true; 978 } 979 } 980 981 return false; 982 } 983 984 bool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) { 985 if (TypeSourceInfo *TSInfo = ND->getReturnTypeSourceInfo()) 986 if (Visit(TSInfo->getTypeLoc())) 987 return true; 988 989 for (const auto *P : ND->parameters()) { 990 if (Visit(MakeCXCursor(P, TU, RegionOfInterest))) 991 return true; 992 } 993 994 return ND->isThisDeclarationADefinition() && 995 Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest)); 996 } 997 998 template <typename DeclIt> 999 static void addRangedDeclsInContainer(DeclIt *DI_current, DeclIt DE_current, 1000 SourceManager &SM, SourceLocation EndLoc, 1001 SmallVectorImpl<Decl *> &Decls) { 1002 DeclIt next = *DI_current; 1003 while (++next != DE_current) { 1004 Decl *D_next = *next; 1005 if (!D_next) 1006 break; 1007 SourceLocation L = D_next->getBeginLoc(); 1008 if (!L.isValid()) 1009 break; 1010 if (SM.isBeforeInTranslationUnit(L, EndLoc)) { 1011 *DI_current = next; 1012 Decls.push_back(D_next); 1013 continue; 1014 } 1015 break; 1016 } 1017 } 1018 1019 bool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) { 1020 // FIXME: Eventually convert back to just 'VisitDeclContext()'. Essentially 1021 // an @implementation can lexically contain Decls that are not properly 1022 // nested in the AST. When we identify such cases, we need to retrofit 1023 // this nesting here. 1024 if (!DI_current && !FileDI_current) 1025 return VisitDeclContext(D); 1026 1027 // Scan the Decls that immediately come after the container 1028 // in the current DeclContext. If any fall within the 1029 // container's lexical region, stash them into a vector 1030 // for later processing. 1031 SmallVector<Decl *, 24> DeclsInContainer; 1032 SourceLocation EndLoc = D->getSourceRange().getEnd(); 1033 SourceManager &SM = AU->getSourceManager(); 1034 if (EndLoc.isValid()) { 1035 if (DI_current) { 1036 addRangedDeclsInContainer(DI_current, DE_current, SM, EndLoc, 1037 DeclsInContainer); 1038 } else { 1039 addRangedDeclsInContainer(FileDI_current, FileDE_current, SM, EndLoc, 1040 DeclsInContainer); 1041 } 1042 } 1043 1044 // The common case. 1045 if (DeclsInContainer.empty()) 1046 return VisitDeclContext(D); 1047 1048 // Get all the Decls in the DeclContext, and sort them with the 1049 // additional ones we've collected. Then visit them. 1050 for (auto *SubDecl : D->decls()) { 1051 if (!SubDecl || SubDecl->getLexicalDeclContext() != D || 1052 SubDecl->getBeginLoc().isInvalid()) 1053 continue; 1054 DeclsInContainer.push_back(SubDecl); 1055 } 1056 1057 // Now sort the Decls so that they appear in lexical order. 1058 llvm::sort(DeclsInContainer, [&SM](Decl *A, Decl *B) { 1059 SourceLocation L_A = A->getBeginLoc(); 1060 SourceLocation L_B = B->getBeginLoc(); 1061 return L_A != L_B 1062 ? SM.isBeforeInTranslationUnit(L_A, L_B) 1063 : SM.isBeforeInTranslationUnit(A->getEndLoc(), B->getEndLoc()); 1064 }); 1065 1066 // Now visit the decls. 1067 for (SmallVectorImpl<Decl *>::iterator I = DeclsInContainer.begin(), 1068 E = DeclsInContainer.end(); 1069 I != E; ++I) { 1070 CXCursor Cursor = MakeCXCursor(*I, TU, RegionOfInterest); 1071 const Optional<bool> &V = shouldVisitCursor(Cursor); 1072 if (!V.hasValue()) 1073 continue; 1074 if (!V.getValue()) 1075 return false; 1076 if (Visit(Cursor, true)) 1077 return true; 1078 } 1079 return false; 1080 } 1081 1082 bool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) { 1083 if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(), 1084 TU))) 1085 return true; 1086 1087 if (VisitObjCTypeParamList(ND->getTypeParamList())) 1088 return true; 1089 1090 ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin(); 1091 for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(), 1092 E = ND->protocol_end(); 1093 I != E; ++I, ++PL) 1094 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 1095 return true; 1096 1097 return VisitObjCContainerDecl(ND); 1098 } 1099 1100 bool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) { 1101 if (!PID->isThisDeclarationADefinition()) 1102 return Visit(MakeCursorObjCProtocolRef(PID, PID->getLocation(), TU)); 1103 1104 ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin(); 1105 for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(), 1106 E = PID->protocol_end(); 1107 I != E; ++I, ++PL) 1108 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 1109 return true; 1110 1111 return VisitObjCContainerDecl(PID); 1112 } 1113 1114 bool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) { 1115 if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc())) 1116 return true; 1117 1118 // FIXME: This implements a workaround with @property declarations also being 1119 // installed in the DeclContext for the @interface. Eventually this code 1120 // should be removed. 1121 ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext()); 1122 if (!CDecl || !CDecl->IsClassExtension()) 1123 return false; 1124 1125 ObjCInterfaceDecl *ID = CDecl->getClassInterface(); 1126 if (!ID) 1127 return false; 1128 1129 IdentifierInfo *PropertyId = PD->getIdentifier(); 1130 ObjCPropertyDecl *prevDecl = ObjCPropertyDecl::findPropertyDecl( 1131 cast<DeclContext>(ID), PropertyId, PD->getQueryKind()); 1132 1133 if (!prevDecl) 1134 return false; 1135 1136 // Visit synthesized methods since they will be skipped when visiting 1137 // the @interface. 1138 if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl()) 1139 if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl) 1140 if (Visit(MakeCXCursor(MD, TU, RegionOfInterest))) 1141 return true; 1142 1143 if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl()) 1144 if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl) 1145 if (Visit(MakeCXCursor(MD, TU, RegionOfInterest))) 1146 return true; 1147 1148 return false; 1149 } 1150 1151 bool CursorVisitor::VisitObjCTypeParamList(ObjCTypeParamList *typeParamList) { 1152 if (!typeParamList) 1153 return false; 1154 1155 for (auto *typeParam : *typeParamList) { 1156 // Visit the type parameter. 1157 if (Visit(MakeCXCursor(typeParam, TU, RegionOfInterest))) 1158 return true; 1159 } 1160 1161 return false; 1162 } 1163 1164 bool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 1165 if (!D->isThisDeclarationADefinition()) { 1166 // Forward declaration is treated like a reference. 1167 return Visit(MakeCursorObjCClassRef(D, D->getLocation(), TU)); 1168 } 1169 1170 // Objective-C type parameters. 1171 if (VisitObjCTypeParamList(D->getTypeParamListAsWritten())) 1172 return true; 1173 1174 // Issue callbacks for super class. 1175 if (D->getSuperClass() && Visit(MakeCursorObjCSuperClassRef( 1176 D->getSuperClass(), D->getSuperClassLoc(), TU))) 1177 return true; 1178 1179 if (TypeSourceInfo *SuperClassTInfo = D->getSuperClassTInfo()) 1180 if (Visit(SuperClassTInfo->getTypeLoc())) 1181 return true; 1182 1183 ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin(); 1184 for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(), 1185 E = D->protocol_end(); 1186 I != E; ++I, ++PL) 1187 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 1188 return true; 1189 1190 return VisitObjCContainerDecl(D); 1191 } 1192 1193 bool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) { 1194 return VisitObjCContainerDecl(D); 1195 } 1196 1197 bool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 1198 // 'ID' could be null when dealing with invalid code. 1199 if (ObjCInterfaceDecl *ID = D->getClassInterface()) 1200 if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU))) 1201 return true; 1202 1203 return VisitObjCImplDecl(D); 1204 } 1205 1206 bool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 1207 #if 0 1208 // Issue callbacks for super class. 1209 // FIXME: No source location information! 1210 if (D->getSuperClass() && 1211 Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(), 1212 D->getSuperClassLoc(), 1213 TU))) 1214 return true; 1215 #endif 1216 1217 return VisitObjCImplDecl(D); 1218 } 1219 1220 bool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) { 1221 if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl()) 1222 if (PD->isIvarNameSpecified()) 1223 return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU)); 1224 1225 return false; 1226 } 1227 1228 bool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) { 1229 return VisitDeclContext(D); 1230 } 1231 1232 bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 1233 // Visit nested-name-specifier. 1234 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) 1235 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1236 return true; 1237 1238 return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(), 1239 D->getTargetNameLoc(), TU)); 1240 } 1241 1242 bool CursorVisitor::VisitUsingDecl(UsingDecl *D) { 1243 // Visit nested-name-specifier. 1244 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) { 1245 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1246 return true; 1247 } 1248 1249 if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU))) 1250 return true; 1251 1252 return VisitDeclarationNameInfo(D->getNameInfo()); 1253 } 1254 1255 bool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 1256 // Visit nested-name-specifier. 1257 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) 1258 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1259 return true; 1260 1261 return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(), 1262 D->getIdentLocation(), TU)); 1263 } 1264 1265 bool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 1266 // Visit nested-name-specifier. 1267 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) { 1268 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1269 return true; 1270 } 1271 1272 return VisitDeclarationNameInfo(D->getNameInfo()); 1273 } 1274 1275 bool CursorVisitor::VisitUnresolvedUsingTypenameDecl( 1276 UnresolvedUsingTypenameDecl *D) { 1277 // Visit nested-name-specifier. 1278 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) 1279 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1280 return true; 1281 1282 return false; 1283 } 1284 1285 bool CursorVisitor::VisitStaticAssertDecl(StaticAssertDecl *D) { 1286 if (Visit(MakeCXCursor(D->getAssertExpr(), StmtParent, TU, RegionOfInterest))) 1287 return true; 1288 if (StringLiteral *Message = D->getMessage()) 1289 if (Visit(MakeCXCursor(Message, StmtParent, TU, RegionOfInterest))) 1290 return true; 1291 return false; 1292 } 1293 1294 bool CursorVisitor::VisitFriendDecl(FriendDecl *D) { 1295 if (NamedDecl *FriendD = D->getFriendDecl()) { 1296 if (Visit(MakeCXCursor(FriendD, TU, RegionOfInterest))) 1297 return true; 1298 } else if (TypeSourceInfo *TI = D->getFriendType()) { 1299 if (Visit(TI->getTypeLoc())) 1300 return true; 1301 } 1302 return false; 1303 } 1304 1305 bool CursorVisitor::VisitDecompositionDecl(DecompositionDecl *D) { 1306 for (auto *B : D->bindings()) { 1307 if (Visit(MakeCXCursor(B, TU, RegionOfInterest))) 1308 return true; 1309 } 1310 return VisitVarDecl(D); 1311 } 1312 1313 bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) { 1314 switch (Name.getName().getNameKind()) { 1315 case clang::DeclarationName::Identifier: 1316 case clang::DeclarationName::CXXLiteralOperatorName: 1317 case clang::DeclarationName::CXXDeductionGuideName: 1318 case clang::DeclarationName::CXXOperatorName: 1319 case clang::DeclarationName::CXXUsingDirective: 1320 return false; 1321 1322 case clang::DeclarationName::CXXConstructorName: 1323 case clang::DeclarationName::CXXDestructorName: 1324 case clang::DeclarationName::CXXConversionFunctionName: 1325 if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo()) 1326 return Visit(TSInfo->getTypeLoc()); 1327 return false; 1328 1329 case clang::DeclarationName::ObjCZeroArgSelector: 1330 case clang::DeclarationName::ObjCOneArgSelector: 1331 case clang::DeclarationName::ObjCMultiArgSelector: 1332 // FIXME: Per-identifier location info? 1333 return false; 1334 } 1335 1336 llvm_unreachable("Invalid DeclarationName::Kind!"); 1337 } 1338 1339 bool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS, 1340 SourceRange Range) { 1341 // FIXME: This whole routine is a hack to work around the lack of proper 1342 // source information in nested-name-specifiers (PR5791). Since we do have 1343 // a beginning source location, we can visit the first component of the 1344 // nested-name-specifier, if it's a single-token component. 1345 if (!NNS) 1346 return false; 1347 1348 // Get the first component in the nested-name-specifier. 1349 while (NestedNameSpecifier *Prefix = NNS->getPrefix()) 1350 NNS = Prefix; 1351 1352 switch (NNS->getKind()) { 1353 case NestedNameSpecifier::Namespace: 1354 return Visit( 1355 MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(), TU)); 1356 1357 case NestedNameSpecifier::NamespaceAlias: 1358 return Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(), 1359 Range.getBegin(), TU)); 1360 1361 case NestedNameSpecifier::TypeSpec: { 1362 // If the type has a form where we know that the beginning of the source 1363 // range matches up with a reference cursor. Visit the appropriate reference 1364 // cursor. 1365 const Type *T = NNS->getAsType(); 1366 if (const TypedefType *Typedef = dyn_cast<TypedefType>(T)) 1367 return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU)); 1368 if (const TagType *Tag = dyn_cast<TagType>(T)) 1369 return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU)); 1370 if (const TemplateSpecializationType *TST = 1371 dyn_cast<TemplateSpecializationType>(T)) 1372 return VisitTemplateName(TST->getTemplateName(), Range.getBegin()); 1373 break; 1374 } 1375 1376 case NestedNameSpecifier::TypeSpecWithTemplate: 1377 case NestedNameSpecifier::Global: 1378 case NestedNameSpecifier::Identifier: 1379 case NestedNameSpecifier::Super: 1380 break; 1381 } 1382 1383 return false; 1384 } 1385 1386 bool CursorVisitor::VisitNestedNameSpecifierLoc( 1387 NestedNameSpecifierLoc Qualifier) { 1388 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 1389 for (; Qualifier; Qualifier = Qualifier.getPrefix()) 1390 Qualifiers.push_back(Qualifier); 1391 1392 while (!Qualifiers.empty()) { 1393 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 1394 NestedNameSpecifier *NNS = Q.getNestedNameSpecifier(); 1395 switch (NNS->getKind()) { 1396 case NestedNameSpecifier::Namespace: 1397 if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), 1398 Q.getLocalBeginLoc(), TU))) 1399 return true; 1400 1401 break; 1402 1403 case NestedNameSpecifier::NamespaceAlias: 1404 if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(), 1405 Q.getLocalBeginLoc(), TU))) 1406 return true; 1407 1408 break; 1409 1410 case NestedNameSpecifier::TypeSpec: 1411 case NestedNameSpecifier::TypeSpecWithTemplate: 1412 if (Visit(Q.getTypeLoc())) 1413 return true; 1414 1415 break; 1416 1417 case NestedNameSpecifier::Global: 1418 case NestedNameSpecifier::Identifier: 1419 case NestedNameSpecifier::Super: 1420 break; 1421 } 1422 } 1423 1424 return false; 1425 } 1426 1427 bool CursorVisitor::VisitTemplateParameters( 1428 const TemplateParameterList *Params) { 1429 if (!Params) 1430 return false; 1431 1432 for (TemplateParameterList::const_iterator P = Params->begin(), 1433 PEnd = Params->end(); 1434 P != PEnd; ++P) { 1435 if (Visit(MakeCXCursor(*P, TU, RegionOfInterest))) 1436 return true; 1437 } 1438 1439 return false; 1440 } 1441 1442 bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) { 1443 switch (Name.getKind()) { 1444 case TemplateName::Template: 1445 return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU)); 1446 1447 case TemplateName::OverloadedTemplate: 1448 // Visit the overloaded template set. 1449 if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU))) 1450 return true; 1451 1452 return false; 1453 1454 case TemplateName::AssumedTemplate: 1455 // FIXME: Visit DeclarationName? 1456 return false; 1457 1458 case TemplateName::DependentTemplate: 1459 // FIXME: Visit nested-name-specifier. 1460 return false; 1461 1462 case TemplateName::QualifiedTemplate: 1463 // FIXME: Visit nested-name-specifier. 1464 return Visit(MakeCursorTemplateRef( 1465 Name.getAsQualifiedTemplateName()->getDecl(), Loc, TU)); 1466 1467 case TemplateName::SubstTemplateTemplateParm: 1468 return Visit(MakeCursorTemplateRef( 1469 Name.getAsSubstTemplateTemplateParm()->getParameter(), Loc, TU)); 1470 1471 case TemplateName::SubstTemplateTemplateParmPack: 1472 return Visit(MakeCursorTemplateRef( 1473 Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(), Loc, 1474 TU)); 1475 } 1476 1477 llvm_unreachable("Invalid TemplateName::Kind!"); 1478 } 1479 1480 bool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) { 1481 switch (TAL.getArgument().getKind()) { 1482 case TemplateArgument::Null: 1483 case TemplateArgument::Integral: 1484 case TemplateArgument::Pack: 1485 return false; 1486 1487 case TemplateArgument::Type: 1488 if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo()) 1489 return Visit(TSInfo->getTypeLoc()); 1490 return false; 1491 1492 case TemplateArgument::Declaration: 1493 if (Expr *E = TAL.getSourceDeclExpression()) 1494 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest)); 1495 return false; 1496 1497 case TemplateArgument::NullPtr: 1498 if (Expr *E = TAL.getSourceNullPtrExpression()) 1499 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest)); 1500 return false; 1501 1502 case TemplateArgument::Expression: 1503 if (Expr *E = TAL.getSourceExpression()) 1504 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest)); 1505 return false; 1506 1507 case TemplateArgument::Template: 1508 case TemplateArgument::TemplateExpansion: 1509 if (VisitNestedNameSpecifierLoc(TAL.getTemplateQualifierLoc())) 1510 return true; 1511 1512 return VisitTemplateName(TAL.getArgument().getAsTemplateOrTemplatePattern(), 1513 TAL.getTemplateNameLoc()); 1514 } 1515 1516 llvm_unreachable("Invalid TemplateArgument::Kind!"); 1517 } 1518 1519 bool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 1520 return VisitDeclContext(D); 1521 } 1522 1523 bool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 1524 return Visit(TL.getUnqualifiedLoc()); 1525 } 1526 1527 bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 1528 ASTContext &Context = AU->getASTContext(); 1529 1530 // Some builtin types (such as Objective-C's "id", "sel", and 1531 // "Class") have associated declarations. Create cursors for those. 1532 QualType VisitType; 1533 switch (TL.getTypePtr()->getKind()) { 1534 1535 case BuiltinType::Void: 1536 case BuiltinType::NullPtr: 1537 case BuiltinType::Dependent: 1538 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 1539 case BuiltinType::Id: 1540 #include "clang/Basic/OpenCLImageTypes.def" 1541 #define EXT_OPAQUE_TYPE(ExtTYpe, Id, Ext) case BuiltinType::Id: 1542 #include "clang/Basic/OpenCLExtensionTypes.def" 1543 case BuiltinType::OCLSampler: 1544 case BuiltinType::OCLEvent: 1545 case BuiltinType::OCLClkEvent: 1546 case BuiltinType::OCLQueue: 1547 case BuiltinType::OCLReserveID: 1548 #define SVE_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 1549 #include "clang/Basic/AArch64SVEACLETypes.def" 1550 #define PPC_VECTOR_TYPE(Name, Id, Size) case BuiltinType::Id: 1551 #include "clang/Basic/PPCTypes.def" 1552 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id: 1553 #include "clang/Basic/RISCVVTypes.def" 1554 #define BUILTIN_TYPE(Id, SingletonId) 1555 #define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id: 1556 #define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id: 1557 #define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id: 1558 #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 1559 #include "clang/AST/BuiltinTypes.def" 1560 break; 1561 1562 case BuiltinType::ObjCId: 1563 VisitType = Context.getObjCIdType(); 1564 break; 1565 1566 case BuiltinType::ObjCClass: 1567 VisitType = Context.getObjCClassType(); 1568 break; 1569 1570 case BuiltinType::ObjCSel: 1571 VisitType = Context.getObjCSelType(); 1572 break; 1573 } 1574 1575 if (!VisitType.isNull()) { 1576 if (const TypedefType *Typedef = VisitType->getAs<TypedefType>()) 1577 return Visit( 1578 MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(), TU)); 1579 } 1580 1581 return false; 1582 } 1583 1584 bool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 1585 return Visit(MakeCursorTypeRef(TL.getTypedefNameDecl(), TL.getNameLoc(), TU)); 1586 } 1587 1588 bool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 1589 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1590 } 1591 1592 bool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) { 1593 if (TL.isDefinition()) 1594 return Visit(MakeCXCursor(TL.getDecl(), TU, RegionOfInterest)); 1595 1596 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1597 } 1598 1599 bool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 1600 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1601 } 1602 1603 bool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 1604 return Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU)); 1605 } 1606 1607 bool CursorVisitor::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 1608 if (Visit(MakeCursorTypeRef(TL.getDecl(), TL.getBeginLoc(), TU))) 1609 return true; 1610 for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) { 1611 if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I), 1612 TU))) 1613 return true; 1614 } 1615 1616 return false; 1617 } 1618 1619 bool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 1620 if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc())) 1621 return true; 1622 1623 for (unsigned I = 0, N = TL.getNumTypeArgs(); I != N; ++I) { 1624 if (Visit(TL.getTypeArgTInfo(I)->getTypeLoc())) 1625 return true; 1626 } 1627 1628 for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) { 1629 if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I), 1630 TU))) 1631 return true; 1632 } 1633 1634 return false; 1635 } 1636 1637 bool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 1638 return Visit(TL.getPointeeLoc()); 1639 } 1640 1641 bool CursorVisitor::VisitParenTypeLoc(ParenTypeLoc TL) { 1642 return Visit(TL.getInnerLoc()); 1643 } 1644 1645 bool CursorVisitor::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 1646 return Visit(TL.getInnerLoc()); 1647 } 1648 1649 bool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) { 1650 return Visit(TL.getPointeeLoc()); 1651 } 1652 1653 bool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 1654 return Visit(TL.getPointeeLoc()); 1655 } 1656 1657 bool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 1658 return Visit(TL.getPointeeLoc()); 1659 } 1660 1661 bool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 1662 return Visit(TL.getPointeeLoc()); 1663 } 1664 1665 bool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 1666 return Visit(TL.getPointeeLoc()); 1667 } 1668 1669 bool CursorVisitor::VisitUsingTypeLoc(UsingTypeLoc TL) { return false; } 1670 1671 bool CursorVisitor::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 1672 return Visit(TL.getModifiedLoc()); 1673 } 1674 1675 bool CursorVisitor::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) { 1676 return Visit(TL.getWrappedLoc()); 1677 } 1678 1679 bool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL, 1680 bool SkipResultType) { 1681 if (!SkipResultType && Visit(TL.getReturnLoc())) 1682 return true; 1683 1684 for (unsigned I = 0, N = TL.getNumParams(); I != N; ++I) 1685 if (Decl *D = TL.getParam(I)) 1686 if (Visit(MakeCXCursor(D, TU, RegionOfInterest))) 1687 return true; 1688 1689 return false; 1690 } 1691 1692 bool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) { 1693 if (Visit(TL.getElementLoc())) 1694 return true; 1695 1696 if (Expr *Size = TL.getSizeExpr()) 1697 return Visit(MakeCXCursor(Size, StmtParent, TU, RegionOfInterest)); 1698 1699 return false; 1700 } 1701 1702 bool CursorVisitor::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 1703 return Visit(TL.getOriginalLoc()); 1704 } 1705 1706 bool CursorVisitor::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 1707 return Visit(TL.getOriginalLoc()); 1708 } 1709 1710 bool CursorVisitor::VisitDeducedTemplateSpecializationTypeLoc( 1711 DeducedTemplateSpecializationTypeLoc TL) { 1712 if (VisitTemplateName(TL.getTypePtr()->getTemplateName(), 1713 TL.getTemplateNameLoc())) 1714 return true; 1715 1716 return false; 1717 } 1718 1719 bool CursorVisitor::VisitTemplateSpecializationTypeLoc( 1720 TemplateSpecializationTypeLoc TL) { 1721 // Visit the template name. 1722 if (VisitTemplateName(TL.getTypePtr()->getTemplateName(), 1723 TL.getTemplateNameLoc())) 1724 return true; 1725 1726 // Visit the template arguments. 1727 for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I) 1728 if (VisitTemplateArgumentLoc(TL.getArgLoc(I))) 1729 return true; 1730 1731 return false; 1732 } 1733 1734 bool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 1735 return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU)); 1736 } 1737 1738 bool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 1739 if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo()) 1740 return Visit(TSInfo->getTypeLoc()); 1741 1742 return false; 1743 } 1744 1745 bool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 1746 if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo()) 1747 return Visit(TSInfo->getTypeLoc()); 1748 1749 return false; 1750 } 1751 1752 bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 1753 return VisitNestedNameSpecifierLoc(TL.getQualifierLoc()); 1754 } 1755 1756 bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc( 1757 DependentTemplateSpecializationTypeLoc TL) { 1758 // Visit the nested-name-specifier, if there is one. 1759 if (TL.getQualifierLoc() && VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) 1760 return true; 1761 1762 // Visit the template arguments. 1763 for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I) 1764 if (VisitTemplateArgumentLoc(TL.getArgLoc(I))) 1765 return true; 1766 1767 return false; 1768 } 1769 1770 bool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 1771 if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) 1772 return true; 1773 1774 return Visit(TL.getNamedTypeLoc()); 1775 } 1776 1777 bool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 1778 return Visit(TL.getPatternLoc()); 1779 } 1780 1781 bool CursorVisitor::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 1782 if (Expr *E = TL.getUnderlyingExpr()) 1783 return Visit(MakeCXCursor(E, StmtParent, TU)); 1784 1785 return false; 1786 } 1787 1788 bool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 1789 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1790 } 1791 1792 bool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 1793 return Visit(TL.getValueLoc()); 1794 } 1795 1796 bool CursorVisitor::VisitPipeTypeLoc(PipeTypeLoc TL) { 1797 return Visit(TL.getValueLoc()); 1798 } 1799 1800 #define DEFAULT_TYPELOC_IMPL(CLASS, PARENT) \ 1801 bool CursorVisitor::Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { \ 1802 return Visit##PARENT##Loc(TL); \ 1803 } 1804 1805 DEFAULT_TYPELOC_IMPL(Complex, Type) 1806 DEFAULT_TYPELOC_IMPL(ConstantArray, ArrayType) 1807 DEFAULT_TYPELOC_IMPL(IncompleteArray, ArrayType) 1808 DEFAULT_TYPELOC_IMPL(VariableArray, ArrayType) 1809 DEFAULT_TYPELOC_IMPL(DependentSizedArray, ArrayType) 1810 DEFAULT_TYPELOC_IMPL(DependentAddressSpace, Type) 1811 DEFAULT_TYPELOC_IMPL(DependentVector, Type) 1812 DEFAULT_TYPELOC_IMPL(DependentSizedExtVector, Type) 1813 DEFAULT_TYPELOC_IMPL(Vector, Type) 1814 DEFAULT_TYPELOC_IMPL(ExtVector, VectorType) 1815 DEFAULT_TYPELOC_IMPL(ConstantMatrix, MatrixType) 1816 DEFAULT_TYPELOC_IMPL(DependentSizedMatrix, MatrixType) 1817 DEFAULT_TYPELOC_IMPL(FunctionProto, FunctionType) 1818 DEFAULT_TYPELOC_IMPL(FunctionNoProto, FunctionType) 1819 DEFAULT_TYPELOC_IMPL(Record, TagType) 1820 DEFAULT_TYPELOC_IMPL(Enum, TagType) 1821 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type) 1822 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type) 1823 DEFAULT_TYPELOC_IMPL(Auto, Type) 1824 DEFAULT_TYPELOC_IMPL(BitInt, Type) 1825 DEFAULT_TYPELOC_IMPL(DependentBitInt, Type) 1826 1827 bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) { 1828 // Visit the nested-name-specifier, if present. 1829 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) 1830 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1831 return true; 1832 1833 if (D->isCompleteDefinition()) { 1834 for (const auto &I : D->bases()) { 1835 if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(&I, TU))) 1836 return true; 1837 } 1838 } 1839 1840 return VisitTagDecl(D); 1841 } 1842 1843 bool CursorVisitor::VisitAttributes(Decl *D) { 1844 for (const auto *I : D->attrs()) 1845 if ((TU->ParsingOptions & CXTranslationUnit_VisitImplicitAttributes || 1846 !I->isImplicit()) && 1847 Visit(MakeCXCursor(I, D, TU))) 1848 return true; 1849 1850 return false; 1851 } 1852 1853 //===----------------------------------------------------------------------===// 1854 // Data-recursive visitor methods. 1855 //===----------------------------------------------------------------------===// 1856 1857 namespace { 1858 #define DEF_JOB(NAME, DATA, KIND) \ 1859 class NAME : public VisitorJob { \ 1860 public: \ 1861 NAME(const DATA *d, CXCursor parent) \ 1862 : VisitorJob(parent, VisitorJob::KIND, d) {} \ 1863 static bool classof(const VisitorJob *VJ) { \ 1864 return VJ->getKind() == KIND; \ 1865 } \ 1866 const DATA *get() const { return static_cast<const DATA *>(data[0]); } \ 1867 }; 1868 1869 DEF_JOB(StmtVisit, Stmt, StmtVisitKind) 1870 DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind) 1871 DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind) 1872 DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind) 1873 DEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind) 1874 DEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind) 1875 DEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind) 1876 #undef DEF_JOB 1877 1878 class ExplicitTemplateArgsVisit : public VisitorJob { 1879 public: 1880 ExplicitTemplateArgsVisit(const TemplateArgumentLoc *Begin, 1881 const TemplateArgumentLoc *End, CXCursor parent) 1882 : VisitorJob(parent, VisitorJob::ExplicitTemplateArgsVisitKind, Begin, 1883 End) {} 1884 static bool classof(const VisitorJob *VJ) { 1885 return VJ->getKind() == ExplicitTemplateArgsVisitKind; 1886 } 1887 const TemplateArgumentLoc *begin() const { 1888 return static_cast<const TemplateArgumentLoc *>(data[0]); 1889 } 1890 const TemplateArgumentLoc *end() { 1891 return static_cast<const TemplateArgumentLoc *>(data[1]); 1892 } 1893 }; 1894 class DeclVisit : public VisitorJob { 1895 public: 1896 DeclVisit(const Decl *D, CXCursor parent, bool isFirst) 1897 : VisitorJob(parent, VisitorJob::DeclVisitKind, D, 1898 isFirst ? (void *)1 : (void *)nullptr) {} 1899 static bool classof(const VisitorJob *VJ) { 1900 return VJ->getKind() == DeclVisitKind; 1901 } 1902 const Decl *get() const { return static_cast<const Decl *>(data[0]); } 1903 bool isFirst() const { return data[1] != nullptr; } 1904 }; 1905 class TypeLocVisit : public VisitorJob { 1906 public: 1907 TypeLocVisit(TypeLoc tl, CXCursor parent) 1908 : VisitorJob(parent, VisitorJob::TypeLocVisitKind, 1909 tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {} 1910 1911 static bool classof(const VisitorJob *VJ) { 1912 return VJ->getKind() == TypeLocVisitKind; 1913 } 1914 1915 TypeLoc get() const { 1916 QualType T = QualType::getFromOpaquePtr(data[0]); 1917 return TypeLoc(T, const_cast<void *>(data[1])); 1918 } 1919 }; 1920 1921 class LabelRefVisit : public VisitorJob { 1922 public: 1923 LabelRefVisit(LabelDecl *LD, SourceLocation labelLoc, CXCursor parent) 1924 : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LD, 1925 labelLoc.getPtrEncoding()) {} 1926 1927 static bool classof(const VisitorJob *VJ) { 1928 return VJ->getKind() == VisitorJob::LabelRefVisitKind; 1929 } 1930 const LabelDecl *get() const { 1931 return static_cast<const LabelDecl *>(data[0]); 1932 } 1933 SourceLocation getLoc() const { 1934 return SourceLocation::getFromPtrEncoding(data[1]); 1935 } 1936 }; 1937 1938 class NestedNameSpecifierLocVisit : public VisitorJob { 1939 public: 1940 NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent) 1941 : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind, 1942 Qualifier.getNestedNameSpecifier(), 1943 Qualifier.getOpaqueData()) {} 1944 1945 static bool classof(const VisitorJob *VJ) { 1946 return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind; 1947 } 1948 1949 NestedNameSpecifierLoc get() const { 1950 return NestedNameSpecifierLoc( 1951 const_cast<NestedNameSpecifier *>( 1952 static_cast<const NestedNameSpecifier *>(data[0])), 1953 const_cast<void *>(data[1])); 1954 } 1955 }; 1956 1957 class DeclarationNameInfoVisit : public VisitorJob { 1958 public: 1959 DeclarationNameInfoVisit(const Stmt *S, CXCursor parent) 1960 : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {} 1961 static bool classof(const VisitorJob *VJ) { 1962 return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind; 1963 } 1964 DeclarationNameInfo get() const { 1965 const Stmt *S = static_cast<const Stmt *>(data[0]); 1966 switch (S->getStmtClass()) { 1967 default: 1968 llvm_unreachable("Unhandled Stmt"); 1969 case clang::Stmt::MSDependentExistsStmtClass: 1970 return cast<MSDependentExistsStmt>(S)->getNameInfo(); 1971 case Stmt::CXXDependentScopeMemberExprClass: 1972 return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo(); 1973 case Stmt::DependentScopeDeclRefExprClass: 1974 return cast<DependentScopeDeclRefExpr>(S)->getNameInfo(); 1975 case Stmt::OMPCriticalDirectiveClass: 1976 return cast<OMPCriticalDirective>(S)->getDirectiveName(); 1977 } 1978 } 1979 }; 1980 class MemberRefVisit : public VisitorJob { 1981 public: 1982 MemberRefVisit(const FieldDecl *D, SourceLocation L, CXCursor parent) 1983 : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D, 1984 L.getPtrEncoding()) {} 1985 static bool classof(const VisitorJob *VJ) { 1986 return VJ->getKind() == VisitorJob::MemberRefVisitKind; 1987 } 1988 const FieldDecl *get() const { 1989 return static_cast<const FieldDecl *>(data[0]); 1990 } 1991 SourceLocation getLoc() const { 1992 return SourceLocation::getFromRawEncoding( 1993 (SourceLocation::UIntTy)(uintptr_t)data[1]); 1994 } 1995 }; 1996 class EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void> { 1997 friend class OMPClauseEnqueue; 1998 VisitorWorkList &WL; 1999 CXCursor Parent; 2000 2001 public: 2002 EnqueueVisitor(VisitorWorkList &wl, CXCursor parent) 2003 : WL(wl), Parent(parent) {} 2004 2005 void VisitAddrLabelExpr(const AddrLabelExpr *E); 2006 void VisitBlockExpr(const BlockExpr *B); 2007 void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 2008 void VisitCompoundStmt(const CompoundStmt *S); 2009 void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ 2010 } 2011 void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S); 2012 void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E); 2013 void VisitCXXNewExpr(const CXXNewExpr *E); 2014 void VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E); 2015 void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *E); 2016 void VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E); 2017 void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E); 2018 void VisitCXXTypeidExpr(const CXXTypeidExpr *E); 2019 void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *E); 2020 void VisitCXXUuidofExpr(const CXXUuidofExpr *E); 2021 void VisitCXXCatchStmt(const CXXCatchStmt *S); 2022 void VisitCXXForRangeStmt(const CXXForRangeStmt *S); 2023 void VisitDeclRefExpr(const DeclRefExpr *D); 2024 void VisitDeclStmt(const DeclStmt *S); 2025 void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *E); 2026 void VisitDesignatedInitExpr(const DesignatedInitExpr *E); 2027 void VisitExplicitCastExpr(const ExplicitCastExpr *E); 2028 void VisitForStmt(const ForStmt *FS); 2029 void VisitGotoStmt(const GotoStmt *GS); 2030 void VisitIfStmt(const IfStmt *If); 2031 void VisitInitListExpr(const InitListExpr *IE); 2032 void VisitMemberExpr(const MemberExpr *M); 2033 void VisitOffsetOfExpr(const OffsetOfExpr *E); 2034 void VisitObjCEncodeExpr(const ObjCEncodeExpr *E); 2035 void VisitObjCMessageExpr(const ObjCMessageExpr *M); 2036 void VisitOverloadExpr(const OverloadExpr *E); 2037 void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E); 2038 void VisitStmt(const Stmt *S); 2039 void VisitSwitchStmt(const SwitchStmt *S); 2040 void VisitWhileStmt(const WhileStmt *W); 2041 void VisitTypeTraitExpr(const TypeTraitExpr *E); 2042 void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E); 2043 void VisitExpressionTraitExpr(const ExpressionTraitExpr *E); 2044 void VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U); 2045 void VisitVAArgExpr(const VAArgExpr *E); 2046 void VisitSizeOfPackExpr(const SizeOfPackExpr *E); 2047 void VisitPseudoObjectExpr(const PseudoObjectExpr *E); 2048 void VisitOpaqueValueExpr(const OpaqueValueExpr *E); 2049 void VisitLambdaExpr(const LambdaExpr *E); 2050 void VisitOMPExecutableDirective(const OMPExecutableDirective *D); 2051 void VisitOMPLoopBasedDirective(const OMPLoopBasedDirective *D); 2052 void VisitOMPLoopDirective(const OMPLoopDirective *D); 2053 void VisitOMPParallelDirective(const OMPParallelDirective *D); 2054 void VisitOMPSimdDirective(const OMPSimdDirective *D); 2055 void 2056 VisitOMPLoopTransformationDirective(const OMPLoopTransformationDirective *D); 2057 void VisitOMPTileDirective(const OMPTileDirective *D); 2058 void VisitOMPUnrollDirective(const OMPUnrollDirective *D); 2059 void VisitOMPForDirective(const OMPForDirective *D); 2060 void VisitOMPForSimdDirective(const OMPForSimdDirective *D); 2061 void VisitOMPSectionsDirective(const OMPSectionsDirective *D); 2062 void VisitOMPSectionDirective(const OMPSectionDirective *D); 2063 void VisitOMPSingleDirective(const OMPSingleDirective *D); 2064 void VisitOMPMasterDirective(const OMPMasterDirective *D); 2065 void VisitOMPCriticalDirective(const OMPCriticalDirective *D); 2066 void VisitOMPParallelForDirective(const OMPParallelForDirective *D); 2067 void VisitOMPParallelForSimdDirective(const OMPParallelForSimdDirective *D); 2068 void VisitOMPParallelMasterDirective(const OMPParallelMasterDirective *D); 2069 void VisitOMPParallelSectionsDirective(const OMPParallelSectionsDirective *D); 2070 void VisitOMPTaskDirective(const OMPTaskDirective *D); 2071 void VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D); 2072 void VisitOMPBarrierDirective(const OMPBarrierDirective *D); 2073 void VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D); 2074 void VisitOMPTaskgroupDirective(const OMPTaskgroupDirective *D); 2075 void 2076 VisitOMPCancellationPointDirective(const OMPCancellationPointDirective *D); 2077 void VisitOMPCancelDirective(const OMPCancelDirective *D); 2078 void VisitOMPFlushDirective(const OMPFlushDirective *D); 2079 void VisitOMPDepobjDirective(const OMPDepobjDirective *D); 2080 void VisitOMPScanDirective(const OMPScanDirective *D); 2081 void VisitOMPOrderedDirective(const OMPOrderedDirective *D); 2082 void VisitOMPAtomicDirective(const OMPAtomicDirective *D); 2083 void VisitOMPTargetDirective(const OMPTargetDirective *D); 2084 void VisitOMPTargetDataDirective(const OMPTargetDataDirective *D); 2085 void VisitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective *D); 2086 void VisitOMPTargetExitDataDirective(const OMPTargetExitDataDirective *D); 2087 void VisitOMPTargetParallelDirective(const OMPTargetParallelDirective *D); 2088 void 2089 VisitOMPTargetParallelForDirective(const OMPTargetParallelForDirective *D); 2090 void VisitOMPTeamsDirective(const OMPTeamsDirective *D); 2091 void VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D); 2092 void VisitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective *D); 2093 void VisitOMPMasterTaskLoopDirective(const OMPMasterTaskLoopDirective *D); 2094 void 2095 VisitOMPMasterTaskLoopSimdDirective(const OMPMasterTaskLoopSimdDirective *D); 2096 void VisitOMPParallelMasterTaskLoopDirective( 2097 const OMPParallelMasterTaskLoopDirective *D); 2098 void VisitOMPParallelMasterTaskLoopSimdDirective( 2099 const OMPParallelMasterTaskLoopSimdDirective *D); 2100 void VisitOMPDistributeDirective(const OMPDistributeDirective *D); 2101 void VisitOMPDistributeParallelForDirective( 2102 const OMPDistributeParallelForDirective *D); 2103 void VisitOMPDistributeParallelForSimdDirective( 2104 const OMPDistributeParallelForSimdDirective *D); 2105 void VisitOMPDistributeSimdDirective(const OMPDistributeSimdDirective *D); 2106 void VisitOMPTargetParallelForSimdDirective( 2107 const OMPTargetParallelForSimdDirective *D); 2108 void VisitOMPTargetSimdDirective(const OMPTargetSimdDirective *D); 2109 void VisitOMPTeamsDistributeDirective(const OMPTeamsDistributeDirective *D); 2110 void VisitOMPTeamsDistributeSimdDirective( 2111 const OMPTeamsDistributeSimdDirective *D); 2112 void VisitOMPTeamsDistributeParallelForSimdDirective( 2113 const OMPTeamsDistributeParallelForSimdDirective *D); 2114 void VisitOMPTeamsDistributeParallelForDirective( 2115 const OMPTeamsDistributeParallelForDirective *D); 2116 void VisitOMPTargetTeamsDirective(const OMPTargetTeamsDirective *D); 2117 void VisitOMPTargetTeamsDistributeDirective( 2118 const OMPTargetTeamsDistributeDirective *D); 2119 void VisitOMPTargetTeamsDistributeParallelForDirective( 2120 const OMPTargetTeamsDistributeParallelForDirective *D); 2121 void VisitOMPTargetTeamsDistributeParallelForSimdDirective( 2122 const OMPTargetTeamsDistributeParallelForSimdDirective *D); 2123 void VisitOMPTargetTeamsDistributeSimdDirective( 2124 const OMPTargetTeamsDistributeSimdDirective *D); 2125 2126 private: 2127 void AddDeclarationNameInfo(const Stmt *S); 2128 void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier); 2129 void AddExplicitTemplateArgs(const TemplateArgumentLoc *A, 2130 unsigned NumTemplateArgs); 2131 void AddMemberRef(const FieldDecl *D, SourceLocation L); 2132 void AddStmt(const Stmt *S); 2133 void AddDecl(const Decl *D, bool isFirst = true); 2134 void AddTypeLoc(TypeSourceInfo *TI); 2135 void EnqueueChildren(const Stmt *S); 2136 void EnqueueChildren(const OMPClause *S); 2137 }; 2138 } // namespace 2139 2140 void EnqueueVisitor::AddDeclarationNameInfo(const Stmt *S) { 2141 // 'S' should always be non-null, since it comes from the 2142 // statement we are visiting. 2143 WL.push_back(DeclarationNameInfoVisit(S, Parent)); 2144 } 2145 2146 void EnqueueVisitor::AddNestedNameSpecifierLoc( 2147 NestedNameSpecifierLoc Qualifier) { 2148 if (Qualifier) 2149 WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent)); 2150 } 2151 2152 void EnqueueVisitor::AddStmt(const Stmt *S) { 2153 if (S) 2154 WL.push_back(StmtVisit(S, Parent)); 2155 } 2156 void EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) { 2157 if (D) 2158 WL.push_back(DeclVisit(D, Parent, isFirst)); 2159 } 2160 void EnqueueVisitor::AddExplicitTemplateArgs(const TemplateArgumentLoc *A, 2161 unsigned NumTemplateArgs) { 2162 WL.push_back(ExplicitTemplateArgsVisit(A, A + NumTemplateArgs, Parent)); 2163 } 2164 void EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) { 2165 if (D) 2166 WL.push_back(MemberRefVisit(D, L, Parent)); 2167 } 2168 void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) { 2169 if (TI) 2170 WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent)); 2171 } 2172 void EnqueueVisitor::EnqueueChildren(const Stmt *S) { 2173 unsigned size = WL.size(); 2174 for (const Stmt *SubStmt : S->children()) { 2175 AddStmt(SubStmt); 2176 } 2177 if (size == WL.size()) 2178 return; 2179 // Now reverse the entries we just added. This will match the DFS 2180 // ordering performed by the worklist. 2181 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 2182 std::reverse(I, E); 2183 } 2184 namespace { 2185 class OMPClauseEnqueue : public ConstOMPClauseVisitor<OMPClauseEnqueue> { 2186 EnqueueVisitor *Visitor; 2187 /// Process clauses with list of variables. 2188 template <typename T> void VisitOMPClauseList(T *Node); 2189 2190 public: 2191 OMPClauseEnqueue(EnqueueVisitor *Visitor) : Visitor(Visitor) {} 2192 #define GEN_CLANG_CLAUSE_CLASS 2193 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(const Class *C); 2194 #include "llvm/Frontend/OpenMP/OMP.inc" 2195 void VisitOMPClauseWithPreInit(const OMPClauseWithPreInit *C); 2196 void VisitOMPClauseWithPostUpdate(const OMPClauseWithPostUpdate *C); 2197 }; 2198 2199 void OMPClauseEnqueue::VisitOMPClauseWithPreInit( 2200 const OMPClauseWithPreInit *C) { 2201 Visitor->AddStmt(C->getPreInitStmt()); 2202 } 2203 2204 void OMPClauseEnqueue::VisitOMPClauseWithPostUpdate( 2205 const OMPClauseWithPostUpdate *C) { 2206 VisitOMPClauseWithPreInit(C); 2207 Visitor->AddStmt(C->getPostUpdateExpr()); 2208 } 2209 2210 void OMPClauseEnqueue::VisitOMPIfClause(const OMPIfClause *C) { 2211 VisitOMPClauseWithPreInit(C); 2212 Visitor->AddStmt(C->getCondition()); 2213 } 2214 2215 void OMPClauseEnqueue::VisitOMPFinalClause(const OMPFinalClause *C) { 2216 Visitor->AddStmt(C->getCondition()); 2217 } 2218 2219 void OMPClauseEnqueue::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) { 2220 VisitOMPClauseWithPreInit(C); 2221 Visitor->AddStmt(C->getNumThreads()); 2222 } 2223 2224 void OMPClauseEnqueue::VisitOMPSafelenClause(const OMPSafelenClause *C) { 2225 Visitor->AddStmt(C->getSafelen()); 2226 } 2227 2228 void OMPClauseEnqueue::VisitOMPSimdlenClause(const OMPSimdlenClause *C) { 2229 Visitor->AddStmt(C->getSimdlen()); 2230 } 2231 2232 void OMPClauseEnqueue::VisitOMPSizesClause(const OMPSizesClause *C) { 2233 for (auto E : C->getSizesRefs()) 2234 Visitor->AddStmt(E); 2235 } 2236 2237 void OMPClauseEnqueue::VisitOMPFullClause(const OMPFullClause *C) {} 2238 2239 void OMPClauseEnqueue::VisitOMPPartialClause(const OMPPartialClause *C) { 2240 Visitor->AddStmt(C->getFactor()); 2241 } 2242 2243 void OMPClauseEnqueue::VisitOMPAllocatorClause(const OMPAllocatorClause *C) { 2244 Visitor->AddStmt(C->getAllocator()); 2245 } 2246 2247 void OMPClauseEnqueue::VisitOMPCollapseClause(const OMPCollapseClause *C) { 2248 Visitor->AddStmt(C->getNumForLoops()); 2249 } 2250 2251 void OMPClauseEnqueue::VisitOMPDefaultClause(const OMPDefaultClause *C) {} 2252 2253 void OMPClauseEnqueue::VisitOMPProcBindClause(const OMPProcBindClause *C) {} 2254 2255 void OMPClauseEnqueue::VisitOMPScheduleClause(const OMPScheduleClause *C) { 2256 VisitOMPClauseWithPreInit(C); 2257 Visitor->AddStmt(C->getChunkSize()); 2258 } 2259 2260 void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *C) { 2261 Visitor->AddStmt(C->getNumForLoops()); 2262 } 2263 2264 void OMPClauseEnqueue::VisitOMPDetachClause(const OMPDetachClause *C) { 2265 Visitor->AddStmt(C->getEventHandler()); 2266 } 2267 2268 void OMPClauseEnqueue::VisitOMPNowaitClause(const OMPNowaitClause *) {} 2269 2270 void OMPClauseEnqueue::VisitOMPUntiedClause(const OMPUntiedClause *) {} 2271 2272 void OMPClauseEnqueue::VisitOMPMergeableClause(const OMPMergeableClause *) {} 2273 2274 void OMPClauseEnqueue::VisitOMPReadClause(const OMPReadClause *) {} 2275 2276 void OMPClauseEnqueue::VisitOMPWriteClause(const OMPWriteClause *) {} 2277 2278 void OMPClauseEnqueue::VisitOMPUpdateClause(const OMPUpdateClause *) {} 2279 2280 void OMPClauseEnqueue::VisitOMPCaptureClause(const OMPCaptureClause *) {} 2281 2282 void OMPClauseEnqueue::VisitOMPCompareClause(const OMPCompareClause *) {} 2283 2284 void OMPClauseEnqueue::VisitOMPSeqCstClause(const OMPSeqCstClause *) {} 2285 2286 void OMPClauseEnqueue::VisitOMPAcqRelClause(const OMPAcqRelClause *) {} 2287 2288 void OMPClauseEnqueue::VisitOMPAcquireClause(const OMPAcquireClause *) {} 2289 2290 void OMPClauseEnqueue::VisitOMPReleaseClause(const OMPReleaseClause *) {} 2291 2292 void OMPClauseEnqueue::VisitOMPRelaxedClause(const OMPRelaxedClause *) {} 2293 2294 void OMPClauseEnqueue::VisitOMPThreadsClause(const OMPThreadsClause *) {} 2295 2296 void OMPClauseEnqueue::VisitOMPSIMDClause(const OMPSIMDClause *) {} 2297 2298 void OMPClauseEnqueue::VisitOMPNogroupClause(const OMPNogroupClause *) {} 2299 2300 void OMPClauseEnqueue::VisitOMPInitClause(const OMPInitClause *C) { 2301 VisitOMPClauseList(C); 2302 } 2303 2304 void OMPClauseEnqueue::VisitOMPUseClause(const OMPUseClause *C) { 2305 Visitor->AddStmt(C->getInteropVar()); 2306 } 2307 2308 void OMPClauseEnqueue::VisitOMPDestroyClause(const OMPDestroyClause *C) { 2309 if (C->getInteropVar()) 2310 Visitor->AddStmt(C->getInteropVar()); 2311 } 2312 2313 void OMPClauseEnqueue::VisitOMPNovariantsClause(const OMPNovariantsClause *C) { 2314 Visitor->AddStmt(C->getCondition()); 2315 } 2316 2317 void OMPClauseEnqueue::VisitOMPNocontextClause(const OMPNocontextClause *C) { 2318 Visitor->AddStmt(C->getCondition()); 2319 } 2320 2321 void OMPClauseEnqueue::VisitOMPFilterClause(const OMPFilterClause *C) { 2322 VisitOMPClauseWithPreInit(C); 2323 Visitor->AddStmt(C->getThreadID()); 2324 } 2325 2326 void OMPClauseEnqueue::VisitOMPAlignClause(const OMPAlignClause *C) { 2327 Visitor->AddStmt(C->getAlignment()); 2328 } 2329 2330 void OMPClauseEnqueue::VisitOMPUnifiedAddressClause( 2331 const OMPUnifiedAddressClause *) {} 2332 2333 void OMPClauseEnqueue::VisitOMPUnifiedSharedMemoryClause( 2334 const OMPUnifiedSharedMemoryClause *) {} 2335 2336 void OMPClauseEnqueue::VisitOMPReverseOffloadClause( 2337 const OMPReverseOffloadClause *) {} 2338 2339 void OMPClauseEnqueue::VisitOMPDynamicAllocatorsClause( 2340 const OMPDynamicAllocatorsClause *) {} 2341 2342 void OMPClauseEnqueue::VisitOMPAtomicDefaultMemOrderClause( 2343 const OMPAtomicDefaultMemOrderClause *) {} 2344 2345 void OMPClauseEnqueue::VisitOMPDeviceClause(const OMPDeviceClause *C) { 2346 Visitor->AddStmt(C->getDevice()); 2347 } 2348 2349 void OMPClauseEnqueue::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) { 2350 VisitOMPClauseWithPreInit(C); 2351 Visitor->AddStmt(C->getNumTeams()); 2352 } 2353 2354 void OMPClauseEnqueue::VisitOMPThreadLimitClause( 2355 const OMPThreadLimitClause *C) { 2356 VisitOMPClauseWithPreInit(C); 2357 Visitor->AddStmt(C->getThreadLimit()); 2358 } 2359 2360 void OMPClauseEnqueue::VisitOMPPriorityClause(const OMPPriorityClause *C) { 2361 Visitor->AddStmt(C->getPriority()); 2362 } 2363 2364 void OMPClauseEnqueue::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) { 2365 Visitor->AddStmt(C->getGrainsize()); 2366 } 2367 2368 void OMPClauseEnqueue::VisitOMPNumTasksClause(const OMPNumTasksClause *C) { 2369 Visitor->AddStmt(C->getNumTasks()); 2370 } 2371 2372 void OMPClauseEnqueue::VisitOMPHintClause(const OMPHintClause *C) { 2373 Visitor->AddStmt(C->getHint()); 2374 } 2375 2376 template <typename T> void OMPClauseEnqueue::VisitOMPClauseList(T *Node) { 2377 for (const auto *I : Node->varlists()) { 2378 Visitor->AddStmt(I); 2379 } 2380 } 2381 2382 void OMPClauseEnqueue::VisitOMPInclusiveClause(const OMPInclusiveClause *C) { 2383 VisitOMPClauseList(C); 2384 } 2385 void OMPClauseEnqueue::VisitOMPExclusiveClause(const OMPExclusiveClause *C) { 2386 VisitOMPClauseList(C); 2387 } 2388 void OMPClauseEnqueue::VisitOMPAllocateClause(const OMPAllocateClause *C) { 2389 VisitOMPClauseList(C); 2390 Visitor->AddStmt(C->getAllocator()); 2391 } 2392 void OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) { 2393 VisitOMPClauseList(C); 2394 for (const auto *E : C->private_copies()) { 2395 Visitor->AddStmt(E); 2396 } 2397 } 2398 void OMPClauseEnqueue::VisitOMPFirstprivateClause( 2399 const OMPFirstprivateClause *C) { 2400 VisitOMPClauseList(C); 2401 VisitOMPClauseWithPreInit(C); 2402 for (const auto *E : C->private_copies()) { 2403 Visitor->AddStmt(E); 2404 } 2405 for (const auto *E : C->inits()) { 2406 Visitor->AddStmt(E); 2407 } 2408 } 2409 void OMPClauseEnqueue::VisitOMPLastprivateClause( 2410 const OMPLastprivateClause *C) { 2411 VisitOMPClauseList(C); 2412 VisitOMPClauseWithPostUpdate(C); 2413 for (auto *E : C->private_copies()) { 2414 Visitor->AddStmt(E); 2415 } 2416 for (auto *E : C->source_exprs()) { 2417 Visitor->AddStmt(E); 2418 } 2419 for (auto *E : C->destination_exprs()) { 2420 Visitor->AddStmt(E); 2421 } 2422 for (auto *E : C->assignment_ops()) { 2423 Visitor->AddStmt(E); 2424 } 2425 } 2426 void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) { 2427 VisitOMPClauseList(C); 2428 } 2429 void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) { 2430 VisitOMPClauseList(C); 2431 VisitOMPClauseWithPostUpdate(C); 2432 for (auto *E : C->privates()) { 2433 Visitor->AddStmt(E); 2434 } 2435 for (auto *E : C->lhs_exprs()) { 2436 Visitor->AddStmt(E); 2437 } 2438 for (auto *E : C->rhs_exprs()) { 2439 Visitor->AddStmt(E); 2440 } 2441 for (auto *E : C->reduction_ops()) { 2442 Visitor->AddStmt(E); 2443 } 2444 if (C->getModifier() == clang::OMPC_REDUCTION_inscan) { 2445 for (auto *E : C->copy_ops()) { 2446 Visitor->AddStmt(E); 2447 } 2448 for (auto *E : C->copy_array_temps()) { 2449 Visitor->AddStmt(E); 2450 } 2451 for (auto *E : C->copy_array_elems()) { 2452 Visitor->AddStmt(E); 2453 } 2454 } 2455 } 2456 void OMPClauseEnqueue::VisitOMPTaskReductionClause( 2457 const OMPTaskReductionClause *C) { 2458 VisitOMPClauseList(C); 2459 VisitOMPClauseWithPostUpdate(C); 2460 for (auto *E : C->privates()) { 2461 Visitor->AddStmt(E); 2462 } 2463 for (auto *E : C->lhs_exprs()) { 2464 Visitor->AddStmt(E); 2465 } 2466 for (auto *E : C->rhs_exprs()) { 2467 Visitor->AddStmt(E); 2468 } 2469 for (auto *E : C->reduction_ops()) { 2470 Visitor->AddStmt(E); 2471 } 2472 } 2473 void OMPClauseEnqueue::VisitOMPInReductionClause( 2474 const OMPInReductionClause *C) { 2475 VisitOMPClauseList(C); 2476 VisitOMPClauseWithPostUpdate(C); 2477 for (auto *E : C->privates()) { 2478 Visitor->AddStmt(E); 2479 } 2480 for (auto *E : C->lhs_exprs()) { 2481 Visitor->AddStmt(E); 2482 } 2483 for (auto *E : C->rhs_exprs()) { 2484 Visitor->AddStmt(E); 2485 } 2486 for (auto *E : C->reduction_ops()) { 2487 Visitor->AddStmt(E); 2488 } 2489 for (auto *E : C->taskgroup_descriptors()) 2490 Visitor->AddStmt(E); 2491 } 2492 void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) { 2493 VisitOMPClauseList(C); 2494 VisitOMPClauseWithPostUpdate(C); 2495 for (const auto *E : C->privates()) { 2496 Visitor->AddStmt(E); 2497 } 2498 for (const auto *E : C->inits()) { 2499 Visitor->AddStmt(E); 2500 } 2501 for (const auto *E : C->updates()) { 2502 Visitor->AddStmt(E); 2503 } 2504 for (const auto *E : C->finals()) { 2505 Visitor->AddStmt(E); 2506 } 2507 Visitor->AddStmt(C->getStep()); 2508 Visitor->AddStmt(C->getCalcStep()); 2509 } 2510 void OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) { 2511 VisitOMPClauseList(C); 2512 Visitor->AddStmt(C->getAlignment()); 2513 } 2514 void OMPClauseEnqueue::VisitOMPCopyinClause(const OMPCopyinClause *C) { 2515 VisitOMPClauseList(C); 2516 for (auto *E : C->source_exprs()) { 2517 Visitor->AddStmt(E); 2518 } 2519 for (auto *E : C->destination_exprs()) { 2520 Visitor->AddStmt(E); 2521 } 2522 for (auto *E : C->assignment_ops()) { 2523 Visitor->AddStmt(E); 2524 } 2525 } 2526 void OMPClauseEnqueue::VisitOMPCopyprivateClause( 2527 const OMPCopyprivateClause *C) { 2528 VisitOMPClauseList(C); 2529 for (auto *E : C->source_exprs()) { 2530 Visitor->AddStmt(E); 2531 } 2532 for (auto *E : C->destination_exprs()) { 2533 Visitor->AddStmt(E); 2534 } 2535 for (auto *E : C->assignment_ops()) { 2536 Visitor->AddStmt(E); 2537 } 2538 } 2539 void OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) { 2540 VisitOMPClauseList(C); 2541 } 2542 void OMPClauseEnqueue::VisitOMPDepobjClause(const OMPDepobjClause *C) { 2543 Visitor->AddStmt(C->getDepobj()); 2544 } 2545 void OMPClauseEnqueue::VisitOMPDependClause(const OMPDependClause *C) { 2546 VisitOMPClauseList(C); 2547 } 2548 void OMPClauseEnqueue::VisitOMPMapClause(const OMPMapClause *C) { 2549 VisitOMPClauseList(C); 2550 } 2551 void OMPClauseEnqueue::VisitOMPDistScheduleClause( 2552 const OMPDistScheduleClause *C) { 2553 VisitOMPClauseWithPreInit(C); 2554 Visitor->AddStmt(C->getChunkSize()); 2555 } 2556 void OMPClauseEnqueue::VisitOMPDefaultmapClause( 2557 const OMPDefaultmapClause * /*C*/) {} 2558 void OMPClauseEnqueue::VisitOMPToClause(const OMPToClause *C) { 2559 VisitOMPClauseList(C); 2560 } 2561 void OMPClauseEnqueue::VisitOMPFromClause(const OMPFromClause *C) { 2562 VisitOMPClauseList(C); 2563 } 2564 void OMPClauseEnqueue::VisitOMPUseDevicePtrClause( 2565 const OMPUseDevicePtrClause *C) { 2566 VisitOMPClauseList(C); 2567 } 2568 void OMPClauseEnqueue::VisitOMPUseDeviceAddrClause( 2569 const OMPUseDeviceAddrClause *C) { 2570 VisitOMPClauseList(C); 2571 } 2572 void OMPClauseEnqueue::VisitOMPIsDevicePtrClause( 2573 const OMPIsDevicePtrClause *C) { 2574 VisitOMPClauseList(C); 2575 } 2576 void OMPClauseEnqueue::VisitOMPNontemporalClause( 2577 const OMPNontemporalClause *C) { 2578 VisitOMPClauseList(C); 2579 for (const auto *E : C->private_refs()) 2580 Visitor->AddStmt(E); 2581 } 2582 void OMPClauseEnqueue::VisitOMPOrderClause(const OMPOrderClause *C) {} 2583 void OMPClauseEnqueue::VisitOMPUsesAllocatorsClause( 2584 const OMPUsesAllocatorsClause *C) { 2585 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 2586 const OMPUsesAllocatorsClause::Data &D = C->getAllocatorData(I); 2587 Visitor->AddStmt(D.Allocator); 2588 Visitor->AddStmt(D.AllocatorTraits); 2589 } 2590 } 2591 void OMPClauseEnqueue::VisitOMPAffinityClause(const OMPAffinityClause *C) { 2592 Visitor->AddStmt(C->getModifier()); 2593 for (const Expr *E : C->varlists()) 2594 Visitor->AddStmt(E); 2595 } 2596 void OMPClauseEnqueue::VisitOMPBindClause(const OMPBindClause *C) {} 2597 2598 } // namespace 2599 2600 void EnqueueVisitor::EnqueueChildren(const OMPClause *S) { 2601 unsigned size = WL.size(); 2602 OMPClauseEnqueue Visitor(this); 2603 Visitor.Visit(S); 2604 if (size == WL.size()) 2605 return; 2606 // Now reverse the entries we just added. This will match the DFS 2607 // ordering performed by the worklist. 2608 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 2609 std::reverse(I, E); 2610 } 2611 void EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) { 2612 WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent)); 2613 } 2614 void EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) { 2615 AddDecl(B->getBlockDecl()); 2616 } 2617 void EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 2618 EnqueueChildren(E); 2619 AddTypeLoc(E->getTypeSourceInfo()); 2620 } 2621 void EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) { 2622 for (auto &I : llvm::reverse(S->body())) 2623 AddStmt(I); 2624 } 2625 void EnqueueVisitor::VisitMSDependentExistsStmt( 2626 const MSDependentExistsStmt *S) { 2627 AddStmt(S->getSubStmt()); 2628 AddDeclarationNameInfo(S); 2629 if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc()) 2630 AddNestedNameSpecifierLoc(QualifierLoc); 2631 } 2632 2633 void EnqueueVisitor::VisitCXXDependentScopeMemberExpr( 2634 const CXXDependentScopeMemberExpr *E) { 2635 if (E->hasExplicitTemplateArgs()) 2636 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); 2637 AddDeclarationNameInfo(E); 2638 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc()) 2639 AddNestedNameSpecifierLoc(QualifierLoc); 2640 if (!E->isImplicitAccess()) 2641 AddStmt(E->getBase()); 2642 } 2643 void EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) { 2644 // Enqueue the initializer , if any. 2645 AddStmt(E->getInitializer()); 2646 // Enqueue the array size, if any. 2647 AddStmt(E->getArraySize().getValueOr(nullptr)); 2648 // Enqueue the allocated type. 2649 AddTypeLoc(E->getAllocatedTypeSourceInfo()); 2650 // Enqueue the placement arguments. 2651 for (unsigned I = E->getNumPlacementArgs(); I > 0; --I) 2652 AddStmt(E->getPlacementArg(I - 1)); 2653 } 2654 void EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) { 2655 for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I) 2656 AddStmt(CE->getArg(I - 1)); 2657 AddStmt(CE->getCallee()); 2658 AddStmt(CE->getArg(0)); 2659 } 2660 void EnqueueVisitor::VisitCXXPseudoDestructorExpr( 2661 const CXXPseudoDestructorExpr *E) { 2662 // Visit the name of the type being destroyed. 2663 AddTypeLoc(E->getDestroyedTypeInfo()); 2664 // Visit the scope type that looks disturbingly like the nested-name-specifier 2665 // but isn't. 2666 AddTypeLoc(E->getScopeTypeInfo()); 2667 // Visit the nested-name-specifier. 2668 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc()) 2669 AddNestedNameSpecifierLoc(QualifierLoc); 2670 // Visit base expression. 2671 AddStmt(E->getBase()); 2672 } 2673 void EnqueueVisitor::VisitCXXScalarValueInitExpr( 2674 const CXXScalarValueInitExpr *E) { 2675 AddTypeLoc(E->getTypeSourceInfo()); 2676 } 2677 void EnqueueVisitor::VisitCXXTemporaryObjectExpr( 2678 const CXXTemporaryObjectExpr *E) { 2679 EnqueueChildren(E); 2680 AddTypeLoc(E->getTypeSourceInfo()); 2681 } 2682 void EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) { 2683 EnqueueChildren(E); 2684 if (E->isTypeOperand()) 2685 AddTypeLoc(E->getTypeOperandSourceInfo()); 2686 } 2687 2688 void EnqueueVisitor::VisitCXXUnresolvedConstructExpr( 2689 const CXXUnresolvedConstructExpr *E) { 2690 EnqueueChildren(E); 2691 AddTypeLoc(E->getTypeSourceInfo()); 2692 } 2693 void EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) { 2694 EnqueueChildren(E); 2695 if (E->isTypeOperand()) 2696 AddTypeLoc(E->getTypeOperandSourceInfo()); 2697 } 2698 2699 void EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) { 2700 EnqueueChildren(S); 2701 AddDecl(S->getExceptionDecl()); 2702 } 2703 2704 void EnqueueVisitor::VisitCXXForRangeStmt(const CXXForRangeStmt *S) { 2705 AddStmt(S->getBody()); 2706 AddStmt(S->getRangeInit()); 2707 AddDecl(S->getLoopVariable()); 2708 } 2709 2710 void EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) { 2711 if (DR->hasExplicitTemplateArgs()) 2712 AddExplicitTemplateArgs(DR->getTemplateArgs(), DR->getNumTemplateArgs()); 2713 WL.push_back(DeclRefExprParts(DR, Parent)); 2714 } 2715 void EnqueueVisitor::VisitDependentScopeDeclRefExpr( 2716 const DependentScopeDeclRefExpr *E) { 2717 if (E->hasExplicitTemplateArgs()) 2718 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); 2719 AddDeclarationNameInfo(E); 2720 AddNestedNameSpecifierLoc(E->getQualifierLoc()); 2721 } 2722 void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) { 2723 unsigned size = WL.size(); 2724 bool isFirst = true; 2725 for (const auto *D : S->decls()) { 2726 AddDecl(D, isFirst); 2727 isFirst = false; 2728 } 2729 if (size == WL.size()) 2730 return; 2731 // Now reverse the entries we just added. This will match the DFS 2732 // ordering performed by the worklist. 2733 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 2734 std::reverse(I, E); 2735 } 2736 void EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) { 2737 AddStmt(E->getInit()); 2738 for (const DesignatedInitExpr::Designator &D : 2739 llvm::reverse(E->designators())) { 2740 if (D.isFieldDesignator()) { 2741 if (FieldDecl *Field = D.getField()) 2742 AddMemberRef(Field, D.getFieldLoc()); 2743 continue; 2744 } 2745 if (D.isArrayDesignator()) { 2746 AddStmt(E->getArrayIndex(D)); 2747 continue; 2748 } 2749 assert(D.isArrayRangeDesignator() && "Unknown designator kind"); 2750 AddStmt(E->getArrayRangeEnd(D)); 2751 AddStmt(E->getArrayRangeStart(D)); 2752 } 2753 } 2754 void EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) { 2755 EnqueueChildren(E); 2756 AddTypeLoc(E->getTypeInfoAsWritten()); 2757 } 2758 void EnqueueVisitor::VisitForStmt(const ForStmt *FS) { 2759 AddStmt(FS->getBody()); 2760 AddStmt(FS->getInc()); 2761 AddStmt(FS->getCond()); 2762 AddDecl(FS->getConditionVariable()); 2763 AddStmt(FS->getInit()); 2764 } 2765 void EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) { 2766 WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent)); 2767 } 2768 void EnqueueVisitor::VisitIfStmt(const IfStmt *If) { 2769 AddStmt(If->getElse()); 2770 AddStmt(If->getThen()); 2771 AddStmt(If->getCond()); 2772 AddStmt(If->getInit()); 2773 AddDecl(If->getConditionVariable()); 2774 } 2775 void EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) { 2776 // We care about the syntactic form of the initializer list, only. 2777 if (InitListExpr *Syntactic = IE->getSyntacticForm()) 2778 IE = Syntactic; 2779 EnqueueChildren(IE); 2780 } 2781 void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) { 2782 WL.push_back(MemberExprParts(M, Parent)); 2783 2784 // If the base of the member access expression is an implicit 'this', don't 2785 // visit it. 2786 // FIXME: If we ever want to show these implicit accesses, this will be 2787 // unfortunate. However, clang_getCursor() relies on this behavior. 2788 if (M->isImplicitAccess()) 2789 return; 2790 2791 // Ignore base anonymous struct/union fields, otherwise they will shadow the 2792 // real field that we are interested in. 2793 if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) { 2794 if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) { 2795 if (FD->isAnonymousStructOrUnion()) { 2796 AddStmt(SubME->getBase()); 2797 return; 2798 } 2799 } 2800 } 2801 2802 AddStmt(M->getBase()); 2803 } 2804 void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { 2805 AddTypeLoc(E->getEncodedTypeSourceInfo()); 2806 } 2807 void EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) { 2808 EnqueueChildren(M); 2809 AddTypeLoc(M->getClassReceiverTypeInfo()); 2810 } 2811 void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) { 2812 // Visit the components of the offsetof expression. 2813 for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) { 2814 const OffsetOfNode &Node = E->getComponent(I - 1); 2815 switch (Node.getKind()) { 2816 case OffsetOfNode::Array: 2817 AddStmt(E->getIndexExpr(Node.getArrayExprIndex())); 2818 break; 2819 case OffsetOfNode::Field: 2820 AddMemberRef(Node.getField(), Node.getSourceRange().getEnd()); 2821 break; 2822 case OffsetOfNode::Identifier: 2823 case OffsetOfNode::Base: 2824 continue; 2825 } 2826 } 2827 // Visit the type into which we're computing the offset. 2828 AddTypeLoc(E->getTypeSourceInfo()); 2829 } 2830 void EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) { 2831 if (E->hasExplicitTemplateArgs()) 2832 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); 2833 WL.push_back(OverloadExprParts(E, Parent)); 2834 } 2835 void EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr( 2836 const UnaryExprOrTypeTraitExpr *E) { 2837 EnqueueChildren(E); 2838 if (E->isArgumentType()) 2839 AddTypeLoc(E->getArgumentTypeInfo()); 2840 } 2841 void EnqueueVisitor::VisitStmt(const Stmt *S) { EnqueueChildren(S); } 2842 void EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) { 2843 AddStmt(S->getBody()); 2844 AddStmt(S->getCond()); 2845 AddDecl(S->getConditionVariable()); 2846 } 2847 2848 void EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) { 2849 AddStmt(W->getBody()); 2850 AddStmt(W->getCond()); 2851 AddDecl(W->getConditionVariable()); 2852 } 2853 2854 void EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) { 2855 for (unsigned I = E->getNumArgs(); I > 0; --I) 2856 AddTypeLoc(E->getArg(I - 1)); 2857 } 2858 2859 void EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) { 2860 AddTypeLoc(E->getQueriedTypeSourceInfo()); 2861 } 2862 2863 void EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) { 2864 EnqueueChildren(E); 2865 } 2866 2867 void EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) { 2868 VisitOverloadExpr(U); 2869 if (!U->isImplicitAccess()) 2870 AddStmt(U->getBase()); 2871 } 2872 void EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) { 2873 AddStmt(E->getSubExpr()); 2874 AddTypeLoc(E->getWrittenTypeInfo()); 2875 } 2876 void EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) { 2877 WL.push_back(SizeOfPackExprParts(E, Parent)); 2878 } 2879 void EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) { 2880 // If the opaque value has a source expression, just transparently 2881 // visit that. This is useful for (e.g.) pseudo-object expressions. 2882 if (Expr *SourceExpr = E->getSourceExpr()) 2883 return Visit(SourceExpr); 2884 } 2885 void EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) { 2886 AddStmt(E->getBody()); 2887 WL.push_back(LambdaExprParts(E, Parent)); 2888 } 2889 void EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) { 2890 // Treat the expression like its syntactic form. 2891 Visit(E->getSyntacticForm()); 2892 } 2893 2894 void EnqueueVisitor::VisitOMPExecutableDirective( 2895 const OMPExecutableDirective *D) { 2896 EnqueueChildren(D); 2897 for (ArrayRef<OMPClause *>::iterator I = D->clauses().begin(), 2898 E = D->clauses().end(); 2899 I != E; ++I) 2900 EnqueueChildren(*I); 2901 } 2902 2903 void EnqueueVisitor::VisitOMPLoopBasedDirective( 2904 const OMPLoopBasedDirective *D) { 2905 VisitOMPExecutableDirective(D); 2906 } 2907 2908 void EnqueueVisitor::VisitOMPLoopDirective(const OMPLoopDirective *D) { 2909 VisitOMPLoopBasedDirective(D); 2910 } 2911 2912 void EnqueueVisitor::VisitOMPParallelDirective(const OMPParallelDirective *D) { 2913 VisitOMPExecutableDirective(D); 2914 } 2915 2916 void EnqueueVisitor::VisitOMPSimdDirective(const OMPSimdDirective *D) { 2917 VisitOMPLoopDirective(D); 2918 } 2919 2920 void EnqueueVisitor::VisitOMPLoopTransformationDirective( 2921 const OMPLoopTransformationDirective *D) { 2922 VisitOMPLoopBasedDirective(D); 2923 } 2924 2925 void EnqueueVisitor::VisitOMPTileDirective(const OMPTileDirective *D) { 2926 VisitOMPLoopTransformationDirective(D); 2927 } 2928 2929 void EnqueueVisitor::VisitOMPUnrollDirective(const OMPUnrollDirective *D) { 2930 VisitOMPLoopTransformationDirective(D); 2931 } 2932 2933 void EnqueueVisitor::VisitOMPForDirective(const OMPForDirective *D) { 2934 VisitOMPLoopDirective(D); 2935 } 2936 2937 void EnqueueVisitor::VisitOMPForSimdDirective(const OMPForSimdDirective *D) { 2938 VisitOMPLoopDirective(D); 2939 } 2940 2941 void EnqueueVisitor::VisitOMPSectionsDirective(const OMPSectionsDirective *D) { 2942 VisitOMPExecutableDirective(D); 2943 } 2944 2945 void EnqueueVisitor::VisitOMPSectionDirective(const OMPSectionDirective *D) { 2946 VisitOMPExecutableDirective(D); 2947 } 2948 2949 void EnqueueVisitor::VisitOMPSingleDirective(const OMPSingleDirective *D) { 2950 VisitOMPExecutableDirective(D); 2951 } 2952 2953 void EnqueueVisitor::VisitOMPMasterDirective(const OMPMasterDirective *D) { 2954 VisitOMPExecutableDirective(D); 2955 } 2956 2957 void EnqueueVisitor::VisitOMPCriticalDirective(const OMPCriticalDirective *D) { 2958 VisitOMPExecutableDirective(D); 2959 AddDeclarationNameInfo(D); 2960 } 2961 2962 void EnqueueVisitor::VisitOMPParallelForDirective( 2963 const OMPParallelForDirective *D) { 2964 VisitOMPLoopDirective(D); 2965 } 2966 2967 void EnqueueVisitor::VisitOMPParallelForSimdDirective( 2968 const OMPParallelForSimdDirective *D) { 2969 VisitOMPLoopDirective(D); 2970 } 2971 2972 void EnqueueVisitor::VisitOMPParallelMasterDirective( 2973 const OMPParallelMasterDirective *D) { 2974 VisitOMPExecutableDirective(D); 2975 } 2976 2977 void EnqueueVisitor::VisitOMPParallelSectionsDirective( 2978 const OMPParallelSectionsDirective *D) { 2979 VisitOMPExecutableDirective(D); 2980 } 2981 2982 void EnqueueVisitor::VisitOMPTaskDirective(const OMPTaskDirective *D) { 2983 VisitOMPExecutableDirective(D); 2984 } 2985 2986 void EnqueueVisitor::VisitOMPTaskyieldDirective( 2987 const OMPTaskyieldDirective *D) { 2988 VisitOMPExecutableDirective(D); 2989 } 2990 2991 void EnqueueVisitor::VisitOMPBarrierDirective(const OMPBarrierDirective *D) { 2992 VisitOMPExecutableDirective(D); 2993 } 2994 2995 void EnqueueVisitor::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D) { 2996 VisitOMPExecutableDirective(D); 2997 } 2998 2999 void EnqueueVisitor::VisitOMPTaskgroupDirective( 3000 const OMPTaskgroupDirective *D) { 3001 VisitOMPExecutableDirective(D); 3002 if (const Expr *E = D->getReductionRef()) 3003 VisitStmt(E); 3004 } 3005 3006 void EnqueueVisitor::VisitOMPFlushDirective(const OMPFlushDirective *D) { 3007 VisitOMPExecutableDirective(D); 3008 } 3009 3010 void EnqueueVisitor::VisitOMPDepobjDirective(const OMPDepobjDirective *D) { 3011 VisitOMPExecutableDirective(D); 3012 } 3013 3014 void EnqueueVisitor::VisitOMPScanDirective(const OMPScanDirective *D) { 3015 VisitOMPExecutableDirective(D); 3016 } 3017 3018 void EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) { 3019 VisitOMPExecutableDirective(D); 3020 } 3021 3022 void EnqueueVisitor::VisitOMPAtomicDirective(const OMPAtomicDirective *D) { 3023 VisitOMPExecutableDirective(D); 3024 } 3025 3026 void EnqueueVisitor::VisitOMPTargetDirective(const OMPTargetDirective *D) { 3027 VisitOMPExecutableDirective(D); 3028 } 3029 3030 void EnqueueVisitor::VisitOMPTargetDataDirective( 3031 const OMPTargetDataDirective *D) { 3032 VisitOMPExecutableDirective(D); 3033 } 3034 3035 void EnqueueVisitor::VisitOMPTargetEnterDataDirective( 3036 const OMPTargetEnterDataDirective *D) { 3037 VisitOMPExecutableDirective(D); 3038 } 3039 3040 void EnqueueVisitor::VisitOMPTargetExitDataDirective( 3041 const OMPTargetExitDataDirective *D) { 3042 VisitOMPExecutableDirective(D); 3043 } 3044 3045 void EnqueueVisitor::VisitOMPTargetParallelDirective( 3046 const OMPTargetParallelDirective *D) { 3047 VisitOMPExecutableDirective(D); 3048 } 3049 3050 void EnqueueVisitor::VisitOMPTargetParallelForDirective( 3051 const OMPTargetParallelForDirective *D) { 3052 VisitOMPLoopDirective(D); 3053 } 3054 3055 void EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) { 3056 VisitOMPExecutableDirective(D); 3057 } 3058 3059 void EnqueueVisitor::VisitOMPCancellationPointDirective( 3060 const OMPCancellationPointDirective *D) { 3061 VisitOMPExecutableDirective(D); 3062 } 3063 3064 void EnqueueVisitor::VisitOMPCancelDirective(const OMPCancelDirective *D) { 3065 VisitOMPExecutableDirective(D); 3066 } 3067 3068 void EnqueueVisitor::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D) { 3069 VisitOMPLoopDirective(D); 3070 } 3071 3072 void EnqueueVisitor::VisitOMPTaskLoopSimdDirective( 3073 const OMPTaskLoopSimdDirective *D) { 3074 VisitOMPLoopDirective(D); 3075 } 3076 3077 void EnqueueVisitor::VisitOMPMasterTaskLoopDirective( 3078 const OMPMasterTaskLoopDirective *D) { 3079 VisitOMPLoopDirective(D); 3080 } 3081 3082 void EnqueueVisitor::VisitOMPMasterTaskLoopSimdDirective( 3083 const OMPMasterTaskLoopSimdDirective *D) { 3084 VisitOMPLoopDirective(D); 3085 } 3086 3087 void EnqueueVisitor::VisitOMPParallelMasterTaskLoopDirective( 3088 const OMPParallelMasterTaskLoopDirective *D) { 3089 VisitOMPLoopDirective(D); 3090 } 3091 3092 void EnqueueVisitor::VisitOMPParallelMasterTaskLoopSimdDirective( 3093 const OMPParallelMasterTaskLoopSimdDirective *D) { 3094 VisitOMPLoopDirective(D); 3095 } 3096 3097 void EnqueueVisitor::VisitOMPDistributeDirective( 3098 const OMPDistributeDirective *D) { 3099 VisitOMPLoopDirective(D); 3100 } 3101 3102 void EnqueueVisitor::VisitOMPDistributeParallelForDirective( 3103 const OMPDistributeParallelForDirective *D) { 3104 VisitOMPLoopDirective(D); 3105 } 3106 3107 void EnqueueVisitor::VisitOMPDistributeParallelForSimdDirective( 3108 const OMPDistributeParallelForSimdDirective *D) { 3109 VisitOMPLoopDirective(D); 3110 } 3111 3112 void EnqueueVisitor::VisitOMPDistributeSimdDirective( 3113 const OMPDistributeSimdDirective *D) { 3114 VisitOMPLoopDirective(D); 3115 } 3116 3117 void EnqueueVisitor::VisitOMPTargetParallelForSimdDirective( 3118 const OMPTargetParallelForSimdDirective *D) { 3119 VisitOMPLoopDirective(D); 3120 } 3121 3122 void EnqueueVisitor::VisitOMPTargetSimdDirective( 3123 const OMPTargetSimdDirective *D) { 3124 VisitOMPLoopDirective(D); 3125 } 3126 3127 void EnqueueVisitor::VisitOMPTeamsDistributeDirective( 3128 const OMPTeamsDistributeDirective *D) { 3129 VisitOMPLoopDirective(D); 3130 } 3131 3132 void EnqueueVisitor::VisitOMPTeamsDistributeSimdDirective( 3133 const OMPTeamsDistributeSimdDirective *D) { 3134 VisitOMPLoopDirective(D); 3135 } 3136 3137 void EnqueueVisitor::VisitOMPTeamsDistributeParallelForSimdDirective( 3138 const OMPTeamsDistributeParallelForSimdDirective *D) { 3139 VisitOMPLoopDirective(D); 3140 } 3141 3142 void EnqueueVisitor::VisitOMPTeamsDistributeParallelForDirective( 3143 const OMPTeamsDistributeParallelForDirective *D) { 3144 VisitOMPLoopDirective(D); 3145 } 3146 3147 void EnqueueVisitor::VisitOMPTargetTeamsDirective( 3148 const OMPTargetTeamsDirective *D) { 3149 VisitOMPExecutableDirective(D); 3150 } 3151 3152 void EnqueueVisitor::VisitOMPTargetTeamsDistributeDirective( 3153 const OMPTargetTeamsDistributeDirective *D) { 3154 VisitOMPLoopDirective(D); 3155 } 3156 3157 void EnqueueVisitor::VisitOMPTargetTeamsDistributeParallelForDirective( 3158 const OMPTargetTeamsDistributeParallelForDirective *D) { 3159 VisitOMPLoopDirective(D); 3160 } 3161 3162 void EnqueueVisitor::VisitOMPTargetTeamsDistributeParallelForSimdDirective( 3163 const OMPTargetTeamsDistributeParallelForSimdDirective *D) { 3164 VisitOMPLoopDirective(D); 3165 } 3166 3167 void EnqueueVisitor::VisitOMPTargetTeamsDistributeSimdDirective( 3168 const OMPTargetTeamsDistributeSimdDirective *D) { 3169 VisitOMPLoopDirective(D); 3170 } 3171 3172 void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) { 3173 EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU, RegionOfInterest)) 3174 .Visit(S); 3175 } 3176 3177 bool CursorVisitor::IsInRegionOfInterest(CXCursor C) { 3178 if (RegionOfInterest.isValid()) { 3179 SourceRange Range = getRawCursorExtent(C); 3180 if (Range.isInvalid() || CompareRegionOfInterest(Range)) 3181 return false; 3182 } 3183 return true; 3184 } 3185 3186 bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { 3187 while (!WL.empty()) { 3188 // Dequeue the worklist item. 3189 VisitorJob LI = WL.pop_back_val(); 3190 3191 // Set the Parent field, then back to its old value once we're done. 3192 SetParentRAII SetParent(Parent, StmtParent, LI.getParent()); 3193 3194 switch (LI.getKind()) { 3195 case VisitorJob::DeclVisitKind: { 3196 const Decl *D = cast<DeclVisit>(&LI)->get(); 3197 if (!D) 3198 continue; 3199 3200 // For now, perform default visitation for Decls. 3201 if (Visit(MakeCXCursor(D, TU, RegionOfInterest, 3202 cast<DeclVisit>(&LI)->isFirst()))) 3203 return true; 3204 3205 continue; 3206 } 3207 case VisitorJob::ExplicitTemplateArgsVisitKind: { 3208 for (const TemplateArgumentLoc &Arg : 3209 *cast<ExplicitTemplateArgsVisit>(&LI)) { 3210 if (VisitTemplateArgumentLoc(Arg)) 3211 return true; 3212 } 3213 continue; 3214 } 3215 case VisitorJob::TypeLocVisitKind: { 3216 // Perform default visitation for TypeLocs. 3217 if (Visit(cast<TypeLocVisit>(&LI)->get())) 3218 return true; 3219 continue; 3220 } 3221 case VisitorJob::LabelRefVisitKind: { 3222 const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get(); 3223 if (LabelStmt *stmt = LS->getStmt()) { 3224 if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(), 3225 TU))) { 3226 return true; 3227 } 3228 } 3229 continue; 3230 } 3231 3232 case VisitorJob::NestedNameSpecifierLocVisitKind: { 3233 NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI); 3234 if (VisitNestedNameSpecifierLoc(V->get())) 3235 return true; 3236 continue; 3237 } 3238 3239 case VisitorJob::DeclarationNameInfoVisitKind: { 3240 if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)->get())) 3241 return true; 3242 continue; 3243 } 3244 case VisitorJob::MemberRefVisitKind: { 3245 MemberRefVisit *V = cast<MemberRefVisit>(&LI); 3246 if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU))) 3247 return true; 3248 continue; 3249 } 3250 case VisitorJob::StmtVisitKind: { 3251 const Stmt *S = cast<StmtVisit>(&LI)->get(); 3252 if (!S) 3253 continue; 3254 3255 // Update the current cursor. 3256 CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest); 3257 if (!IsInRegionOfInterest(Cursor)) 3258 continue; 3259 switch (Visitor(Cursor, Parent, ClientData)) { 3260 case CXChildVisit_Break: 3261 return true; 3262 case CXChildVisit_Continue: 3263 break; 3264 case CXChildVisit_Recurse: 3265 if (PostChildrenVisitor) 3266 WL.push_back(PostChildrenVisit(nullptr, Cursor)); 3267 EnqueueWorkList(WL, S); 3268 break; 3269 } 3270 continue; 3271 } 3272 case VisitorJob::MemberExprPartsKind: { 3273 // Handle the other pieces in the MemberExpr besides the base. 3274 const MemberExpr *M = cast<MemberExprParts>(&LI)->get(); 3275 3276 // Visit the nested-name-specifier 3277 if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc()) 3278 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 3279 return true; 3280 3281 // Visit the declaration name. 3282 if (VisitDeclarationNameInfo(M->getMemberNameInfo())) 3283 return true; 3284 3285 // Visit the explicitly-specified template arguments, if any. 3286 if (M->hasExplicitTemplateArgs()) { 3287 for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(), 3288 *ArgEnd = Arg + M->getNumTemplateArgs(); 3289 Arg != ArgEnd; ++Arg) { 3290 if (VisitTemplateArgumentLoc(*Arg)) 3291 return true; 3292 } 3293 } 3294 continue; 3295 } 3296 case VisitorJob::DeclRefExprPartsKind: { 3297 const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get(); 3298 // Visit nested-name-specifier, if present. 3299 if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc()) 3300 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 3301 return true; 3302 // Visit declaration name. 3303 if (VisitDeclarationNameInfo(DR->getNameInfo())) 3304 return true; 3305 continue; 3306 } 3307 case VisitorJob::OverloadExprPartsKind: { 3308 const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get(); 3309 // Visit the nested-name-specifier. 3310 if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc()) 3311 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 3312 return true; 3313 // Visit the declaration name. 3314 if (VisitDeclarationNameInfo(O->getNameInfo())) 3315 return true; 3316 // Visit the overloaded declaration reference. 3317 if (Visit(MakeCursorOverloadedDeclRef(O, TU))) 3318 return true; 3319 continue; 3320 } 3321 case VisitorJob::SizeOfPackExprPartsKind: { 3322 const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get(); 3323 NamedDecl *Pack = E->getPack(); 3324 if (isa<TemplateTypeParmDecl>(Pack)) { 3325 if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack), 3326 E->getPackLoc(), TU))) 3327 return true; 3328 3329 continue; 3330 } 3331 3332 if (isa<TemplateTemplateParmDecl>(Pack)) { 3333 if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack), 3334 E->getPackLoc(), TU))) 3335 return true; 3336 3337 continue; 3338 } 3339 3340 // Non-type template parameter packs and function parameter packs are 3341 // treated like DeclRefExpr cursors. 3342 continue; 3343 } 3344 3345 case VisitorJob::LambdaExprPartsKind: { 3346 // Visit non-init captures. 3347 const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get(); 3348 for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(), 3349 CEnd = E->explicit_capture_end(); 3350 C != CEnd; ++C) { 3351 if (!C->capturesVariable()) 3352 continue; 3353 3354 if (Visit(MakeCursorVariableRef(C->getCapturedVar(), C->getLocation(), 3355 TU))) 3356 return true; 3357 } 3358 // Visit init captures 3359 for (auto InitExpr : E->capture_inits()) { 3360 if (InitExpr && Visit(InitExpr)) 3361 return true; 3362 } 3363 3364 TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc(); 3365 // Visit parameters and return type, if present. 3366 if (FunctionTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) { 3367 if (E->hasExplicitParameters()) { 3368 // Visit parameters. 3369 for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) 3370 if (Visit(MakeCXCursor(Proto.getParam(I), TU))) 3371 return true; 3372 } 3373 if (E->hasExplicitResultType()) { 3374 // Visit result type. 3375 if (Visit(Proto.getReturnLoc())) 3376 return true; 3377 } 3378 } 3379 break; 3380 } 3381 3382 case VisitorJob::PostChildrenVisitKind: 3383 if (PostChildrenVisitor(Parent, ClientData)) 3384 return true; 3385 break; 3386 } 3387 } 3388 return false; 3389 } 3390 3391 bool CursorVisitor::Visit(const Stmt *S) { 3392 VisitorWorkList *WL = nullptr; 3393 if (!WorkListFreeList.empty()) { 3394 WL = WorkListFreeList.back(); 3395 WL->clear(); 3396 WorkListFreeList.pop_back(); 3397 } else { 3398 WL = new VisitorWorkList(); 3399 WorkListCache.push_back(WL); 3400 } 3401 EnqueueWorkList(*WL, S); 3402 bool result = RunVisitorWorkList(*WL); 3403 WorkListFreeList.push_back(WL); 3404 return result; 3405 } 3406 3407 namespace { 3408 typedef SmallVector<SourceRange, 4> RefNamePieces; 3409 RefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr, 3410 const DeclarationNameInfo &NI, SourceRange QLoc, 3411 const SourceRange *TemplateArgsLoc = nullptr) { 3412 const bool WantQualifier = NameFlags & CXNameRange_WantQualifier; 3413 const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs; 3414 const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece; 3415 3416 const DeclarationName::NameKind Kind = NI.getName().getNameKind(); 3417 3418 RefNamePieces Pieces; 3419 3420 if (WantQualifier && QLoc.isValid()) 3421 Pieces.push_back(QLoc); 3422 3423 if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr) 3424 Pieces.push_back(NI.getLoc()); 3425 3426 if (WantTemplateArgs && TemplateArgsLoc && TemplateArgsLoc->isValid()) 3427 Pieces.push_back(*TemplateArgsLoc); 3428 3429 if (Kind == DeclarationName::CXXOperatorName) { 3430 Pieces.push_back(NI.getInfo().getCXXOperatorNameBeginLoc()); 3431 Pieces.push_back(NI.getInfo().getCXXOperatorNameEndLoc()); 3432 } 3433 3434 if (WantSinglePiece) { 3435 SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd()); 3436 Pieces.clear(); 3437 Pieces.push_back(R); 3438 } 3439 3440 return Pieces; 3441 } 3442 } // namespace 3443 3444 //===----------------------------------------------------------------------===// 3445 // Misc. API hooks. 3446 //===----------------------------------------------------------------------===// 3447 3448 namespace { 3449 struct RegisterFatalErrorHandler { 3450 RegisterFatalErrorHandler() { 3451 clang_install_aborting_llvm_fatal_error_handler(); 3452 } 3453 }; 3454 } // namespace 3455 3456 static llvm::ManagedStatic<RegisterFatalErrorHandler> 3457 RegisterFatalErrorHandlerOnce; 3458 3459 CXIndex clang_createIndex(int excludeDeclarationsFromPCH, 3460 int displayDiagnostics) { 3461 // We use crash recovery to make some of our APIs more reliable, implicitly 3462 // enable it. 3463 if (!getenv("LIBCLANG_DISABLE_CRASH_RECOVERY")) 3464 llvm::CrashRecoveryContext::Enable(); 3465 3466 // Look through the managed static to trigger construction of the managed 3467 // static which registers our fatal error handler. This ensures it is only 3468 // registered once. 3469 (void)*RegisterFatalErrorHandlerOnce; 3470 3471 // Initialize targets for clang module support. 3472 llvm::InitializeAllTargets(); 3473 llvm::InitializeAllTargetMCs(); 3474 llvm::InitializeAllAsmPrinters(); 3475 llvm::InitializeAllAsmParsers(); 3476 3477 CIndexer *CIdxr = new CIndexer(); 3478 3479 if (excludeDeclarationsFromPCH) 3480 CIdxr->setOnlyLocalDecls(); 3481 if (displayDiagnostics) 3482 CIdxr->setDisplayDiagnostics(); 3483 3484 if (getenv("LIBCLANG_BGPRIO_INDEX")) 3485 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | 3486 CXGlobalOpt_ThreadBackgroundPriorityForIndexing); 3487 if (getenv("LIBCLANG_BGPRIO_EDIT")) 3488 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | 3489 CXGlobalOpt_ThreadBackgroundPriorityForEditing); 3490 3491 return CIdxr; 3492 } 3493 3494 void clang_disposeIndex(CXIndex CIdx) { 3495 if (CIdx) 3496 delete static_cast<CIndexer *>(CIdx); 3497 } 3498 3499 void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) { 3500 if (CIdx) 3501 static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options); 3502 } 3503 3504 unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) { 3505 if (CIdx) 3506 return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags(); 3507 return 0; 3508 } 3509 3510 void clang_CXIndex_setInvocationEmissionPathOption(CXIndex CIdx, 3511 const char *Path) { 3512 if (CIdx) 3513 static_cast<CIndexer *>(CIdx)->setInvocationEmissionPath(Path ? Path : ""); 3514 } 3515 3516 void clang_toggleCrashRecovery(unsigned isEnabled) { 3517 if (isEnabled) 3518 llvm::CrashRecoveryContext::Enable(); 3519 else 3520 llvm::CrashRecoveryContext::Disable(); 3521 } 3522 3523 CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx, 3524 const char *ast_filename) { 3525 CXTranslationUnit TU; 3526 enum CXErrorCode Result = 3527 clang_createTranslationUnit2(CIdx, ast_filename, &TU); 3528 (void)Result; 3529 assert((TU && Result == CXError_Success) || 3530 (!TU && Result != CXError_Success)); 3531 return TU; 3532 } 3533 3534 enum CXErrorCode clang_createTranslationUnit2(CXIndex CIdx, 3535 const char *ast_filename, 3536 CXTranslationUnit *out_TU) { 3537 if (out_TU) 3538 *out_TU = nullptr; 3539 3540 if (!CIdx || !ast_filename || !out_TU) 3541 return CXError_InvalidArguments; 3542 3543 LOG_FUNC_SECTION { *Log << ast_filename; } 3544 3545 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); 3546 FileSystemOptions FileSystemOpts; 3547 3548 IntrusiveRefCntPtr<DiagnosticsEngine> Diags = 3549 CompilerInstance::createDiagnostics(new DiagnosticOptions()); 3550 std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile( 3551 ast_filename, CXXIdx->getPCHContainerOperations()->getRawReader(), 3552 ASTUnit::LoadEverything, Diags, FileSystemOpts, /*UseDebugInfo=*/false, 3553 CXXIdx->getOnlyLocalDecls(), CaptureDiagsKind::All, 3554 /*AllowASTWithCompilerErrors=*/true, 3555 /*UserFilesAreVolatile=*/true); 3556 *out_TU = MakeCXTranslationUnit(CXXIdx, std::move(AU)); 3557 return *out_TU ? CXError_Success : CXError_Failure; 3558 } 3559 3560 unsigned clang_defaultEditingTranslationUnitOptions() { 3561 return CXTranslationUnit_PrecompiledPreamble | 3562 CXTranslationUnit_CacheCompletionResults; 3563 } 3564 3565 CXTranslationUnit clang_createTranslationUnitFromSourceFile( 3566 CXIndex CIdx, const char *source_filename, int num_command_line_args, 3567 const char *const *command_line_args, unsigned num_unsaved_files, 3568 struct CXUnsavedFile *unsaved_files) { 3569 unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord; 3570 return clang_parseTranslationUnit(CIdx, source_filename, command_line_args, 3571 num_command_line_args, unsaved_files, 3572 num_unsaved_files, Options); 3573 } 3574 3575 static CXErrorCode 3576 clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename, 3577 const char *const *command_line_args, 3578 int num_command_line_args, 3579 ArrayRef<CXUnsavedFile> unsaved_files, 3580 unsigned options, CXTranslationUnit *out_TU) { 3581 // Set up the initial return values. 3582 if (out_TU) 3583 *out_TU = nullptr; 3584 3585 // Check arguments. 3586 if (!CIdx || !out_TU) 3587 return CXError_InvalidArguments; 3588 3589 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); 3590 3591 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) 3592 setThreadBackgroundPriority(); 3593 3594 bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble; 3595 bool CreatePreambleOnFirstParse = 3596 options & CXTranslationUnit_CreatePreambleOnFirstParse; 3597 // FIXME: Add a flag for modules. 3598 TranslationUnitKind TUKind = (options & (CXTranslationUnit_Incomplete | 3599 CXTranslationUnit_SingleFileParse)) 3600 ? TU_Prefix 3601 : TU_Complete; 3602 bool CacheCodeCompletionResults = 3603 options & CXTranslationUnit_CacheCompletionResults; 3604 bool IncludeBriefCommentsInCodeCompletion = 3605 options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion; 3606 bool SingleFileParse = options & CXTranslationUnit_SingleFileParse; 3607 bool ForSerialization = options & CXTranslationUnit_ForSerialization; 3608 bool RetainExcludedCB = 3609 options & CXTranslationUnit_RetainExcludedConditionalBlocks; 3610 SkipFunctionBodiesScope SkipFunctionBodies = SkipFunctionBodiesScope::None; 3611 if (options & CXTranslationUnit_SkipFunctionBodies) { 3612 SkipFunctionBodies = 3613 (options & CXTranslationUnit_LimitSkipFunctionBodiesToPreamble) 3614 ? SkipFunctionBodiesScope::Preamble 3615 : SkipFunctionBodiesScope::PreambleAndMainFile; 3616 } 3617 3618 // Configure the diagnostics. 3619 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 3620 CompilerInstance::createDiagnostics(new DiagnosticOptions)); 3621 3622 if (options & CXTranslationUnit_KeepGoing) 3623 Diags->setFatalsAsError(true); 3624 3625 CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::All; 3626 if (options & CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles) 3627 CaptureDiagnostics = CaptureDiagsKind::AllWithoutNonErrorsFromIncludes; 3628 3629 // Recover resources if we crash before exiting this function. 3630 llvm::CrashRecoveryContextCleanupRegistrar< 3631 DiagnosticsEngine, 3632 llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>> 3633 DiagCleanup(Diags.get()); 3634 3635 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles( 3636 new std::vector<ASTUnit::RemappedFile>()); 3637 3638 // Recover resources if we crash before exiting this function. 3639 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<ASTUnit::RemappedFile>> 3640 RemappedCleanup(RemappedFiles.get()); 3641 3642 for (auto &UF : unsaved_files) { 3643 std::unique_ptr<llvm::MemoryBuffer> MB = 3644 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); 3645 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); 3646 } 3647 3648 std::unique_ptr<std::vector<const char *>> Args( 3649 new std::vector<const char *>()); 3650 3651 // Recover resources if we crash before exiting this method. 3652 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char *>> 3653 ArgsCleanup(Args.get()); 3654 3655 // Since the Clang C library is primarily used by batch tools dealing with 3656 // (often very broken) source code, where spell-checking can have a 3657 // significant negative impact on performance (particularly when 3658 // precompiled headers are involved), we disable it by default. 3659 // Only do this if we haven't found a spell-checking-related argument. 3660 bool FoundSpellCheckingArgument = false; 3661 for (int I = 0; I != num_command_line_args; ++I) { 3662 if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 || 3663 strcmp(command_line_args[I], "-fspell-checking") == 0) { 3664 FoundSpellCheckingArgument = true; 3665 break; 3666 } 3667 } 3668 Args->insert(Args->end(), command_line_args, 3669 command_line_args + num_command_line_args); 3670 3671 if (!FoundSpellCheckingArgument) 3672 Args->insert(Args->begin() + 1, "-fno-spell-checking"); 3673 3674 // The 'source_filename' argument is optional. If the caller does not 3675 // specify it then it is assumed that the source file is specified 3676 // in the actual argument list. 3677 // Put the source file after command_line_args otherwise if '-x' flag is 3678 // present it will be unused. 3679 if (source_filename) 3680 Args->push_back(source_filename); 3681 3682 // Do we need the detailed preprocessing record? 3683 if (options & CXTranslationUnit_DetailedPreprocessingRecord) { 3684 Args->push_back("-Xclang"); 3685 Args->push_back("-detailed-preprocessing-record"); 3686 } 3687 3688 // Suppress any editor placeholder diagnostics. 3689 Args->push_back("-fallow-editor-placeholders"); 3690 3691 unsigned NumErrors = Diags->getClient()->getNumErrors(); 3692 std::unique_ptr<ASTUnit> ErrUnit; 3693 // Unless the user specified that they want the preamble on the first parse 3694 // set it up to be created on the first reparse. This makes the first parse 3695 // faster, trading for a slower (first) reparse. 3696 unsigned PrecompilePreambleAfterNParses = 3697 !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse; 3698 3699 LibclangInvocationReporter InvocationReporter( 3700 *CXXIdx, LibclangInvocationReporter::OperationKind::ParseOperation, 3701 options, llvm::makeArrayRef(*Args), /*InvocationArgs=*/None, 3702 unsaved_files); 3703 std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine( 3704 Args->data(), Args->data() + Args->size(), 3705 CXXIdx->getPCHContainerOperations(), Diags, 3706 CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(), 3707 CaptureDiagnostics, *RemappedFiles.get(), 3708 /*RemappedFilesKeepOriginalName=*/true, PrecompilePreambleAfterNParses, 3709 TUKind, CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion, 3710 /*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies, SingleFileParse, 3711 /*UserFilesAreVolatile=*/true, ForSerialization, RetainExcludedCB, 3712 CXXIdx->getPCHContainerOperations()->getRawReader().getFormat(), 3713 &ErrUnit)); 3714 3715 // Early failures in LoadFromCommandLine may return with ErrUnit unset. 3716 if (!Unit && !ErrUnit) 3717 return CXError_ASTReadError; 3718 3719 if (NumErrors != Diags->getClient()->getNumErrors()) { 3720 // Make sure to check that 'Unit' is non-NULL. 3721 if (CXXIdx->getDisplayDiagnostics()) 3722 printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get()); 3723 } 3724 3725 if (isASTReadError(Unit ? Unit.get() : ErrUnit.get())) 3726 return CXError_ASTReadError; 3727 3728 *out_TU = MakeCXTranslationUnit(CXXIdx, std::move(Unit)); 3729 if (CXTranslationUnitImpl *TU = *out_TU) { 3730 TU->ParsingOptions = options; 3731 TU->Arguments.reserve(Args->size()); 3732 for (const char *Arg : *Args) 3733 TU->Arguments.push_back(Arg); 3734 return CXError_Success; 3735 } 3736 return CXError_Failure; 3737 } 3738 3739 CXTranslationUnit 3740 clang_parseTranslationUnit(CXIndex CIdx, const char *source_filename, 3741 const char *const *command_line_args, 3742 int num_command_line_args, 3743 struct CXUnsavedFile *unsaved_files, 3744 unsigned num_unsaved_files, unsigned options) { 3745 CXTranslationUnit TU; 3746 enum CXErrorCode Result = clang_parseTranslationUnit2( 3747 CIdx, source_filename, command_line_args, num_command_line_args, 3748 unsaved_files, num_unsaved_files, options, &TU); 3749 (void)Result; 3750 assert((TU && Result == CXError_Success) || 3751 (!TU && Result != CXError_Success)); 3752 return TU; 3753 } 3754 3755 enum CXErrorCode clang_parseTranslationUnit2( 3756 CXIndex CIdx, const char *source_filename, 3757 const char *const *command_line_args, int num_command_line_args, 3758 struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files, 3759 unsigned options, CXTranslationUnit *out_TU) { 3760 noteBottomOfStack(); 3761 SmallVector<const char *, 4> Args; 3762 Args.push_back("clang"); 3763 Args.append(command_line_args, command_line_args + num_command_line_args); 3764 return clang_parseTranslationUnit2FullArgv( 3765 CIdx, source_filename, Args.data(), Args.size(), unsaved_files, 3766 num_unsaved_files, options, out_TU); 3767 } 3768 3769 enum CXErrorCode clang_parseTranslationUnit2FullArgv( 3770 CXIndex CIdx, const char *source_filename, 3771 const char *const *command_line_args, int num_command_line_args, 3772 struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files, 3773 unsigned options, CXTranslationUnit *out_TU) { 3774 LOG_FUNC_SECTION { 3775 *Log << source_filename << ": "; 3776 for (int i = 0; i != num_command_line_args; ++i) 3777 *Log << command_line_args[i] << " "; 3778 } 3779 3780 if (num_unsaved_files && !unsaved_files) 3781 return CXError_InvalidArguments; 3782 3783 CXErrorCode result = CXError_Failure; 3784 auto ParseTranslationUnitImpl = [=, &result] { 3785 noteBottomOfStack(); 3786 result = clang_parseTranslationUnit_Impl( 3787 CIdx, source_filename, command_line_args, num_command_line_args, 3788 llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU); 3789 }; 3790 3791 llvm::CrashRecoveryContext CRC; 3792 3793 if (!RunSafely(CRC, ParseTranslationUnitImpl)) { 3794 fprintf(stderr, "libclang: crash detected during parsing: {\n"); 3795 fprintf(stderr, " 'source_filename' : '%s'\n", source_filename); 3796 fprintf(stderr, " 'command_line_args' : ["); 3797 for (int i = 0; i != num_command_line_args; ++i) { 3798 if (i) 3799 fprintf(stderr, ", "); 3800 fprintf(stderr, "'%s'", command_line_args[i]); 3801 } 3802 fprintf(stderr, "],\n"); 3803 fprintf(stderr, " 'unsaved_files' : ["); 3804 for (unsigned i = 0; i != num_unsaved_files; ++i) { 3805 if (i) 3806 fprintf(stderr, ", "); 3807 fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename, 3808 unsaved_files[i].Length); 3809 } 3810 fprintf(stderr, "],\n"); 3811 fprintf(stderr, " 'options' : %d,\n", options); 3812 fprintf(stderr, "}\n"); 3813 3814 return CXError_Crashed; 3815 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) { 3816 if (CXTranslationUnit *TU = out_TU) 3817 PrintLibclangResourceUsage(*TU); 3818 } 3819 3820 return result; 3821 } 3822 3823 CXString clang_Type_getObjCEncoding(CXType CT) { 3824 CXTranslationUnit tu = static_cast<CXTranslationUnit>(CT.data[1]); 3825 ASTContext &Ctx = getASTUnit(tu)->getASTContext(); 3826 std::string encoding; 3827 Ctx.getObjCEncodingForType(QualType::getFromOpaquePtr(CT.data[0]), encoding); 3828 3829 return cxstring::createDup(encoding); 3830 } 3831 3832 static const IdentifierInfo *getMacroIdentifier(CXCursor C) { 3833 if (C.kind == CXCursor_MacroDefinition) { 3834 if (const MacroDefinitionRecord *MDR = getCursorMacroDefinition(C)) 3835 return MDR->getName(); 3836 } else if (C.kind == CXCursor_MacroExpansion) { 3837 MacroExpansionCursor ME = getCursorMacroExpansion(C); 3838 return ME.getName(); 3839 } 3840 return nullptr; 3841 } 3842 3843 unsigned clang_Cursor_isMacroFunctionLike(CXCursor C) { 3844 const IdentifierInfo *II = getMacroIdentifier(C); 3845 if (!II) { 3846 return false; 3847 } 3848 ASTUnit *ASTU = getCursorASTUnit(C); 3849 Preprocessor &PP = ASTU->getPreprocessor(); 3850 if (const MacroInfo *MI = PP.getMacroInfo(II)) 3851 return MI->isFunctionLike(); 3852 return false; 3853 } 3854 3855 unsigned clang_Cursor_isMacroBuiltin(CXCursor C) { 3856 const IdentifierInfo *II = getMacroIdentifier(C); 3857 if (!II) { 3858 return false; 3859 } 3860 ASTUnit *ASTU = getCursorASTUnit(C); 3861 Preprocessor &PP = ASTU->getPreprocessor(); 3862 if (const MacroInfo *MI = PP.getMacroInfo(II)) 3863 return MI->isBuiltinMacro(); 3864 return false; 3865 } 3866 3867 unsigned clang_Cursor_isFunctionInlined(CXCursor C) { 3868 const Decl *D = getCursorDecl(C); 3869 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D); 3870 if (!FD) { 3871 return false; 3872 } 3873 return FD->isInlined(); 3874 } 3875 3876 static StringLiteral *getCFSTR_value(CallExpr *callExpr) { 3877 if (callExpr->getNumArgs() != 1) { 3878 return nullptr; 3879 } 3880 3881 StringLiteral *S = nullptr; 3882 auto *arg = callExpr->getArg(0); 3883 if (arg->getStmtClass() == Stmt::ImplicitCastExprClass) { 3884 ImplicitCastExpr *I = static_cast<ImplicitCastExpr *>(arg); 3885 auto *subExpr = I->getSubExprAsWritten(); 3886 3887 if (subExpr->getStmtClass() != Stmt::StringLiteralClass) { 3888 return nullptr; 3889 } 3890 3891 S = static_cast<StringLiteral *>(I->getSubExprAsWritten()); 3892 } else if (arg->getStmtClass() == Stmt::StringLiteralClass) { 3893 S = static_cast<StringLiteral *>(callExpr->getArg(0)); 3894 } else { 3895 return nullptr; 3896 } 3897 return S; 3898 } 3899 3900 struct ExprEvalResult { 3901 CXEvalResultKind EvalType; 3902 union { 3903 unsigned long long unsignedVal; 3904 long long intVal; 3905 double floatVal; 3906 char *stringVal; 3907 } EvalData; 3908 bool IsUnsignedInt; 3909 ~ExprEvalResult() { 3910 if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float && 3911 EvalType != CXEval_Int) { 3912 delete[] EvalData.stringVal; 3913 } 3914 } 3915 }; 3916 3917 void clang_EvalResult_dispose(CXEvalResult E) { 3918 delete static_cast<ExprEvalResult *>(E); 3919 } 3920 3921 CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) { 3922 if (!E) { 3923 return CXEval_UnExposed; 3924 } 3925 return ((ExprEvalResult *)E)->EvalType; 3926 } 3927 3928 int clang_EvalResult_getAsInt(CXEvalResult E) { 3929 return clang_EvalResult_getAsLongLong(E); 3930 } 3931 3932 long long clang_EvalResult_getAsLongLong(CXEvalResult E) { 3933 if (!E) { 3934 return 0; 3935 } 3936 ExprEvalResult *Result = (ExprEvalResult *)E; 3937 if (Result->IsUnsignedInt) 3938 return Result->EvalData.unsignedVal; 3939 return Result->EvalData.intVal; 3940 } 3941 3942 unsigned clang_EvalResult_isUnsignedInt(CXEvalResult E) { 3943 return ((ExprEvalResult *)E)->IsUnsignedInt; 3944 } 3945 3946 unsigned long long clang_EvalResult_getAsUnsigned(CXEvalResult E) { 3947 if (!E) { 3948 return 0; 3949 } 3950 3951 ExprEvalResult *Result = (ExprEvalResult *)E; 3952 if (Result->IsUnsignedInt) 3953 return Result->EvalData.unsignedVal; 3954 return Result->EvalData.intVal; 3955 } 3956 3957 double clang_EvalResult_getAsDouble(CXEvalResult E) { 3958 if (!E) { 3959 return 0; 3960 } 3961 return ((ExprEvalResult *)E)->EvalData.floatVal; 3962 } 3963 3964 const char *clang_EvalResult_getAsStr(CXEvalResult E) { 3965 if (!E) { 3966 return nullptr; 3967 } 3968 return ((ExprEvalResult *)E)->EvalData.stringVal; 3969 } 3970 3971 static const ExprEvalResult *evaluateExpr(Expr *expr, CXCursor C) { 3972 Expr::EvalResult ER; 3973 ASTContext &ctx = getCursorContext(C); 3974 if (!expr) 3975 return nullptr; 3976 3977 expr = expr->IgnoreParens(); 3978 if (expr->isValueDependent()) 3979 return nullptr; 3980 if (!expr->EvaluateAsRValue(ER, ctx)) 3981 return nullptr; 3982 3983 QualType rettype; 3984 CallExpr *callExpr; 3985 auto result = std::make_unique<ExprEvalResult>(); 3986 result->EvalType = CXEval_UnExposed; 3987 result->IsUnsignedInt = false; 3988 3989 if (ER.Val.isInt()) { 3990 result->EvalType = CXEval_Int; 3991 3992 auto &val = ER.Val.getInt(); 3993 if (val.isUnsigned()) { 3994 result->IsUnsignedInt = true; 3995 result->EvalData.unsignedVal = val.getZExtValue(); 3996 } else { 3997 result->EvalData.intVal = val.getExtValue(); 3998 } 3999 4000 return result.release(); 4001 } 4002 4003 if (ER.Val.isFloat()) { 4004 llvm::SmallVector<char, 100> Buffer; 4005 ER.Val.getFloat().toString(Buffer); 4006 std::string floatStr(Buffer.data(), Buffer.size()); 4007 result->EvalType = CXEval_Float; 4008 bool ignored; 4009 llvm::APFloat apFloat = ER.Val.getFloat(); 4010 apFloat.convert(llvm::APFloat::IEEEdouble(), 4011 llvm::APFloat::rmNearestTiesToEven, &ignored); 4012 result->EvalData.floatVal = apFloat.convertToDouble(); 4013 return result.release(); 4014 } 4015 4016 if (expr->getStmtClass() == Stmt::ImplicitCastExprClass) { 4017 const auto *I = cast<ImplicitCastExpr>(expr); 4018 auto *subExpr = I->getSubExprAsWritten(); 4019 if (subExpr->getStmtClass() == Stmt::StringLiteralClass || 4020 subExpr->getStmtClass() == Stmt::ObjCStringLiteralClass) { 4021 const StringLiteral *StrE = nullptr; 4022 const ObjCStringLiteral *ObjCExpr; 4023 ObjCExpr = dyn_cast<ObjCStringLiteral>(subExpr); 4024 4025 if (ObjCExpr) { 4026 StrE = ObjCExpr->getString(); 4027 result->EvalType = CXEval_ObjCStrLiteral; 4028 } else { 4029 StrE = cast<StringLiteral>(I->getSubExprAsWritten()); 4030 result->EvalType = CXEval_StrLiteral; 4031 } 4032 4033 std::string strRef(StrE->getString().str()); 4034 result->EvalData.stringVal = new char[strRef.size() + 1]; 4035 strncpy((char *)result->EvalData.stringVal, strRef.c_str(), 4036 strRef.size()); 4037 result->EvalData.stringVal[strRef.size()] = '\0'; 4038 return result.release(); 4039 } 4040 } else if (expr->getStmtClass() == Stmt::ObjCStringLiteralClass || 4041 expr->getStmtClass() == Stmt::StringLiteralClass) { 4042 const StringLiteral *StrE = nullptr; 4043 const ObjCStringLiteral *ObjCExpr; 4044 ObjCExpr = dyn_cast<ObjCStringLiteral>(expr); 4045 4046 if (ObjCExpr) { 4047 StrE = ObjCExpr->getString(); 4048 result->EvalType = CXEval_ObjCStrLiteral; 4049 } else { 4050 StrE = cast<StringLiteral>(expr); 4051 result->EvalType = CXEval_StrLiteral; 4052 } 4053 4054 std::string strRef(StrE->getString().str()); 4055 result->EvalData.stringVal = new char[strRef.size() + 1]; 4056 strncpy((char *)result->EvalData.stringVal, strRef.c_str(), strRef.size()); 4057 result->EvalData.stringVal[strRef.size()] = '\0'; 4058 return result.release(); 4059 } 4060 4061 if (expr->getStmtClass() == Stmt::CStyleCastExprClass) { 4062 CStyleCastExpr *CC = static_cast<CStyleCastExpr *>(expr); 4063 4064 rettype = CC->getType(); 4065 if (rettype.getAsString() == "CFStringRef" && 4066 CC->getSubExpr()->getStmtClass() == Stmt::CallExprClass) { 4067 4068 callExpr = static_cast<CallExpr *>(CC->getSubExpr()); 4069 StringLiteral *S = getCFSTR_value(callExpr); 4070 if (S) { 4071 std::string strLiteral(S->getString().str()); 4072 result->EvalType = CXEval_CFStr; 4073 4074 result->EvalData.stringVal = new char[strLiteral.size() + 1]; 4075 strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(), 4076 strLiteral.size()); 4077 result->EvalData.stringVal[strLiteral.size()] = '\0'; 4078 return result.release(); 4079 } 4080 } 4081 4082 } else if (expr->getStmtClass() == Stmt::CallExprClass) { 4083 callExpr = static_cast<CallExpr *>(expr); 4084 rettype = callExpr->getCallReturnType(ctx); 4085 4086 if (rettype->isVectorType() || callExpr->getNumArgs() > 1) 4087 return nullptr; 4088 4089 if (rettype->isIntegralType(ctx) || rettype->isRealFloatingType()) { 4090 if (callExpr->getNumArgs() == 1 && 4091 !callExpr->getArg(0)->getType()->isIntegralType(ctx)) 4092 return nullptr; 4093 } else if (rettype.getAsString() == "CFStringRef") { 4094 4095 StringLiteral *S = getCFSTR_value(callExpr); 4096 if (S) { 4097 std::string strLiteral(S->getString().str()); 4098 result->EvalType = CXEval_CFStr; 4099 result->EvalData.stringVal = new char[strLiteral.size() + 1]; 4100 strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(), 4101 strLiteral.size()); 4102 result->EvalData.stringVal[strLiteral.size()] = '\0'; 4103 return result.release(); 4104 } 4105 } 4106 } else if (expr->getStmtClass() == Stmt::DeclRefExprClass) { 4107 DeclRefExpr *D = static_cast<DeclRefExpr *>(expr); 4108 ValueDecl *V = D->getDecl(); 4109 if (V->getKind() == Decl::Function) { 4110 std::string strName = V->getNameAsString(); 4111 result->EvalType = CXEval_Other; 4112 result->EvalData.stringVal = new char[strName.size() + 1]; 4113 strncpy(result->EvalData.stringVal, strName.c_str(), strName.size()); 4114 result->EvalData.stringVal[strName.size()] = '\0'; 4115 return result.release(); 4116 } 4117 } 4118 4119 return nullptr; 4120 } 4121 4122 static const Expr *evaluateDeclExpr(const Decl *D) { 4123 if (!D) 4124 return nullptr; 4125 if (auto *Var = dyn_cast<VarDecl>(D)) 4126 return Var->getInit(); 4127 else if (auto *Field = dyn_cast<FieldDecl>(D)) 4128 return Field->getInClassInitializer(); 4129 return nullptr; 4130 } 4131 4132 static const Expr *evaluateCompoundStmtExpr(const CompoundStmt *CS) { 4133 assert(CS && "invalid compound statement"); 4134 for (auto *bodyIterator : CS->body()) { 4135 if (const auto *E = dyn_cast<Expr>(bodyIterator)) 4136 return E; 4137 } 4138 return nullptr; 4139 } 4140 4141 CXEvalResult clang_Cursor_Evaluate(CXCursor C) { 4142 const Expr *E = nullptr; 4143 if (clang_getCursorKind(C) == CXCursor_CompoundStmt) 4144 E = evaluateCompoundStmtExpr(cast<CompoundStmt>(getCursorStmt(C))); 4145 else if (clang_isDeclaration(C.kind)) 4146 E = evaluateDeclExpr(getCursorDecl(C)); 4147 else if (clang_isExpression(C.kind)) 4148 E = getCursorExpr(C); 4149 if (E) 4150 return const_cast<CXEvalResult>( 4151 reinterpret_cast<const void *>(evaluateExpr(const_cast<Expr *>(E), C))); 4152 return nullptr; 4153 } 4154 4155 unsigned clang_Cursor_hasAttrs(CXCursor C) { 4156 const Decl *D = getCursorDecl(C); 4157 if (!D) { 4158 return 0; 4159 } 4160 4161 if (D->hasAttrs()) { 4162 return 1; 4163 } 4164 4165 return 0; 4166 } 4167 unsigned clang_defaultSaveOptions(CXTranslationUnit TU) { 4168 return CXSaveTranslationUnit_None; 4169 } 4170 4171 static CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU, 4172 const char *FileName, 4173 unsigned options) { 4174 CIndexer *CXXIdx = TU->CIdx; 4175 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) 4176 setThreadBackgroundPriority(); 4177 4178 bool hadError = cxtu::getASTUnit(TU)->Save(FileName); 4179 return hadError ? CXSaveError_Unknown : CXSaveError_None; 4180 } 4181 4182 int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, 4183 unsigned options) { 4184 LOG_FUNC_SECTION { *Log << TU << ' ' << FileName; } 4185 4186 if (isNotUsableTU(TU)) { 4187 LOG_BAD_TU(TU); 4188 return CXSaveError_InvalidTU; 4189 } 4190 4191 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4192 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 4193 if (!CXXUnit->hasSema()) 4194 return CXSaveError_InvalidTU; 4195 4196 CXSaveError result; 4197 auto SaveTranslationUnitImpl = [=, &result]() { 4198 result = clang_saveTranslationUnit_Impl(TU, FileName, options); 4199 }; 4200 4201 if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred()) { 4202 SaveTranslationUnitImpl(); 4203 4204 if (getenv("LIBCLANG_RESOURCE_USAGE")) 4205 PrintLibclangResourceUsage(TU); 4206 4207 return result; 4208 } 4209 4210 // We have an AST that has invalid nodes due to compiler errors. 4211 // Use a crash recovery thread for protection. 4212 4213 llvm::CrashRecoveryContext CRC; 4214 4215 if (!RunSafely(CRC, SaveTranslationUnitImpl)) { 4216 fprintf(stderr, "libclang: crash detected during AST saving: {\n"); 4217 fprintf(stderr, " 'filename' : '%s'\n", FileName); 4218 fprintf(stderr, " 'options' : %d,\n", options); 4219 fprintf(stderr, "}\n"); 4220 4221 return CXSaveError_Unknown; 4222 4223 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) { 4224 PrintLibclangResourceUsage(TU); 4225 } 4226 4227 return result; 4228 } 4229 4230 void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) { 4231 if (CTUnit) { 4232 // If the translation unit has been marked as unsafe to free, just discard 4233 // it. 4234 ASTUnit *Unit = cxtu::getASTUnit(CTUnit); 4235 if (Unit && Unit->isUnsafeToFree()) 4236 return; 4237 4238 delete cxtu::getASTUnit(CTUnit); 4239 delete CTUnit->StringPool; 4240 delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics); 4241 disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool); 4242 delete CTUnit->CommentToXML; 4243 delete CTUnit; 4244 } 4245 } 4246 4247 unsigned clang_suspendTranslationUnit(CXTranslationUnit CTUnit) { 4248 if (CTUnit) { 4249 ASTUnit *Unit = cxtu::getASTUnit(CTUnit); 4250 4251 if (Unit && Unit->isUnsafeToFree()) 4252 return false; 4253 4254 Unit->ResetForParse(); 4255 return true; 4256 } 4257 4258 return false; 4259 } 4260 4261 unsigned clang_defaultReparseOptions(CXTranslationUnit TU) { 4262 return CXReparse_None; 4263 } 4264 4265 static CXErrorCode 4266 clang_reparseTranslationUnit_Impl(CXTranslationUnit TU, 4267 ArrayRef<CXUnsavedFile> unsaved_files, 4268 unsigned options) { 4269 // Check arguments. 4270 if (isNotUsableTU(TU)) { 4271 LOG_BAD_TU(TU); 4272 return CXError_InvalidArguments; 4273 } 4274 4275 // Reset the associated diagnostics. 4276 delete static_cast<CXDiagnosticSetImpl *>(TU->Diagnostics); 4277 TU->Diagnostics = nullptr; 4278 4279 CIndexer *CXXIdx = TU->CIdx; 4280 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) 4281 setThreadBackgroundPriority(); 4282 4283 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4284 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 4285 4286 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles( 4287 new std::vector<ASTUnit::RemappedFile>()); 4288 4289 // Recover resources if we crash before exiting this function. 4290 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<ASTUnit::RemappedFile>> 4291 RemappedCleanup(RemappedFiles.get()); 4292 4293 for (auto &UF : unsaved_files) { 4294 std::unique_ptr<llvm::MemoryBuffer> MB = 4295 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); 4296 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); 4297 } 4298 4299 if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(), 4300 *RemappedFiles.get())) 4301 return CXError_Success; 4302 if (isASTReadError(CXXUnit)) 4303 return CXError_ASTReadError; 4304 return CXError_Failure; 4305 } 4306 4307 int clang_reparseTranslationUnit(CXTranslationUnit TU, 4308 unsigned num_unsaved_files, 4309 struct CXUnsavedFile *unsaved_files, 4310 unsigned options) { 4311 LOG_FUNC_SECTION { *Log << TU; } 4312 4313 if (num_unsaved_files && !unsaved_files) 4314 return CXError_InvalidArguments; 4315 4316 CXErrorCode result; 4317 auto ReparseTranslationUnitImpl = [=, &result]() { 4318 result = clang_reparseTranslationUnit_Impl( 4319 TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options); 4320 }; 4321 4322 llvm::CrashRecoveryContext CRC; 4323 4324 if (!RunSafely(CRC, ReparseTranslationUnitImpl)) { 4325 fprintf(stderr, "libclang: crash detected during reparsing\n"); 4326 cxtu::getASTUnit(TU)->setUnsafeToFree(true); 4327 return CXError_Crashed; 4328 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) 4329 PrintLibclangResourceUsage(TU); 4330 4331 return result; 4332 } 4333 4334 CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) { 4335 if (isNotUsableTU(CTUnit)) { 4336 LOG_BAD_TU(CTUnit); 4337 return cxstring::createEmpty(); 4338 } 4339 4340 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); 4341 return cxstring::createDup(CXXUnit->getOriginalSourceFileName()); 4342 } 4343 4344 CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) { 4345 if (isNotUsableTU(TU)) { 4346 LOG_BAD_TU(TU); 4347 return clang_getNullCursor(); 4348 } 4349 4350 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4351 return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU); 4352 } 4353 4354 CXTargetInfo clang_getTranslationUnitTargetInfo(CXTranslationUnit CTUnit) { 4355 if (isNotUsableTU(CTUnit)) { 4356 LOG_BAD_TU(CTUnit); 4357 return nullptr; 4358 } 4359 4360 CXTargetInfoImpl *impl = new CXTargetInfoImpl(); 4361 impl->TranslationUnit = CTUnit; 4362 return impl; 4363 } 4364 4365 CXString clang_TargetInfo_getTriple(CXTargetInfo TargetInfo) { 4366 if (!TargetInfo) 4367 return cxstring::createEmpty(); 4368 4369 CXTranslationUnit CTUnit = TargetInfo->TranslationUnit; 4370 assert(!isNotUsableTU(CTUnit) && 4371 "Unexpected unusable translation unit in TargetInfo"); 4372 4373 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); 4374 std::string Triple = 4375 CXXUnit->getASTContext().getTargetInfo().getTriple().normalize(); 4376 return cxstring::createDup(Triple); 4377 } 4378 4379 int clang_TargetInfo_getPointerWidth(CXTargetInfo TargetInfo) { 4380 if (!TargetInfo) 4381 return -1; 4382 4383 CXTranslationUnit CTUnit = TargetInfo->TranslationUnit; 4384 assert(!isNotUsableTU(CTUnit) && 4385 "Unexpected unusable translation unit in TargetInfo"); 4386 4387 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); 4388 return CXXUnit->getASTContext().getTargetInfo().getMaxPointerWidth(); 4389 } 4390 4391 void clang_TargetInfo_dispose(CXTargetInfo TargetInfo) { 4392 if (!TargetInfo) 4393 return; 4394 4395 delete TargetInfo; 4396 } 4397 4398 //===----------------------------------------------------------------------===// 4399 // CXFile Operations. 4400 //===----------------------------------------------------------------------===// 4401 4402 CXString clang_getFileName(CXFile SFile) { 4403 if (!SFile) 4404 return cxstring::createNull(); 4405 4406 FileEntry *FEnt = static_cast<FileEntry *>(SFile); 4407 return cxstring::createRef(FEnt->getName()); 4408 } 4409 4410 time_t clang_getFileTime(CXFile SFile) { 4411 if (!SFile) 4412 return 0; 4413 4414 FileEntry *FEnt = static_cast<FileEntry *>(SFile); 4415 return FEnt->getModificationTime(); 4416 } 4417 4418 CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) { 4419 if (isNotUsableTU(TU)) { 4420 LOG_BAD_TU(TU); 4421 return nullptr; 4422 } 4423 4424 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4425 4426 FileManager &FMgr = CXXUnit->getFileManager(); 4427 auto File = FMgr.getFile(file_name); 4428 if (!File) 4429 return nullptr; 4430 return const_cast<FileEntry *>(*File); 4431 } 4432 4433 const char *clang_getFileContents(CXTranslationUnit TU, CXFile file, 4434 size_t *size) { 4435 if (isNotUsableTU(TU)) { 4436 LOG_BAD_TU(TU); 4437 return nullptr; 4438 } 4439 4440 const SourceManager &SM = cxtu::getASTUnit(TU)->getSourceManager(); 4441 FileID fid = SM.translateFile(static_cast<FileEntry *>(file)); 4442 llvm::Optional<llvm::MemoryBufferRef> buf = SM.getBufferOrNone(fid); 4443 if (!buf) { 4444 if (size) 4445 *size = 0; 4446 return nullptr; 4447 } 4448 if (size) 4449 *size = buf->getBufferSize(); 4450 return buf->getBufferStart(); 4451 } 4452 4453 unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, CXFile file) { 4454 if (isNotUsableTU(TU)) { 4455 LOG_BAD_TU(TU); 4456 return 0; 4457 } 4458 4459 if (!file) 4460 return 0; 4461 4462 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4463 FileEntry *FEnt = static_cast<FileEntry *>(file); 4464 return CXXUnit->getPreprocessor() 4465 .getHeaderSearchInfo() 4466 .isFileMultipleIncludeGuarded(FEnt); 4467 } 4468 4469 int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) { 4470 if (!file || !outID) 4471 return 1; 4472 4473 FileEntry *FEnt = static_cast<FileEntry *>(file); 4474 const llvm::sys::fs::UniqueID &ID = FEnt->getUniqueID(); 4475 outID->data[0] = ID.getDevice(); 4476 outID->data[1] = ID.getFile(); 4477 outID->data[2] = FEnt->getModificationTime(); 4478 return 0; 4479 } 4480 4481 int clang_File_isEqual(CXFile file1, CXFile file2) { 4482 if (file1 == file2) 4483 return true; 4484 4485 if (!file1 || !file2) 4486 return false; 4487 4488 FileEntry *FEnt1 = static_cast<FileEntry *>(file1); 4489 FileEntry *FEnt2 = static_cast<FileEntry *>(file2); 4490 return FEnt1->getUniqueID() == FEnt2->getUniqueID(); 4491 } 4492 4493 CXString clang_File_tryGetRealPathName(CXFile SFile) { 4494 if (!SFile) 4495 return cxstring::createNull(); 4496 4497 FileEntry *FEnt = static_cast<FileEntry *>(SFile); 4498 return cxstring::createRef(FEnt->tryGetRealPathName()); 4499 } 4500 4501 //===----------------------------------------------------------------------===// 4502 // CXCursor Operations. 4503 //===----------------------------------------------------------------------===// 4504 4505 static const Decl *getDeclFromExpr(const Stmt *E) { 4506 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 4507 return getDeclFromExpr(CE->getSubExpr()); 4508 4509 if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E)) 4510 return RefExpr->getDecl(); 4511 if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 4512 return ME->getMemberDecl(); 4513 if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E)) 4514 return RE->getDecl(); 4515 if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) { 4516 if (PRE->isExplicitProperty()) 4517 return PRE->getExplicitProperty(); 4518 // It could be messaging both getter and setter as in: 4519 // ++myobj.myprop; 4520 // in which case prefer to associate the setter since it is less obvious 4521 // from inspecting the source that the setter is going to get called. 4522 if (PRE->isMessagingSetter()) 4523 return PRE->getImplicitPropertySetter(); 4524 return PRE->getImplicitPropertyGetter(); 4525 } 4526 if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) 4527 return getDeclFromExpr(POE->getSyntacticForm()); 4528 if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) 4529 if (Expr *Src = OVE->getSourceExpr()) 4530 return getDeclFromExpr(Src); 4531 4532 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) 4533 return getDeclFromExpr(CE->getCallee()); 4534 if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) 4535 if (!CE->isElidable()) 4536 return CE->getConstructor(); 4537 if (const CXXInheritedCtorInitExpr *CE = 4538 dyn_cast<CXXInheritedCtorInitExpr>(E)) 4539 return CE->getConstructor(); 4540 if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E)) 4541 return OME->getMethodDecl(); 4542 4543 if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E)) 4544 return PE->getProtocol(); 4545 if (const SubstNonTypeTemplateParmPackExpr *NTTP = 4546 dyn_cast<SubstNonTypeTemplateParmPackExpr>(E)) 4547 return NTTP->getParameterPack(); 4548 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E)) 4549 if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) || 4550 isa<ParmVarDecl>(SizeOfPack->getPack())) 4551 return SizeOfPack->getPack(); 4552 4553 return nullptr; 4554 } 4555 4556 static SourceLocation getLocationFromExpr(const Expr *E) { 4557 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 4558 return getLocationFromExpr(CE->getSubExpr()); 4559 4560 if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E)) 4561 return /*FIXME:*/ Msg->getLeftLoc(); 4562 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 4563 return DRE->getLocation(); 4564 if (const MemberExpr *Member = dyn_cast<MemberExpr>(E)) 4565 return Member->getMemberLoc(); 4566 if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E)) 4567 return Ivar->getLocation(); 4568 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E)) 4569 return SizeOfPack->getPackLoc(); 4570 if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E)) 4571 return PropRef->getLocation(); 4572 4573 return E->getBeginLoc(); 4574 } 4575 4576 extern "C" { 4577 4578 unsigned clang_visitChildren(CXCursor parent, CXCursorVisitor visitor, 4579 CXClientData client_data) { 4580 CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data, 4581 /*VisitPreprocessorLast=*/false); 4582 return CursorVis.VisitChildren(parent); 4583 } 4584 4585 #ifndef __has_feature 4586 #define __has_feature(x) 0 4587 #endif 4588 #if __has_feature(blocks) 4589 typedef enum CXChildVisitResult (^CXCursorVisitorBlock)(CXCursor cursor, 4590 CXCursor parent); 4591 4592 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 4593 CXClientData client_data) { 4594 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 4595 return block(cursor, parent); 4596 } 4597 #else 4598 // If we are compiled with a compiler that doesn't have native blocks support, 4599 // define and call the block manually, so the 4600 typedef struct _CXChildVisitResult { 4601 void *isa; 4602 int flags; 4603 int reserved; 4604 enum CXChildVisitResult (*invoke)(struct _CXChildVisitResult *, CXCursor, 4605 CXCursor); 4606 } * CXCursorVisitorBlock; 4607 4608 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 4609 CXClientData client_data) { 4610 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 4611 return block->invoke(block, cursor, parent); 4612 } 4613 #endif 4614 4615 unsigned clang_visitChildrenWithBlock(CXCursor parent, 4616 CXCursorVisitorBlock block) { 4617 return clang_visitChildren(parent, visitWithBlock, block); 4618 } 4619 4620 static CXString getDeclSpelling(const Decl *D) { 4621 if (!D) 4622 return cxstring::createEmpty(); 4623 4624 const NamedDecl *ND = dyn_cast<NamedDecl>(D); 4625 if (!ND) { 4626 if (const ObjCPropertyImplDecl *PropImpl = 4627 dyn_cast<ObjCPropertyImplDecl>(D)) 4628 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 4629 return cxstring::createDup(Property->getIdentifier()->getName()); 4630 4631 if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D)) 4632 if (Module *Mod = ImportD->getImportedModule()) 4633 return cxstring::createDup(Mod->getFullModuleName()); 4634 4635 return cxstring::createEmpty(); 4636 } 4637 4638 if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND)) 4639 return cxstring::createDup(OMD->getSelector().getAsString()); 4640 4641 if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND)) 4642 // No, this isn't the same as the code below. getIdentifier() is non-virtual 4643 // and returns different names. NamedDecl returns the class name and 4644 // ObjCCategoryImplDecl returns the category name. 4645 return cxstring::createRef(CIMP->getIdentifier()->getNameStart()); 4646 4647 if (isa<UsingDirectiveDecl>(D)) 4648 return cxstring::createEmpty(); 4649 4650 SmallString<1024> S; 4651 llvm::raw_svector_ostream os(S); 4652 ND->printName(os); 4653 4654 return cxstring::createDup(os.str()); 4655 } 4656 4657 CXString clang_getCursorSpelling(CXCursor C) { 4658 if (clang_isTranslationUnit(C.kind)) 4659 return clang_getTranslationUnitSpelling(getCursorTU(C)); 4660 4661 if (clang_isReference(C.kind)) { 4662 switch (C.kind) { 4663 case CXCursor_ObjCSuperClassRef: { 4664 const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first; 4665 return cxstring::createRef(Super->getIdentifier()->getNameStart()); 4666 } 4667 case CXCursor_ObjCClassRef: { 4668 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 4669 return cxstring::createRef(Class->getIdentifier()->getNameStart()); 4670 } 4671 case CXCursor_ObjCProtocolRef: { 4672 const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first; 4673 assert(OID && "getCursorSpelling(): Missing protocol decl"); 4674 return cxstring::createRef(OID->getIdentifier()->getNameStart()); 4675 } 4676 case CXCursor_CXXBaseSpecifier: { 4677 const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C); 4678 return cxstring::createDup(B->getType().getAsString()); 4679 } 4680 case CXCursor_TypeRef: { 4681 const TypeDecl *Type = getCursorTypeRef(C).first; 4682 assert(Type && "Missing type decl"); 4683 4684 return cxstring::createDup( 4685 getCursorContext(C).getTypeDeclType(Type).getAsString()); 4686 } 4687 case CXCursor_TemplateRef: { 4688 const TemplateDecl *Template = getCursorTemplateRef(C).first; 4689 assert(Template && "Missing template decl"); 4690 4691 return cxstring::createDup(Template->getNameAsString()); 4692 } 4693 4694 case CXCursor_NamespaceRef: { 4695 const NamedDecl *NS = getCursorNamespaceRef(C).first; 4696 assert(NS && "Missing namespace decl"); 4697 4698 return cxstring::createDup(NS->getNameAsString()); 4699 } 4700 4701 case CXCursor_MemberRef: { 4702 const FieldDecl *Field = getCursorMemberRef(C).first; 4703 assert(Field && "Missing member decl"); 4704 4705 return cxstring::createDup(Field->getNameAsString()); 4706 } 4707 4708 case CXCursor_LabelRef: { 4709 const LabelStmt *Label = getCursorLabelRef(C).first; 4710 assert(Label && "Missing label"); 4711 4712 return cxstring::createRef(Label->getName()); 4713 } 4714 4715 case CXCursor_OverloadedDeclRef: { 4716 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 4717 if (const Decl *D = Storage.dyn_cast<const Decl *>()) { 4718 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 4719 return cxstring::createDup(ND->getNameAsString()); 4720 return cxstring::createEmpty(); 4721 } 4722 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 4723 return cxstring::createDup(E->getName().getAsString()); 4724 OverloadedTemplateStorage *Ovl = 4725 Storage.get<OverloadedTemplateStorage *>(); 4726 if (Ovl->size() == 0) 4727 return cxstring::createEmpty(); 4728 return cxstring::createDup((*Ovl->begin())->getNameAsString()); 4729 } 4730 4731 case CXCursor_VariableRef: { 4732 const VarDecl *Var = getCursorVariableRef(C).first; 4733 assert(Var && "Missing variable decl"); 4734 4735 return cxstring::createDup(Var->getNameAsString()); 4736 } 4737 4738 default: 4739 return cxstring::createRef("<not implemented>"); 4740 } 4741 } 4742 4743 if (clang_isExpression(C.kind)) { 4744 const Expr *E = getCursorExpr(C); 4745 4746 if (C.kind == CXCursor_ObjCStringLiteral || 4747 C.kind == CXCursor_StringLiteral) { 4748 const StringLiteral *SLit; 4749 if (const ObjCStringLiteral *OSL = dyn_cast<ObjCStringLiteral>(E)) { 4750 SLit = OSL->getString(); 4751 } else { 4752 SLit = cast<StringLiteral>(E); 4753 } 4754 SmallString<256> Buf; 4755 llvm::raw_svector_ostream OS(Buf); 4756 SLit->outputString(OS); 4757 return cxstring::createDup(OS.str()); 4758 } 4759 4760 const Decl *D = getDeclFromExpr(getCursorExpr(C)); 4761 if (D) 4762 return getDeclSpelling(D); 4763 return cxstring::createEmpty(); 4764 } 4765 4766 if (clang_isStatement(C.kind)) { 4767 const Stmt *S = getCursorStmt(C); 4768 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) 4769 return cxstring::createRef(Label->getName()); 4770 4771 return cxstring::createEmpty(); 4772 } 4773 4774 if (C.kind == CXCursor_MacroExpansion) 4775 return cxstring::createRef( 4776 getCursorMacroExpansion(C).getName()->getNameStart()); 4777 4778 if (C.kind == CXCursor_MacroDefinition) 4779 return cxstring::createRef( 4780 getCursorMacroDefinition(C)->getName()->getNameStart()); 4781 4782 if (C.kind == CXCursor_InclusionDirective) 4783 return cxstring::createDup(getCursorInclusionDirective(C)->getFileName()); 4784 4785 if (clang_isDeclaration(C.kind)) 4786 return getDeclSpelling(getCursorDecl(C)); 4787 4788 if (C.kind == CXCursor_AnnotateAttr) { 4789 const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C)); 4790 return cxstring::createDup(AA->getAnnotation()); 4791 } 4792 4793 if (C.kind == CXCursor_AsmLabelAttr) { 4794 const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C)); 4795 return cxstring::createDup(AA->getLabel()); 4796 } 4797 4798 if (C.kind == CXCursor_PackedAttr) { 4799 return cxstring::createRef("packed"); 4800 } 4801 4802 if (C.kind == CXCursor_VisibilityAttr) { 4803 const VisibilityAttr *AA = cast<VisibilityAttr>(cxcursor::getCursorAttr(C)); 4804 switch (AA->getVisibility()) { 4805 case VisibilityAttr::VisibilityType::Default: 4806 return cxstring::createRef("default"); 4807 case VisibilityAttr::VisibilityType::Hidden: 4808 return cxstring::createRef("hidden"); 4809 case VisibilityAttr::VisibilityType::Protected: 4810 return cxstring::createRef("protected"); 4811 } 4812 llvm_unreachable("unknown visibility type"); 4813 } 4814 4815 return cxstring::createEmpty(); 4816 } 4817 4818 CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C, unsigned pieceIndex, 4819 unsigned options) { 4820 if (clang_Cursor_isNull(C)) 4821 return clang_getNullRange(); 4822 4823 ASTContext &Ctx = getCursorContext(C); 4824 4825 if (clang_isStatement(C.kind)) { 4826 const Stmt *S = getCursorStmt(C); 4827 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) { 4828 if (pieceIndex > 0) 4829 return clang_getNullRange(); 4830 return cxloc::translateSourceRange(Ctx, Label->getIdentLoc()); 4831 } 4832 4833 return clang_getNullRange(); 4834 } 4835 4836 if (C.kind == CXCursor_ObjCMessageExpr) { 4837 if (const ObjCMessageExpr *ME = 4838 dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) { 4839 if (pieceIndex >= ME->getNumSelectorLocs()) 4840 return clang_getNullRange(); 4841 return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex)); 4842 } 4843 } 4844 4845 if (C.kind == CXCursor_ObjCInstanceMethodDecl || 4846 C.kind == CXCursor_ObjCClassMethodDecl) { 4847 if (const ObjCMethodDecl *MD = 4848 dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) { 4849 if (pieceIndex >= MD->getNumSelectorLocs()) 4850 return clang_getNullRange(); 4851 return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex)); 4852 } 4853 } 4854 4855 if (C.kind == CXCursor_ObjCCategoryDecl || 4856 C.kind == CXCursor_ObjCCategoryImplDecl) { 4857 if (pieceIndex > 0) 4858 return clang_getNullRange(); 4859 if (const ObjCCategoryDecl *CD = 4860 dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C))) 4861 return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc()); 4862 if (const ObjCCategoryImplDecl *CID = 4863 dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C))) 4864 return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc()); 4865 } 4866 4867 if (C.kind == CXCursor_ModuleImportDecl) { 4868 if (pieceIndex > 0) 4869 return clang_getNullRange(); 4870 if (const ImportDecl *ImportD = 4871 dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) { 4872 ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs(); 4873 if (!Locs.empty()) 4874 return cxloc::translateSourceRange( 4875 Ctx, SourceRange(Locs.front(), Locs.back())); 4876 } 4877 return clang_getNullRange(); 4878 } 4879 4880 if (C.kind == CXCursor_CXXMethod || C.kind == CXCursor_Destructor || 4881 C.kind == CXCursor_ConversionFunction || 4882 C.kind == CXCursor_FunctionDecl) { 4883 if (pieceIndex > 0) 4884 return clang_getNullRange(); 4885 if (const FunctionDecl *FD = 4886 dyn_cast_or_null<FunctionDecl>(getCursorDecl(C))) { 4887 DeclarationNameInfo FunctionName = FD->getNameInfo(); 4888 return cxloc::translateSourceRange(Ctx, FunctionName.getSourceRange()); 4889 } 4890 return clang_getNullRange(); 4891 } 4892 4893 // FIXME: A CXCursor_InclusionDirective should give the location of the 4894 // filename, but we don't keep track of this. 4895 4896 // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation 4897 // but we don't keep track of this. 4898 4899 // FIXME: A CXCursor_AsmLabelAttr should give the location of the label 4900 // but we don't keep track of this. 4901 4902 // Default handling, give the location of the cursor. 4903 4904 if (pieceIndex > 0) 4905 return clang_getNullRange(); 4906 4907 CXSourceLocation CXLoc = clang_getCursorLocation(C); 4908 SourceLocation Loc = cxloc::translateSourceLocation(CXLoc); 4909 return cxloc::translateSourceRange(Ctx, Loc); 4910 } 4911 4912 CXString clang_Cursor_getMangling(CXCursor C) { 4913 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind)) 4914 return cxstring::createEmpty(); 4915 4916 // Mangling only works for functions and variables. 4917 const Decl *D = getCursorDecl(C); 4918 if (!D || !(isa<FunctionDecl>(D) || isa<VarDecl>(D))) 4919 return cxstring::createEmpty(); 4920 4921 ASTContext &Ctx = D->getASTContext(); 4922 ASTNameGenerator ASTNameGen(Ctx); 4923 return cxstring::createDup(ASTNameGen.getName(D)); 4924 } 4925 4926 CXStringSet *clang_Cursor_getCXXManglings(CXCursor C) { 4927 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind)) 4928 return nullptr; 4929 4930 const Decl *D = getCursorDecl(C); 4931 if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D))) 4932 return nullptr; 4933 4934 ASTContext &Ctx = D->getASTContext(); 4935 ASTNameGenerator ASTNameGen(Ctx); 4936 std::vector<std::string> Manglings = ASTNameGen.getAllManglings(D); 4937 return cxstring::createSet(Manglings); 4938 } 4939 4940 CXStringSet *clang_Cursor_getObjCManglings(CXCursor C) { 4941 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind)) 4942 return nullptr; 4943 4944 const Decl *D = getCursorDecl(C); 4945 if (!(isa<ObjCInterfaceDecl>(D) || isa<ObjCImplementationDecl>(D))) 4946 return nullptr; 4947 4948 ASTContext &Ctx = D->getASTContext(); 4949 ASTNameGenerator ASTNameGen(Ctx); 4950 std::vector<std::string> Manglings = ASTNameGen.getAllManglings(D); 4951 return cxstring::createSet(Manglings); 4952 } 4953 4954 CXPrintingPolicy clang_getCursorPrintingPolicy(CXCursor C) { 4955 if (clang_Cursor_isNull(C)) 4956 return nullptr; 4957 return new PrintingPolicy(getCursorContext(C).getPrintingPolicy()); 4958 } 4959 4960 void clang_PrintingPolicy_dispose(CXPrintingPolicy Policy) { 4961 if (Policy) 4962 delete static_cast<PrintingPolicy *>(Policy); 4963 } 4964 4965 unsigned 4966 clang_PrintingPolicy_getProperty(CXPrintingPolicy Policy, 4967 enum CXPrintingPolicyProperty Property) { 4968 if (!Policy) 4969 return 0; 4970 4971 PrintingPolicy *P = static_cast<PrintingPolicy *>(Policy); 4972 switch (Property) { 4973 case CXPrintingPolicy_Indentation: 4974 return P->Indentation; 4975 case CXPrintingPolicy_SuppressSpecifiers: 4976 return P->SuppressSpecifiers; 4977 case CXPrintingPolicy_SuppressTagKeyword: 4978 return P->SuppressTagKeyword; 4979 case CXPrintingPolicy_IncludeTagDefinition: 4980 return P->IncludeTagDefinition; 4981 case CXPrintingPolicy_SuppressScope: 4982 return P->SuppressScope; 4983 case CXPrintingPolicy_SuppressUnwrittenScope: 4984 return P->SuppressUnwrittenScope; 4985 case CXPrintingPolicy_SuppressInitializers: 4986 return P->SuppressInitializers; 4987 case CXPrintingPolicy_ConstantArraySizeAsWritten: 4988 return P->ConstantArraySizeAsWritten; 4989 case CXPrintingPolicy_AnonymousTagLocations: 4990 return P->AnonymousTagLocations; 4991 case CXPrintingPolicy_SuppressStrongLifetime: 4992 return P->SuppressStrongLifetime; 4993 case CXPrintingPolicy_SuppressLifetimeQualifiers: 4994 return P->SuppressLifetimeQualifiers; 4995 case CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors: 4996 return P->SuppressTemplateArgsInCXXConstructors; 4997 case CXPrintingPolicy_Bool: 4998 return P->Bool; 4999 case CXPrintingPolicy_Restrict: 5000 return P->Restrict; 5001 case CXPrintingPolicy_Alignof: 5002 return P->Alignof; 5003 case CXPrintingPolicy_UnderscoreAlignof: 5004 return P->UnderscoreAlignof; 5005 case CXPrintingPolicy_UseVoidForZeroParams: 5006 return P->UseVoidForZeroParams; 5007 case CXPrintingPolicy_TerseOutput: 5008 return P->TerseOutput; 5009 case CXPrintingPolicy_PolishForDeclaration: 5010 return P->PolishForDeclaration; 5011 case CXPrintingPolicy_Half: 5012 return P->Half; 5013 case CXPrintingPolicy_MSWChar: 5014 return P->MSWChar; 5015 case CXPrintingPolicy_IncludeNewlines: 5016 return P->IncludeNewlines; 5017 case CXPrintingPolicy_MSVCFormatting: 5018 return P->MSVCFormatting; 5019 case CXPrintingPolicy_ConstantsAsWritten: 5020 return P->ConstantsAsWritten; 5021 case CXPrintingPolicy_SuppressImplicitBase: 5022 return P->SuppressImplicitBase; 5023 case CXPrintingPolicy_FullyQualifiedName: 5024 return P->FullyQualifiedName; 5025 } 5026 5027 assert(false && "Invalid CXPrintingPolicyProperty"); 5028 return 0; 5029 } 5030 5031 void clang_PrintingPolicy_setProperty(CXPrintingPolicy Policy, 5032 enum CXPrintingPolicyProperty Property, 5033 unsigned Value) { 5034 if (!Policy) 5035 return; 5036 5037 PrintingPolicy *P = static_cast<PrintingPolicy *>(Policy); 5038 switch (Property) { 5039 case CXPrintingPolicy_Indentation: 5040 P->Indentation = Value; 5041 return; 5042 case CXPrintingPolicy_SuppressSpecifiers: 5043 P->SuppressSpecifiers = Value; 5044 return; 5045 case CXPrintingPolicy_SuppressTagKeyword: 5046 P->SuppressTagKeyword = Value; 5047 return; 5048 case CXPrintingPolicy_IncludeTagDefinition: 5049 P->IncludeTagDefinition = Value; 5050 return; 5051 case CXPrintingPolicy_SuppressScope: 5052 P->SuppressScope = Value; 5053 return; 5054 case CXPrintingPolicy_SuppressUnwrittenScope: 5055 P->SuppressUnwrittenScope = Value; 5056 return; 5057 case CXPrintingPolicy_SuppressInitializers: 5058 P->SuppressInitializers = Value; 5059 return; 5060 case CXPrintingPolicy_ConstantArraySizeAsWritten: 5061 P->ConstantArraySizeAsWritten = Value; 5062 return; 5063 case CXPrintingPolicy_AnonymousTagLocations: 5064 P->AnonymousTagLocations = Value; 5065 return; 5066 case CXPrintingPolicy_SuppressStrongLifetime: 5067 P->SuppressStrongLifetime = Value; 5068 return; 5069 case CXPrintingPolicy_SuppressLifetimeQualifiers: 5070 P->SuppressLifetimeQualifiers = Value; 5071 return; 5072 case CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors: 5073 P->SuppressTemplateArgsInCXXConstructors = Value; 5074 return; 5075 case CXPrintingPolicy_Bool: 5076 P->Bool = Value; 5077 return; 5078 case CXPrintingPolicy_Restrict: 5079 P->Restrict = Value; 5080 return; 5081 case CXPrintingPolicy_Alignof: 5082 P->Alignof = Value; 5083 return; 5084 case CXPrintingPolicy_UnderscoreAlignof: 5085 P->UnderscoreAlignof = Value; 5086 return; 5087 case CXPrintingPolicy_UseVoidForZeroParams: 5088 P->UseVoidForZeroParams = Value; 5089 return; 5090 case CXPrintingPolicy_TerseOutput: 5091 P->TerseOutput = Value; 5092 return; 5093 case CXPrintingPolicy_PolishForDeclaration: 5094 P->PolishForDeclaration = Value; 5095 return; 5096 case CXPrintingPolicy_Half: 5097 P->Half = Value; 5098 return; 5099 case CXPrintingPolicy_MSWChar: 5100 P->MSWChar = Value; 5101 return; 5102 case CXPrintingPolicy_IncludeNewlines: 5103 P->IncludeNewlines = Value; 5104 return; 5105 case CXPrintingPolicy_MSVCFormatting: 5106 P->MSVCFormatting = Value; 5107 return; 5108 case CXPrintingPolicy_ConstantsAsWritten: 5109 P->ConstantsAsWritten = Value; 5110 return; 5111 case CXPrintingPolicy_SuppressImplicitBase: 5112 P->SuppressImplicitBase = Value; 5113 return; 5114 case CXPrintingPolicy_FullyQualifiedName: 5115 P->FullyQualifiedName = Value; 5116 return; 5117 } 5118 5119 assert(false && "Invalid CXPrintingPolicyProperty"); 5120 } 5121 5122 CXString clang_getCursorPrettyPrinted(CXCursor C, CXPrintingPolicy cxPolicy) { 5123 if (clang_Cursor_isNull(C)) 5124 return cxstring::createEmpty(); 5125 5126 if (clang_isDeclaration(C.kind)) { 5127 const Decl *D = getCursorDecl(C); 5128 if (!D) 5129 return cxstring::createEmpty(); 5130 5131 SmallString<128> Str; 5132 llvm::raw_svector_ostream OS(Str); 5133 PrintingPolicy *UserPolicy = static_cast<PrintingPolicy *>(cxPolicy); 5134 D->print(OS, UserPolicy ? *UserPolicy 5135 : getCursorContext(C).getPrintingPolicy()); 5136 5137 return cxstring::createDup(OS.str()); 5138 } 5139 5140 return cxstring::createEmpty(); 5141 } 5142 5143 CXString clang_getCursorDisplayName(CXCursor C) { 5144 if (!clang_isDeclaration(C.kind)) 5145 return clang_getCursorSpelling(C); 5146 5147 const Decl *D = getCursorDecl(C); 5148 if (!D) 5149 return cxstring::createEmpty(); 5150 5151 PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy(); 5152 if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D)) 5153 D = FunTmpl->getTemplatedDecl(); 5154 5155 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 5156 SmallString<64> Str; 5157 llvm::raw_svector_ostream OS(Str); 5158 OS << *Function; 5159 if (Function->getPrimaryTemplate()) 5160 OS << "<>"; 5161 OS << "("; 5162 for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) { 5163 if (I) 5164 OS << ", "; 5165 OS << Function->getParamDecl(I)->getType().getAsString(Policy); 5166 } 5167 5168 if (Function->isVariadic()) { 5169 if (Function->getNumParams()) 5170 OS << ", "; 5171 OS << "..."; 5172 } 5173 OS << ")"; 5174 return cxstring::createDup(OS.str()); 5175 } 5176 5177 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) { 5178 SmallString<64> Str; 5179 llvm::raw_svector_ostream OS(Str); 5180 OS << *ClassTemplate; 5181 OS << "<"; 5182 TemplateParameterList *Params = ClassTemplate->getTemplateParameters(); 5183 for (unsigned I = 0, N = Params->size(); I != N; ++I) { 5184 if (I) 5185 OS << ", "; 5186 5187 NamedDecl *Param = Params->getParam(I); 5188 if (Param->getIdentifier()) { 5189 OS << Param->getIdentifier()->getName(); 5190 continue; 5191 } 5192 5193 // There is no parameter name, which makes this tricky. Try to come up 5194 // with something useful that isn't too long. 5195 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 5196 if (const auto *TC = TTP->getTypeConstraint()) { 5197 TC->getConceptNameInfo().printName(OS, Policy); 5198 if (TC->hasExplicitTemplateArgs()) 5199 OS << "<...>"; 5200 } else 5201 OS << (TTP->wasDeclaredWithTypename() ? "typename" : "class"); 5202 else if (NonTypeTemplateParmDecl *NTTP = 5203 dyn_cast<NonTypeTemplateParmDecl>(Param)) 5204 OS << NTTP->getType().getAsString(Policy); 5205 else 5206 OS << "template<...> class"; 5207 } 5208 5209 OS << ">"; 5210 return cxstring::createDup(OS.str()); 5211 } 5212 5213 if (const ClassTemplateSpecializationDecl *ClassSpec = 5214 dyn_cast<ClassTemplateSpecializationDecl>(D)) { 5215 // If the type was explicitly written, use that. 5216 if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten()) 5217 return cxstring::createDup(TSInfo->getType().getAsString(Policy)); 5218 5219 SmallString<128> Str; 5220 llvm::raw_svector_ostream OS(Str); 5221 OS << *ClassSpec; 5222 printTemplateArgumentList( 5223 OS, ClassSpec->getTemplateArgs().asArray(), Policy, 5224 ClassSpec->getSpecializedTemplate()->getTemplateParameters()); 5225 return cxstring::createDup(OS.str()); 5226 } 5227 5228 return clang_getCursorSpelling(C); 5229 } 5230 5231 CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { 5232 switch (Kind) { 5233 case CXCursor_FunctionDecl: 5234 return cxstring::createRef("FunctionDecl"); 5235 case CXCursor_TypedefDecl: 5236 return cxstring::createRef("TypedefDecl"); 5237 case CXCursor_EnumDecl: 5238 return cxstring::createRef("EnumDecl"); 5239 case CXCursor_EnumConstantDecl: 5240 return cxstring::createRef("EnumConstantDecl"); 5241 case CXCursor_StructDecl: 5242 return cxstring::createRef("StructDecl"); 5243 case CXCursor_UnionDecl: 5244 return cxstring::createRef("UnionDecl"); 5245 case CXCursor_ClassDecl: 5246 return cxstring::createRef("ClassDecl"); 5247 case CXCursor_FieldDecl: 5248 return cxstring::createRef("FieldDecl"); 5249 case CXCursor_VarDecl: 5250 return cxstring::createRef("VarDecl"); 5251 case CXCursor_ParmDecl: 5252 return cxstring::createRef("ParmDecl"); 5253 case CXCursor_ObjCInterfaceDecl: 5254 return cxstring::createRef("ObjCInterfaceDecl"); 5255 case CXCursor_ObjCCategoryDecl: 5256 return cxstring::createRef("ObjCCategoryDecl"); 5257 case CXCursor_ObjCProtocolDecl: 5258 return cxstring::createRef("ObjCProtocolDecl"); 5259 case CXCursor_ObjCPropertyDecl: 5260 return cxstring::createRef("ObjCPropertyDecl"); 5261 case CXCursor_ObjCIvarDecl: 5262 return cxstring::createRef("ObjCIvarDecl"); 5263 case CXCursor_ObjCInstanceMethodDecl: 5264 return cxstring::createRef("ObjCInstanceMethodDecl"); 5265 case CXCursor_ObjCClassMethodDecl: 5266 return cxstring::createRef("ObjCClassMethodDecl"); 5267 case CXCursor_ObjCImplementationDecl: 5268 return cxstring::createRef("ObjCImplementationDecl"); 5269 case CXCursor_ObjCCategoryImplDecl: 5270 return cxstring::createRef("ObjCCategoryImplDecl"); 5271 case CXCursor_CXXMethod: 5272 return cxstring::createRef("CXXMethod"); 5273 case CXCursor_UnexposedDecl: 5274 return cxstring::createRef("UnexposedDecl"); 5275 case CXCursor_ObjCSuperClassRef: 5276 return cxstring::createRef("ObjCSuperClassRef"); 5277 case CXCursor_ObjCProtocolRef: 5278 return cxstring::createRef("ObjCProtocolRef"); 5279 case CXCursor_ObjCClassRef: 5280 return cxstring::createRef("ObjCClassRef"); 5281 case CXCursor_TypeRef: 5282 return cxstring::createRef("TypeRef"); 5283 case CXCursor_TemplateRef: 5284 return cxstring::createRef("TemplateRef"); 5285 case CXCursor_NamespaceRef: 5286 return cxstring::createRef("NamespaceRef"); 5287 case CXCursor_MemberRef: 5288 return cxstring::createRef("MemberRef"); 5289 case CXCursor_LabelRef: 5290 return cxstring::createRef("LabelRef"); 5291 case CXCursor_OverloadedDeclRef: 5292 return cxstring::createRef("OverloadedDeclRef"); 5293 case CXCursor_VariableRef: 5294 return cxstring::createRef("VariableRef"); 5295 case CXCursor_IntegerLiteral: 5296 return cxstring::createRef("IntegerLiteral"); 5297 case CXCursor_FixedPointLiteral: 5298 return cxstring::createRef("FixedPointLiteral"); 5299 case CXCursor_FloatingLiteral: 5300 return cxstring::createRef("FloatingLiteral"); 5301 case CXCursor_ImaginaryLiteral: 5302 return cxstring::createRef("ImaginaryLiteral"); 5303 case CXCursor_StringLiteral: 5304 return cxstring::createRef("StringLiteral"); 5305 case CXCursor_CharacterLiteral: 5306 return cxstring::createRef("CharacterLiteral"); 5307 case CXCursor_ParenExpr: 5308 return cxstring::createRef("ParenExpr"); 5309 case CXCursor_UnaryOperator: 5310 return cxstring::createRef("UnaryOperator"); 5311 case CXCursor_ArraySubscriptExpr: 5312 return cxstring::createRef("ArraySubscriptExpr"); 5313 case CXCursor_OMPArraySectionExpr: 5314 return cxstring::createRef("OMPArraySectionExpr"); 5315 case CXCursor_OMPArrayShapingExpr: 5316 return cxstring::createRef("OMPArrayShapingExpr"); 5317 case CXCursor_OMPIteratorExpr: 5318 return cxstring::createRef("OMPIteratorExpr"); 5319 case CXCursor_BinaryOperator: 5320 return cxstring::createRef("BinaryOperator"); 5321 case CXCursor_CompoundAssignOperator: 5322 return cxstring::createRef("CompoundAssignOperator"); 5323 case CXCursor_ConditionalOperator: 5324 return cxstring::createRef("ConditionalOperator"); 5325 case CXCursor_CStyleCastExpr: 5326 return cxstring::createRef("CStyleCastExpr"); 5327 case CXCursor_CompoundLiteralExpr: 5328 return cxstring::createRef("CompoundLiteralExpr"); 5329 case CXCursor_InitListExpr: 5330 return cxstring::createRef("InitListExpr"); 5331 case CXCursor_AddrLabelExpr: 5332 return cxstring::createRef("AddrLabelExpr"); 5333 case CXCursor_StmtExpr: 5334 return cxstring::createRef("StmtExpr"); 5335 case CXCursor_GenericSelectionExpr: 5336 return cxstring::createRef("GenericSelectionExpr"); 5337 case CXCursor_GNUNullExpr: 5338 return cxstring::createRef("GNUNullExpr"); 5339 case CXCursor_CXXStaticCastExpr: 5340 return cxstring::createRef("CXXStaticCastExpr"); 5341 case CXCursor_CXXDynamicCastExpr: 5342 return cxstring::createRef("CXXDynamicCastExpr"); 5343 case CXCursor_CXXReinterpretCastExpr: 5344 return cxstring::createRef("CXXReinterpretCastExpr"); 5345 case CXCursor_CXXConstCastExpr: 5346 return cxstring::createRef("CXXConstCastExpr"); 5347 case CXCursor_CXXFunctionalCastExpr: 5348 return cxstring::createRef("CXXFunctionalCastExpr"); 5349 case CXCursor_CXXAddrspaceCastExpr: 5350 return cxstring::createRef("CXXAddrspaceCastExpr"); 5351 case CXCursor_CXXTypeidExpr: 5352 return cxstring::createRef("CXXTypeidExpr"); 5353 case CXCursor_CXXBoolLiteralExpr: 5354 return cxstring::createRef("CXXBoolLiteralExpr"); 5355 case CXCursor_CXXNullPtrLiteralExpr: 5356 return cxstring::createRef("CXXNullPtrLiteralExpr"); 5357 case CXCursor_CXXThisExpr: 5358 return cxstring::createRef("CXXThisExpr"); 5359 case CXCursor_CXXThrowExpr: 5360 return cxstring::createRef("CXXThrowExpr"); 5361 case CXCursor_CXXNewExpr: 5362 return cxstring::createRef("CXXNewExpr"); 5363 case CXCursor_CXXDeleteExpr: 5364 return cxstring::createRef("CXXDeleteExpr"); 5365 case CXCursor_UnaryExpr: 5366 return cxstring::createRef("UnaryExpr"); 5367 case CXCursor_ObjCStringLiteral: 5368 return cxstring::createRef("ObjCStringLiteral"); 5369 case CXCursor_ObjCBoolLiteralExpr: 5370 return cxstring::createRef("ObjCBoolLiteralExpr"); 5371 case CXCursor_ObjCAvailabilityCheckExpr: 5372 return cxstring::createRef("ObjCAvailabilityCheckExpr"); 5373 case CXCursor_ObjCSelfExpr: 5374 return cxstring::createRef("ObjCSelfExpr"); 5375 case CXCursor_ObjCEncodeExpr: 5376 return cxstring::createRef("ObjCEncodeExpr"); 5377 case CXCursor_ObjCSelectorExpr: 5378 return cxstring::createRef("ObjCSelectorExpr"); 5379 case CXCursor_ObjCProtocolExpr: 5380 return cxstring::createRef("ObjCProtocolExpr"); 5381 case CXCursor_ObjCBridgedCastExpr: 5382 return cxstring::createRef("ObjCBridgedCastExpr"); 5383 case CXCursor_BlockExpr: 5384 return cxstring::createRef("BlockExpr"); 5385 case CXCursor_PackExpansionExpr: 5386 return cxstring::createRef("PackExpansionExpr"); 5387 case CXCursor_SizeOfPackExpr: 5388 return cxstring::createRef("SizeOfPackExpr"); 5389 case CXCursor_LambdaExpr: 5390 return cxstring::createRef("LambdaExpr"); 5391 case CXCursor_UnexposedExpr: 5392 return cxstring::createRef("UnexposedExpr"); 5393 case CXCursor_DeclRefExpr: 5394 return cxstring::createRef("DeclRefExpr"); 5395 case CXCursor_MemberRefExpr: 5396 return cxstring::createRef("MemberRefExpr"); 5397 case CXCursor_CallExpr: 5398 return cxstring::createRef("CallExpr"); 5399 case CXCursor_ObjCMessageExpr: 5400 return cxstring::createRef("ObjCMessageExpr"); 5401 case CXCursor_BuiltinBitCastExpr: 5402 return cxstring::createRef("BuiltinBitCastExpr"); 5403 case CXCursor_UnexposedStmt: 5404 return cxstring::createRef("UnexposedStmt"); 5405 case CXCursor_DeclStmt: 5406 return cxstring::createRef("DeclStmt"); 5407 case CXCursor_LabelStmt: 5408 return cxstring::createRef("LabelStmt"); 5409 case CXCursor_CompoundStmt: 5410 return cxstring::createRef("CompoundStmt"); 5411 case CXCursor_CaseStmt: 5412 return cxstring::createRef("CaseStmt"); 5413 case CXCursor_DefaultStmt: 5414 return cxstring::createRef("DefaultStmt"); 5415 case CXCursor_IfStmt: 5416 return cxstring::createRef("IfStmt"); 5417 case CXCursor_SwitchStmt: 5418 return cxstring::createRef("SwitchStmt"); 5419 case CXCursor_WhileStmt: 5420 return cxstring::createRef("WhileStmt"); 5421 case CXCursor_DoStmt: 5422 return cxstring::createRef("DoStmt"); 5423 case CXCursor_ForStmt: 5424 return cxstring::createRef("ForStmt"); 5425 case CXCursor_GotoStmt: 5426 return cxstring::createRef("GotoStmt"); 5427 case CXCursor_IndirectGotoStmt: 5428 return cxstring::createRef("IndirectGotoStmt"); 5429 case CXCursor_ContinueStmt: 5430 return cxstring::createRef("ContinueStmt"); 5431 case CXCursor_BreakStmt: 5432 return cxstring::createRef("BreakStmt"); 5433 case CXCursor_ReturnStmt: 5434 return cxstring::createRef("ReturnStmt"); 5435 case CXCursor_GCCAsmStmt: 5436 return cxstring::createRef("GCCAsmStmt"); 5437 case CXCursor_MSAsmStmt: 5438 return cxstring::createRef("MSAsmStmt"); 5439 case CXCursor_ObjCAtTryStmt: 5440 return cxstring::createRef("ObjCAtTryStmt"); 5441 case CXCursor_ObjCAtCatchStmt: 5442 return cxstring::createRef("ObjCAtCatchStmt"); 5443 case CXCursor_ObjCAtFinallyStmt: 5444 return cxstring::createRef("ObjCAtFinallyStmt"); 5445 case CXCursor_ObjCAtThrowStmt: 5446 return cxstring::createRef("ObjCAtThrowStmt"); 5447 case CXCursor_ObjCAtSynchronizedStmt: 5448 return cxstring::createRef("ObjCAtSynchronizedStmt"); 5449 case CXCursor_ObjCAutoreleasePoolStmt: 5450 return cxstring::createRef("ObjCAutoreleasePoolStmt"); 5451 case CXCursor_ObjCForCollectionStmt: 5452 return cxstring::createRef("ObjCForCollectionStmt"); 5453 case CXCursor_CXXCatchStmt: 5454 return cxstring::createRef("CXXCatchStmt"); 5455 case CXCursor_CXXTryStmt: 5456 return cxstring::createRef("CXXTryStmt"); 5457 case CXCursor_CXXForRangeStmt: 5458 return cxstring::createRef("CXXForRangeStmt"); 5459 case CXCursor_SEHTryStmt: 5460 return cxstring::createRef("SEHTryStmt"); 5461 case CXCursor_SEHExceptStmt: 5462 return cxstring::createRef("SEHExceptStmt"); 5463 case CXCursor_SEHFinallyStmt: 5464 return cxstring::createRef("SEHFinallyStmt"); 5465 case CXCursor_SEHLeaveStmt: 5466 return cxstring::createRef("SEHLeaveStmt"); 5467 case CXCursor_NullStmt: 5468 return cxstring::createRef("NullStmt"); 5469 case CXCursor_InvalidFile: 5470 return cxstring::createRef("InvalidFile"); 5471 case CXCursor_InvalidCode: 5472 return cxstring::createRef("InvalidCode"); 5473 case CXCursor_NoDeclFound: 5474 return cxstring::createRef("NoDeclFound"); 5475 case CXCursor_NotImplemented: 5476 return cxstring::createRef("NotImplemented"); 5477 case CXCursor_TranslationUnit: 5478 return cxstring::createRef("TranslationUnit"); 5479 case CXCursor_UnexposedAttr: 5480 return cxstring::createRef("UnexposedAttr"); 5481 case CXCursor_IBActionAttr: 5482 return cxstring::createRef("attribute(ibaction)"); 5483 case CXCursor_IBOutletAttr: 5484 return cxstring::createRef("attribute(iboutlet)"); 5485 case CXCursor_IBOutletCollectionAttr: 5486 return cxstring::createRef("attribute(iboutletcollection)"); 5487 case CXCursor_CXXFinalAttr: 5488 return cxstring::createRef("attribute(final)"); 5489 case CXCursor_CXXOverrideAttr: 5490 return cxstring::createRef("attribute(override)"); 5491 case CXCursor_AnnotateAttr: 5492 return cxstring::createRef("attribute(annotate)"); 5493 case CXCursor_AsmLabelAttr: 5494 return cxstring::createRef("asm label"); 5495 case CXCursor_PackedAttr: 5496 return cxstring::createRef("attribute(packed)"); 5497 case CXCursor_PureAttr: 5498 return cxstring::createRef("attribute(pure)"); 5499 case CXCursor_ConstAttr: 5500 return cxstring::createRef("attribute(const)"); 5501 case CXCursor_NoDuplicateAttr: 5502 return cxstring::createRef("attribute(noduplicate)"); 5503 case CXCursor_CUDAConstantAttr: 5504 return cxstring::createRef("attribute(constant)"); 5505 case CXCursor_CUDADeviceAttr: 5506 return cxstring::createRef("attribute(device)"); 5507 case CXCursor_CUDAGlobalAttr: 5508 return cxstring::createRef("attribute(global)"); 5509 case CXCursor_CUDAHostAttr: 5510 return cxstring::createRef("attribute(host)"); 5511 case CXCursor_CUDASharedAttr: 5512 return cxstring::createRef("attribute(shared)"); 5513 case CXCursor_VisibilityAttr: 5514 return cxstring::createRef("attribute(visibility)"); 5515 case CXCursor_DLLExport: 5516 return cxstring::createRef("attribute(dllexport)"); 5517 case CXCursor_DLLImport: 5518 return cxstring::createRef("attribute(dllimport)"); 5519 case CXCursor_NSReturnsRetained: 5520 return cxstring::createRef("attribute(ns_returns_retained)"); 5521 case CXCursor_NSReturnsNotRetained: 5522 return cxstring::createRef("attribute(ns_returns_not_retained)"); 5523 case CXCursor_NSReturnsAutoreleased: 5524 return cxstring::createRef("attribute(ns_returns_autoreleased)"); 5525 case CXCursor_NSConsumesSelf: 5526 return cxstring::createRef("attribute(ns_consumes_self)"); 5527 case CXCursor_NSConsumed: 5528 return cxstring::createRef("attribute(ns_consumed)"); 5529 case CXCursor_ObjCException: 5530 return cxstring::createRef("attribute(objc_exception)"); 5531 case CXCursor_ObjCNSObject: 5532 return cxstring::createRef("attribute(NSObject)"); 5533 case CXCursor_ObjCIndependentClass: 5534 return cxstring::createRef("attribute(objc_independent_class)"); 5535 case CXCursor_ObjCPreciseLifetime: 5536 return cxstring::createRef("attribute(objc_precise_lifetime)"); 5537 case CXCursor_ObjCReturnsInnerPointer: 5538 return cxstring::createRef("attribute(objc_returns_inner_pointer)"); 5539 case CXCursor_ObjCRequiresSuper: 5540 return cxstring::createRef("attribute(objc_requires_super)"); 5541 case CXCursor_ObjCRootClass: 5542 return cxstring::createRef("attribute(objc_root_class)"); 5543 case CXCursor_ObjCSubclassingRestricted: 5544 return cxstring::createRef("attribute(objc_subclassing_restricted)"); 5545 case CXCursor_ObjCExplicitProtocolImpl: 5546 return cxstring::createRef( 5547 "attribute(objc_protocol_requires_explicit_implementation)"); 5548 case CXCursor_ObjCDesignatedInitializer: 5549 return cxstring::createRef("attribute(objc_designated_initializer)"); 5550 case CXCursor_ObjCRuntimeVisible: 5551 return cxstring::createRef("attribute(objc_runtime_visible)"); 5552 case CXCursor_ObjCBoxable: 5553 return cxstring::createRef("attribute(objc_boxable)"); 5554 case CXCursor_FlagEnum: 5555 return cxstring::createRef("attribute(flag_enum)"); 5556 case CXCursor_PreprocessingDirective: 5557 return cxstring::createRef("preprocessing directive"); 5558 case CXCursor_MacroDefinition: 5559 return cxstring::createRef("macro definition"); 5560 case CXCursor_MacroExpansion: 5561 return cxstring::createRef("macro expansion"); 5562 case CXCursor_InclusionDirective: 5563 return cxstring::createRef("inclusion directive"); 5564 case CXCursor_Namespace: 5565 return cxstring::createRef("Namespace"); 5566 case CXCursor_LinkageSpec: 5567 return cxstring::createRef("LinkageSpec"); 5568 case CXCursor_CXXBaseSpecifier: 5569 return cxstring::createRef("C++ base class specifier"); 5570 case CXCursor_Constructor: 5571 return cxstring::createRef("CXXConstructor"); 5572 case CXCursor_Destructor: 5573 return cxstring::createRef("CXXDestructor"); 5574 case CXCursor_ConversionFunction: 5575 return cxstring::createRef("CXXConversion"); 5576 case CXCursor_TemplateTypeParameter: 5577 return cxstring::createRef("TemplateTypeParameter"); 5578 case CXCursor_NonTypeTemplateParameter: 5579 return cxstring::createRef("NonTypeTemplateParameter"); 5580 case CXCursor_TemplateTemplateParameter: 5581 return cxstring::createRef("TemplateTemplateParameter"); 5582 case CXCursor_FunctionTemplate: 5583 return cxstring::createRef("FunctionTemplate"); 5584 case CXCursor_ClassTemplate: 5585 return cxstring::createRef("ClassTemplate"); 5586 case CXCursor_ClassTemplatePartialSpecialization: 5587 return cxstring::createRef("ClassTemplatePartialSpecialization"); 5588 case CXCursor_NamespaceAlias: 5589 return cxstring::createRef("NamespaceAlias"); 5590 case CXCursor_UsingDirective: 5591 return cxstring::createRef("UsingDirective"); 5592 case CXCursor_UsingDeclaration: 5593 return cxstring::createRef("UsingDeclaration"); 5594 case CXCursor_TypeAliasDecl: 5595 return cxstring::createRef("TypeAliasDecl"); 5596 case CXCursor_ObjCSynthesizeDecl: 5597 return cxstring::createRef("ObjCSynthesizeDecl"); 5598 case CXCursor_ObjCDynamicDecl: 5599 return cxstring::createRef("ObjCDynamicDecl"); 5600 case CXCursor_CXXAccessSpecifier: 5601 return cxstring::createRef("CXXAccessSpecifier"); 5602 case CXCursor_ModuleImportDecl: 5603 return cxstring::createRef("ModuleImport"); 5604 case CXCursor_OMPCanonicalLoop: 5605 return cxstring::createRef("OMPCanonicalLoop"); 5606 case CXCursor_OMPMetaDirective: 5607 return cxstring::createRef("OMPMetaDirective"); 5608 case CXCursor_OMPParallelDirective: 5609 return cxstring::createRef("OMPParallelDirective"); 5610 case CXCursor_OMPSimdDirective: 5611 return cxstring::createRef("OMPSimdDirective"); 5612 case CXCursor_OMPTileDirective: 5613 return cxstring::createRef("OMPTileDirective"); 5614 case CXCursor_OMPUnrollDirective: 5615 return cxstring::createRef("OMPUnrollDirective"); 5616 case CXCursor_OMPForDirective: 5617 return cxstring::createRef("OMPForDirective"); 5618 case CXCursor_OMPForSimdDirective: 5619 return cxstring::createRef("OMPForSimdDirective"); 5620 case CXCursor_OMPSectionsDirective: 5621 return cxstring::createRef("OMPSectionsDirective"); 5622 case CXCursor_OMPSectionDirective: 5623 return cxstring::createRef("OMPSectionDirective"); 5624 case CXCursor_OMPSingleDirective: 5625 return cxstring::createRef("OMPSingleDirective"); 5626 case CXCursor_OMPMasterDirective: 5627 return cxstring::createRef("OMPMasterDirective"); 5628 case CXCursor_OMPCriticalDirective: 5629 return cxstring::createRef("OMPCriticalDirective"); 5630 case CXCursor_OMPParallelForDirective: 5631 return cxstring::createRef("OMPParallelForDirective"); 5632 case CXCursor_OMPParallelForSimdDirective: 5633 return cxstring::createRef("OMPParallelForSimdDirective"); 5634 case CXCursor_OMPParallelMasterDirective: 5635 return cxstring::createRef("OMPParallelMasterDirective"); 5636 case CXCursor_OMPParallelSectionsDirective: 5637 return cxstring::createRef("OMPParallelSectionsDirective"); 5638 case CXCursor_OMPTaskDirective: 5639 return cxstring::createRef("OMPTaskDirective"); 5640 case CXCursor_OMPTaskyieldDirective: 5641 return cxstring::createRef("OMPTaskyieldDirective"); 5642 case CXCursor_OMPBarrierDirective: 5643 return cxstring::createRef("OMPBarrierDirective"); 5644 case CXCursor_OMPTaskwaitDirective: 5645 return cxstring::createRef("OMPTaskwaitDirective"); 5646 case CXCursor_OMPTaskgroupDirective: 5647 return cxstring::createRef("OMPTaskgroupDirective"); 5648 case CXCursor_OMPFlushDirective: 5649 return cxstring::createRef("OMPFlushDirective"); 5650 case CXCursor_OMPDepobjDirective: 5651 return cxstring::createRef("OMPDepobjDirective"); 5652 case CXCursor_OMPScanDirective: 5653 return cxstring::createRef("OMPScanDirective"); 5654 case CXCursor_OMPOrderedDirective: 5655 return cxstring::createRef("OMPOrderedDirective"); 5656 case CXCursor_OMPAtomicDirective: 5657 return cxstring::createRef("OMPAtomicDirective"); 5658 case CXCursor_OMPTargetDirective: 5659 return cxstring::createRef("OMPTargetDirective"); 5660 case CXCursor_OMPTargetDataDirective: 5661 return cxstring::createRef("OMPTargetDataDirective"); 5662 case CXCursor_OMPTargetEnterDataDirective: 5663 return cxstring::createRef("OMPTargetEnterDataDirective"); 5664 case CXCursor_OMPTargetExitDataDirective: 5665 return cxstring::createRef("OMPTargetExitDataDirective"); 5666 case CXCursor_OMPTargetParallelDirective: 5667 return cxstring::createRef("OMPTargetParallelDirective"); 5668 case CXCursor_OMPTargetParallelForDirective: 5669 return cxstring::createRef("OMPTargetParallelForDirective"); 5670 case CXCursor_OMPTargetUpdateDirective: 5671 return cxstring::createRef("OMPTargetUpdateDirective"); 5672 case CXCursor_OMPTeamsDirective: 5673 return cxstring::createRef("OMPTeamsDirective"); 5674 case CXCursor_OMPCancellationPointDirective: 5675 return cxstring::createRef("OMPCancellationPointDirective"); 5676 case CXCursor_OMPCancelDirective: 5677 return cxstring::createRef("OMPCancelDirective"); 5678 case CXCursor_OMPTaskLoopDirective: 5679 return cxstring::createRef("OMPTaskLoopDirective"); 5680 case CXCursor_OMPTaskLoopSimdDirective: 5681 return cxstring::createRef("OMPTaskLoopSimdDirective"); 5682 case CXCursor_OMPMasterTaskLoopDirective: 5683 return cxstring::createRef("OMPMasterTaskLoopDirective"); 5684 case CXCursor_OMPMasterTaskLoopSimdDirective: 5685 return cxstring::createRef("OMPMasterTaskLoopSimdDirective"); 5686 case CXCursor_OMPParallelMasterTaskLoopDirective: 5687 return cxstring::createRef("OMPParallelMasterTaskLoopDirective"); 5688 case CXCursor_OMPParallelMasterTaskLoopSimdDirective: 5689 return cxstring::createRef("OMPParallelMasterTaskLoopSimdDirective"); 5690 case CXCursor_OMPDistributeDirective: 5691 return cxstring::createRef("OMPDistributeDirective"); 5692 case CXCursor_OMPDistributeParallelForDirective: 5693 return cxstring::createRef("OMPDistributeParallelForDirective"); 5694 case CXCursor_OMPDistributeParallelForSimdDirective: 5695 return cxstring::createRef("OMPDistributeParallelForSimdDirective"); 5696 case CXCursor_OMPDistributeSimdDirective: 5697 return cxstring::createRef("OMPDistributeSimdDirective"); 5698 case CXCursor_OMPTargetParallelForSimdDirective: 5699 return cxstring::createRef("OMPTargetParallelForSimdDirective"); 5700 case CXCursor_OMPTargetSimdDirective: 5701 return cxstring::createRef("OMPTargetSimdDirective"); 5702 case CXCursor_OMPTeamsDistributeDirective: 5703 return cxstring::createRef("OMPTeamsDistributeDirective"); 5704 case CXCursor_OMPTeamsDistributeSimdDirective: 5705 return cxstring::createRef("OMPTeamsDistributeSimdDirective"); 5706 case CXCursor_OMPTeamsDistributeParallelForSimdDirective: 5707 return cxstring::createRef("OMPTeamsDistributeParallelForSimdDirective"); 5708 case CXCursor_OMPTeamsDistributeParallelForDirective: 5709 return cxstring::createRef("OMPTeamsDistributeParallelForDirective"); 5710 case CXCursor_OMPTargetTeamsDirective: 5711 return cxstring::createRef("OMPTargetTeamsDirective"); 5712 case CXCursor_OMPTargetTeamsDistributeDirective: 5713 return cxstring::createRef("OMPTargetTeamsDistributeDirective"); 5714 case CXCursor_OMPTargetTeamsDistributeParallelForDirective: 5715 return cxstring::createRef("OMPTargetTeamsDistributeParallelForDirective"); 5716 case CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective: 5717 return cxstring::createRef( 5718 "OMPTargetTeamsDistributeParallelForSimdDirective"); 5719 case CXCursor_OMPTargetTeamsDistributeSimdDirective: 5720 return cxstring::createRef("OMPTargetTeamsDistributeSimdDirective"); 5721 case CXCursor_OMPInteropDirective: 5722 return cxstring::createRef("OMPInteropDirective"); 5723 case CXCursor_OMPDispatchDirective: 5724 return cxstring::createRef("OMPDispatchDirective"); 5725 case CXCursor_OMPMaskedDirective: 5726 return cxstring::createRef("OMPMaskedDirective"); 5727 case CXCursor_OMPGenericLoopDirective: 5728 return cxstring::createRef("OMPGenericLoopDirective"); 5729 case CXCursor_OMPTeamsGenericLoopDirective: 5730 return cxstring::createRef("OMPTeamsGenericLoopDirective"); 5731 case CXCursor_OMPTargetTeamsGenericLoopDirective: 5732 return cxstring::createRef("OMPTargetTeamsGenericLoopDirective"); 5733 case CXCursor_OMPParallelGenericLoopDirective: 5734 return cxstring::createRef("OMPParallelGenericLoopDirective"); 5735 case CXCursor_OMPTargetParallelGenericLoopDirective: 5736 return cxstring::createRef("OMPTargetParallelGenericLoopDirective"); 5737 case CXCursor_OverloadCandidate: 5738 return cxstring::createRef("OverloadCandidate"); 5739 case CXCursor_TypeAliasTemplateDecl: 5740 return cxstring::createRef("TypeAliasTemplateDecl"); 5741 case CXCursor_StaticAssert: 5742 return cxstring::createRef("StaticAssert"); 5743 case CXCursor_FriendDecl: 5744 return cxstring::createRef("FriendDecl"); 5745 case CXCursor_ConvergentAttr: 5746 return cxstring::createRef("attribute(convergent)"); 5747 case CXCursor_WarnUnusedAttr: 5748 return cxstring::createRef("attribute(warn_unused)"); 5749 case CXCursor_WarnUnusedResultAttr: 5750 return cxstring::createRef("attribute(warn_unused_result)"); 5751 case CXCursor_AlignedAttr: 5752 return cxstring::createRef("attribute(aligned)"); 5753 } 5754 5755 llvm_unreachable("Unhandled CXCursorKind"); 5756 } 5757 5758 struct GetCursorData { 5759 SourceLocation TokenBeginLoc; 5760 bool PointsAtMacroArgExpansion; 5761 bool VisitedObjCPropertyImplDecl; 5762 SourceLocation VisitedDeclaratorDeclStartLoc; 5763 CXCursor &BestCursor; 5764 5765 GetCursorData(SourceManager &SM, SourceLocation tokenBegin, 5766 CXCursor &outputCursor) 5767 : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) { 5768 PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin); 5769 VisitedObjCPropertyImplDecl = false; 5770 } 5771 }; 5772 5773 static enum CXChildVisitResult 5774 GetCursorVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data) { 5775 GetCursorData *Data = static_cast<GetCursorData *>(client_data); 5776 CXCursor *BestCursor = &Data->BestCursor; 5777 5778 // If we point inside a macro argument we should provide info of what the 5779 // token is so use the actual cursor, don't replace it with a macro expansion 5780 // cursor. 5781 if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion) 5782 return CXChildVisit_Recurse; 5783 5784 if (clang_isDeclaration(cursor.kind)) { 5785 // Avoid having the implicit methods override the property decls. 5786 if (const ObjCMethodDecl *MD = 5787 dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) { 5788 if (MD->isImplicit()) 5789 return CXChildVisit_Break; 5790 5791 } else if (const ObjCInterfaceDecl *ID = 5792 dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) { 5793 // Check that when we have multiple @class references in the same line, 5794 // that later ones do not override the previous ones. 5795 // If we have: 5796 // @class Foo, Bar; 5797 // source ranges for both start at '@', so 'Bar' will end up overriding 5798 // 'Foo' even though the cursor location was at 'Foo'. 5799 if (BestCursor->kind == CXCursor_ObjCInterfaceDecl || 5800 BestCursor->kind == CXCursor_ObjCClassRef) 5801 if (const ObjCInterfaceDecl *PrevID = 5802 dyn_cast_or_null<ObjCInterfaceDecl>( 5803 getCursorDecl(*BestCursor))) { 5804 if (PrevID != ID && !PrevID->isThisDeclarationADefinition() && 5805 !ID->isThisDeclarationADefinition()) 5806 return CXChildVisit_Break; 5807 } 5808 5809 } else if (const DeclaratorDecl *DD = 5810 dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) { 5811 SourceLocation StartLoc = DD->getSourceRange().getBegin(); 5812 // Check that when we have multiple declarators in the same line, 5813 // that later ones do not override the previous ones. 5814 // If we have: 5815 // int Foo, Bar; 5816 // source ranges for both start at 'int', so 'Bar' will end up overriding 5817 // 'Foo' even though the cursor location was at 'Foo'. 5818 if (Data->VisitedDeclaratorDeclStartLoc == StartLoc) 5819 return CXChildVisit_Break; 5820 Data->VisitedDeclaratorDeclStartLoc = StartLoc; 5821 5822 } else if (const ObjCPropertyImplDecl *PropImp = 5823 dyn_cast_or_null<ObjCPropertyImplDecl>( 5824 getCursorDecl(cursor))) { 5825 (void)PropImp; 5826 // Check that when we have multiple @synthesize in the same line, 5827 // that later ones do not override the previous ones. 5828 // If we have: 5829 // @synthesize Foo, Bar; 5830 // source ranges for both start at '@', so 'Bar' will end up overriding 5831 // 'Foo' even though the cursor location was at 'Foo'. 5832 if (Data->VisitedObjCPropertyImplDecl) 5833 return CXChildVisit_Break; 5834 Data->VisitedObjCPropertyImplDecl = true; 5835 } 5836 } 5837 5838 if (clang_isExpression(cursor.kind) && 5839 clang_isDeclaration(BestCursor->kind)) { 5840 if (const Decl *D = getCursorDecl(*BestCursor)) { 5841 // Avoid having the cursor of an expression replace the declaration cursor 5842 // when the expression source range overlaps the declaration range. 5843 // This can happen for C++ constructor expressions whose range generally 5844 // include the variable declaration, e.g.: 5845 // MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl 5846 // cursor. 5847 if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() && 5848 D->getLocation() == Data->TokenBeginLoc) 5849 return CXChildVisit_Break; 5850 } 5851 } 5852 5853 // If our current best cursor is the construction of a temporary object, 5854 // don't replace that cursor with a type reference, because we want 5855 // clang_getCursor() to point at the constructor. 5856 if (clang_isExpression(BestCursor->kind) && 5857 isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) && 5858 cursor.kind == CXCursor_TypeRef) { 5859 // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it 5860 // as having the actual point on the type reference. 5861 *BestCursor = getTypeRefedCallExprCursor(*BestCursor); 5862 return CXChildVisit_Recurse; 5863 } 5864 5865 // If we already have an Objective-C superclass reference, don't 5866 // update it further. 5867 if (BestCursor->kind == CXCursor_ObjCSuperClassRef) 5868 return CXChildVisit_Break; 5869 5870 *BestCursor = cursor; 5871 return CXChildVisit_Recurse; 5872 } 5873 5874 CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) { 5875 if (isNotUsableTU(TU)) { 5876 LOG_BAD_TU(TU); 5877 return clang_getNullCursor(); 5878 } 5879 5880 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 5881 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 5882 5883 SourceLocation SLoc = cxloc::translateSourceLocation(Loc); 5884 CXCursor Result = cxcursor::getCursor(TU, SLoc); 5885 5886 LOG_FUNC_SECTION { 5887 CXFile SearchFile; 5888 unsigned SearchLine, SearchColumn; 5889 CXFile ResultFile; 5890 unsigned ResultLine, ResultColumn; 5891 CXString SearchFileName, ResultFileName, KindSpelling, USR; 5892 const char *IsDef = clang_isCursorDefinition(Result) ? " (Definition)" : ""; 5893 CXSourceLocation ResultLoc = clang_getCursorLocation(Result); 5894 5895 clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 5896 nullptr); 5897 clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine, &ResultColumn, 5898 nullptr); 5899 SearchFileName = clang_getFileName(SearchFile); 5900 ResultFileName = clang_getFileName(ResultFile); 5901 KindSpelling = clang_getCursorKindSpelling(Result.kind); 5902 USR = clang_getCursorUSR(Result); 5903 *Log << llvm::format("(%s:%d:%d) = %s", clang_getCString(SearchFileName), 5904 SearchLine, SearchColumn, 5905 clang_getCString(KindSpelling)) 5906 << llvm::format("(%s:%d:%d):%s%s", clang_getCString(ResultFileName), 5907 ResultLine, ResultColumn, clang_getCString(USR), 5908 IsDef); 5909 clang_disposeString(SearchFileName); 5910 clang_disposeString(ResultFileName); 5911 clang_disposeString(KindSpelling); 5912 clang_disposeString(USR); 5913 5914 CXCursor Definition = clang_getCursorDefinition(Result); 5915 if (!clang_equalCursors(Definition, clang_getNullCursor())) { 5916 CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition); 5917 CXString DefinitionKindSpelling = 5918 clang_getCursorKindSpelling(Definition.kind); 5919 CXFile DefinitionFile; 5920 unsigned DefinitionLine, DefinitionColumn; 5921 clang_getFileLocation(DefinitionLoc, &DefinitionFile, &DefinitionLine, 5922 &DefinitionColumn, nullptr); 5923 CXString DefinitionFileName = clang_getFileName(DefinitionFile); 5924 *Log << llvm::format(" -> %s(%s:%d:%d)", 5925 clang_getCString(DefinitionKindSpelling), 5926 clang_getCString(DefinitionFileName), DefinitionLine, 5927 DefinitionColumn); 5928 clang_disposeString(DefinitionFileName); 5929 clang_disposeString(DefinitionKindSpelling); 5930 } 5931 } 5932 5933 return Result; 5934 } 5935 5936 CXCursor clang_getNullCursor(void) { 5937 return MakeCXCursorInvalid(CXCursor_InvalidFile); 5938 } 5939 5940 unsigned clang_equalCursors(CXCursor X, CXCursor Y) { 5941 // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we 5942 // can't set consistently. For example, when visiting a DeclStmt we will set 5943 // it but we don't set it on the result of clang_getCursorDefinition for 5944 // a reference of the same declaration. 5945 // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works 5946 // when visiting a DeclStmt currently, the AST should be enhanced to be able 5947 // to provide that kind of info. 5948 if (clang_isDeclaration(X.kind)) 5949 X.data[1] = nullptr; 5950 if (clang_isDeclaration(Y.kind)) 5951 Y.data[1] = nullptr; 5952 5953 return X == Y; 5954 } 5955 5956 unsigned clang_hashCursor(CXCursor C) { 5957 unsigned Index = 0; 5958 if (clang_isExpression(C.kind) || clang_isStatement(C.kind)) 5959 Index = 1; 5960 5961 return llvm::DenseMapInfo<std::pair<unsigned, const void *>>::getHashValue( 5962 std::make_pair(C.kind, C.data[Index])); 5963 } 5964 5965 unsigned clang_isInvalid(enum CXCursorKind K) { 5966 return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid; 5967 } 5968 5969 unsigned clang_isDeclaration(enum CXCursorKind K) { 5970 return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) || 5971 (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl); 5972 } 5973 5974 unsigned clang_isInvalidDeclaration(CXCursor C) { 5975 if (clang_isDeclaration(C.kind)) { 5976 if (const Decl *D = getCursorDecl(C)) 5977 return D->isInvalidDecl(); 5978 } 5979 5980 return 0; 5981 } 5982 5983 unsigned clang_isReference(enum CXCursorKind K) { 5984 return K >= CXCursor_FirstRef && K <= CXCursor_LastRef; 5985 } 5986 5987 unsigned clang_isExpression(enum CXCursorKind K) { 5988 return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr; 5989 } 5990 5991 unsigned clang_isStatement(enum CXCursorKind K) { 5992 return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt; 5993 } 5994 5995 unsigned clang_isAttribute(enum CXCursorKind K) { 5996 return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr; 5997 } 5998 5999 unsigned clang_isTranslationUnit(enum CXCursorKind K) { 6000 return K == CXCursor_TranslationUnit; 6001 } 6002 6003 unsigned clang_isPreprocessing(enum CXCursorKind K) { 6004 return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing; 6005 } 6006 6007 unsigned clang_isUnexposed(enum CXCursorKind K) { 6008 switch (K) { 6009 case CXCursor_UnexposedDecl: 6010 case CXCursor_UnexposedExpr: 6011 case CXCursor_UnexposedStmt: 6012 case CXCursor_UnexposedAttr: 6013 return true; 6014 default: 6015 return false; 6016 } 6017 } 6018 6019 CXCursorKind clang_getCursorKind(CXCursor C) { return C.kind; } 6020 6021 CXSourceLocation clang_getCursorLocation(CXCursor C) { 6022 if (clang_isReference(C.kind)) { 6023 switch (C.kind) { 6024 case CXCursor_ObjCSuperClassRef: { 6025 std::pair<const ObjCInterfaceDecl *, SourceLocation> P = 6026 getCursorObjCSuperClassRef(C); 6027 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6028 } 6029 6030 case CXCursor_ObjCProtocolRef: { 6031 std::pair<const ObjCProtocolDecl *, SourceLocation> P = 6032 getCursorObjCProtocolRef(C); 6033 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6034 } 6035 6036 case CXCursor_ObjCClassRef: { 6037 std::pair<const ObjCInterfaceDecl *, SourceLocation> P = 6038 getCursorObjCClassRef(C); 6039 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6040 } 6041 6042 case CXCursor_TypeRef: { 6043 std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C); 6044 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6045 } 6046 6047 case CXCursor_TemplateRef: { 6048 std::pair<const TemplateDecl *, SourceLocation> P = 6049 getCursorTemplateRef(C); 6050 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6051 } 6052 6053 case CXCursor_NamespaceRef: { 6054 std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C); 6055 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6056 } 6057 6058 case CXCursor_MemberRef: { 6059 std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C); 6060 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6061 } 6062 6063 case CXCursor_VariableRef: { 6064 std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C); 6065 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6066 } 6067 6068 case CXCursor_CXXBaseSpecifier: { 6069 const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C); 6070 if (!BaseSpec) 6071 return clang_getNullLocation(); 6072 6073 if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo()) 6074 return cxloc::translateSourceLocation( 6075 getCursorContext(C), TSInfo->getTypeLoc().getBeginLoc()); 6076 6077 return cxloc::translateSourceLocation(getCursorContext(C), 6078 BaseSpec->getBeginLoc()); 6079 } 6080 6081 case CXCursor_LabelRef: { 6082 std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C); 6083 return cxloc::translateSourceLocation(getCursorContext(C), P.second); 6084 } 6085 6086 case CXCursor_OverloadedDeclRef: 6087 return cxloc::translateSourceLocation( 6088 getCursorContext(C), getCursorOverloadedDeclRef(C).second); 6089 6090 default: 6091 // FIXME: Need a way to enumerate all non-reference cases. 6092 llvm_unreachable("Missed a reference kind"); 6093 } 6094 } 6095 6096 if (clang_isExpression(C.kind)) 6097 return cxloc::translateSourceLocation( 6098 getCursorContext(C), getLocationFromExpr(getCursorExpr(C))); 6099 6100 if (clang_isStatement(C.kind)) 6101 return cxloc::translateSourceLocation(getCursorContext(C), 6102 getCursorStmt(C)->getBeginLoc()); 6103 6104 if (C.kind == CXCursor_PreprocessingDirective) { 6105 SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin(); 6106 return cxloc::translateSourceLocation(getCursorContext(C), L); 6107 } 6108 6109 if (C.kind == CXCursor_MacroExpansion) { 6110 SourceLocation L = 6111 cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin(); 6112 return cxloc::translateSourceLocation(getCursorContext(C), L); 6113 } 6114 6115 if (C.kind == CXCursor_MacroDefinition) { 6116 SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation(); 6117 return cxloc::translateSourceLocation(getCursorContext(C), L); 6118 } 6119 6120 if (C.kind == CXCursor_InclusionDirective) { 6121 SourceLocation L = 6122 cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin(); 6123 return cxloc::translateSourceLocation(getCursorContext(C), L); 6124 } 6125 6126 if (clang_isAttribute(C.kind)) { 6127 SourceLocation L = cxcursor::getCursorAttr(C)->getLocation(); 6128 return cxloc::translateSourceLocation(getCursorContext(C), L); 6129 } 6130 6131 if (!clang_isDeclaration(C.kind)) 6132 return clang_getNullLocation(); 6133 6134 const Decl *D = getCursorDecl(C); 6135 if (!D) 6136 return clang_getNullLocation(); 6137 6138 SourceLocation Loc = D->getLocation(); 6139 // FIXME: Multiple variables declared in a single declaration 6140 // currently lack the information needed to correctly determine their 6141 // ranges when accounting for the type-specifier. We use context 6142 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 6143 // and if so, whether it is the first decl. 6144 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 6145 if (!cxcursor::isFirstInDeclGroup(C)) 6146 Loc = VD->getLocation(); 6147 } 6148 6149 // For ObjC methods, give the start location of the method name. 6150 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 6151 Loc = MD->getSelectorStartLoc(); 6152 6153 return cxloc::translateSourceLocation(getCursorContext(C), Loc); 6154 } 6155 6156 } // end extern "C" 6157 6158 CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) { 6159 assert(TU); 6160 6161 // Guard against an invalid SourceLocation, or we may assert in one 6162 // of the following calls. 6163 if (SLoc.isInvalid()) 6164 return clang_getNullCursor(); 6165 6166 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6167 6168 // Translate the given source location to make it point at the beginning of 6169 // the token under the cursor. 6170 SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(), 6171 CXXUnit->getASTContext().getLangOpts()); 6172 6173 CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound); 6174 if (SLoc.isValid()) { 6175 GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result); 6176 CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData, 6177 /*VisitPreprocessorLast=*/true, 6178 /*VisitIncludedEntities=*/false, 6179 SourceLocation(SLoc)); 6180 CursorVis.visitFileRegion(); 6181 } 6182 6183 return Result; 6184 } 6185 6186 static SourceRange getRawCursorExtent(CXCursor C) { 6187 if (clang_isReference(C.kind)) { 6188 switch (C.kind) { 6189 case CXCursor_ObjCSuperClassRef: 6190 return getCursorObjCSuperClassRef(C).second; 6191 6192 case CXCursor_ObjCProtocolRef: 6193 return getCursorObjCProtocolRef(C).second; 6194 6195 case CXCursor_ObjCClassRef: 6196 return getCursorObjCClassRef(C).second; 6197 6198 case CXCursor_TypeRef: 6199 return getCursorTypeRef(C).second; 6200 6201 case CXCursor_TemplateRef: 6202 return getCursorTemplateRef(C).second; 6203 6204 case CXCursor_NamespaceRef: 6205 return getCursorNamespaceRef(C).second; 6206 6207 case CXCursor_MemberRef: 6208 return getCursorMemberRef(C).second; 6209 6210 case CXCursor_CXXBaseSpecifier: 6211 return getCursorCXXBaseSpecifier(C)->getSourceRange(); 6212 6213 case CXCursor_LabelRef: 6214 return getCursorLabelRef(C).second; 6215 6216 case CXCursor_OverloadedDeclRef: 6217 return getCursorOverloadedDeclRef(C).second; 6218 6219 case CXCursor_VariableRef: 6220 return getCursorVariableRef(C).second; 6221 6222 default: 6223 // FIXME: Need a way to enumerate all non-reference cases. 6224 llvm_unreachable("Missed a reference kind"); 6225 } 6226 } 6227 6228 if (clang_isExpression(C.kind)) 6229 return getCursorExpr(C)->getSourceRange(); 6230 6231 if (clang_isStatement(C.kind)) 6232 return getCursorStmt(C)->getSourceRange(); 6233 6234 if (clang_isAttribute(C.kind)) 6235 return getCursorAttr(C)->getRange(); 6236 6237 if (C.kind == CXCursor_PreprocessingDirective) 6238 return cxcursor::getCursorPreprocessingDirective(C); 6239 6240 if (C.kind == CXCursor_MacroExpansion) { 6241 ASTUnit *TU = getCursorASTUnit(C); 6242 SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange(); 6243 return TU->mapRangeFromPreamble(Range); 6244 } 6245 6246 if (C.kind == CXCursor_MacroDefinition) { 6247 ASTUnit *TU = getCursorASTUnit(C); 6248 SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange(); 6249 return TU->mapRangeFromPreamble(Range); 6250 } 6251 6252 if (C.kind == CXCursor_InclusionDirective) { 6253 ASTUnit *TU = getCursorASTUnit(C); 6254 SourceRange Range = 6255 cxcursor::getCursorInclusionDirective(C)->getSourceRange(); 6256 return TU->mapRangeFromPreamble(Range); 6257 } 6258 6259 if (C.kind == CXCursor_TranslationUnit) { 6260 ASTUnit *TU = getCursorASTUnit(C); 6261 FileID MainID = TU->getSourceManager().getMainFileID(); 6262 SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID); 6263 SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID); 6264 return SourceRange(Start, End); 6265 } 6266 6267 if (clang_isDeclaration(C.kind)) { 6268 const Decl *D = cxcursor::getCursorDecl(C); 6269 if (!D) 6270 return SourceRange(); 6271 6272 SourceRange R = D->getSourceRange(); 6273 // FIXME: Multiple variables declared in a single declaration 6274 // currently lack the information needed to correctly determine their 6275 // ranges when accounting for the type-specifier. We use context 6276 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 6277 // and if so, whether it is the first decl. 6278 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 6279 if (!cxcursor::isFirstInDeclGroup(C)) 6280 R.setBegin(VD->getLocation()); 6281 } 6282 return R; 6283 } 6284 return SourceRange(); 6285 } 6286 6287 /// Retrieves the "raw" cursor extent, which is then extended to include 6288 /// the decl-specifier-seq for declarations. 6289 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) { 6290 if (clang_isDeclaration(C.kind)) { 6291 const Decl *D = cxcursor::getCursorDecl(C); 6292 if (!D) 6293 return SourceRange(); 6294 6295 SourceRange R = D->getSourceRange(); 6296 6297 // Adjust the start of the location for declarations preceded by 6298 // declaration specifiers. 6299 SourceLocation StartLoc; 6300 if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) { 6301 if (TypeSourceInfo *TI = DD->getTypeSourceInfo()) 6302 StartLoc = TI->getTypeLoc().getBeginLoc(); 6303 } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) { 6304 if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo()) 6305 StartLoc = TI->getTypeLoc().getBeginLoc(); 6306 } 6307 6308 if (StartLoc.isValid() && R.getBegin().isValid() && 6309 SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin())) 6310 R.setBegin(StartLoc); 6311 6312 // FIXME: Multiple variables declared in a single declaration 6313 // currently lack the information needed to correctly determine their 6314 // ranges when accounting for the type-specifier. We use context 6315 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 6316 // and if so, whether it is the first decl. 6317 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 6318 if (!cxcursor::isFirstInDeclGroup(C)) 6319 R.setBegin(VD->getLocation()); 6320 } 6321 6322 return R; 6323 } 6324 6325 return getRawCursorExtent(C); 6326 } 6327 6328 CXSourceRange clang_getCursorExtent(CXCursor C) { 6329 SourceRange R = getRawCursorExtent(C); 6330 if (R.isInvalid()) 6331 return clang_getNullRange(); 6332 6333 return cxloc::translateSourceRange(getCursorContext(C), R); 6334 } 6335 6336 CXCursor clang_getCursorReferenced(CXCursor C) { 6337 if (clang_isInvalid(C.kind)) 6338 return clang_getNullCursor(); 6339 6340 CXTranslationUnit tu = getCursorTU(C); 6341 if (clang_isDeclaration(C.kind)) { 6342 const Decl *D = getCursorDecl(C); 6343 if (!D) 6344 return clang_getNullCursor(); 6345 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) 6346 return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu); 6347 if (const ObjCPropertyImplDecl *PropImpl = 6348 dyn_cast<ObjCPropertyImplDecl>(D)) 6349 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 6350 return MakeCXCursor(Property, tu); 6351 6352 return C; 6353 } 6354 6355 if (clang_isExpression(C.kind)) { 6356 const Expr *E = getCursorExpr(C); 6357 const Decl *D = getDeclFromExpr(E); 6358 if (D) { 6359 CXCursor declCursor = MakeCXCursor(D, tu); 6360 declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C), 6361 declCursor); 6362 return declCursor; 6363 } 6364 6365 if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E)) 6366 return MakeCursorOverloadedDeclRef(Ovl, tu); 6367 6368 return clang_getNullCursor(); 6369 } 6370 6371 if (clang_isStatement(C.kind)) { 6372 const Stmt *S = getCursorStmt(C); 6373 if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S)) 6374 if (LabelDecl *label = Goto->getLabel()) 6375 if (LabelStmt *labelS = label->getStmt()) 6376 return MakeCXCursor(labelS, getCursorDecl(C), tu); 6377 6378 return clang_getNullCursor(); 6379 } 6380 6381 if (C.kind == CXCursor_MacroExpansion) { 6382 if (const MacroDefinitionRecord *Def = 6383 getCursorMacroExpansion(C).getDefinition()) 6384 return MakeMacroDefinitionCursor(Def, tu); 6385 } 6386 6387 if (!clang_isReference(C.kind)) 6388 return clang_getNullCursor(); 6389 6390 switch (C.kind) { 6391 case CXCursor_ObjCSuperClassRef: 6392 return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu); 6393 6394 case CXCursor_ObjCProtocolRef: { 6395 const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first; 6396 if (const ObjCProtocolDecl *Def = Prot->getDefinition()) 6397 return MakeCXCursor(Def, tu); 6398 6399 return MakeCXCursor(Prot, tu); 6400 } 6401 6402 case CXCursor_ObjCClassRef: { 6403 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 6404 if (const ObjCInterfaceDecl *Def = Class->getDefinition()) 6405 return MakeCXCursor(Def, tu); 6406 6407 return MakeCXCursor(Class, tu); 6408 } 6409 6410 case CXCursor_TypeRef: 6411 return MakeCXCursor(getCursorTypeRef(C).first, tu); 6412 6413 case CXCursor_TemplateRef: 6414 return MakeCXCursor(getCursorTemplateRef(C).first, tu); 6415 6416 case CXCursor_NamespaceRef: 6417 return MakeCXCursor(getCursorNamespaceRef(C).first, tu); 6418 6419 case CXCursor_MemberRef: 6420 return MakeCXCursor(getCursorMemberRef(C).first, tu); 6421 6422 case CXCursor_CXXBaseSpecifier: { 6423 const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C); 6424 return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(), tu)); 6425 } 6426 6427 case CXCursor_LabelRef: 6428 // FIXME: We end up faking the "parent" declaration here because we 6429 // don't want to make CXCursor larger. 6430 return MakeCXCursor( 6431 getCursorLabelRef(C).first, 6432 cxtu::getASTUnit(tu)->getASTContext().getTranslationUnitDecl(), tu); 6433 6434 case CXCursor_OverloadedDeclRef: 6435 return C; 6436 6437 case CXCursor_VariableRef: 6438 return MakeCXCursor(getCursorVariableRef(C).first, tu); 6439 6440 default: 6441 // We would prefer to enumerate all non-reference cursor kinds here. 6442 llvm_unreachable("Unhandled reference cursor kind"); 6443 } 6444 } 6445 6446 CXCursor clang_getCursorDefinition(CXCursor C) { 6447 if (clang_isInvalid(C.kind)) 6448 return clang_getNullCursor(); 6449 6450 CXTranslationUnit TU = getCursorTU(C); 6451 6452 bool WasReference = false; 6453 if (clang_isReference(C.kind) || clang_isExpression(C.kind)) { 6454 C = clang_getCursorReferenced(C); 6455 WasReference = true; 6456 } 6457 6458 if (C.kind == CXCursor_MacroExpansion) 6459 return clang_getCursorReferenced(C); 6460 6461 if (!clang_isDeclaration(C.kind)) 6462 return clang_getNullCursor(); 6463 6464 const Decl *D = getCursorDecl(C); 6465 if (!D) 6466 return clang_getNullCursor(); 6467 6468 switch (D->getKind()) { 6469 // Declaration kinds that don't really separate the notions of 6470 // declaration and definition. 6471 case Decl::Namespace: 6472 case Decl::Typedef: 6473 case Decl::TypeAlias: 6474 case Decl::TypeAliasTemplate: 6475 case Decl::TemplateTypeParm: 6476 case Decl::EnumConstant: 6477 case Decl::Field: 6478 case Decl::Binding: 6479 case Decl::MSProperty: 6480 case Decl::MSGuid: 6481 case Decl::UnnamedGlobalConstant: 6482 case Decl::TemplateParamObject: 6483 case Decl::IndirectField: 6484 case Decl::ObjCIvar: 6485 case Decl::ObjCAtDefsField: 6486 case Decl::ImplicitParam: 6487 case Decl::ParmVar: 6488 case Decl::NonTypeTemplateParm: 6489 case Decl::TemplateTemplateParm: 6490 case Decl::ObjCCategoryImpl: 6491 case Decl::ObjCImplementation: 6492 case Decl::AccessSpec: 6493 case Decl::LinkageSpec: 6494 case Decl::Export: 6495 case Decl::ObjCPropertyImpl: 6496 case Decl::FileScopeAsm: 6497 case Decl::StaticAssert: 6498 case Decl::Block: 6499 case Decl::Captured: 6500 case Decl::OMPCapturedExpr: 6501 case Decl::Label: // FIXME: Is this right?? 6502 case Decl::ClassScopeFunctionSpecialization: 6503 case Decl::CXXDeductionGuide: 6504 case Decl::Import: 6505 case Decl::OMPThreadPrivate: 6506 case Decl::OMPAllocate: 6507 case Decl::OMPDeclareReduction: 6508 case Decl::OMPDeclareMapper: 6509 case Decl::OMPRequires: 6510 case Decl::ObjCTypeParam: 6511 case Decl::BuiltinTemplate: 6512 case Decl::PragmaComment: 6513 case Decl::PragmaDetectMismatch: 6514 case Decl::UsingPack: 6515 case Decl::Concept: 6516 case Decl::LifetimeExtendedTemporary: 6517 case Decl::RequiresExprBody: 6518 case Decl::UnresolvedUsingIfExists: 6519 return C; 6520 6521 // Declaration kinds that don't make any sense here, but are 6522 // nonetheless harmless. 6523 case Decl::Empty: 6524 case Decl::TranslationUnit: 6525 case Decl::ExternCContext: 6526 break; 6527 6528 // Declaration kinds for which the definition is not resolvable. 6529 case Decl::UnresolvedUsingTypename: 6530 case Decl::UnresolvedUsingValue: 6531 break; 6532 6533 case Decl::UsingDirective: 6534 return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(), 6535 TU); 6536 6537 case Decl::NamespaceAlias: 6538 return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU); 6539 6540 case Decl::Enum: 6541 case Decl::Record: 6542 case Decl::CXXRecord: 6543 case Decl::ClassTemplateSpecialization: 6544 case Decl::ClassTemplatePartialSpecialization: 6545 if (TagDecl *Def = cast<TagDecl>(D)->getDefinition()) 6546 return MakeCXCursor(Def, TU); 6547 return clang_getNullCursor(); 6548 6549 case Decl::Function: 6550 case Decl::CXXMethod: 6551 case Decl::CXXConstructor: 6552 case Decl::CXXDestructor: 6553 case Decl::CXXConversion: { 6554 const FunctionDecl *Def = nullptr; 6555 if (cast<FunctionDecl>(D)->getBody(Def)) 6556 return MakeCXCursor(Def, TU); 6557 return clang_getNullCursor(); 6558 } 6559 6560 case Decl::Var: 6561 case Decl::VarTemplateSpecialization: 6562 case Decl::VarTemplatePartialSpecialization: 6563 case Decl::Decomposition: { 6564 // Ask the variable if it has a definition. 6565 if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition()) 6566 return MakeCXCursor(Def, TU); 6567 return clang_getNullCursor(); 6568 } 6569 6570 case Decl::FunctionTemplate: { 6571 const FunctionDecl *Def = nullptr; 6572 if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def)) 6573 return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU); 6574 return clang_getNullCursor(); 6575 } 6576 6577 case Decl::ClassTemplate: { 6578 if (RecordDecl *Def = 6579 cast<ClassTemplateDecl>(D)->getTemplatedDecl()->getDefinition()) 6580 return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(), 6581 TU); 6582 return clang_getNullCursor(); 6583 } 6584 6585 case Decl::VarTemplate: { 6586 if (VarDecl *Def = 6587 cast<VarTemplateDecl>(D)->getTemplatedDecl()->getDefinition()) 6588 return MakeCXCursor(cast<VarDecl>(Def)->getDescribedVarTemplate(), TU); 6589 return clang_getNullCursor(); 6590 } 6591 6592 case Decl::Using: 6593 case Decl::UsingEnum: 6594 return MakeCursorOverloadedDeclRef(cast<BaseUsingDecl>(D), D->getLocation(), 6595 TU); 6596 6597 case Decl::UsingShadow: 6598 case Decl::ConstructorUsingShadow: 6599 return clang_getCursorDefinition( 6600 MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(), TU)); 6601 6602 case Decl::ObjCMethod: { 6603 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D); 6604 if (Method->isThisDeclarationADefinition()) 6605 return C; 6606 6607 // Dig out the method definition in the associated 6608 // @implementation, if we have it. 6609 // FIXME: The ASTs should make finding the definition easier. 6610 if (const ObjCInterfaceDecl *Class = 6611 dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) 6612 if (ObjCImplementationDecl *ClassImpl = Class->getImplementation()) 6613 if (ObjCMethodDecl *Def = ClassImpl->getMethod( 6614 Method->getSelector(), Method->isInstanceMethod())) 6615 if (Def->isThisDeclarationADefinition()) 6616 return MakeCXCursor(Def, TU); 6617 6618 return clang_getNullCursor(); 6619 } 6620 6621 case Decl::ObjCCategory: 6622 if (ObjCCategoryImplDecl *Impl = 6623 cast<ObjCCategoryDecl>(D)->getImplementation()) 6624 return MakeCXCursor(Impl, TU); 6625 return clang_getNullCursor(); 6626 6627 case Decl::ObjCProtocol: 6628 if (const ObjCProtocolDecl *Def = 6629 cast<ObjCProtocolDecl>(D)->getDefinition()) 6630 return MakeCXCursor(Def, TU); 6631 return clang_getNullCursor(); 6632 6633 case Decl::ObjCInterface: { 6634 // There are two notions of a "definition" for an Objective-C 6635 // class: the interface and its implementation. When we resolved a 6636 // reference to an Objective-C class, produce the @interface as 6637 // the definition; when we were provided with the interface, 6638 // produce the @implementation as the definition. 6639 const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D); 6640 if (WasReference) { 6641 if (const ObjCInterfaceDecl *Def = IFace->getDefinition()) 6642 return MakeCXCursor(Def, TU); 6643 } else if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 6644 return MakeCXCursor(Impl, TU); 6645 return clang_getNullCursor(); 6646 } 6647 6648 case Decl::ObjCProperty: 6649 // FIXME: We don't really know where to find the 6650 // ObjCPropertyImplDecls that implement this property. 6651 return clang_getNullCursor(); 6652 6653 case Decl::ObjCCompatibleAlias: 6654 if (const ObjCInterfaceDecl *Class = 6655 cast<ObjCCompatibleAliasDecl>(D)->getClassInterface()) 6656 if (const ObjCInterfaceDecl *Def = Class->getDefinition()) 6657 return MakeCXCursor(Def, TU); 6658 6659 return clang_getNullCursor(); 6660 6661 case Decl::Friend: 6662 if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl()) 6663 return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 6664 return clang_getNullCursor(); 6665 6666 case Decl::FriendTemplate: 6667 if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl()) 6668 return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 6669 return clang_getNullCursor(); 6670 } 6671 6672 return clang_getNullCursor(); 6673 } 6674 6675 unsigned clang_isCursorDefinition(CXCursor C) { 6676 if (!clang_isDeclaration(C.kind)) 6677 return 0; 6678 6679 return clang_getCursorDefinition(C) == C; 6680 } 6681 6682 CXCursor clang_getCanonicalCursor(CXCursor C) { 6683 if (!clang_isDeclaration(C.kind)) 6684 return C; 6685 6686 if (const Decl *D = getCursorDecl(C)) { 6687 if (const ObjCCategoryImplDecl *CatImplD = 6688 dyn_cast<ObjCCategoryImplDecl>(D)) 6689 if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl()) 6690 return MakeCXCursor(CatD, getCursorTU(C)); 6691 6692 if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 6693 if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface()) 6694 return MakeCXCursor(IFD, getCursorTU(C)); 6695 6696 return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C)); 6697 } 6698 6699 return C; 6700 } 6701 6702 int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) { 6703 return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first; 6704 } 6705 6706 unsigned clang_getNumOverloadedDecls(CXCursor C) { 6707 if (C.kind != CXCursor_OverloadedDeclRef) 6708 return 0; 6709 6710 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 6711 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 6712 return E->getNumDecls(); 6713 6714 if (OverloadedTemplateStorage *S = 6715 Storage.dyn_cast<OverloadedTemplateStorage *>()) 6716 return S->size(); 6717 6718 const Decl *D = Storage.get<const Decl *>(); 6719 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) 6720 return Using->shadow_size(); 6721 6722 return 0; 6723 } 6724 6725 CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) { 6726 if (cursor.kind != CXCursor_OverloadedDeclRef) 6727 return clang_getNullCursor(); 6728 6729 if (index >= clang_getNumOverloadedDecls(cursor)) 6730 return clang_getNullCursor(); 6731 6732 CXTranslationUnit TU = getCursorTU(cursor); 6733 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first; 6734 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 6735 return MakeCXCursor(E->decls_begin()[index], TU); 6736 6737 if (OverloadedTemplateStorage *S = 6738 Storage.dyn_cast<OverloadedTemplateStorage *>()) 6739 return MakeCXCursor(S->begin()[index], TU); 6740 6741 const Decl *D = Storage.get<const Decl *>(); 6742 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) { 6743 // FIXME: This is, unfortunately, linear time. 6744 UsingDecl::shadow_iterator Pos = Using->shadow_begin(); 6745 std::advance(Pos, index); 6746 return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU); 6747 } 6748 6749 return clang_getNullCursor(); 6750 } 6751 6752 void clang_getDefinitionSpellingAndExtent( 6753 CXCursor C, const char **startBuf, const char **endBuf, unsigned *startLine, 6754 unsigned *startColumn, unsigned *endLine, unsigned *endColumn) { 6755 assert(getCursorDecl(C) && "CXCursor has null decl"); 6756 const auto *FD = cast<FunctionDecl>(getCursorDecl(C)); 6757 const auto *Body = cast<CompoundStmt>(FD->getBody()); 6758 6759 SourceManager &SM = FD->getASTContext().getSourceManager(); 6760 *startBuf = SM.getCharacterData(Body->getLBracLoc()); 6761 *endBuf = SM.getCharacterData(Body->getRBracLoc()); 6762 *startLine = SM.getSpellingLineNumber(Body->getLBracLoc()); 6763 *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc()); 6764 *endLine = SM.getSpellingLineNumber(Body->getRBracLoc()); 6765 *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc()); 6766 } 6767 6768 CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags, 6769 unsigned PieceIndex) { 6770 RefNamePieces Pieces; 6771 6772 switch (C.kind) { 6773 case CXCursor_MemberRefExpr: 6774 if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C))) 6775 Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(), 6776 E->getQualifierLoc().getSourceRange()); 6777 break; 6778 6779 case CXCursor_DeclRefExpr: 6780 if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) { 6781 SourceRange TemplateArgLoc(E->getLAngleLoc(), E->getRAngleLoc()); 6782 Pieces = 6783 buildPieces(NameFlags, false, E->getNameInfo(), 6784 E->getQualifierLoc().getSourceRange(), &TemplateArgLoc); 6785 } 6786 break; 6787 6788 case CXCursor_CallExpr: 6789 if (const CXXOperatorCallExpr *OCE = 6790 dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) { 6791 const Expr *Callee = OCE->getCallee(); 6792 if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) 6793 Callee = ICE->getSubExpr(); 6794 6795 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) 6796 Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(), 6797 DRE->getQualifierLoc().getSourceRange()); 6798 } 6799 break; 6800 6801 default: 6802 break; 6803 } 6804 6805 if (Pieces.empty()) { 6806 if (PieceIndex == 0) 6807 return clang_getCursorExtent(C); 6808 } else if (PieceIndex < Pieces.size()) { 6809 SourceRange R = Pieces[PieceIndex]; 6810 if (R.isValid()) 6811 return cxloc::translateSourceRange(getCursorContext(C), R); 6812 } 6813 6814 return clang_getNullRange(); 6815 } 6816 6817 void clang_enableStackTraces(void) { 6818 // FIXME: Provide an argv0 here so we can find llvm-symbolizer. 6819 llvm::sys::PrintStackTraceOnErrorSignal(StringRef()); 6820 } 6821 6822 void clang_executeOnThread(void (*fn)(void *), void *user_data, 6823 unsigned stack_size) { 6824 llvm::thread Thread(stack_size == 0 ? clang::DesiredStackSize 6825 : llvm::Optional<unsigned>(stack_size), 6826 fn, user_data); 6827 Thread.join(); 6828 } 6829 6830 //===----------------------------------------------------------------------===// 6831 // Token-based Operations. 6832 //===----------------------------------------------------------------------===// 6833 6834 /* CXToken layout: 6835 * int_data[0]: a CXTokenKind 6836 * int_data[1]: starting token location 6837 * int_data[2]: token length 6838 * int_data[3]: reserved 6839 * ptr_data: for identifiers and keywords, an IdentifierInfo*. 6840 * otherwise unused. 6841 */ 6842 CXTokenKind clang_getTokenKind(CXToken CXTok) { 6843 return static_cast<CXTokenKind>(CXTok.int_data[0]); 6844 } 6845 6846 CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { 6847 switch (clang_getTokenKind(CXTok)) { 6848 case CXToken_Identifier: 6849 case CXToken_Keyword: 6850 // We know we have an IdentifierInfo*, so use that. 6851 return cxstring::createRef( 6852 static_cast<IdentifierInfo *>(CXTok.ptr_data)->getNameStart()); 6853 6854 case CXToken_Literal: { 6855 // We have stashed the starting pointer in the ptr_data field. Use it. 6856 const char *Text = static_cast<const char *>(CXTok.ptr_data); 6857 return cxstring::createDup(StringRef(Text, CXTok.int_data[2])); 6858 } 6859 6860 case CXToken_Punctuation: 6861 case CXToken_Comment: 6862 break; 6863 } 6864 6865 if (isNotUsableTU(TU)) { 6866 LOG_BAD_TU(TU); 6867 return cxstring::createEmpty(); 6868 } 6869 6870 // We have to find the starting buffer pointer the hard way, by 6871 // deconstructing the source location. 6872 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6873 if (!CXXUnit) 6874 return cxstring::createEmpty(); 6875 6876 SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]); 6877 std::pair<FileID, unsigned> LocInfo = 6878 CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc); 6879 bool Invalid = false; 6880 StringRef Buffer = 6881 CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid); 6882 if (Invalid) 6883 return cxstring::createEmpty(); 6884 6885 return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2])); 6886 } 6887 6888 CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) { 6889 if (isNotUsableTU(TU)) { 6890 LOG_BAD_TU(TU); 6891 return clang_getNullLocation(); 6892 } 6893 6894 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6895 if (!CXXUnit) 6896 return clang_getNullLocation(); 6897 6898 return cxloc::translateSourceLocation( 6899 CXXUnit->getASTContext(), 6900 SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 6901 } 6902 6903 CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { 6904 if (isNotUsableTU(TU)) { 6905 LOG_BAD_TU(TU); 6906 return clang_getNullRange(); 6907 } 6908 6909 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6910 if (!CXXUnit) 6911 return clang_getNullRange(); 6912 6913 return cxloc::translateSourceRange( 6914 CXXUnit->getASTContext(), 6915 SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 6916 } 6917 6918 static void getTokens(ASTUnit *CXXUnit, SourceRange Range, 6919 SmallVectorImpl<CXToken> &CXTokens) { 6920 SourceManager &SourceMgr = CXXUnit->getSourceManager(); 6921 std::pair<FileID, unsigned> BeginLocInfo = 6922 SourceMgr.getDecomposedSpellingLoc(Range.getBegin()); 6923 std::pair<FileID, unsigned> EndLocInfo = 6924 SourceMgr.getDecomposedSpellingLoc(Range.getEnd()); 6925 6926 // Cannot tokenize across files. 6927 if (BeginLocInfo.first != EndLocInfo.first) 6928 return; 6929 6930 // Create a lexer 6931 bool Invalid = false; 6932 StringRef Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 6933 if (Invalid) 6934 return; 6935 6936 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 6937 CXXUnit->getASTContext().getLangOpts(), Buffer.begin(), 6938 Buffer.data() + BeginLocInfo.second, Buffer.end()); 6939 Lex.SetCommentRetentionState(true); 6940 6941 // Lex tokens until we hit the end of the range. 6942 const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second; 6943 Token Tok; 6944 bool previousWasAt = false; 6945 do { 6946 // Lex the next token 6947 Lex.LexFromRawLexer(Tok); 6948 if (Tok.is(tok::eof)) 6949 break; 6950 6951 // Initialize the CXToken. 6952 CXToken CXTok; 6953 6954 // - Common fields 6955 CXTok.int_data[1] = Tok.getLocation().getRawEncoding(); 6956 CXTok.int_data[2] = Tok.getLength(); 6957 CXTok.int_data[3] = 0; 6958 6959 // - Kind-specific fields 6960 if (Tok.isLiteral()) { 6961 CXTok.int_data[0] = CXToken_Literal; 6962 CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData()); 6963 } else if (Tok.is(tok::raw_identifier)) { 6964 // Lookup the identifier to determine whether we have a keyword. 6965 IdentifierInfo *II = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok); 6966 6967 if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) { 6968 CXTok.int_data[0] = CXToken_Keyword; 6969 } else { 6970 CXTok.int_data[0] = 6971 Tok.is(tok::identifier) ? CXToken_Identifier : CXToken_Keyword; 6972 } 6973 CXTok.ptr_data = II; 6974 } else if (Tok.is(tok::comment)) { 6975 CXTok.int_data[0] = CXToken_Comment; 6976 CXTok.ptr_data = nullptr; 6977 } else { 6978 CXTok.int_data[0] = CXToken_Punctuation; 6979 CXTok.ptr_data = nullptr; 6980 } 6981 CXTokens.push_back(CXTok); 6982 previousWasAt = Tok.is(tok::at); 6983 } while (Lex.getBufferLocation() < EffectiveBufferEnd); 6984 } 6985 6986 CXToken *clang_getToken(CXTranslationUnit TU, CXSourceLocation Location) { 6987 LOG_FUNC_SECTION { *Log << TU << ' ' << Location; } 6988 6989 if (isNotUsableTU(TU)) { 6990 LOG_BAD_TU(TU); 6991 return nullptr; 6992 } 6993 6994 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6995 if (!CXXUnit) 6996 return nullptr; 6997 6998 SourceLocation Begin = cxloc::translateSourceLocation(Location); 6999 if (Begin.isInvalid()) 7000 return nullptr; 7001 SourceManager &SM = CXXUnit->getSourceManager(); 7002 std::pair<FileID, unsigned> DecomposedEnd = SM.getDecomposedLoc(Begin); 7003 DecomposedEnd.second += 7004 Lexer::MeasureTokenLength(Begin, SM, CXXUnit->getLangOpts()); 7005 7006 SourceLocation End = 7007 SM.getComposedLoc(DecomposedEnd.first, DecomposedEnd.second); 7008 7009 SmallVector<CXToken, 32> CXTokens; 7010 getTokens(CXXUnit, SourceRange(Begin, End), CXTokens); 7011 7012 if (CXTokens.empty()) 7013 return nullptr; 7014 7015 CXTokens.resize(1); 7016 CXToken *Token = static_cast<CXToken *>(llvm::safe_malloc(sizeof(CXToken))); 7017 7018 memmove(Token, CXTokens.data(), sizeof(CXToken)); 7019 return Token; 7020 } 7021 7022 void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, CXToken **Tokens, 7023 unsigned *NumTokens) { 7024 LOG_FUNC_SECTION { *Log << TU << ' ' << Range; } 7025 7026 if (Tokens) 7027 *Tokens = nullptr; 7028 if (NumTokens) 7029 *NumTokens = 0; 7030 7031 if (isNotUsableTU(TU)) { 7032 LOG_BAD_TU(TU); 7033 return; 7034 } 7035 7036 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 7037 if (!CXXUnit || !Tokens || !NumTokens) 7038 return; 7039 7040 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 7041 7042 SourceRange R = cxloc::translateCXSourceRange(Range); 7043 if (R.isInvalid()) 7044 return; 7045 7046 SmallVector<CXToken, 32> CXTokens; 7047 getTokens(CXXUnit, R, CXTokens); 7048 7049 if (CXTokens.empty()) 7050 return; 7051 7052 *Tokens = static_cast<CXToken *>( 7053 llvm::safe_malloc(sizeof(CXToken) * CXTokens.size())); 7054 memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size()); 7055 *NumTokens = CXTokens.size(); 7056 } 7057 7058 void clang_disposeTokens(CXTranslationUnit TU, CXToken *Tokens, 7059 unsigned NumTokens) { 7060 free(Tokens); 7061 } 7062 7063 //===----------------------------------------------------------------------===// 7064 // Token annotation APIs. 7065 //===----------------------------------------------------------------------===// 7066 7067 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 7068 CXCursor parent, 7069 CXClientData client_data); 7070 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor, 7071 CXClientData client_data); 7072 7073 namespace { 7074 class AnnotateTokensWorker { 7075 CXToken *Tokens; 7076 CXCursor *Cursors; 7077 unsigned NumTokens; 7078 unsigned TokIdx; 7079 unsigned PreprocessingTokIdx; 7080 CursorVisitor AnnotateVis; 7081 SourceManager &SrcMgr; 7082 bool HasContextSensitiveKeywords; 7083 7084 struct PostChildrenAction { 7085 CXCursor cursor; 7086 enum Action { Invalid, Ignore, Postpone } action; 7087 }; 7088 using PostChildrenActions = SmallVector<PostChildrenAction, 0>; 7089 7090 struct PostChildrenInfo { 7091 CXCursor Cursor; 7092 SourceRange CursorRange; 7093 unsigned BeforeReachingCursorIdx; 7094 unsigned BeforeChildrenTokenIdx; 7095 PostChildrenActions ChildActions; 7096 }; 7097 SmallVector<PostChildrenInfo, 8> PostChildrenInfos; 7098 7099 CXToken &getTok(unsigned Idx) { 7100 assert(Idx < NumTokens); 7101 return Tokens[Idx]; 7102 } 7103 const CXToken &getTok(unsigned Idx) const { 7104 assert(Idx < NumTokens); 7105 return Tokens[Idx]; 7106 } 7107 bool MoreTokens() const { return TokIdx < NumTokens; } 7108 unsigned NextToken() const { return TokIdx; } 7109 void AdvanceToken() { ++TokIdx; } 7110 SourceLocation GetTokenLoc(unsigned tokI) { 7111 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]); 7112 } 7113 bool isFunctionMacroToken(unsigned tokI) const { 7114 return getTok(tokI).int_data[3] != 0; 7115 } 7116 SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const { 7117 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[3]); 7118 } 7119 7120 void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange); 7121 bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult, 7122 SourceRange); 7123 7124 public: 7125 AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens, 7126 CXTranslationUnit TU, SourceRange RegionOfInterest) 7127 : Tokens(tokens), Cursors(cursors), NumTokens(numTokens), TokIdx(0), 7128 PreprocessingTokIdx(0), 7129 AnnotateVis(TU, AnnotateTokensVisitor, this, 7130 /*VisitPreprocessorLast=*/true, 7131 /*VisitIncludedEntities=*/false, RegionOfInterest, 7132 /*VisitDeclsOnly=*/false, 7133 AnnotateTokensPostChildrenVisitor), 7134 SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()), 7135 HasContextSensitiveKeywords(false) {} 7136 7137 void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); } 7138 enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent); 7139 bool IsIgnoredChildCursor(CXCursor cursor) const; 7140 PostChildrenActions DetermineChildActions(CXCursor Cursor) const; 7141 7142 bool postVisitChildren(CXCursor cursor); 7143 void HandlePostPonedChildCursors(const PostChildrenInfo &Info); 7144 void HandlePostPonedChildCursor(CXCursor Cursor, unsigned StartTokenIndex); 7145 7146 void AnnotateTokens(); 7147 7148 /// Determine whether the annotator saw any cursors that have 7149 /// context-sensitive keywords. 7150 bool hasContextSensitiveKeywords() const { 7151 return HasContextSensitiveKeywords; 7152 } 7153 7154 ~AnnotateTokensWorker() { assert(PostChildrenInfos.empty()); } 7155 }; 7156 } // namespace 7157 7158 void AnnotateTokensWorker::AnnotateTokens() { 7159 // Walk the AST within the region of interest, annotating tokens 7160 // along the way. 7161 AnnotateVis.visitFileRegion(); 7162 } 7163 7164 bool AnnotateTokensWorker::IsIgnoredChildCursor(CXCursor cursor) const { 7165 if (PostChildrenInfos.empty()) 7166 return false; 7167 7168 for (const auto &ChildAction : PostChildrenInfos.back().ChildActions) { 7169 if (ChildAction.cursor == cursor && 7170 ChildAction.action == PostChildrenAction::Ignore) { 7171 return true; 7172 } 7173 } 7174 7175 return false; 7176 } 7177 7178 const CXXOperatorCallExpr *GetSubscriptOrCallOperator(CXCursor Cursor) { 7179 if (!clang_isExpression(Cursor.kind)) 7180 return nullptr; 7181 7182 const Expr *E = getCursorExpr(Cursor); 7183 if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) { 7184 const OverloadedOperatorKind Kind = OCE->getOperator(); 7185 if (Kind == OO_Call || Kind == OO_Subscript) 7186 return OCE; 7187 } 7188 7189 return nullptr; 7190 } 7191 7192 AnnotateTokensWorker::PostChildrenActions 7193 AnnotateTokensWorker::DetermineChildActions(CXCursor Cursor) const { 7194 PostChildrenActions actions; 7195 7196 // The DeclRefExpr of CXXOperatorCallExpr refering to the custom operator is 7197 // visited before the arguments to the operator call. For the Call and 7198 // Subscript operator the range of this DeclRefExpr includes the whole call 7199 // expression, so that all tokens in that range would be mapped to the 7200 // operator function, including the tokens of the arguments. To avoid that, 7201 // ensure to visit this DeclRefExpr as last node. 7202 if (const auto *OCE = GetSubscriptOrCallOperator(Cursor)) { 7203 const Expr *Callee = OCE->getCallee(); 7204 if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) { 7205 const Expr *SubExpr = ICE->getSubExpr(); 7206 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(SubExpr)) { 7207 const Decl *parentDecl = getCursorDecl(Cursor); 7208 CXTranslationUnit TU = clang_Cursor_getTranslationUnit(Cursor); 7209 7210 // Visit the DeclRefExpr as last. 7211 CXCursor cxChild = MakeCXCursor(DRE, parentDecl, TU); 7212 actions.push_back({cxChild, PostChildrenAction::Postpone}); 7213 7214 // The parent of the DeclRefExpr, an ImplicitCastExpr, has an equally 7215 // wide range as the DeclRefExpr. We can skip visiting this entirely. 7216 cxChild = MakeCXCursor(ICE, parentDecl, TU); 7217 actions.push_back({cxChild, PostChildrenAction::Ignore}); 7218 } 7219 } 7220 } 7221 7222 return actions; 7223 } 7224 7225 static inline void updateCursorAnnotation(CXCursor &Cursor, 7226 const CXCursor &updateC) { 7227 if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind)) 7228 return; 7229 Cursor = updateC; 7230 } 7231 7232 /// It annotates and advances tokens with a cursor until the comparison 7233 //// between the cursor location and the source range is the same as 7234 /// \arg compResult. 7235 /// 7236 /// Pass RangeBefore to annotate tokens with a cursor until a range is reached. 7237 /// Pass RangeOverlap to annotate tokens inside a range. 7238 void AnnotateTokensWorker::annotateAndAdvanceTokens( 7239 CXCursor updateC, RangeComparisonResult compResult, SourceRange range) { 7240 while (MoreTokens()) { 7241 const unsigned I = NextToken(); 7242 if (isFunctionMacroToken(I)) 7243 if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range)) 7244 return; 7245 7246 SourceLocation TokLoc = GetTokenLoc(I); 7247 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) { 7248 updateCursorAnnotation(Cursors[I], updateC); 7249 AdvanceToken(); 7250 continue; 7251 } 7252 break; 7253 } 7254 } 7255 7256 /// Special annotation handling for macro argument tokens. 7257 /// \returns true if it advanced beyond all macro tokens, false otherwise. 7258 bool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens( 7259 CXCursor updateC, RangeComparisonResult compResult, SourceRange range) { 7260 assert(MoreTokens()); 7261 assert(isFunctionMacroToken(NextToken()) && 7262 "Should be called only for macro arg tokens"); 7263 7264 // This works differently than annotateAndAdvanceTokens; because expanded 7265 // macro arguments can have arbitrary translation-unit source order, we do not 7266 // advance the token index one by one until a token fails the range test. 7267 // We only advance once past all of the macro arg tokens if all of them 7268 // pass the range test. If one of them fails we keep the token index pointing 7269 // at the start of the macro arg tokens so that the failing token will be 7270 // annotated by a subsequent annotation try. 7271 7272 bool atLeastOneCompFail = false; 7273 7274 unsigned I = NextToken(); 7275 for (; I < NumTokens && isFunctionMacroToken(I); ++I) { 7276 SourceLocation TokLoc = getFunctionMacroTokenLoc(I); 7277 if (TokLoc.isFileID()) 7278 continue; // not macro arg token, it's parens or comma. 7279 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) { 7280 if (clang_isInvalid(clang_getCursorKind(Cursors[I]))) 7281 Cursors[I] = updateC; 7282 } else 7283 atLeastOneCompFail = true; 7284 } 7285 7286 if (atLeastOneCompFail) 7287 return false; 7288 7289 TokIdx = I; // All of the tokens were handled, advance beyond all of them. 7290 return true; 7291 } 7292 7293 enum CXChildVisitResult AnnotateTokensWorker::Visit(CXCursor cursor, 7294 CXCursor parent) { 7295 SourceRange cursorRange = getRawCursorExtent(cursor); 7296 if (cursorRange.isInvalid()) 7297 return CXChildVisit_Recurse; 7298 7299 if (IsIgnoredChildCursor(cursor)) 7300 return CXChildVisit_Continue; 7301 7302 if (!HasContextSensitiveKeywords) { 7303 // Objective-C properties can have context-sensitive keywords. 7304 if (cursor.kind == CXCursor_ObjCPropertyDecl) { 7305 if (const ObjCPropertyDecl *Property = 7306 dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor))) 7307 HasContextSensitiveKeywords = 7308 Property->getPropertyAttributesAsWritten() != 0; 7309 } 7310 // Objective-C methods can have context-sensitive keywords. 7311 else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl || 7312 cursor.kind == CXCursor_ObjCClassMethodDecl) { 7313 if (const ObjCMethodDecl *Method = 7314 dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) { 7315 if (Method->getObjCDeclQualifier()) 7316 HasContextSensitiveKeywords = true; 7317 else { 7318 for (const auto *P : Method->parameters()) { 7319 if (P->getObjCDeclQualifier()) { 7320 HasContextSensitiveKeywords = true; 7321 break; 7322 } 7323 } 7324 } 7325 } 7326 } 7327 // C++ methods can have context-sensitive keywords. 7328 else if (cursor.kind == CXCursor_CXXMethod) { 7329 if (const CXXMethodDecl *Method = 7330 dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) { 7331 if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>()) 7332 HasContextSensitiveKeywords = true; 7333 } 7334 } 7335 // C++ classes can have context-sensitive keywords. 7336 else if (cursor.kind == CXCursor_StructDecl || 7337 cursor.kind == CXCursor_ClassDecl || 7338 cursor.kind == CXCursor_ClassTemplate || 7339 cursor.kind == CXCursor_ClassTemplatePartialSpecialization) { 7340 if (const Decl *D = getCursorDecl(cursor)) 7341 if (D->hasAttr<FinalAttr>()) 7342 HasContextSensitiveKeywords = true; 7343 } 7344 } 7345 7346 // Don't override a property annotation with its getter/setter method. 7347 if (cursor.kind == CXCursor_ObjCInstanceMethodDecl && 7348 parent.kind == CXCursor_ObjCPropertyDecl) 7349 return CXChildVisit_Continue; 7350 7351 if (clang_isPreprocessing(cursor.kind)) { 7352 // Items in the preprocessing record are kept separate from items in 7353 // declarations, so we keep a separate token index. 7354 unsigned SavedTokIdx = TokIdx; 7355 TokIdx = PreprocessingTokIdx; 7356 7357 // Skip tokens up until we catch up to the beginning of the preprocessing 7358 // entry. 7359 while (MoreTokens()) { 7360 const unsigned I = NextToken(); 7361 SourceLocation TokLoc = GetTokenLoc(I); 7362 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 7363 case RangeBefore: 7364 AdvanceToken(); 7365 continue; 7366 case RangeAfter: 7367 case RangeOverlap: 7368 break; 7369 } 7370 break; 7371 } 7372 7373 // Look at all of the tokens within this range. 7374 while (MoreTokens()) { 7375 const unsigned I = NextToken(); 7376 SourceLocation TokLoc = GetTokenLoc(I); 7377 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 7378 case RangeBefore: 7379 llvm_unreachable("Infeasible"); 7380 case RangeAfter: 7381 break; 7382 case RangeOverlap: 7383 // For macro expansions, just note where the beginning of the macro 7384 // expansion occurs. 7385 if (cursor.kind == CXCursor_MacroExpansion) { 7386 if (TokLoc == cursorRange.getBegin()) 7387 Cursors[I] = cursor; 7388 AdvanceToken(); 7389 break; 7390 } 7391 // We may have already annotated macro names inside macro definitions. 7392 if (Cursors[I].kind != CXCursor_MacroExpansion) 7393 Cursors[I] = cursor; 7394 AdvanceToken(); 7395 continue; 7396 } 7397 break; 7398 } 7399 7400 // Save the preprocessing token index; restore the non-preprocessing 7401 // token index. 7402 PreprocessingTokIdx = TokIdx; 7403 TokIdx = SavedTokIdx; 7404 return CXChildVisit_Recurse; 7405 } 7406 7407 if (cursorRange.isInvalid()) 7408 return CXChildVisit_Continue; 7409 7410 unsigned BeforeReachingCursorIdx = NextToken(); 7411 const enum CXCursorKind cursorK = clang_getCursorKind(cursor); 7412 const enum CXCursorKind K = clang_getCursorKind(parent); 7413 const CXCursor updateC = 7414 (clang_isInvalid(K) || K == CXCursor_TranslationUnit || 7415 // Attributes are annotated out-of-order, skip tokens until we reach it. 7416 clang_isAttribute(cursor.kind)) 7417 ? clang_getNullCursor() 7418 : parent; 7419 7420 annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange); 7421 7422 // Avoid having the cursor of an expression "overwrite" the annotation of the 7423 // variable declaration that it belongs to. 7424 // This can happen for C++ constructor expressions whose range generally 7425 // include the variable declaration, e.g.: 7426 // MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor. 7427 if (clang_isExpression(cursorK) && MoreTokens()) { 7428 const Expr *E = getCursorExpr(cursor); 7429 if (const Decl *D = getCursorDecl(cursor)) { 7430 const unsigned I = NextToken(); 7431 if (E->getBeginLoc().isValid() && D->getLocation().isValid() && 7432 E->getBeginLoc() == D->getLocation() && 7433 E->getBeginLoc() == GetTokenLoc(I)) { 7434 updateCursorAnnotation(Cursors[I], updateC); 7435 AdvanceToken(); 7436 } 7437 } 7438 } 7439 7440 // Before recursing into the children keep some state that we are going 7441 // to use in the AnnotateTokensWorker::postVisitChildren callback to do some 7442 // extra work after the child nodes are visited. 7443 // Note that we don't call VisitChildren here to avoid traversing statements 7444 // code-recursively which can blow the stack. 7445 7446 PostChildrenInfo Info; 7447 Info.Cursor = cursor; 7448 Info.CursorRange = cursorRange; 7449 Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx; 7450 Info.BeforeChildrenTokenIdx = NextToken(); 7451 Info.ChildActions = DetermineChildActions(cursor); 7452 PostChildrenInfos.push_back(Info); 7453 7454 return CXChildVisit_Recurse; 7455 } 7456 7457 bool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) { 7458 if (PostChildrenInfos.empty()) 7459 return false; 7460 const PostChildrenInfo &Info = PostChildrenInfos.back(); 7461 if (!clang_equalCursors(Info.Cursor, cursor)) 7462 return false; 7463 7464 HandlePostPonedChildCursors(Info); 7465 7466 const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx; 7467 const unsigned AfterChildren = NextToken(); 7468 SourceRange cursorRange = Info.CursorRange; 7469 7470 // Scan the tokens that are at the end of the cursor, but are not captured 7471 // but the child cursors. 7472 annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange); 7473 7474 // Scan the tokens that are at the beginning of the cursor, but are not 7475 // capture by the child cursors. 7476 for (unsigned I = BeforeChildren; I != AfterChildren; ++I) { 7477 if (!clang_isInvalid(clang_getCursorKind(Cursors[I]))) 7478 break; 7479 7480 Cursors[I] = cursor; 7481 } 7482 7483 // Attributes are annotated out-of-order, rewind TokIdx to when we first 7484 // encountered the attribute cursor. 7485 if (clang_isAttribute(cursor.kind)) 7486 TokIdx = Info.BeforeReachingCursorIdx; 7487 7488 PostChildrenInfos.pop_back(); 7489 return false; 7490 } 7491 7492 void AnnotateTokensWorker::HandlePostPonedChildCursors( 7493 const PostChildrenInfo &Info) { 7494 for (const auto &ChildAction : Info.ChildActions) { 7495 if (ChildAction.action == PostChildrenAction::Postpone) { 7496 HandlePostPonedChildCursor(ChildAction.cursor, 7497 Info.BeforeChildrenTokenIdx); 7498 } 7499 } 7500 } 7501 7502 void AnnotateTokensWorker::HandlePostPonedChildCursor( 7503 CXCursor Cursor, unsigned StartTokenIndex) { 7504 unsigned I = StartTokenIndex; 7505 7506 // The bracket tokens of a Call or Subscript operator are mapped to 7507 // CallExpr/CXXOperatorCallExpr because we skipped visiting the corresponding 7508 // DeclRefExpr. Remap these tokens to the DeclRefExpr cursors. 7509 for (unsigned RefNameRangeNr = 0; I < NumTokens; RefNameRangeNr++) { 7510 const CXSourceRange CXRefNameRange = clang_getCursorReferenceNameRange( 7511 Cursor, CXNameRange_WantQualifier, RefNameRangeNr); 7512 if (clang_Range_isNull(CXRefNameRange)) 7513 break; // All ranges handled. 7514 7515 SourceRange RefNameRange = cxloc::translateCXSourceRange(CXRefNameRange); 7516 while (I < NumTokens) { 7517 const SourceLocation TokenLocation = GetTokenLoc(I); 7518 if (!TokenLocation.isValid()) 7519 break; 7520 7521 // Adapt the end range, because LocationCompare() reports 7522 // RangeOverlap even for the not-inclusive end location. 7523 const SourceLocation fixedEnd = 7524 RefNameRange.getEnd().getLocWithOffset(-1); 7525 RefNameRange = SourceRange(RefNameRange.getBegin(), fixedEnd); 7526 7527 const RangeComparisonResult ComparisonResult = 7528 LocationCompare(SrcMgr, TokenLocation, RefNameRange); 7529 7530 if (ComparisonResult == RangeOverlap) { 7531 Cursors[I++] = Cursor; 7532 } else if (ComparisonResult == RangeBefore) { 7533 ++I; // Not relevant token, check next one. 7534 } else if (ComparisonResult == RangeAfter) { 7535 break; // All tokens updated for current range, check next. 7536 } 7537 } 7538 } 7539 } 7540 7541 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 7542 CXCursor parent, 7543 CXClientData client_data) { 7544 return static_cast<AnnotateTokensWorker *>(client_data) 7545 ->Visit(cursor, parent); 7546 } 7547 7548 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor, 7549 CXClientData client_data) { 7550 return static_cast<AnnotateTokensWorker *>(client_data) 7551 ->postVisitChildren(cursor); 7552 } 7553 7554 namespace { 7555 7556 /// Uses the macro expansions in the preprocessing record to find 7557 /// and mark tokens that are macro arguments. This info is used by the 7558 /// AnnotateTokensWorker. 7559 class MarkMacroArgTokensVisitor { 7560 SourceManager &SM; 7561 CXToken *Tokens; 7562 unsigned NumTokens; 7563 unsigned CurIdx; 7564 7565 public: 7566 MarkMacroArgTokensVisitor(SourceManager &SM, CXToken *tokens, 7567 unsigned numTokens) 7568 : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) {} 7569 7570 CXChildVisitResult visit(CXCursor cursor, CXCursor parent) { 7571 if (cursor.kind != CXCursor_MacroExpansion) 7572 return CXChildVisit_Continue; 7573 7574 SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange(); 7575 if (macroRange.getBegin() == macroRange.getEnd()) 7576 return CXChildVisit_Continue; // it's not a function macro. 7577 7578 for (; CurIdx < NumTokens; ++CurIdx) { 7579 if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx), 7580 macroRange.getBegin())) 7581 break; 7582 } 7583 7584 if (CurIdx == NumTokens) 7585 return CXChildVisit_Break; 7586 7587 for (; CurIdx < NumTokens; ++CurIdx) { 7588 SourceLocation tokLoc = getTokenLoc(CurIdx); 7589 if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd())) 7590 break; 7591 7592 setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc)); 7593 } 7594 7595 if (CurIdx == NumTokens) 7596 return CXChildVisit_Break; 7597 7598 return CXChildVisit_Continue; 7599 } 7600 7601 private: 7602 CXToken &getTok(unsigned Idx) { 7603 assert(Idx < NumTokens); 7604 return Tokens[Idx]; 7605 } 7606 const CXToken &getTok(unsigned Idx) const { 7607 assert(Idx < NumTokens); 7608 return Tokens[Idx]; 7609 } 7610 7611 SourceLocation getTokenLoc(unsigned tokI) { 7612 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]); 7613 } 7614 7615 void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) { 7616 // The third field is reserved and currently not used. Use it here 7617 // to mark macro arg expanded tokens with their expanded locations. 7618 getTok(tokI).int_data[3] = loc.getRawEncoding(); 7619 } 7620 }; 7621 7622 } // end anonymous namespace 7623 7624 static CXChildVisitResult 7625 MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent, 7626 CXClientData client_data) { 7627 return static_cast<MarkMacroArgTokensVisitor *>(client_data) 7628 ->visit(cursor, parent); 7629 } 7630 7631 /// Used by \c annotatePreprocessorTokens. 7632 /// \returns true if lexing was finished, false otherwise. 7633 static bool lexNext(Lexer &Lex, Token &Tok, unsigned &NextIdx, 7634 unsigned NumTokens) { 7635 if (NextIdx >= NumTokens) 7636 return true; 7637 7638 ++NextIdx; 7639 Lex.LexFromRawLexer(Tok); 7640 return Tok.is(tok::eof); 7641 } 7642 7643 static void annotatePreprocessorTokens(CXTranslationUnit TU, 7644 SourceRange RegionOfInterest, 7645 CXCursor *Cursors, CXToken *Tokens, 7646 unsigned NumTokens) { 7647 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 7648 7649 Preprocessor &PP = CXXUnit->getPreprocessor(); 7650 SourceManager &SourceMgr = CXXUnit->getSourceManager(); 7651 std::pair<FileID, unsigned> BeginLocInfo = 7652 SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin()); 7653 std::pair<FileID, unsigned> EndLocInfo = 7654 SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd()); 7655 7656 if (BeginLocInfo.first != EndLocInfo.first) 7657 return; 7658 7659 StringRef Buffer; 7660 bool Invalid = false; 7661 Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 7662 if (Buffer.empty() || Invalid) 7663 return; 7664 7665 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 7666 CXXUnit->getASTContext().getLangOpts(), Buffer.begin(), 7667 Buffer.data() + BeginLocInfo.second, Buffer.end()); 7668 Lex.SetCommentRetentionState(true); 7669 7670 unsigned NextIdx = 0; 7671 // Lex tokens in raw mode until we hit the end of the range, to avoid 7672 // entering #includes or expanding macros. 7673 while (true) { 7674 Token Tok; 7675 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 7676 break; 7677 unsigned TokIdx = NextIdx - 1; 7678 assert(Tok.getLocation() == 7679 SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1])); 7680 7681 reprocess: 7682 if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) { 7683 // We have found a preprocessing directive. Annotate the tokens 7684 // appropriately. 7685 // 7686 // FIXME: Some simple tests here could identify macro definitions and 7687 // #undefs, to provide specific cursor kinds for those. 7688 7689 SourceLocation BeginLoc = Tok.getLocation(); 7690 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 7691 break; 7692 7693 MacroInfo *MI = nullptr; 7694 if (Tok.is(tok::raw_identifier) && Tok.getRawIdentifier() == "define") { 7695 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 7696 break; 7697 7698 if (Tok.is(tok::raw_identifier)) { 7699 IdentifierInfo &II = 7700 PP.getIdentifierTable().get(Tok.getRawIdentifier()); 7701 SourceLocation MappedTokLoc = 7702 CXXUnit->mapLocationToPreamble(Tok.getLocation()); 7703 MI = getMacroInfo(II, MappedTokLoc, TU); 7704 } 7705 } 7706 7707 bool finished = false; 7708 do { 7709 if (lexNext(Lex, Tok, NextIdx, NumTokens)) { 7710 finished = true; 7711 break; 7712 } 7713 // If we are in a macro definition, check if the token was ever a 7714 // macro name and annotate it if that's the case. 7715 if (MI) { 7716 SourceLocation SaveLoc = Tok.getLocation(); 7717 Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc)); 7718 MacroDefinitionRecord *MacroDef = 7719 checkForMacroInMacroDefinition(MI, Tok, TU); 7720 Tok.setLocation(SaveLoc); 7721 if (MacroDef) 7722 Cursors[NextIdx - 1] = 7723 MakeMacroExpansionCursor(MacroDef, Tok.getLocation(), TU); 7724 } 7725 } while (!Tok.isAtStartOfLine()); 7726 7727 unsigned LastIdx = finished ? NextIdx - 1 : NextIdx - 2; 7728 assert(TokIdx <= LastIdx); 7729 SourceLocation EndLoc = 7730 SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]); 7731 CXCursor Cursor = 7732 MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU); 7733 7734 for (; TokIdx <= LastIdx; ++TokIdx) 7735 updateCursorAnnotation(Cursors[TokIdx], Cursor); 7736 7737 if (finished) 7738 break; 7739 goto reprocess; 7740 } 7741 } 7742 } 7743 7744 // This gets run a separate thread to avoid stack blowout. 7745 static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit, 7746 CXToken *Tokens, unsigned NumTokens, 7747 CXCursor *Cursors) { 7748 CIndexer *CXXIdx = TU->CIdx; 7749 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) 7750 setThreadBackgroundPriority(); 7751 7752 // Determine the region of interest, which contains all of the tokens. 7753 SourceRange RegionOfInterest; 7754 RegionOfInterest.setBegin( 7755 cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0]))); 7756 RegionOfInterest.setEnd(cxloc::translateSourceLocation( 7757 clang_getTokenLocation(TU, Tokens[NumTokens - 1]))); 7758 7759 // Relex the tokens within the source range to look for preprocessing 7760 // directives. 7761 annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens); 7762 7763 // If begin location points inside a macro argument, set it to the expansion 7764 // location so we can have the full context when annotating semantically. 7765 { 7766 SourceManager &SM = CXXUnit->getSourceManager(); 7767 SourceLocation Loc = 7768 SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin()); 7769 if (Loc.isMacroID()) 7770 RegionOfInterest.setBegin(SM.getExpansionLoc(Loc)); 7771 } 7772 7773 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) { 7774 // Search and mark tokens that are macro argument expansions. 7775 MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(), Tokens, 7776 NumTokens); 7777 CursorVisitor MacroArgMarker( 7778 TU, MarkMacroArgTokensVisitorDelegate, &Visitor, 7779 /*VisitPreprocessorLast=*/true, 7780 /*VisitIncludedEntities=*/false, RegionOfInterest); 7781 MacroArgMarker.visitPreprocessedEntitiesInRegion(); 7782 } 7783 7784 // Annotate all of the source locations in the region of interest that map to 7785 // a specific cursor. 7786 AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest); 7787 7788 // FIXME: We use a ridiculous stack size here because the data-recursion 7789 // algorithm uses a large stack frame than the non-data recursive version, 7790 // and AnnotationTokensWorker currently transforms the data-recursion 7791 // algorithm back into a traditional recursion by explicitly calling 7792 // VisitChildren(). We will need to remove this explicit recursive call. 7793 W.AnnotateTokens(); 7794 7795 // If we ran into any entities that involve context-sensitive keywords, 7796 // take another pass through the tokens to mark them as such. 7797 if (W.hasContextSensitiveKeywords()) { 7798 for (unsigned I = 0; I != NumTokens; ++I) { 7799 if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier) 7800 continue; 7801 7802 if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) { 7803 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data); 7804 if (const ObjCPropertyDecl *Property = 7805 dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) { 7806 if (Property->getPropertyAttributesAsWritten() != 0 && 7807 llvm::StringSwitch<bool>(II->getName()) 7808 .Case("readonly", true) 7809 .Case("assign", true) 7810 .Case("unsafe_unretained", true) 7811 .Case("readwrite", true) 7812 .Case("retain", true) 7813 .Case("copy", true) 7814 .Case("nonatomic", true) 7815 .Case("atomic", true) 7816 .Case("getter", true) 7817 .Case("setter", true) 7818 .Case("strong", true) 7819 .Case("weak", true) 7820 .Case("class", true) 7821 .Default(false)) 7822 Tokens[I].int_data[0] = CXToken_Keyword; 7823 } 7824 continue; 7825 } 7826 7827 if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl || 7828 Cursors[I].kind == CXCursor_ObjCClassMethodDecl) { 7829 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data); 7830 if (llvm::StringSwitch<bool>(II->getName()) 7831 .Case("in", true) 7832 .Case("out", true) 7833 .Case("inout", true) 7834 .Case("oneway", true) 7835 .Case("bycopy", true) 7836 .Case("byref", true) 7837 .Default(false)) 7838 Tokens[I].int_data[0] = CXToken_Keyword; 7839 continue; 7840 } 7841 7842 if (Cursors[I].kind == CXCursor_CXXFinalAttr || 7843 Cursors[I].kind == CXCursor_CXXOverrideAttr) { 7844 Tokens[I].int_data[0] = CXToken_Keyword; 7845 continue; 7846 } 7847 } 7848 } 7849 } 7850 7851 void clang_annotateTokens(CXTranslationUnit TU, CXToken *Tokens, 7852 unsigned NumTokens, CXCursor *Cursors) { 7853 if (isNotUsableTU(TU)) { 7854 LOG_BAD_TU(TU); 7855 return; 7856 } 7857 if (NumTokens == 0 || !Tokens || !Cursors) { 7858 LOG_FUNC_SECTION { *Log << "<null input>"; } 7859 return; 7860 } 7861 7862 LOG_FUNC_SECTION { 7863 *Log << TU << ' '; 7864 CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]); 7865 CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens - 1]); 7866 *Log << clang_getRange(bloc, eloc); 7867 } 7868 7869 // Any token we don't specifically annotate will have a NULL cursor. 7870 CXCursor C = clang_getNullCursor(); 7871 for (unsigned I = 0; I != NumTokens; ++I) 7872 Cursors[I] = C; 7873 7874 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 7875 if (!CXXUnit) 7876 return; 7877 7878 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 7879 7880 auto AnnotateTokensImpl = [=]() { 7881 clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors); 7882 }; 7883 llvm::CrashRecoveryContext CRC; 7884 if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) { 7885 fprintf(stderr, "libclang: crash detected while annotating tokens\n"); 7886 } 7887 } 7888 7889 //===----------------------------------------------------------------------===// 7890 // Operations for querying linkage of a cursor. 7891 //===----------------------------------------------------------------------===// 7892 7893 CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { 7894 if (!clang_isDeclaration(cursor.kind)) 7895 return CXLinkage_Invalid; 7896 7897 const Decl *D = cxcursor::getCursorDecl(cursor); 7898 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D)) 7899 switch (ND->getLinkageInternal()) { 7900 case NoLinkage: 7901 case VisibleNoLinkage: 7902 return CXLinkage_NoLinkage; 7903 case ModuleInternalLinkage: 7904 case InternalLinkage: 7905 return CXLinkage_Internal; 7906 case UniqueExternalLinkage: 7907 return CXLinkage_UniqueExternal; 7908 case ModuleLinkage: 7909 case ExternalLinkage: 7910 return CXLinkage_External; 7911 }; 7912 7913 return CXLinkage_Invalid; 7914 } 7915 7916 //===----------------------------------------------------------------------===// 7917 // Operations for querying visibility of a cursor. 7918 //===----------------------------------------------------------------------===// 7919 7920 CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) { 7921 if (!clang_isDeclaration(cursor.kind)) 7922 return CXVisibility_Invalid; 7923 7924 const Decl *D = cxcursor::getCursorDecl(cursor); 7925 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D)) 7926 switch (ND->getVisibility()) { 7927 case HiddenVisibility: 7928 return CXVisibility_Hidden; 7929 case ProtectedVisibility: 7930 return CXVisibility_Protected; 7931 case DefaultVisibility: 7932 return CXVisibility_Default; 7933 }; 7934 7935 return CXVisibility_Invalid; 7936 } 7937 7938 //===----------------------------------------------------------------------===// 7939 // Operations for querying language of a cursor. 7940 //===----------------------------------------------------------------------===// 7941 7942 static CXLanguageKind getDeclLanguage(const Decl *D) { 7943 if (!D) 7944 return CXLanguage_C; 7945 7946 switch (D->getKind()) { 7947 default: 7948 break; 7949 case Decl::ImplicitParam: 7950 case Decl::ObjCAtDefsField: 7951 case Decl::ObjCCategory: 7952 case Decl::ObjCCategoryImpl: 7953 case Decl::ObjCCompatibleAlias: 7954 case Decl::ObjCImplementation: 7955 case Decl::ObjCInterface: 7956 case Decl::ObjCIvar: 7957 case Decl::ObjCMethod: 7958 case Decl::ObjCProperty: 7959 case Decl::ObjCPropertyImpl: 7960 case Decl::ObjCProtocol: 7961 case Decl::ObjCTypeParam: 7962 return CXLanguage_ObjC; 7963 case Decl::CXXConstructor: 7964 case Decl::CXXConversion: 7965 case Decl::CXXDestructor: 7966 case Decl::CXXMethod: 7967 case Decl::CXXRecord: 7968 case Decl::ClassTemplate: 7969 case Decl::ClassTemplatePartialSpecialization: 7970 case Decl::ClassTemplateSpecialization: 7971 case Decl::Friend: 7972 case Decl::FriendTemplate: 7973 case Decl::FunctionTemplate: 7974 case Decl::LinkageSpec: 7975 case Decl::Namespace: 7976 case Decl::NamespaceAlias: 7977 case Decl::NonTypeTemplateParm: 7978 case Decl::StaticAssert: 7979 case Decl::TemplateTemplateParm: 7980 case Decl::TemplateTypeParm: 7981 case Decl::UnresolvedUsingTypename: 7982 case Decl::UnresolvedUsingValue: 7983 case Decl::Using: 7984 case Decl::UsingDirective: 7985 case Decl::UsingShadow: 7986 return CXLanguage_CPlusPlus; 7987 } 7988 7989 return CXLanguage_C; 7990 } 7991 7992 static CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) { 7993 if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted()) 7994 return CXAvailability_NotAvailable; 7995 7996 switch (D->getAvailability()) { 7997 case AR_Available: 7998 case AR_NotYetIntroduced: 7999 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D)) 8000 return getCursorAvailabilityForDecl( 8001 cast<Decl>(EnumConst->getDeclContext())); 8002 return CXAvailability_Available; 8003 8004 case AR_Deprecated: 8005 return CXAvailability_Deprecated; 8006 8007 case AR_Unavailable: 8008 return CXAvailability_NotAvailable; 8009 } 8010 8011 llvm_unreachable("Unknown availability kind!"); 8012 } 8013 8014 enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) { 8015 if (clang_isDeclaration(cursor.kind)) 8016 if (const Decl *D = cxcursor::getCursorDecl(cursor)) 8017 return getCursorAvailabilityForDecl(D); 8018 8019 return CXAvailability_Available; 8020 } 8021 8022 static CXVersion convertVersion(VersionTuple In) { 8023 CXVersion Out = {-1, -1, -1}; 8024 if (In.empty()) 8025 return Out; 8026 8027 Out.Major = In.getMajor(); 8028 8029 Optional<unsigned> Minor = In.getMinor(); 8030 if (Minor.hasValue()) 8031 Out.Minor = *Minor; 8032 else 8033 return Out; 8034 8035 Optional<unsigned> Subminor = In.getSubminor(); 8036 if (Subminor.hasValue()) 8037 Out.Subminor = *Subminor; 8038 8039 return Out; 8040 } 8041 8042 static void getCursorPlatformAvailabilityForDecl( 8043 const Decl *D, int *always_deprecated, CXString *deprecated_message, 8044 int *always_unavailable, CXString *unavailable_message, 8045 SmallVectorImpl<AvailabilityAttr *> &AvailabilityAttrs) { 8046 bool HadAvailAttr = false; 8047 for (auto A : D->attrs()) { 8048 if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) { 8049 HadAvailAttr = true; 8050 if (always_deprecated) 8051 *always_deprecated = 1; 8052 if (deprecated_message) { 8053 clang_disposeString(*deprecated_message); 8054 *deprecated_message = cxstring::createDup(Deprecated->getMessage()); 8055 } 8056 continue; 8057 } 8058 8059 if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) { 8060 HadAvailAttr = true; 8061 if (always_unavailable) 8062 *always_unavailable = 1; 8063 if (unavailable_message) { 8064 clang_disposeString(*unavailable_message); 8065 *unavailable_message = cxstring::createDup(Unavailable->getMessage()); 8066 } 8067 continue; 8068 } 8069 8070 if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) { 8071 AvailabilityAttrs.push_back(Avail); 8072 HadAvailAttr = true; 8073 } 8074 } 8075 8076 if (!HadAvailAttr) 8077 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D)) 8078 return getCursorPlatformAvailabilityForDecl( 8079 cast<Decl>(EnumConst->getDeclContext()), always_deprecated, 8080 deprecated_message, always_unavailable, unavailable_message, 8081 AvailabilityAttrs); 8082 8083 if (AvailabilityAttrs.empty()) 8084 return; 8085 8086 llvm::sort( 8087 AvailabilityAttrs, [](AvailabilityAttr *LHS, AvailabilityAttr *RHS) { 8088 return LHS->getPlatform()->getName() < RHS->getPlatform()->getName(); 8089 }); 8090 ASTContext &Ctx = D->getASTContext(); 8091 auto It = std::unique( 8092 AvailabilityAttrs.begin(), AvailabilityAttrs.end(), 8093 [&Ctx](AvailabilityAttr *LHS, AvailabilityAttr *RHS) { 8094 if (LHS->getPlatform() != RHS->getPlatform()) 8095 return false; 8096 8097 if (LHS->getIntroduced() == RHS->getIntroduced() && 8098 LHS->getDeprecated() == RHS->getDeprecated() && 8099 LHS->getObsoleted() == RHS->getObsoleted() && 8100 LHS->getMessage() == RHS->getMessage() && 8101 LHS->getReplacement() == RHS->getReplacement()) 8102 return true; 8103 8104 if ((!LHS->getIntroduced().empty() && !RHS->getIntroduced().empty()) || 8105 (!LHS->getDeprecated().empty() && !RHS->getDeprecated().empty()) || 8106 (!LHS->getObsoleted().empty() && !RHS->getObsoleted().empty())) 8107 return false; 8108 8109 if (LHS->getIntroduced().empty() && !RHS->getIntroduced().empty()) 8110 LHS->setIntroduced(Ctx, RHS->getIntroduced()); 8111 8112 if (LHS->getDeprecated().empty() && !RHS->getDeprecated().empty()) { 8113 LHS->setDeprecated(Ctx, RHS->getDeprecated()); 8114 if (LHS->getMessage().empty()) 8115 LHS->setMessage(Ctx, RHS->getMessage()); 8116 if (LHS->getReplacement().empty()) 8117 LHS->setReplacement(Ctx, RHS->getReplacement()); 8118 } 8119 8120 if (LHS->getObsoleted().empty() && !RHS->getObsoleted().empty()) { 8121 LHS->setObsoleted(Ctx, RHS->getObsoleted()); 8122 if (LHS->getMessage().empty()) 8123 LHS->setMessage(Ctx, RHS->getMessage()); 8124 if (LHS->getReplacement().empty()) 8125 LHS->setReplacement(Ctx, RHS->getReplacement()); 8126 } 8127 8128 return true; 8129 }); 8130 AvailabilityAttrs.erase(It, AvailabilityAttrs.end()); 8131 } 8132 8133 int clang_getCursorPlatformAvailability(CXCursor cursor, int *always_deprecated, 8134 CXString *deprecated_message, 8135 int *always_unavailable, 8136 CXString *unavailable_message, 8137 CXPlatformAvailability *availability, 8138 int availability_size) { 8139 if (always_deprecated) 8140 *always_deprecated = 0; 8141 if (deprecated_message) 8142 *deprecated_message = cxstring::createEmpty(); 8143 if (always_unavailable) 8144 *always_unavailable = 0; 8145 if (unavailable_message) 8146 *unavailable_message = cxstring::createEmpty(); 8147 8148 if (!clang_isDeclaration(cursor.kind)) 8149 return 0; 8150 8151 const Decl *D = cxcursor::getCursorDecl(cursor); 8152 if (!D) 8153 return 0; 8154 8155 SmallVector<AvailabilityAttr *, 8> AvailabilityAttrs; 8156 getCursorPlatformAvailabilityForDecl(D, always_deprecated, deprecated_message, 8157 always_unavailable, unavailable_message, 8158 AvailabilityAttrs); 8159 for (const auto &Avail : 8160 llvm::enumerate(llvm::makeArrayRef(AvailabilityAttrs) 8161 .take_front(availability_size))) { 8162 availability[Avail.index()].Platform = 8163 cxstring::createDup(Avail.value()->getPlatform()->getName()); 8164 availability[Avail.index()].Introduced = 8165 convertVersion(Avail.value()->getIntroduced()); 8166 availability[Avail.index()].Deprecated = 8167 convertVersion(Avail.value()->getDeprecated()); 8168 availability[Avail.index()].Obsoleted = 8169 convertVersion(Avail.value()->getObsoleted()); 8170 availability[Avail.index()].Unavailable = Avail.value()->getUnavailable(); 8171 availability[Avail.index()].Message = 8172 cxstring::createDup(Avail.value()->getMessage()); 8173 } 8174 8175 return AvailabilityAttrs.size(); 8176 } 8177 8178 void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) { 8179 clang_disposeString(availability->Platform); 8180 clang_disposeString(availability->Message); 8181 } 8182 8183 CXLanguageKind clang_getCursorLanguage(CXCursor cursor) { 8184 if (clang_isDeclaration(cursor.kind)) 8185 return getDeclLanguage(cxcursor::getCursorDecl(cursor)); 8186 8187 return CXLanguage_Invalid; 8188 } 8189 8190 CXTLSKind clang_getCursorTLSKind(CXCursor cursor) { 8191 const Decl *D = cxcursor::getCursorDecl(cursor); 8192 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 8193 switch (VD->getTLSKind()) { 8194 case VarDecl::TLS_None: 8195 return CXTLS_None; 8196 case VarDecl::TLS_Dynamic: 8197 return CXTLS_Dynamic; 8198 case VarDecl::TLS_Static: 8199 return CXTLS_Static; 8200 } 8201 } 8202 8203 return CXTLS_None; 8204 } 8205 8206 /// If the given cursor is the "templated" declaration 8207 /// describing a class or function template, return the class or 8208 /// function template. 8209 static const Decl *maybeGetTemplateCursor(const Decl *D) { 8210 if (!D) 8211 return nullptr; 8212 8213 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 8214 if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate()) 8215 return FunTmpl; 8216 8217 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) 8218 if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate()) 8219 return ClassTmpl; 8220 8221 return D; 8222 } 8223 8224 enum CX_StorageClass clang_Cursor_getStorageClass(CXCursor C) { 8225 StorageClass sc = SC_None; 8226 const Decl *D = getCursorDecl(C); 8227 if (D) { 8228 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 8229 sc = FD->getStorageClass(); 8230 } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 8231 sc = VD->getStorageClass(); 8232 } else { 8233 return CX_SC_Invalid; 8234 } 8235 } else { 8236 return CX_SC_Invalid; 8237 } 8238 switch (sc) { 8239 case SC_None: 8240 return CX_SC_None; 8241 case SC_Extern: 8242 return CX_SC_Extern; 8243 case SC_Static: 8244 return CX_SC_Static; 8245 case SC_PrivateExtern: 8246 return CX_SC_PrivateExtern; 8247 case SC_Auto: 8248 return CX_SC_Auto; 8249 case SC_Register: 8250 return CX_SC_Register; 8251 } 8252 llvm_unreachable("Unhandled storage class!"); 8253 } 8254 8255 CXCursor clang_getCursorSemanticParent(CXCursor cursor) { 8256 if (clang_isDeclaration(cursor.kind)) { 8257 if (const Decl *D = getCursorDecl(cursor)) { 8258 const DeclContext *DC = D->getDeclContext(); 8259 if (!DC) 8260 return clang_getNullCursor(); 8261 8262 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)), 8263 getCursorTU(cursor)); 8264 } 8265 } 8266 8267 if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) { 8268 if (const Decl *D = getCursorDecl(cursor)) 8269 return MakeCXCursor(D, getCursorTU(cursor)); 8270 } 8271 8272 return clang_getNullCursor(); 8273 } 8274 8275 CXCursor clang_getCursorLexicalParent(CXCursor cursor) { 8276 if (clang_isDeclaration(cursor.kind)) { 8277 if (const Decl *D = getCursorDecl(cursor)) { 8278 const DeclContext *DC = D->getLexicalDeclContext(); 8279 if (!DC) 8280 return clang_getNullCursor(); 8281 8282 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)), 8283 getCursorTU(cursor)); 8284 } 8285 } 8286 8287 // FIXME: Note that we can't easily compute the lexical context of a 8288 // statement or expression, so we return nothing. 8289 return clang_getNullCursor(); 8290 } 8291 8292 CXFile clang_getIncludedFile(CXCursor cursor) { 8293 if (cursor.kind != CXCursor_InclusionDirective) 8294 return nullptr; 8295 8296 const InclusionDirective *ID = getCursorInclusionDirective(cursor); 8297 return const_cast<FileEntry *>(ID->getFile()); 8298 } 8299 8300 unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) { 8301 if (C.kind != CXCursor_ObjCPropertyDecl) 8302 return CXObjCPropertyAttr_noattr; 8303 8304 unsigned Result = CXObjCPropertyAttr_noattr; 8305 const auto *PD = cast<ObjCPropertyDecl>(getCursorDecl(C)); 8306 ObjCPropertyAttribute::Kind Attr = PD->getPropertyAttributesAsWritten(); 8307 8308 #define SET_CXOBJCPROP_ATTR(A) \ 8309 if (Attr & ObjCPropertyAttribute::kind_##A) \ 8310 Result |= CXObjCPropertyAttr_##A 8311 SET_CXOBJCPROP_ATTR(readonly); 8312 SET_CXOBJCPROP_ATTR(getter); 8313 SET_CXOBJCPROP_ATTR(assign); 8314 SET_CXOBJCPROP_ATTR(readwrite); 8315 SET_CXOBJCPROP_ATTR(retain); 8316 SET_CXOBJCPROP_ATTR(copy); 8317 SET_CXOBJCPROP_ATTR(nonatomic); 8318 SET_CXOBJCPROP_ATTR(setter); 8319 SET_CXOBJCPROP_ATTR(atomic); 8320 SET_CXOBJCPROP_ATTR(weak); 8321 SET_CXOBJCPROP_ATTR(strong); 8322 SET_CXOBJCPROP_ATTR(unsafe_unretained); 8323 SET_CXOBJCPROP_ATTR(class); 8324 #undef SET_CXOBJCPROP_ATTR 8325 8326 return Result; 8327 } 8328 8329 CXString clang_Cursor_getObjCPropertyGetterName(CXCursor C) { 8330 if (C.kind != CXCursor_ObjCPropertyDecl) 8331 return cxstring::createNull(); 8332 8333 const auto *PD = cast<ObjCPropertyDecl>(getCursorDecl(C)); 8334 Selector sel = PD->getGetterName(); 8335 if (sel.isNull()) 8336 return cxstring::createNull(); 8337 8338 return cxstring::createDup(sel.getAsString()); 8339 } 8340 8341 CXString clang_Cursor_getObjCPropertySetterName(CXCursor C) { 8342 if (C.kind != CXCursor_ObjCPropertyDecl) 8343 return cxstring::createNull(); 8344 8345 const auto *PD = cast<ObjCPropertyDecl>(getCursorDecl(C)); 8346 Selector sel = PD->getSetterName(); 8347 if (sel.isNull()) 8348 return cxstring::createNull(); 8349 8350 return cxstring::createDup(sel.getAsString()); 8351 } 8352 8353 unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) { 8354 if (!clang_isDeclaration(C.kind)) 8355 return CXObjCDeclQualifier_None; 8356 8357 Decl::ObjCDeclQualifier QT = Decl::OBJC_TQ_None; 8358 const Decl *D = getCursorDecl(C); 8359 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 8360 QT = MD->getObjCDeclQualifier(); 8361 else if (const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D)) 8362 QT = PD->getObjCDeclQualifier(); 8363 if (QT == Decl::OBJC_TQ_None) 8364 return CXObjCDeclQualifier_None; 8365 8366 unsigned Result = CXObjCDeclQualifier_None; 8367 if (QT & Decl::OBJC_TQ_In) 8368 Result |= CXObjCDeclQualifier_In; 8369 if (QT & Decl::OBJC_TQ_Inout) 8370 Result |= CXObjCDeclQualifier_Inout; 8371 if (QT & Decl::OBJC_TQ_Out) 8372 Result |= CXObjCDeclQualifier_Out; 8373 if (QT & Decl::OBJC_TQ_Bycopy) 8374 Result |= CXObjCDeclQualifier_Bycopy; 8375 if (QT & Decl::OBJC_TQ_Byref) 8376 Result |= CXObjCDeclQualifier_Byref; 8377 if (QT & Decl::OBJC_TQ_Oneway) 8378 Result |= CXObjCDeclQualifier_Oneway; 8379 8380 return Result; 8381 } 8382 8383 unsigned clang_Cursor_isObjCOptional(CXCursor C) { 8384 if (!clang_isDeclaration(C.kind)) 8385 return 0; 8386 8387 const Decl *D = getCursorDecl(C); 8388 if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D)) 8389 return PD->getPropertyImplementation() == ObjCPropertyDecl::Optional; 8390 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 8391 return MD->getImplementationControl() == ObjCMethodDecl::Optional; 8392 8393 return 0; 8394 } 8395 8396 unsigned clang_Cursor_isVariadic(CXCursor C) { 8397 if (!clang_isDeclaration(C.kind)) 8398 return 0; 8399 8400 const Decl *D = getCursorDecl(C); 8401 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 8402 return FD->isVariadic(); 8403 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 8404 return MD->isVariadic(); 8405 8406 return 0; 8407 } 8408 8409 unsigned clang_Cursor_isExternalSymbol(CXCursor C, CXString *language, 8410 CXString *definedIn, 8411 unsigned *isGenerated) { 8412 if (!clang_isDeclaration(C.kind)) 8413 return 0; 8414 8415 const Decl *D = getCursorDecl(C); 8416 8417 if (auto *attr = D->getExternalSourceSymbolAttr()) { 8418 if (language) 8419 *language = cxstring::createDup(attr->getLanguage()); 8420 if (definedIn) 8421 *definedIn = cxstring::createDup(attr->getDefinedIn()); 8422 if (isGenerated) 8423 *isGenerated = attr->getGeneratedDeclaration(); 8424 return 1; 8425 } 8426 return 0; 8427 } 8428 8429 CXSourceRange clang_Cursor_getCommentRange(CXCursor C) { 8430 if (!clang_isDeclaration(C.kind)) 8431 return clang_getNullRange(); 8432 8433 const Decl *D = getCursorDecl(C); 8434 ASTContext &Context = getCursorContext(C); 8435 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 8436 if (!RC) 8437 return clang_getNullRange(); 8438 8439 return cxloc::translateSourceRange(Context, RC->getSourceRange()); 8440 } 8441 8442 CXString clang_Cursor_getRawCommentText(CXCursor C) { 8443 if (!clang_isDeclaration(C.kind)) 8444 return cxstring::createNull(); 8445 8446 const Decl *D = getCursorDecl(C); 8447 ASTContext &Context = getCursorContext(C); 8448 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 8449 StringRef RawText = 8450 RC ? RC->getRawText(Context.getSourceManager()) : StringRef(); 8451 8452 // Don't duplicate the string because RawText points directly into source 8453 // code. 8454 return cxstring::createRef(RawText); 8455 } 8456 8457 CXString clang_Cursor_getBriefCommentText(CXCursor C) { 8458 if (!clang_isDeclaration(C.kind)) 8459 return cxstring::createNull(); 8460 8461 const Decl *D = getCursorDecl(C); 8462 const ASTContext &Context = getCursorContext(C); 8463 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 8464 8465 if (RC) { 8466 StringRef BriefText = RC->getBriefText(Context); 8467 8468 // Don't duplicate the string because RawComment ensures that this memory 8469 // will not go away. 8470 return cxstring::createRef(BriefText); 8471 } 8472 8473 return cxstring::createNull(); 8474 } 8475 8476 CXModule clang_Cursor_getModule(CXCursor C) { 8477 if (C.kind == CXCursor_ModuleImportDecl) { 8478 if (const ImportDecl *ImportD = 8479 dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) 8480 return ImportD->getImportedModule(); 8481 } 8482 8483 return nullptr; 8484 } 8485 8486 CXModule clang_getModuleForFile(CXTranslationUnit TU, CXFile File) { 8487 if (isNotUsableTU(TU)) { 8488 LOG_BAD_TU(TU); 8489 return nullptr; 8490 } 8491 if (!File) 8492 return nullptr; 8493 FileEntry *FE = static_cast<FileEntry *>(File); 8494 8495 ASTUnit &Unit = *cxtu::getASTUnit(TU); 8496 HeaderSearch &HS = Unit.getPreprocessor().getHeaderSearchInfo(); 8497 ModuleMap::KnownHeader Header = HS.findModuleForHeader(FE); 8498 8499 return Header.getModule(); 8500 } 8501 8502 CXFile clang_Module_getASTFile(CXModule CXMod) { 8503 if (!CXMod) 8504 return nullptr; 8505 Module *Mod = static_cast<Module *>(CXMod); 8506 if (auto File = Mod->getASTFile()) 8507 return const_cast<FileEntry *>(&File->getFileEntry()); 8508 return nullptr; 8509 } 8510 8511 CXModule clang_Module_getParent(CXModule CXMod) { 8512 if (!CXMod) 8513 return nullptr; 8514 Module *Mod = static_cast<Module *>(CXMod); 8515 return Mod->Parent; 8516 } 8517 8518 CXString clang_Module_getName(CXModule CXMod) { 8519 if (!CXMod) 8520 return cxstring::createEmpty(); 8521 Module *Mod = static_cast<Module *>(CXMod); 8522 return cxstring::createDup(Mod->Name); 8523 } 8524 8525 CXString clang_Module_getFullName(CXModule CXMod) { 8526 if (!CXMod) 8527 return cxstring::createEmpty(); 8528 Module *Mod = static_cast<Module *>(CXMod); 8529 return cxstring::createDup(Mod->getFullModuleName()); 8530 } 8531 8532 int clang_Module_isSystem(CXModule CXMod) { 8533 if (!CXMod) 8534 return 0; 8535 Module *Mod = static_cast<Module *>(CXMod); 8536 return Mod->IsSystem; 8537 } 8538 8539 unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU, 8540 CXModule CXMod) { 8541 if (isNotUsableTU(TU)) { 8542 LOG_BAD_TU(TU); 8543 return 0; 8544 } 8545 if (!CXMod) 8546 return 0; 8547 Module *Mod = static_cast<Module *>(CXMod); 8548 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager(); 8549 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr); 8550 return TopHeaders.size(); 8551 } 8552 8553 CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU, CXModule CXMod, 8554 unsigned Index) { 8555 if (isNotUsableTU(TU)) { 8556 LOG_BAD_TU(TU); 8557 return nullptr; 8558 } 8559 if (!CXMod) 8560 return nullptr; 8561 Module *Mod = static_cast<Module *>(CXMod); 8562 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager(); 8563 8564 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr); 8565 if (Index < TopHeaders.size()) 8566 return const_cast<FileEntry *>(TopHeaders[Index]); 8567 8568 return nullptr; 8569 } 8570 8571 //===----------------------------------------------------------------------===// 8572 // C++ AST instrospection. 8573 //===----------------------------------------------------------------------===// 8574 8575 unsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C) { 8576 if (!clang_isDeclaration(C.kind)) 8577 return 0; 8578 8579 const Decl *D = cxcursor::getCursorDecl(C); 8580 const CXXConstructorDecl *Constructor = 8581 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr; 8582 return (Constructor && Constructor->isDefaultConstructor()) ? 1 : 0; 8583 } 8584 8585 unsigned clang_CXXConstructor_isCopyConstructor(CXCursor C) { 8586 if (!clang_isDeclaration(C.kind)) 8587 return 0; 8588 8589 const Decl *D = cxcursor::getCursorDecl(C); 8590 const CXXConstructorDecl *Constructor = 8591 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr; 8592 return (Constructor && Constructor->isCopyConstructor()) ? 1 : 0; 8593 } 8594 8595 unsigned clang_CXXConstructor_isMoveConstructor(CXCursor C) { 8596 if (!clang_isDeclaration(C.kind)) 8597 return 0; 8598 8599 const Decl *D = cxcursor::getCursorDecl(C); 8600 const CXXConstructorDecl *Constructor = 8601 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr; 8602 return (Constructor && Constructor->isMoveConstructor()) ? 1 : 0; 8603 } 8604 8605 unsigned clang_CXXConstructor_isConvertingConstructor(CXCursor C) { 8606 if (!clang_isDeclaration(C.kind)) 8607 return 0; 8608 8609 const Decl *D = cxcursor::getCursorDecl(C); 8610 const CXXConstructorDecl *Constructor = 8611 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr; 8612 // Passing 'false' excludes constructors marked 'explicit'. 8613 return (Constructor && Constructor->isConvertingConstructor(false)) ? 1 : 0; 8614 } 8615 8616 unsigned clang_CXXField_isMutable(CXCursor C) { 8617 if (!clang_isDeclaration(C.kind)) 8618 return 0; 8619 8620 if (const auto D = cxcursor::getCursorDecl(C)) 8621 if (const auto FD = dyn_cast_or_null<FieldDecl>(D)) 8622 return FD->isMutable() ? 1 : 0; 8623 return 0; 8624 } 8625 8626 unsigned clang_CXXMethod_isPureVirtual(CXCursor C) { 8627 if (!clang_isDeclaration(C.kind)) 8628 return 0; 8629 8630 const Decl *D = cxcursor::getCursorDecl(C); 8631 const CXXMethodDecl *Method = 8632 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8633 return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0; 8634 } 8635 8636 unsigned clang_CXXMethod_isConst(CXCursor C) { 8637 if (!clang_isDeclaration(C.kind)) 8638 return 0; 8639 8640 const Decl *D = cxcursor::getCursorDecl(C); 8641 const CXXMethodDecl *Method = 8642 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8643 return (Method && Method->getMethodQualifiers().hasConst()) ? 1 : 0; 8644 } 8645 8646 unsigned clang_CXXMethod_isDefaulted(CXCursor C) { 8647 if (!clang_isDeclaration(C.kind)) 8648 return 0; 8649 8650 const Decl *D = cxcursor::getCursorDecl(C); 8651 const CXXMethodDecl *Method = 8652 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8653 return (Method && Method->isDefaulted()) ? 1 : 0; 8654 } 8655 8656 unsigned clang_CXXMethod_isStatic(CXCursor C) { 8657 if (!clang_isDeclaration(C.kind)) 8658 return 0; 8659 8660 const Decl *D = cxcursor::getCursorDecl(C); 8661 const CXXMethodDecl *Method = 8662 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8663 return (Method && Method->isStatic()) ? 1 : 0; 8664 } 8665 8666 unsigned clang_CXXMethod_isVirtual(CXCursor C) { 8667 if (!clang_isDeclaration(C.kind)) 8668 return 0; 8669 8670 const Decl *D = cxcursor::getCursorDecl(C); 8671 const CXXMethodDecl *Method = 8672 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8673 return (Method && Method->isVirtual()) ? 1 : 0; 8674 } 8675 8676 unsigned clang_CXXRecord_isAbstract(CXCursor C) { 8677 if (!clang_isDeclaration(C.kind)) 8678 return 0; 8679 8680 const auto *D = cxcursor::getCursorDecl(C); 8681 const auto *RD = dyn_cast_or_null<CXXRecordDecl>(D); 8682 if (RD) 8683 RD = RD->getDefinition(); 8684 return (RD && RD->isAbstract()) ? 1 : 0; 8685 } 8686 8687 unsigned clang_EnumDecl_isScoped(CXCursor C) { 8688 if (!clang_isDeclaration(C.kind)) 8689 return 0; 8690 8691 const Decl *D = cxcursor::getCursorDecl(C); 8692 auto *Enum = dyn_cast_or_null<EnumDecl>(D); 8693 return (Enum && Enum->isScoped()) ? 1 : 0; 8694 } 8695 8696 //===----------------------------------------------------------------------===// 8697 // Attribute introspection. 8698 //===----------------------------------------------------------------------===// 8699 8700 CXType clang_getIBOutletCollectionType(CXCursor C) { 8701 if (C.kind != CXCursor_IBOutletCollectionAttr) 8702 return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C)); 8703 8704 const IBOutletCollectionAttr *A = 8705 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C)); 8706 8707 return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C)); 8708 } 8709 8710 //===----------------------------------------------------------------------===// 8711 // Inspecting memory usage. 8712 //===----------------------------------------------------------------------===// 8713 8714 typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries; 8715 8716 static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries, 8717 enum CXTUResourceUsageKind k, 8718 unsigned long amount) { 8719 CXTUResourceUsageEntry entry = {k, amount}; 8720 entries.push_back(entry); 8721 } 8722 8723 const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) { 8724 const char *str = ""; 8725 switch (kind) { 8726 case CXTUResourceUsage_AST: 8727 str = "ASTContext: expressions, declarations, and types"; 8728 break; 8729 case CXTUResourceUsage_Identifiers: 8730 str = "ASTContext: identifiers"; 8731 break; 8732 case CXTUResourceUsage_Selectors: 8733 str = "ASTContext: selectors"; 8734 break; 8735 case CXTUResourceUsage_GlobalCompletionResults: 8736 str = "Code completion: cached global results"; 8737 break; 8738 case CXTUResourceUsage_SourceManagerContentCache: 8739 str = "SourceManager: content cache allocator"; 8740 break; 8741 case CXTUResourceUsage_AST_SideTables: 8742 str = "ASTContext: side tables"; 8743 break; 8744 case CXTUResourceUsage_SourceManager_Membuffer_Malloc: 8745 str = "SourceManager: malloc'ed memory buffers"; 8746 break; 8747 case CXTUResourceUsage_SourceManager_Membuffer_MMap: 8748 str = "SourceManager: mmap'ed memory buffers"; 8749 break; 8750 case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc: 8751 str = "ExternalASTSource: malloc'ed memory buffers"; 8752 break; 8753 case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap: 8754 str = "ExternalASTSource: mmap'ed memory buffers"; 8755 break; 8756 case CXTUResourceUsage_Preprocessor: 8757 str = "Preprocessor: malloc'ed memory"; 8758 break; 8759 case CXTUResourceUsage_PreprocessingRecord: 8760 str = "Preprocessor: PreprocessingRecord"; 8761 break; 8762 case CXTUResourceUsage_SourceManager_DataStructures: 8763 str = "SourceManager: data structures and tables"; 8764 break; 8765 case CXTUResourceUsage_Preprocessor_HeaderSearch: 8766 str = "Preprocessor: header search tables"; 8767 break; 8768 } 8769 return str; 8770 } 8771 8772 CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) { 8773 if (isNotUsableTU(TU)) { 8774 LOG_BAD_TU(TU); 8775 CXTUResourceUsage usage = {(void *)nullptr, 0, nullptr}; 8776 return usage; 8777 } 8778 8779 ASTUnit *astUnit = cxtu::getASTUnit(TU); 8780 std::unique_ptr<MemUsageEntries> entries(new MemUsageEntries()); 8781 ASTContext &astContext = astUnit->getASTContext(); 8782 8783 // How much memory is used by AST nodes and types? 8784 createCXTUResourceUsageEntry( 8785 *entries, CXTUResourceUsage_AST, 8786 (unsigned long)astContext.getASTAllocatedMemory()); 8787 8788 // How much memory is used by identifiers? 8789 createCXTUResourceUsageEntry( 8790 *entries, CXTUResourceUsage_Identifiers, 8791 (unsigned long)astContext.Idents.getAllocator().getTotalMemory()); 8792 8793 // How much memory is used for selectors? 8794 createCXTUResourceUsageEntry( 8795 *entries, CXTUResourceUsage_Selectors, 8796 (unsigned long)astContext.Selectors.getTotalMemory()); 8797 8798 // How much memory is used by ASTContext's side tables? 8799 createCXTUResourceUsageEntry( 8800 *entries, CXTUResourceUsage_AST_SideTables, 8801 (unsigned long)astContext.getSideTableAllocatedMemory()); 8802 8803 // How much memory is used for caching global code completion results? 8804 unsigned long completionBytes = 0; 8805 if (GlobalCodeCompletionAllocator *completionAllocator = 8806 astUnit->getCachedCompletionAllocator().get()) { 8807 completionBytes = completionAllocator->getTotalMemory(); 8808 } 8809 createCXTUResourceUsageEntry( 8810 *entries, CXTUResourceUsage_GlobalCompletionResults, completionBytes); 8811 8812 // How much memory is being used by SourceManager's content cache? 8813 createCXTUResourceUsageEntry( 8814 *entries, CXTUResourceUsage_SourceManagerContentCache, 8815 (unsigned long)astContext.getSourceManager().getContentCacheSize()); 8816 8817 // How much memory is being used by the MemoryBuffer's in SourceManager? 8818 const SourceManager::MemoryBufferSizes &srcBufs = 8819 astUnit->getSourceManager().getMemoryBufferSizes(); 8820 8821 createCXTUResourceUsageEntry(*entries, 8822 CXTUResourceUsage_SourceManager_Membuffer_Malloc, 8823 (unsigned long)srcBufs.malloc_bytes); 8824 createCXTUResourceUsageEntry(*entries, 8825 CXTUResourceUsage_SourceManager_Membuffer_MMap, 8826 (unsigned long)srcBufs.mmap_bytes); 8827 createCXTUResourceUsageEntry( 8828 *entries, CXTUResourceUsage_SourceManager_DataStructures, 8829 (unsigned long)astContext.getSourceManager().getDataStructureSizes()); 8830 8831 // How much memory is being used by the ExternalASTSource? 8832 if (ExternalASTSource *esrc = astContext.getExternalSource()) { 8833 const ExternalASTSource::MemoryBufferSizes &sizes = 8834 esrc->getMemoryBufferSizes(); 8835 8836 createCXTUResourceUsageEntry( 8837 *entries, CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc, 8838 (unsigned long)sizes.malloc_bytes); 8839 createCXTUResourceUsageEntry( 8840 *entries, CXTUResourceUsage_ExternalASTSource_Membuffer_MMap, 8841 (unsigned long)sizes.mmap_bytes); 8842 } 8843 8844 // How much memory is being used by the Preprocessor? 8845 Preprocessor &pp = astUnit->getPreprocessor(); 8846 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Preprocessor, 8847 pp.getTotalMemory()); 8848 8849 if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) { 8850 createCXTUResourceUsageEntry(*entries, 8851 CXTUResourceUsage_PreprocessingRecord, 8852 pRec->getTotalMemory()); 8853 } 8854 8855 createCXTUResourceUsageEntry(*entries, 8856 CXTUResourceUsage_Preprocessor_HeaderSearch, 8857 pp.getHeaderSearchInfo().getTotalMemory()); 8858 8859 CXTUResourceUsage usage = {(void *)entries.get(), (unsigned)entries->size(), 8860 !entries->empty() ? &(*entries)[0] : nullptr}; 8861 (void)entries.release(); 8862 return usage; 8863 } 8864 8865 void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) { 8866 if (usage.data) 8867 delete (MemUsageEntries *)usage.data; 8868 } 8869 8870 CXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) { 8871 CXSourceRangeList *skipped = new CXSourceRangeList; 8872 skipped->count = 0; 8873 skipped->ranges = nullptr; 8874 8875 if (isNotUsableTU(TU)) { 8876 LOG_BAD_TU(TU); 8877 return skipped; 8878 } 8879 8880 if (!file) 8881 return skipped; 8882 8883 ASTUnit *astUnit = cxtu::getASTUnit(TU); 8884 PreprocessingRecord *ppRec = 8885 astUnit->getPreprocessor().getPreprocessingRecord(); 8886 if (!ppRec) 8887 return skipped; 8888 8889 ASTContext &Ctx = astUnit->getASTContext(); 8890 SourceManager &sm = Ctx.getSourceManager(); 8891 FileEntry *fileEntry = static_cast<FileEntry *>(file); 8892 FileID wantedFileID = sm.translateFile(fileEntry); 8893 bool isMainFile = wantedFileID == sm.getMainFileID(); 8894 8895 const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges(); 8896 std::vector<SourceRange> wantedRanges; 8897 for (std::vector<SourceRange>::const_iterator i = SkippedRanges.begin(), 8898 ei = SkippedRanges.end(); 8899 i != ei; ++i) { 8900 if (sm.getFileID(i->getBegin()) == wantedFileID || 8901 sm.getFileID(i->getEnd()) == wantedFileID) 8902 wantedRanges.push_back(*i); 8903 else if (isMainFile && (astUnit->isInPreambleFileID(i->getBegin()) || 8904 astUnit->isInPreambleFileID(i->getEnd()))) 8905 wantedRanges.push_back(*i); 8906 } 8907 8908 skipped->count = wantedRanges.size(); 8909 skipped->ranges = new CXSourceRange[skipped->count]; 8910 for (unsigned i = 0, ei = skipped->count; i != ei; ++i) 8911 skipped->ranges[i] = cxloc::translateSourceRange(Ctx, wantedRanges[i]); 8912 8913 return skipped; 8914 } 8915 8916 CXSourceRangeList *clang_getAllSkippedRanges(CXTranslationUnit TU) { 8917 CXSourceRangeList *skipped = new CXSourceRangeList; 8918 skipped->count = 0; 8919 skipped->ranges = nullptr; 8920 8921 if (isNotUsableTU(TU)) { 8922 LOG_BAD_TU(TU); 8923 return skipped; 8924 } 8925 8926 ASTUnit *astUnit = cxtu::getASTUnit(TU); 8927 PreprocessingRecord *ppRec = 8928 astUnit->getPreprocessor().getPreprocessingRecord(); 8929 if (!ppRec) 8930 return skipped; 8931 8932 ASTContext &Ctx = astUnit->getASTContext(); 8933 8934 const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges(); 8935 8936 skipped->count = SkippedRanges.size(); 8937 skipped->ranges = new CXSourceRange[skipped->count]; 8938 for (unsigned i = 0, ei = skipped->count; i != ei; ++i) 8939 skipped->ranges[i] = cxloc::translateSourceRange(Ctx, SkippedRanges[i]); 8940 8941 return skipped; 8942 } 8943 8944 void clang_disposeSourceRangeList(CXSourceRangeList *ranges) { 8945 if (ranges) { 8946 delete[] ranges->ranges; 8947 delete ranges; 8948 } 8949 } 8950 8951 void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) { 8952 CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU); 8953 for (unsigned I = 0; I != Usage.numEntries; ++I) 8954 fprintf(stderr, " %s: %lu\n", 8955 clang_getTUResourceUsageName(Usage.entries[I].kind), 8956 Usage.entries[I].amount); 8957 8958 clang_disposeCXTUResourceUsage(Usage); 8959 } 8960 8961 CXCursor clang_Cursor_getVarDeclInitializer(CXCursor cursor) { 8962 const Decl *const D = getCursorDecl(cursor); 8963 if (!D) 8964 return clang_getNullCursor(); 8965 const auto *const VD = dyn_cast<VarDecl>(D); 8966 if (!VD) 8967 return clang_getNullCursor(); 8968 const Expr *const Init = VD->getInit(); 8969 if (!Init) 8970 return clang_getNullCursor(); 8971 8972 return cxcursor::MakeCXCursor(Init, VD, cxcursor::getCursorTU(cursor)); 8973 } 8974 8975 int clang_Cursor_hasVarDeclGlobalStorage(CXCursor cursor) { 8976 const Decl *const D = getCursorDecl(cursor); 8977 if (!D) 8978 return -1; 8979 const auto *const VD = dyn_cast<VarDecl>(D); 8980 if (!VD) 8981 return -1; 8982 8983 return VD->hasGlobalStorage(); 8984 } 8985 8986 int clang_Cursor_hasVarDeclExternalStorage(CXCursor cursor) { 8987 const Decl *const D = getCursorDecl(cursor); 8988 if (!D) 8989 return -1; 8990 const auto *const VD = dyn_cast<VarDecl>(D); 8991 if (!VD) 8992 return -1; 8993 8994 return VD->hasExternalStorage(); 8995 } 8996 8997 //===----------------------------------------------------------------------===// 8998 // Misc. utility functions. 8999 //===----------------------------------------------------------------------===// 9000 9001 /// Default to using our desired 8 MB stack size on "safety" threads. 9002 static unsigned SafetyStackThreadSize = DesiredStackSize; 9003 9004 namespace clang { 9005 9006 bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn, 9007 unsigned Size) { 9008 if (!Size) 9009 Size = GetSafetyThreadStackSize(); 9010 if (Size && !getenv("LIBCLANG_NOTHREADS")) 9011 return CRC.RunSafelyOnThread(Fn, Size); 9012 return CRC.RunSafely(Fn); 9013 } 9014 9015 unsigned GetSafetyThreadStackSize() { return SafetyStackThreadSize; } 9016 9017 void SetSafetyThreadStackSize(unsigned Value) { SafetyStackThreadSize = Value; } 9018 9019 } // namespace clang 9020 9021 void clang::setThreadBackgroundPriority() { 9022 if (getenv("LIBCLANG_BGPRIO_DISABLE")) 9023 return; 9024 9025 #if LLVM_ENABLE_THREADS 9026 llvm::set_thread_priority(llvm::ThreadPriority::Background); 9027 #endif 9028 } 9029 9030 void cxindex::printDiagsToStderr(ASTUnit *Unit) { 9031 if (!Unit) 9032 return; 9033 9034 for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(), 9035 DEnd = Unit->stored_diag_end(); 9036 D != DEnd; ++D) { 9037 CXStoredDiagnostic Diag(*D, Unit->getLangOpts()); 9038 CXString Msg = 9039 clang_formatDiagnostic(&Diag, clang_defaultDiagnosticDisplayOptions()); 9040 fprintf(stderr, "%s\n", clang_getCString(Msg)); 9041 clang_disposeString(Msg); 9042 } 9043 #ifdef _WIN32 9044 // On Windows, force a flush, since there may be multiple copies of 9045 // stderr and stdout in the file system, all with different buffers 9046 // but writing to the same device. 9047 fflush(stderr); 9048 #endif 9049 } 9050 9051 MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II, 9052 SourceLocation MacroDefLoc, 9053 CXTranslationUnit TU) { 9054 if (MacroDefLoc.isInvalid() || !TU) 9055 return nullptr; 9056 if (!II.hadMacroDefinition()) 9057 return nullptr; 9058 9059 ASTUnit *Unit = cxtu::getASTUnit(TU); 9060 Preprocessor &PP = Unit->getPreprocessor(); 9061 MacroDirective *MD = PP.getLocalMacroDirectiveHistory(&II); 9062 if (MD) { 9063 for (MacroDirective::DefInfo Def = MD->getDefinition(); Def; 9064 Def = Def.getPreviousDefinition()) { 9065 if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc()) 9066 return Def.getMacroInfo(); 9067 } 9068 } 9069 9070 return nullptr; 9071 } 9072 9073 const MacroInfo *cxindex::getMacroInfo(const MacroDefinitionRecord *MacroDef, 9074 CXTranslationUnit TU) { 9075 if (!MacroDef || !TU) 9076 return nullptr; 9077 const IdentifierInfo *II = MacroDef->getName(); 9078 if (!II) 9079 return nullptr; 9080 9081 return getMacroInfo(*II, MacroDef->getLocation(), TU); 9082 } 9083 9084 MacroDefinitionRecord * 9085 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, const Token &Tok, 9086 CXTranslationUnit TU) { 9087 if (!MI || !TU) 9088 return nullptr; 9089 if (Tok.isNot(tok::raw_identifier)) 9090 return nullptr; 9091 9092 if (MI->getNumTokens() == 0) 9093 return nullptr; 9094 SourceRange DefRange(MI->getReplacementToken(0).getLocation(), 9095 MI->getDefinitionEndLoc()); 9096 ASTUnit *Unit = cxtu::getASTUnit(TU); 9097 9098 // Check that the token is inside the definition and not its argument list. 9099 SourceManager &SM = Unit->getSourceManager(); 9100 if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin())) 9101 return nullptr; 9102 if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation())) 9103 return nullptr; 9104 9105 Preprocessor &PP = Unit->getPreprocessor(); 9106 PreprocessingRecord *PPRec = PP.getPreprocessingRecord(); 9107 if (!PPRec) 9108 return nullptr; 9109 9110 IdentifierInfo &II = PP.getIdentifierTable().get(Tok.getRawIdentifier()); 9111 if (!II.hadMacroDefinition()) 9112 return nullptr; 9113 9114 // Check that the identifier is not one of the macro arguments. 9115 if (llvm::is_contained(MI->params(), &II)) 9116 return nullptr; 9117 9118 MacroDirective *InnerMD = PP.getLocalMacroDirectiveHistory(&II); 9119 if (!InnerMD) 9120 return nullptr; 9121 9122 return PPRec->findMacroDefinition(InnerMD->getMacroInfo()); 9123 } 9124 9125 MacroDefinitionRecord * 9126 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, SourceLocation Loc, 9127 CXTranslationUnit TU) { 9128 if (Loc.isInvalid() || !MI || !TU) 9129 return nullptr; 9130 9131 if (MI->getNumTokens() == 0) 9132 return nullptr; 9133 ASTUnit *Unit = cxtu::getASTUnit(TU); 9134 Preprocessor &PP = Unit->getPreprocessor(); 9135 if (!PP.getPreprocessingRecord()) 9136 return nullptr; 9137 Loc = Unit->getSourceManager().getSpellingLoc(Loc); 9138 Token Tok; 9139 if (PP.getRawToken(Loc, Tok)) 9140 return nullptr; 9141 9142 return checkForMacroInMacroDefinition(MI, Tok, TU); 9143 } 9144 9145 CXString clang_getClangVersion() { 9146 return cxstring::createDup(getClangFullVersion()); 9147 } 9148 9149 Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) { 9150 if (TU) { 9151 if (ASTUnit *Unit = cxtu::getASTUnit(TU)) { 9152 LogOS << '<' << Unit->getMainFileName() << '>'; 9153 if (Unit->isMainFileAST()) 9154 LogOS << " (" << Unit->getASTFileName() << ')'; 9155 return *this; 9156 } 9157 } else { 9158 LogOS << "<NULL TU>"; 9159 } 9160 return *this; 9161 } 9162 9163 Logger &cxindex::Logger::operator<<(const FileEntry *FE) { 9164 *this << FE->getName(); 9165 return *this; 9166 } 9167 9168 Logger &cxindex::Logger::operator<<(CXCursor cursor) { 9169 CXString cursorName = clang_getCursorDisplayName(cursor); 9170 *this << cursorName << "@" << clang_getCursorLocation(cursor); 9171 clang_disposeString(cursorName); 9172 return *this; 9173 } 9174 9175 Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) { 9176 CXFile File; 9177 unsigned Line, Column; 9178 clang_getFileLocation(Loc, &File, &Line, &Column, nullptr); 9179 CXString FileName = clang_getFileName(File); 9180 *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column); 9181 clang_disposeString(FileName); 9182 return *this; 9183 } 9184 9185 Logger &cxindex::Logger::operator<<(CXSourceRange range) { 9186 CXSourceLocation BLoc = clang_getRangeStart(range); 9187 CXSourceLocation ELoc = clang_getRangeEnd(range); 9188 9189 CXFile BFile; 9190 unsigned BLine, BColumn; 9191 clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, nullptr); 9192 9193 CXFile EFile; 9194 unsigned ELine, EColumn; 9195 clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, nullptr); 9196 9197 CXString BFileName = clang_getFileName(BFile); 9198 if (BFile == EFile) { 9199 *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName), 9200 BLine, BColumn, ELine, EColumn); 9201 } else { 9202 CXString EFileName = clang_getFileName(EFile); 9203 *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName), BLine, 9204 BColumn) 9205 << llvm::format("%s:%d:%d]", clang_getCString(EFileName), ELine, 9206 EColumn); 9207 clang_disposeString(EFileName); 9208 } 9209 clang_disposeString(BFileName); 9210 return *this; 9211 } 9212 9213 Logger &cxindex::Logger::operator<<(CXString Str) { 9214 *this << clang_getCString(Str); 9215 return *this; 9216 } 9217 9218 Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) { 9219 LogOS << Fmt; 9220 return *this; 9221 } 9222 9223 static llvm::ManagedStatic<std::mutex> LoggingMutex; 9224 9225 cxindex::Logger::~Logger() { 9226 std::lock_guard<std::mutex> L(*LoggingMutex); 9227 9228 static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime(); 9229 9230 raw_ostream &OS = llvm::errs(); 9231 OS << "[libclang:" << Name << ':'; 9232 9233 #ifdef USE_DARWIN_THREADS 9234 // TODO: Portability. 9235 mach_port_t tid = pthread_mach_thread_np(pthread_self()); 9236 OS << tid << ':'; 9237 #endif 9238 9239 llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime(); 9240 OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime()); 9241 OS << Msg << '\n'; 9242 9243 if (Trace) { 9244 llvm::sys::PrintStackTrace(OS); 9245 OS << "--------------------------------------------------\n"; 9246 } 9247 } 9248