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