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