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