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