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