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