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