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::VisitOMPUnifiedAddressClause( 2295 const OMPUnifiedAddressClause *) {} 2296 2297 void OMPClauseEnqueue::VisitOMPUnifiedSharedMemoryClause( 2298 const OMPUnifiedSharedMemoryClause *) {} 2299 2300 void OMPClauseEnqueue::VisitOMPReverseOffloadClause( 2301 const OMPReverseOffloadClause *) {} 2302 2303 void OMPClauseEnqueue::VisitOMPDynamicAllocatorsClause( 2304 const OMPDynamicAllocatorsClause *) {} 2305 2306 void OMPClauseEnqueue::VisitOMPAtomicDefaultMemOrderClause( 2307 const OMPAtomicDefaultMemOrderClause *) {} 2308 2309 void OMPClauseEnqueue::VisitOMPDeviceClause(const OMPDeviceClause *C) { 2310 Visitor->AddStmt(C->getDevice()); 2311 } 2312 2313 void OMPClauseEnqueue::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) { 2314 VisitOMPClauseWithPreInit(C); 2315 Visitor->AddStmt(C->getNumTeams()); 2316 } 2317 2318 void OMPClauseEnqueue::VisitOMPThreadLimitClause( 2319 const OMPThreadLimitClause *C) { 2320 VisitOMPClauseWithPreInit(C); 2321 Visitor->AddStmt(C->getThreadLimit()); 2322 } 2323 2324 void OMPClauseEnqueue::VisitOMPPriorityClause(const OMPPriorityClause *C) { 2325 Visitor->AddStmt(C->getPriority()); 2326 } 2327 2328 void OMPClauseEnqueue::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) { 2329 Visitor->AddStmt(C->getGrainsize()); 2330 } 2331 2332 void OMPClauseEnqueue::VisitOMPNumTasksClause(const OMPNumTasksClause *C) { 2333 Visitor->AddStmt(C->getNumTasks()); 2334 } 2335 2336 void OMPClauseEnqueue::VisitOMPHintClause(const OMPHintClause *C) { 2337 Visitor->AddStmt(C->getHint()); 2338 } 2339 2340 template <typename T> void OMPClauseEnqueue::VisitOMPClauseList(T *Node) { 2341 for (const auto *I : Node->varlists()) { 2342 Visitor->AddStmt(I); 2343 } 2344 } 2345 2346 void OMPClauseEnqueue::VisitOMPInclusiveClause(const OMPInclusiveClause *C) { 2347 VisitOMPClauseList(C); 2348 } 2349 void OMPClauseEnqueue::VisitOMPExclusiveClause(const OMPExclusiveClause *C) { 2350 VisitOMPClauseList(C); 2351 } 2352 void OMPClauseEnqueue::VisitOMPAllocateClause(const OMPAllocateClause *C) { 2353 VisitOMPClauseList(C); 2354 Visitor->AddStmt(C->getAllocator()); 2355 } 2356 void OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) { 2357 VisitOMPClauseList(C); 2358 for (const auto *E : C->private_copies()) { 2359 Visitor->AddStmt(E); 2360 } 2361 } 2362 void OMPClauseEnqueue::VisitOMPFirstprivateClause( 2363 const OMPFirstprivateClause *C) { 2364 VisitOMPClauseList(C); 2365 VisitOMPClauseWithPreInit(C); 2366 for (const auto *E : C->private_copies()) { 2367 Visitor->AddStmt(E); 2368 } 2369 for (const auto *E : C->inits()) { 2370 Visitor->AddStmt(E); 2371 } 2372 } 2373 void OMPClauseEnqueue::VisitOMPLastprivateClause( 2374 const OMPLastprivateClause *C) { 2375 VisitOMPClauseList(C); 2376 VisitOMPClauseWithPostUpdate(C); 2377 for (auto *E : C->private_copies()) { 2378 Visitor->AddStmt(E); 2379 } 2380 for (auto *E : C->source_exprs()) { 2381 Visitor->AddStmt(E); 2382 } 2383 for (auto *E : C->destination_exprs()) { 2384 Visitor->AddStmt(E); 2385 } 2386 for (auto *E : C->assignment_ops()) { 2387 Visitor->AddStmt(E); 2388 } 2389 } 2390 void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) { 2391 VisitOMPClauseList(C); 2392 } 2393 void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) { 2394 VisitOMPClauseList(C); 2395 VisitOMPClauseWithPostUpdate(C); 2396 for (auto *E : C->privates()) { 2397 Visitor->AddStmt(E); 2398 } 2399 for (auto *E : C->lhs_exprs()) { 2400 Visitor->AddStmt(E); 2401 } 2402 for (auto *E : C->rhs_exprs()) { 2403 Visitor->AddStmt(E); 2404 } 2405 for (auto *E : C->reduction_ops()) { 2406 Visitor->AddStmt(E); 2407 } 2408 if (C->getModifier() == clang::OMPC_REDUCTION_inscan) { 2409 for (auto *E : C->copy_ops()) { 2410 Visitor->AddStmt(E); 2411 } 2412 for (auto *E : C->copy_array_temps()) { 2413 Visitor->AddStmt(E); 2414 } 2415 for (auto *E : C->copy_array_elems()) { 2416 Visitor->AddStmt(E); 2417 } 2418 } 2419 } 2420 void OMPClauseEnqueue::VisitOMPTaskReductionClause( 2421 const OMPTaskReductionClause *C) { 2422 VisitOMPClauseList(C); 2423 VisitOMPClauseWithPostUpdate(C); 2424 for (auto *E : C->privates()) { 2425 Visitor->AddStmt(E); 2426 } 2427 for (auto *E : C->lhs_exprs()) { 2428 Visitor->AddStmt(E); 2429 } 2430 for (auto *E : C->rhs_exprs()) { 2431 Visitor->AddStmt(E); 2432 } 2433 for (auto *E : C->reduction_ops()) { 2434 Visitor->AddStmt(E); 2435 } 2436 } 2437 void OMPClauseEnqueue::VisitOMPInReductionClause( 2438 const OMPInReductionClause *C) { 2439 VisitOMPClauseList(C); 2440 VisitOMPClauseWithPostUpdate(C); 2441 for (auto *E : C->privates()) { 2442 Visitor->AddStmt(E); 2443 } 2444 for (auto *E : C->lhs_exprs()) { 2445 Visitor->AddStmt(E); 2446 } 2447 for (auto *E : C->rhs_exprs()) { 2448 Visitor->AddStmt(E); 2449 } 2450 for (auto *E : C->reduction_ops()) { 2451 Visitor->AddStmt(E); 2452 } 2453 for (auto *E : C->taskgroup_descriptors()) 2454 Visitor->AddStmt(E); 2455 } 2456 void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) { 2457 VisitOMPClauseList(C); 2458 VisitOMPClauseWithPostUpdate(C); 2459 for (const auto *E : C->privates()) { 2460 Visitor->AddStmt(E); 2461 } 2462 for (const auto *E : C->inits()) { 2463 Visitor->AddStmt(E); 2464 } 2465 for (const auto *E : C->updates()) { 2466 Visitor->AddStmt(E); 2467 } 2468 for (const auto *E : C->finals()) { 2469 Visitor->AddStmt(E); 2470 } 2471 Visitor->AddStmt(C->getStep()); 2472 Visitor->AddStmt(C->getCalcStep()); 2473 } 2474 void OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) { 2475 VisitOMPClauseList(C); 2476 Visitor->AddStmt(C->getAlignment()); 2477 } 2478 void OMPClauseEnqueue::VisitOMPCopyinClause(const OMPCopyinClause *C) { 2479 VisitOMPClauseList(C); 2480 for (auto *E : C->source_exprs()) { 2481 Visitor->AddStmt(E); 2482 } 2483 for (auto *E : C->destination_exprs()) { 2484 Visitor->AddStmt(E); 2485 } 2486 for (auto *E : C->assignment_ops()) { 2487 Visitor->AddStmt(E); 2488 } 2489 } 2490 void OMPClauseEnqueue::VisitOMPCopyprivateClause( 2491 const OMPCopyprivateClause *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::VisitOMPFlushClause(const OMPFlushClause *C) { 2504 VisitOMPClauseList(C); 2505 } 2506 void OMPClauseEnqueue::VisitOMPDepobjClause(const OMPDepobjClause *C) { 2507 Visitor->AddStmt(C->getDepobj()); 2508 } 2509 void OMPClauseEnqueue::VisitOMPDependClause(const OMPDependClause *C) { 2510 VisitOMPClauseList(C); 2511 } 2512 void OMPClauseEnqueue::VisitOMPMapClause(const OMPMapClause *C) { 2513 VisitOMPClauseList(C); 2514 } 2515 void OMPClauseEnqueue::VisitOMPDistScheduleClause( 2516 const OMPDistScheduleClause *C) { 2517 VisitOMPClauseWithPreInit(C); 2518 Visitor->AddStmt(C->getChunkSize()); 2519 } 2520 void OMPClauseEnqueue::VisitOMPDefaultmapClause( 2521 const OMPDefaultmapClause * /*C*/) {} 2522 void OMPClauseEnqueue::VisitOMPToClause(const OMPToClause *C) { 2523 VisitOMPClauseList(C); 2524 } 2525 void OMPClauseEnqueue::VisitOMPFromClause(const OMPFromClause *C) { 2526 VisitOMPClauseList(C); 2527 } 2528 void OMPClauseEnqueue::VisitOMPUseDevicePtrClause( 2529 const OMPUseDevicePtrClause *C) { 2530 VisitOMPClauseList(C); 2531 } 2532 void OMPClauseEnqueue::VisitOMPUseDeviceAddrClause( 2533 const OMPUseDeviceAddrClause *C) { 2534 VisitOMPClauseList(C); 2535 } 2536 void OMPClauseEnqueue::VisitOMPIsDevicePtrClause( 2537 const OMPIsDevicePtrClause *C) { 2538 VisitOMPClauseList(C); 2539 } 2540 void OMPClauseEnqueue::VisitOMPNontemporalClause( 2541 const OMPNontemporalClause *C) { 2542 VisitOMPClauseList(C); 2543 for (const auto *E : C->private_refs()) 2544 Visitor->AddStmt(E); 2545 } 2546 void OMPClauseEnqueue::VisitOMPOrderClause(const OMPOrderClause *C) {} 2547 void OMPClauseEnqueue::VisitOMPUsesAllocatorsClause( 2548 const OMPUsesAllocatorsClause *C) { 2549 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 2550 const OMPUsesAllocatorsClause::Data &D = C->getAllocatorData(I); 2551 Visitor->AddStmt(D.Allocator); 2552 Visitor->AddStmt(D.AllocatorTraits); 2553 } 2554 } 2555 void OMPClauseEnqueue::VisitOMPAffinityClause(const OMPAffinityClause *C) { 2556 Visitor->AddStmt(C->getModifier()); 2557 for (const Expr *E : C->varlists()) 2558 Visitor->AddStmt(E); 2559 } 2560 } // namespace 2561 2562 void EnqueueVisitor::EnqueueChildren(const OMPClause *S) { 2563 unsigned size = WL.size(); 2564 OMPClauseEnqueue Visitor(this); 2565 Visitor.Visit(S); 2566 if (size == WL.size()) 2567 return; 2568 // Now reverse the entries we just added. This will match the DFS 2569 // ordering performed by the worklist. 2570 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 2571 std::reverse(I, E); 2572 } 2573 void EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) { 2574 WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent)); 2575 } 2576 void EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) { 2577 AddDecl(B->getBlockDecl()); 2578 } 2579 void EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 2580 EnqueueChildren(E); 2581 AddTypeLoc(E->getTypeSourceInfo()); 2582 } 2583 void EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) { 2584 for (auto &I : llvm::reverse(S->body())) 2585 AddStmt(I); 2586 } 2587 void EnqueueVisitor::VisitMSDependentExistsStmt( 2588 const MSDependentExistsStmt *S) { 2589 AddStmt(S->getSubStmt()); 2590 AddDeclarationNameInfo(S); 2591 if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc()) 2592 AddNestedNameSpecifierLoc(QualifierLoc); 2593 } 2594 2595 void EnqueueVisitor::VisitCXXDependentScopeMemberExpr( 2596 const CXXDependentScopeMemberExpr *E) { 2597 if (E->hasExplicitTemplateArgs()) 2598 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); 2599 AddDeclarationNameInfo(E); 2600 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc()) 2601 AddNestedNameSpecifierLoc(QualifierLoc); 2602 if (!E->isImplicitAccess()) 2603 AddStmt(E->getBase()); 2604 } 2605 void EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) { 2606 // Enqueue the initializer , if any. 2607 AddStmt(E->getInitializer()); 2608 // Enqueue the array size, if any. 2609 AddStmt(E->getArraySize().getValueOr(nullptr)); 2610 // Enqueue the allocated type. 2611 AddTypeLoc(E->getAllocatedTypeSourceInfo()); 2612 // Enqueue the placement arguments. 2613 for (unsigned I = E->getNumPlacementArgs(); I > 0; --I) 2614 AddStmt(E->getPlacementArg(I - 1)); 2615 } 2616 void EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) { 2617 for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I) 2618 AddStmt(CE->getArg(I - 1)); 2619 AddStmt(CE->getCallee()); 2620 AddStmt(CE->getArg(0)); 2621 } 2622 void EnqueueVisitor::VisitCXXPseudoDestructorExpr( 2623 const CXXPseudoDestructorExpr *E) { 2624 // Visit the name of the type being destroyed. 2625 AddTypeLoc(E->getDestroyedTypeInfo()); 2626 // Visit the scope type that looks disturbingly like the nested-name-specifier 2627 // but isn't. 2628 AddTypeLoc(E->getScopeTypeInfo()); 2629 // Visit the nested-name-specifier. 2630 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc()) 2631 AddNestedNameSpecifierLoc(QualifierLoc); 2632 // Visit base expression. 2633 AddStmt(E->getBase()); 2634 } 2635 void EnqueueVisitor::VisitCXXScalarValueInitExpr( 2636 const CXXScalarValueInitExpr *E) { 2637 AddTypeLoc(E->getTypeSourceInfo()); 2638 } 2639 void EnqueueVisitor::VisitCXXTemporaryObjectExpr( 2640 const CXXTemporaryObjectExpr *E) { 2641 EnqueueChildren(E); 2642 AddTypeLoc(E->getTypeSourceInfo()); 2643 } 2644 void EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) { 2645 EnqueueChildren(E); 2646 if (E->isTypeOperand()) 2647 AddTypeLoc(E->getTypeOperandSourceInfo()); 2648 } 2649 2650 void EnqueueVisitor::VisitCXXUnresolvedConstructExpr( 2651 const CXXUnresolvedConstructExpr *E) { 2652 EnqueueChildren(E); 2653 AddTypeLoc(E->getTypeSourceInfo()); 2654 } 2655 void EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) { 2656 EnqueueChildren(E); 2657 if (E->isTypeOperand()) 2658 AddTypeLoc(E->getTypeOperandSourceInfo()); 2659 } 2660 2661 void EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) { 2662 EnqueueChildren(S); 2663 AddDecl(S->getExceptionDecl()); 2664 } 2665 2666 void EnqueueVisitor::VisitCXXForRangeStmt(const CXXForRangeStmt *S) { 2667 AddStmt(S->getBody()); 2668 AddStmt(S->getRangeInit()); 2669 AddDecl(S->getLoopVariable()); 2670 } 2671 2672 void EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) { 2673 if (DR->hasExplicitTemplateArgs()) 2674 AddExplicitTemplateArgs(DR->getTemplateArgs(), DR->getNumTemplateArgs()); 2675 WL.push_back(DeclRefExprParts(DR, Parent)); 2676 } 2677 void EnqueueVisitor::VisitDependentScopeDeclRefExpr( 2678 const DependentScopeDeclRefExpr *E) { 2679 if (E->hasExplicitTemplateArgs()) 2680 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); 2681 AddDeclarationNameInfo(E); 2682 AddNestedNameSpecifierLoc(E->getQualifierLoc()); 2683 } 2684 void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) { 2685 unsigned size = WL.size(); 2686 bool isFirst = true; 2687 for (const auto *D : S->decls()) { 2688 AddDecl(D, isFirst); 2689 isFirst = false; 2690 } 2691 if (size == WL.size()) 2692 return; 2693 // Now reverse the entries we just added. This will match the DFS 2694 // ordering performed by the worklist. 2695 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 2696 std::reverse(I, E); 2697 } 2698 void EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) { 2699 AddStmt(E->getInit()); 2700 for (const DesignatedInitExpr::Designator &D : 2701 llvm::reverse(E->designators())) { 2702 if (D.isFieldDesignator()) { 2703 if (FieldDecl *Field = D.getField()) 2704 AddMemberRef(Field, D.getFieldLoc()); 2705 continue; 2706 } 2707 if (D.isArrayDesignator()) { 2708 AddStmt(E->getArrayIndex(D)); 2709 continue; 2710 } 2711 assert(D.isArrayRangeDesignator() && "Unknown designator kind"); 2712 AddStmt(E->getArrayRangeEnd(D)); 2713 AddStmt(E->getArrayRangeStart(D)); 2714 } 2715 } 2716 void EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) { 2717 EnqueueChildren(E); 2718 AddTypeLoc(E->getTypeInfoAsWritten()); 2719 } 2720 void EnqueueVisitor::VisitForStmt(const ForStmt *FS) { 2721 AddStmt(FS->getBody()); 2722 AddStmt(FS->getInc()); 2723 AddStmt(FS->getCond()); 2724 AddDecl(FS->getConditionVariable()); 2725 AddStmt(FS->getInit()); 2726 } 2727 void EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) { 2728 WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent)); 2729 } 2730 void EnqueueVisitor::VisitIfStmt(const IfStmt *If) { 2731 AddStmt(If->getElse()); 2732 AddStmt(If->getThen()); 2733 AddStmt(If->getCond()); 2734 AddStmt(If->getInit()); 2735 AddDecl(If->getConditionVariable()); 2736 } 2737 void EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) { 2738 // We care about the syntactic form of the initializer list, only. 2739 if (InitListExpr *Syntactic = IE->getSyntacticForm()) 2740 IE = Syntactic; 2741 EnqueueChildren(IE); 2742 } 2743 void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) { 2744 WL.push_back(MemberExprParts(M, Parent)); 2745 2746 // If the base of the member access expression is an implicit 'this', don't 2747 // visit it. 2748 // FIXME: If we ever want to show these implicit accesses, this will be 2749 // unfortunate. However, clang_getCursor() relies on this behavior. 2750 if (M->isImplicitAccess()) 2751 return; 2752 2753 // Ignore base anonymous struct/union fields, otherwise they will shadow the 2754 // real field that we are interested in. 2755 if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) { 2756 if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) { 2757 if (FD->isAnonymousStructOrUnion()) { 2758 AddStmt(SubME->getBase()); 2759 return; 2760 } 2761 } 2762 } 2763 2764 AddStmt(M->getBase()); 2765 } 2766 void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { 2767 AddTypeLoc(E->getEncodedTypeSourceInfo()); 2768 } 2769 void EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) { 2770 EnqueueChildren(M); 2771 AddTypeLoc(M->getClassReceiverTypeInfo()); 2772 } 2773 void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) { 2774 // Visit the components of the offsetof expression. 2775 for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) { 2776 const OffsetOfNode &Node = E->getComponent(I - 1); 2777 switch (Node.getKind()) { 2778 case OffsetOfNode::Array: 2779 AddStmt(E->getIndexExpr(Node.getArrayExprIndex())); 2780 break; 2781 case OffsetOfNode::Field: 2782 AddMemberRef(Node.getField(), Node.getSourceRange().getEnd()); 2783 break; 2784 case OffsetOfNode::Identifier: 2785 case OffsetOfNode::Base: 2786 continue; 2787 } 2788 } 2789 // Visit the type into which we're computing the offset. 2790 AddTypeLoc(E->getTypeSourceInfo()); 2791 } 2792 void EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) { 2793 if (E->hasExplicitTemplateArgs()) 2794 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs()); 2795 WL.push_back(OverloadExprParts(E, Parent)); 2796 } 2797 void EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr( 2798 const UnaryExprOrTypeTraitExpr *E) { 2799 EnqueueChildren(E); 2800 if (E->isArgumentType()) 2801 AddTypeLoc(E->getArgumentTypeInfo()); 2802 } 2803 void EnqueueVisitor::VisitStmt(const Stmt *S) { EnqueueChildren(S); } 2804 void EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) { 2805 AddStmt(S->getBody()); 2806 AddStmt(S->getCond()); 2807 AddDecl(S->getConditionVariable()); 2808 } 2809 2810 void EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) { 2811 AddStmt(W->getBody()); 2812 AddStmt(W->getCond()); 2813 AddDecl(W->getConditionVariable()); 2814 } 2815 2816 void EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) { 2817 for (unsigned I = E->getNumArgs(); I > 0; --I) 2818 AddTypeLoc(E->getArg(I - 1)); 2819 } 2820 2821 void EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) { 2822 AddTypeLoc(E->getQueriedTypeSourceInfo()); 2823 } 2824 2825 void EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) { 2826 EnqueueChildren(E); 2827 } 2828 2829 void EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) { 2830 VisitOverloadExpr(U); 2831 if (!U->isImplicitAccess()) 2832 AddStmt(U->getBase()); 2833 } 2834 void EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) { 2835 AddStmt(E->getSubExpr()); 2836 AddTypeLoc(E->getWrittenTypeInfo()); 2837 } 2838 void EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) { 2839 WL.push_back(SizeOfPackExprParts(E, Parent)); 2840 } 2841 void EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) { 2842 // If the opaque value has a source expression, just transparently 2843 // visit that. This is useful for (e.g.) pseudo-object expressions. 2844 if (Expr *SourceExpr = E->getSourceExpr()) 2845 return Visit(SourceExpr); 2846 } 2847 void EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) { 2848 AddStmt(E->getBody()); 2849 WL.push_back(LambdaExprParts(E, Parent)); 2850 } 2851 void EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) { 2852 // Treat the expression like its syntactic form. 2853 Visit(E->getSyntacticForm()); 2854 } 2855 2856 void EnqueueVisitor::VisitOMPExecutableDirective( 2857 const OMPExecutableDirective *D) { 2858 EnqueueChildren(D); 2859 for (ArrayRef<OMPClause *>::iterator I = D->clauses().begin(), 2860 E = D->clauses().end(); 2861 I != E; ++I) 2862 EnqueueChildren(*I); 2863 } 2864 2865 void EnqueueVisitor::VisitOMPLoopBasedDirective( 2866 const OMPLoopBasedDirective *D) { 2867 VisitOMPExecutableDirective(D); 2868 } 2869 2870 void EnqueueVisitor::VisitOMPLoopDirective(const OMPLoopDirective *D) { 2871 VisitOMPLoopBasedDirective(D); 2872 } 2873 2874 void EnqueueVisitor::VisitOMPParallelDirective(const OMPParallelDirective *D) { 2875 VisitOMPExecutableDirective(D); 2876 } 2877 2878 void EnqueueVisitor::VisitOMPSimdDirective(const OMPSimdDirective *D) { 2879 VisitOMPLoopDirective(D); 2880 } 2881 2882 void EnqueueVisitor::VisitOMPTileDirective(const OMPTileDirective *D) { 2883 VisitOMPLoopBasedDirective(D); 2884 } 2885 2886 void EnqueueVisitor::VisitOMPForDirective(const OMPForDirective *D) { 2887 VisitOMPLoopDirective(D); 2888 } 2889 2890 void EnqueueVisitor::VisitOMPForSimdDirective(const OMPForSimdDirective *D) { 2891 VisitOMPLoopDirective(D); 2892 } 2893 2894 void EnqueueVisitor::VisitOMPSectionsDirective(const OMPSectionsDirective *D) { 2895 VisitOMPExecutableDirective(D); 2896 } 2897 2898 void EnqueueVisitor::VisitOMPSectionDirective(const OMPSectionDirective *D) { 2899 VisitOMPExecutableDirective(D); 2900 } 2901 2902 void EnqueueVisitor::VisitOMPSingleDirective(const OMPSingleDirective *D) { 2903 VisitOMPExecutableDirective(D); 2904 } 2905 2906 void EnqueueVisitor::VisitOMPMasterDirective(const OMPMasterDirective *D) { 2907 VisitOMPExecutableDirective(D); 2908 } 2909 2910 void EnqueueVisitor::VisitOMPCriticalDirective(const OMPCriticalDirective *D) { 2911 VisitOMPExecutableDirective(D); 2912 AddDeclarationNameInfo(D); 2913 } 2914 2915 void EnqueueVisitor::VisitOMPParallelForDirective( 2916 const OMPParallelForDirective *D) { 2917 VisitOMPLoopDirective(D); 2918 } 2919 2920 void EnqueueVisitor::VisitOMPParallelForSimdDirective( 2921 const OMPParallelForSimdDirective *D) { 2922 VisitOMPLoopDirective(D); 2923 } 2924 2925 void EnqueueVisitor::VisitOMPParallelMasterDirective( 2926 const OMPParallelMasterDirective *D) { 2927 VisitOMPExecutableDirective(D); 2928 } 2929 2930 void EnqueueVisitor::VisitOMPParallelSectionsDirective( 2931 const OMPParallelSectionsDirective *D) { 2932 VisitOMPExecutableDirective(D); 2933 } 2934 2935 void EnqueueVisitor::VisitOMPTaskDirective(const OMPTaskDirective *D) { 2936 VisitOMPExecutableDirective(D); 2937 } 2938 2939 void EnqueueVisitor::VisitOMPTaskyieldDirective( 2940 const OMPTaskyieldDirective *D) { 2941 VisitOMPExecutableDirective(D); 2942 } 2943 2944 void EnqueueVisitor::VisitOMPBarrierDirective(const OMPBarrierDirective *D) { 2945 VisitOMPExecutableDirective(D); 2946 } 2947 2948 void EnqueueVisitor::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D) { 2949 VisitOMPExecutableDirective(D); 2950 } 2951 2952 void EnqueueVisitor::VisitOMPTaskgroupDirective( 2953 const OMPTaskgroupDirective *D) { 2954 VisitOMPExecutableDirective(D); 2955 if (const Expr *E = D->getReductionRef()) 2956 VisitStmt(E); 2957 } 2958 2959 void EnqueueVisitor::VisitOMPFlushDirective(const OMPFlushDirective *D) { 2960 VisitOMPExecutableDirective(D); 2961 } 2962 2963 void EnqueueVisitor::VisitOMPDepobjDirective(const OMPDepobjDirective *D) { 2964 VisitOMPExecutableDirective(D); 2965 } 2966 2967 void EnqueueVisitor::VisitOMPScanDirective(const OMPScanDirective *D) { 2968 VisitOMPExecutableDirective(D); 2969 } 2970 2971 void EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) { 2972 VisitOMPExecutableDirective(D); 2973 } 2974 2975 void EnqueueVisitor::VisitOMPAtomicDirective(const OMPAtomicDirective *D) { 2976 VisitOMPExecutableDirective(D); 2977 } 2978 2979 void EnqueueVisitor::VisitOMPTargetDirective(const OMPTargetDirective *D) { 2980 VisitOMPExecutableDirective(D); 2981 } 2982 2983 void EnqueueVisitor::VisitOMPTargetDataDirective( 2984 const OMPTargetDataDirective *D) { 2985 VisitOMPExecutableDirective(D); 2986 } 2987 2988 void EnqueueVisitor::VisitOMPTargetEnterDataDirective( 2989 const OMPTargetEnterDataDirective *D) { 2990 VisitOMPExecutableDirective(D); 2991 } 2992 2993 void EnqueueVisitor::VisitOMPTargetExitDataDirective( 2994 const OMPTargetExitDataDirective *D) { 2995 VisitOMPExecutableDirective(D); 2996 } 2997 2998 void EnqueueVisitor::VisitOMPTargetParallelDirective( 2999 const OMPTargetParallelDirective *D) { 3000 VisitOMPExecutableDirective(D); 3001 } 3002 3003 void EnqueueVisitor::VisitOMPTargetParallelForDirective( 3004 const OMPTargetParallelForDirective *D) { 3005 VisitOMPLoopDirective(D); 3006 } 3007 3008 void EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) { 3009 VisitOMPExecutableDirective(D); 3010 } 3011 3012 void EnqueueVisitor::VisitOMPCancellationPointDirective( 3013 const OMPCancellationPointDirective *D) { 3014 VisitOMPExecutableDirective(D); 3015 } 3016 3017 void EnqueueVisitor::VisitOMPCancelDirective(const OMPCancelDirective *D) { 3018 VisitOMPExecutableDirective(D); 3019 } 3020 3021 void EnqueueVisitor::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D) { 3022 VisitOMPLoopDirective(D); 3023 } 3024 3025 void EnqueueVisitor::VisitOMPTaskLoopSimdDirective( 3026 const OMPTaskLoopSimdDirective *D) { 3027 VisitOMPLoopDirective(D); 3028 } 3029 3030 void EnqueueVisitor::VisitOMPMasterTaskLoopDirective( 3031 const OMPMasterTaskLoopDirective *D) { 3032 VisitOMPLoopDirective(D); 3033 } 3034 3035 void EnqueueVisitor::VisitOMPMasterTaskLoopSimdDirective( 3036 const OMPMasterTaskLoopSimdDirective *D) { 3037 VisitOMPLoopDirective(D); 3038 } 3039 3040 void EnqueueVisitor::VisitOMPParallelMasterTaskLoopDirective( 3041 const OMPParallelMasterTaskLoopDirective *D) { 3042 VisitOMPLoopDirective(D); 3043 } 3044 3045 void EnqueueVisitor::VisitOMPParallelMasterTaskLoopSimdDirective( 3046 const OMPParallelMasterTaskLoopSimdDirective *D) { 3047 VisitOMPLoopDirective(D); 3048 } 3049 3050 void EnqueueVisitor::VisitOMPDistributeDirective( 3051 const OMPDistributeDirective *D) { 3052 VisitOMPLoopDirective(D); 3053 } 3054 3055 void EnqueueVisitor::VisitOMPDistributeParallelForDirective( 3056 const OMPDistributeParallelForDirective *D) { 3057 VisitOMPLoopDirective(D); 3058 } 3059 3060 void EnqueueVisitor::VisitOMPDistributeParallelForSimdDirective( 3061 const OMPDistributeParallelForSimdDirective *D) { 3062 VisitOMPLoopDirective(D); 3063 } 3064 3065 void EnqueueVisitor::VisitOMPDistributeSimdDirective( 3066 const OMPDistributeSimdDirective *D) { 3067 VisitOMPLoopDirective(D); 3068 } 3069 3070 void EnqueueVisitor::VisitOMPTargetParallelForSimdDirective( 3071 const OMPTargetParallelForSimdDirective *D) { 3072 VisitOMPLoopDirective(D); 3073 } 3074 3075 void EnqueueVisitor::VisitOMPTargetSimdDirective( 3076 const OMPTargetSimdDirective *D) { 3077 VisitOMPLoopDirective(D); 3078 } 3079 3080 void EnqueueVisitor::VisitOMPTeamsDistributeDirective( 3081 const OMPTeamsDistributeDirective *D) { 3082 VisitOMPLoopDirective(D); 3083 } 3084 3085 void EnqueueVisitor::VisitOMPTeamsDistributeSimdDirective( 3086 const OMPTeamsDistributeSimdDirective *D) { 3087 VisitOMPLoopDirective(D); 3088 } 3089 3090 void EnqueueVisitor::VisitOMPTeamsDistributeParallelForSimdDirective( 3091 const OMPTeamsDistributeParallelForSimdDirective *D) { 3092 VisitOMPLoopDirective(D); 3093 } 3094 3095 void EnqueueVisitor::VisitOMPTeamsDistributeParallelForDirective( 3096 const OMPTeamsDistributeParallelForDirective *D) { 3097 VisitOMPLoopDirective(D); 3098 } 3099 3100 void EnqueueVisitor::VisitOMPTargetTeamsDirective( 3101 const OMPTargetTeamsDirective *D) { 3102 VisitOMPExecutableDirective(D); 3103 } 3104 3105 void EnqueueVisitor::VisitOMPTargetTeamsDistributeDirective( 3106 const OMPTargetTeamsDistributeDirective *D) { 3107 VisitOMPLoopDirective(D); 3108 } 3109 3110 void EnqueueVisitor::VisitOMPTargetTeamsDistributeParallelForDirective( 3111 const OMPTargetTeamsDistributeParallelForDirective *D) { 3112 VisitOMPLoopDirective(D); 3113 } 3114 3115 void EnqueueVisitor::VisitOMPTargetTeamsDistributeParallelForSimdDirective( 3116 const OMPTargetTeamsDistributeParallelForSimdDirective *D) { 3117 VisitOMPLoopDirective(D); 3118 } 3119 3120 void EnqueueVisitor::VisitOMPTargetTeamsDistributeSimdDirective( 3121 const OMPTargetTeamsDistributeSimdDirective *D) { 3122 VisitOMPLoopDirective(D); 3123 } 3124 3125 void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) { 3126 EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU, RegionOfInterest)) 3127 .Visit(S); 3128 } 3129 3130 bool CursorVisitor::IsInRegionOfInterest(CXCursor C) { 3131 if (RegionOfInterest.isValid()) { 3132 SourceRange Range = getRawCursorExtent(C); 3133 if (Range.isInvalid() || CompareRegionOfInterest(Range)) 3134 return false; 3135 } 3136 return true; 3137 } 3138 3139 bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { 3140 while (!WL.empty()) { 3141 // Dequeue the worklist item. 3142 VisitorJob LI = WL.pop_back_val(); 3143 3144 // Set the Parent field, then back to its old value once we're done. 3145 SetParentRAII SetParent(Parent, StmtParent, LI.getParent()); 3146 3147 switch (LI.getKind()) { 3148 case VisitorJob::DeclVisitKind: { 3149 const Decl *D = cast<DeclVisit>(&LI)->get(); 3150 if (!D) 3151 continue; 3152 3153 // For now, perform default visitation for Decls. 3154 if (Visit(MakeCXCursor(D, TU, RegionOfInterest, 3155 cast<DeclVisit>(&LI)->isFirst()))) 3156 return true; 3157 3158 continue; 3159 } 3160 case VisitorJob::ExplicitTemplateArgsVisitKind: { 3161 for (const TemplateArgumentLoc &Arg : 3162 *cast<ExplicitTemplateArgsVisit>(&LI)) { 3163 if (VisitTemplateArgumentLoc(Arg)) 3164 return true; 3165 } 3166 continue; 3167 } 3168 case VisitorJob::TypeLocVisitKind: { 3169 // Perform default visitation for TypeLocs. 3170 if (Visit(cast<TypeLocVisit>(&LI)->get())) 3171 return true; 3172 continue; 3173 } 3174 case VisitorJob::LabelRefVisitKind: { 3175 const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get(); 3176 if (LabelStmt *stmt = LS->getStmt()) { 3177 if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(), 3178 TU))) { 3179 return true; 3180 } 3181 } 3182 continue; 3183 } 3184 3185 case VisitorJob::NestedNameSpecifierLocVisitKind: { 3186 NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI); 3187 if (VisitNestedNameSpecifierLoc(V->get())) 3188 return true; 3189 continue; 3190 } 3191 3192 case VisitorJob::DeclarationNameInfoVisitKind: { 3193 if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)->get())) 3194 return true; 3195 continue; 3196 } 3197 case VisitorJob::MemberRefVisitKind: { 3198 MemberRefVisit *V = cast<MemberRefVisit>(&LI); 3199 if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU))) 3200 return true; 3201 continue; 3202 } 3203 case VisitorJob::StmtVisitKind: { 3204 const Stmt *S = cast<StmtVisit>(&LI)->get(); 3205 if (!S) 3206 continue; 3207 3208 // Update the current cursor. 3209 CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest); 3210 if (!IsInRegionOfInterest(Cursor)) 3211 continue; 3212 switch (Visitor(Cursor, Parent, ClientData)) { 3213 case CXChildVisit_Break: 3214 return true; 3215 case CXChildVisit_Continue: 3216 break; 3217 case CXChildVisit_Recurse: 3218 if (PostChildrenVisitor) 3219 WL.push_back(PostChildrenVisit(nullptr, Cursor)); 3220 EnqueueWorkList(WL, S); 3221 break; 3222 } 3223 continue; 3224 } 3225 case VisitorJob::MemberExprPartsKind: { 3226 // Handle the other pieces in the MemberExpr besides the base. 3227 const MemberExpr *M = cast<MemberExprParts>(&LI)->get(); 3228 3229 // Visit the nested-name-specifier 3230 if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc()) 3231 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 3232 return true; 3233 3234 // Visit the declaration name. 3235 if (VisitDeclarationNameInfo(M->getMemberNameInfo())) 3236 return true; 3237 3238 // Visit the explicitly-specified template arguments, if any. 3239 if (M->hasExplicitTemplateArgs()) { 3240 for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(), 3241 *ArgEnd = Arg + M->getNumTemplateArgs(); 3242 Arg != ArgEnd; ++Arg) { 3243 if (VisitTemplateArgumentLoc(*Arg)) 3244 return true; 3245 } 3246 } 3247 continue; 3248 } 3249 case VisitorJob::DeclRefExprPartsKind: { 3250 const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get(); 3251 // Visit nested-name-specifier, if present. 3252 if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc()) 3253 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 3254 return true; 3255 // Visit declaration name. 3256 if (VisitDeclarationNameInfo(DR->getNameInfo())) 3257 return true; 3258 continue; 3259 } 3260 case VisitorJob::OverloadExprPartsKind: { 3261 const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get(); 3262 // Visit the nested-name-specifier. 3263 if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc()) 3264 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 3265 return true; 3266 // Visit the declaration name. 3267 if (VisitDeclarationNameInfo(O->getNameInfo())) 3268 return true; 3269 // Visit the overloaded declaration reference. 3270 if (Visit(MakeCursorOverloadedDeclRef(O, TU))) 3271 return true; 3272 continue; 3273 } 3274 case VisitorJob::SizeOfPackExprPartsKind: { 3275 const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get(); 3276 NamedDecl *Pack = E->getPack(); 3277 if (isa<TemplateTypeParmDecl>(Pack)) { 3278 if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack), 3279 E->getPackLoc(), TU))) 3280 return true; 3281 3282 continue; 3283 } 3284 3285 if (isa<TemplateTemplateParmDecl>(Pack)) { 3286 if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack), 3287 E->getPackLoc(), TU))) 3288 return true; 3289 3290 continue; 3291 } 3292 3293 // Non-type template parameter packs and function parameter packs are 3294 // treated like DeclRefExpr cursors. 3295 continue; 3296 } 3297 3298 case VisitorJob::LambdaExprPartsKind: { 3299 // Visit non-init captures. 3300 const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get(); 3301 for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(), 3302 CEnd = E->explicit_capture_end(); 3303 C != CEnd; ++C) { 3304 if (!C->capturesVariable()) 3305 continue; 3306 3307 if (Visit(MakeCursorVariableRef(C->getCapturedVar(), C->getLocation(), 3308 TU))) 3309 return true; 3310 } 3311 // Visit init captures 3312 for (auto InitExpr : E->capture_inits()) { 3313 if (InitExpr && Visit(InitExpr)) 3314 return true; 3315 } 3316 3317 TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc(); 3318 // Visit parameters and return type, if present. 3319 if (FunctionTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) { 3320 if (E->hasExplicitParameters()) { 3321 // Visit parameters. 3322 for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) 3323 if (Visit(MakeCXCursor(Proto.getParam(I), TU))) 3324 return true; 3325 } 3326 if (E->hasExplicitResultType()) { 3327 // Visit result type. 3328 if (Visit(Proto.getReturnLoc())) 3329 return true; 3330 } 3331 } 3332 break; 3333 } 3334 3335 case VisitorJob::PostChildrenVisitKind: 3336 if (PostChildrenVisitor(Parent, ClientData)) 3337 return true; 3338 break; 3339 } 3340 } 3341 return false; 3342 } 3343 3344 bool CursorVisitor::Visit(const Stmt *S) { 3345 VisitorWorkList *WL = nullptr; 3346 if (!WorkListFreeList.empty()) { 3347 WL = WorkListFreeList.back(); 3348 WL->clear(); 3349 WorkListFreeList.pop_back(); 3350 } else { 3351 WL = new VisitorWorkList(); 3352 WorkListCache.push_back(WL); 3353 } 3354 EnqueueWorkList(*WL, S); 3355 bool result = RunVisitorWorkList(*WL); 3356 WorkListFreeList.push_back(WL); 3357 return result; 3358 } 3359 3360 namespace { 3361 typedef SmallVector<SourceRange, 4> RefNamePieces; 3362 RefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr, 3363 const DeclarationNameInfo &NI, SourceRange QLoc, 3364 const SourceRange *TemplateArgsLoc = nullptr) { 3365 const bool WantQualifier = NameFlags & CXNameRange_WantQualifier; 3366 const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs; 3367 const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece; 3368 3369 const DeclarationName::NameKind Kind = NI.getName().getNameKind(); 3370 3371 RefNamePieces Pieces; 3372 3373 if (WantQualifier && QLoc.isValid()) 3374 Pieces.push_back(QLoc); 3375 3376 if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr) 3377 Pieces.push_back(NI.getLoc()); 3378 3379 if (WantTemplateArgs && TemplateArgsLoc && TemplateArgsLoc->isValid()) 3380 Pieces.push_back(*TemplateArgsLoc); 3381 3382 if (Kind == DeclarationName::CXXOperatorName) { 3383 Pieces.push_back(NI.getInfo().getCXXOperatorNameBeginLoc()); 3384 Pieces.push_back(NI.getInfo().getCXXOperatorNameEndLoc()); 3385 } 3386 3387 if (WantSinglePiece) { 3388 SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd()); 3389 Pieces.clear(); 3390 Pieces.push_back(R); 3391 } 3392 3393 return Pieces; 3394 } 3395 } // namespace 3396 3397 //===----------------------------------------------------------------------===// 3398 // Misc. API hooks. 3399 //===----------------------------------------------------------------------===// 3400 3401 namespace { 3402 struct RegisterFatalErrorHandler { 3403 RegisterFatalErrorHandler() { 3404 clang_install_aborting_llvm_fatal_error_handler(); 3405 } 3406 }; 3407 } // namespace 3408 3409 static llvm::ManagedStatic<RegisterFatalErrorHandler> 3410 RegisterFatalErrorHandlerOnce; 3411 3412 CXIndex clang_createIndex(int excludeDeclarationsFromPCH, 3413 int displayDiagnostics) { 3414 // We use crash recovery to make some of our APIs more reliable, implicitly 3415 // enable it. 3416 if (!getenv("LIBCLANG_DISABLE_CRASH_RECOVERY")) 3417 llvm::CrashRecoveryContext::Enable(); 3418 3419 // Look through the managed static to trigger construction of the managed 3420 // static which registers our fatal error handler. This ensures it is only 3421 // registered once. 3422 (void)*RegisterFatalErrorHandlerOnce; 3423 3424 // Initialize targets for clang module support. 3425 llvm::InitializeAllTargets(); 3426 llvm::InitializeAllTargetMCs(); 3427 llvm::InitializeAllAsmPrinters(); 3428 llvm::InitializeAllAsmParsers(); 3429 3430 CIndexer *CIdxr = new CIndexer(); 3431 3432 if (excludeDeclarationsFromPCH) 3433 CIdxr->setOnlyLocalDecls(); 3434 if (displayDiagnostics) 3435 CIdxr->setDisplayDiagnostics(); 3436 3437 if (getenv("LIBCLANG_BGPRIO_INDEX")) 3438 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | 3439 CXGlobalOpt_ThreadBackgroundPriorityForIndexing); 3440 if (getenv("LIBCLANG_BGPRIO_EDIT")) 3441 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | 3442 CXGlobalOpt_ThreadBackgroundPriorityForEditing); 3443 3444 return CIdxr; 3445 } 3446 3447 void clang_disposeIndex(CXIndex CIdx) { 3448 if (CIdx) 3449 delete static_cast<CIndexer *>(CIdx); 3450 } 3451 3452 void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) { 3453 if (CIdx) 3454 static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options); 3455 } 3456 3457 unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) { 3458 if (CIdx) 3459 return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags(); 3460 return 0; 3461 } 3462 3463 void clang_CXIndex_setInvocationEmissionPathOption(CXIndex CIdx, 3464 const char *Path) { 3465 if (CIdx) 3466 static_cast<CIndexer *>(CIdx)->setInvocationEmissionPath(Path ? Path : ""); 3467 } 3468 3469 void clang_toggleCrashRecovery(unsigned isEnabled) { 3470 if (isEnabled) 3471 llvm::CrashRecoveryContext::Enable(); 3472 else 3473 llvm::CrashRecoveryContext::Disable(); 3474 } 3475 3476 CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx, 3477 const char *ast_filename) { 3478 CXTranslationUnit TU; 3479 enum CXErrorCode Result = 3480 clang_createTranslationUnit2(CIdx, ast_filename, &TU); 3481 (void)Result; 3482 assert((TU && Result == CXError_Success) || 3483 (!TU && Result != CXError_Success)); 3484 return TU; 3485 } 3486 3487 enum CXErrorCode clang_createTranslationUnit2(CXIndex CIdx, 3488 const char *ast_filename, 3489 CXTranslationUnit *out_TU) { 3490 if (out_TU) 3491 *out_TU = nullptr; 3492 3493 if (!CIdx || !ast_filename || !out_TU) 3494 return CXError_InvalidArguments; 3495 3496 LOG_FUNC_SECTION { *Log << ast_filename; } 3497 3498 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); 3499 FileSystemOptions FileSystemOpts; 3500 3501 IntrusiveRefCntPtr<DiagnosticsEngine> Diags = 3502 CompilerInstance::createDiagnostics(new DiagnosticOptions()); 3503 std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile( 3504 ast_filename, CXXIdx->getPCHContainerOperations()->getRawReader(), 3505 ASTUnit::LoadEverything, Diags, FileSystemOpts, /*UseDebugInfo=*/false, 3506 CXXIdx->getOnlyLocalDecls(), CaptureDiagsKind::All, 3507 /*AllowASTWithCompilerErrors=*/true, 3508 /*UserFilesAreVolatile=*/true); 3509 *out_TU = MakeCXTranslationUnit(CXXIdx, std::move(AU)); 3510 return *out_TU ? CXError_Success : CXError_Failure; 3511 } 3512 3513 unsigned clang_defaultEditingTranslationUnitOptions() { 3514 return CXTranslationUnit_PrecompiledPreamble | 3515 CXTranslationUnit_CacheCompletionResults; 3516 } 3517 3518 CXTranslationUnit clang_createTranslationUnitFromSourceFile( 3519 CXIndex CIdx, const char *source_filename, int num_command_line_args, 3520 const char *const *command_line_args, unsigned num_unsaved_files, 3521 struct CXUnsavedFile *unsaved_files) { 3522 unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord; 3523 return clang_parseTranslationUnit(CIdx, source_filename, command_line_args, 3524 num_command_line_args, unsaved_files, 3525 num_unsaved_files, Options); 3526 } 3527 3528 static CXErrorCode 3529 clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename, 3530 const char *const *command_line_args, 3531 int num_command_line_args, 3532 ArrayRef<CXUnsavedFile> unsaved_files, 3533 unsigned options, CXTranslationUnit *out_TU) { 3534 // Set up the initial return values. 3535 if (out_TU) 3536 *out_TU = nullptr; 3537 3538 // Check arguments. 3539 if (!CIdx || !out_TU) 3540 return CXError_InvalidArguments; 3541 3542 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); 3543 3544 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) 3545 setThreadBackgroundPriority(); 3546 3547 bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble; 3548 bool CreatePreambleOnFirstParse = 3549 options & CXTranslationUnit_CreatePreambleOnFirstParse; 3550 // FIXME: Add a flag for modules. 3551 TranslationUnitKind TUKind = (options & (CXTranslationUnit_Incomplete | 3552 CXTranslationUnit_SingleFileParse)) 3553 ? TU_Prefix 3554 : TU_Complete; 3555 bool CacheCodeCompletionResults = 3556 options & CXTranslationUnit_CacheCompletionResults; 3557 bool IncludeBriefCommentsInCodeCompletion = 3558 options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion; 3559 bool SingleFileParse = options & CXTranslationUnit_SingleFileParse; 3560 bool ForSerialization = options & CXTranslationUnit_ForSerialization; 3561 bool RetainExcludedCB = 3562 options & CXTranslationUnit_RetainExcludedConditionalBlocks; 3563 SkipFunctionBodiesScope SkipFunctionBodies = SkipFunctionBodiesScope::None; 3564 if (options & CXTranslationUnit_SkipFunctionBodies) { 3565 SkipFunctionBodies = 3566 (options & CXTranslationUnit_LimitSkipFunctionBodiesToPreamble) 3567 ? SkipFunctionBodiesScope::Preamble 3568 : SkipFunctionBodiesScope::PreambleAndMainFile; 3569 } 3570 3571 // Configure the diagnostics. 3572 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 3573 CompilerInstance::createDiagnostics(new DiagnosticOptions)); 3574 3575 if (options & CXTranslationUnit_KeepGoing) 3576 Diags->setFatalsAsError(true); 3577 3578 CaptureDiagsKind CaptureDiagnostics = CaptureDiagsKind::All; 3579 if (options & CXTranslationUnit_IgnoreNonErrorsFromIncludedFiles) 3580 CaptureDiagnostics = CaptureDiagsKind::AllWithoutNonErrorsFromIncludes; 3581 3582 // Recover resources if we crash before exiting this function. 3583 llvm::CrashRecoveryContextCleanupRegistrar< 3584 DiagnosticsEngine, 3585 llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine>> 3586 DiagCleanup(Diags.get()); 3587 3588 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles( 3589 new std::vector<ASTUnit::RemappedFile>()); 3590 3591 // Recover resources if we crash before exiting this function. 3592 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<ASTUnit::RemappedFile>> 3593 RemappedCleanup(RemappedFiles.get()); 3594 3595 for (auto &UF : unsaved_files) { 3596 std::unique_ptr<llvm::MemoryBuffer> MB = 3597 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); 3598 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); 3599 } 3600 3601 std::unique_ptr<std::vector<const char *>> Args( 3602 new std::vector<const char *>()); 3603 3604 // Recover resources if we crash before exiting this method. 3605 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char *>> 3606 ArgsCleanup(Args.get()); 3607 3608 // Since the Clang C library is primarily used by batch tools dealing with 3609 // (often very broken) source code, where spell-checking can have a 3610 // significant negative impact on performance (particularly when 3611 // precompiled headers are involved), we disable it by default. 3612 // Only do this if we haven't found a spell-checking-related argument. 3613 bool FoundSpellCheckingArgument = false; 3614 for (int I = 0; I != num_command_line_args; ++I) { 3615 if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 || 3616 strcmp(command_line_args[I], "-fspell-checking") == 0) { 3617 FoundSpellCheckingArgument = true; 3618 break; 3619 } 3620 } 3621 Args->insert(Args->end(), command_line_args, 3622 command_line_args + num_command_line_args); 3623 3624 if (!FoundSpellCheckingArgument) 3625 Args->insert(Args->begin() + 1, "-fno-spell-checking"); 3626 3627 // The 'source_filename' argument is optional. If the caller does not 3628 // specify it then it is assumed that the source file is specified 3629 // in the actual argument list. 3630 // Put the source file after command_line_args otherwise if '-x' flag is 3631 // present it will be unused. 3632 if (source_filename) 3633 Args->push_back(source_filename); 3634 3635 // Do we need the detailed preprocessing record? 3636 if (options & CXTranslationUnit_DetailedPreprocessingRecord) { 3637 Args->push_back("-Xclang"); 3638 Args->push_back("-detailed-preprocessing-record"); 3639 } 3640 3641 // Suppress any editor placeholder diagnostics. 3642 Args->push_back("-fallow-editor-placeholders"); 3643 3644 unsigned NumErrors = Diags->getClient()->getNumErrors(); 3645 std::unique_ptr<ASTUnit> ErrUnit; 3646 // Unless the user specified that they want the preamble on the first parse 3647 // set it up to be created on the first reparse. This makes the first parse 3648 // faster, trading for a slower (first) reparse. 3649 unsigned PrecompilePreambleAfterNParses = 3650 !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse; 3651 3652 LibclangInvocationReporter InvocationReporter( 3653 *CXXIdx, LibclangInvocationReporter::OperationKind::ParseOperation, 3654 options, llvm::makeArrayRef(*Args), /*InvocationArgs=*/None, 3655 unsaved_files); 3656 std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine( 3657 Args->data(), Args->data() + Args->size(), 3658 CXXIdx->getPCHContainerOperations(), Diags, 3659 CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(), 3660 CaptureDiagnostics, *RemappedFiles.get(), 3661 /*RemappedFilesKeepOriginalName=*/true, PrecompilePreambleAfterNParses, 3662 TUKind, CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion, 3663 /*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies, SingleFileParse, 3664 /*UserFilesAreVolatile=*/true, ForSerialization, RetainExcludedCB, 3665 CXXIdx->getPCHContainerOperations()->getRawReader().getFormat(), 3666 &ErrUnit)); 3667 3668 // Early failures in LoadFromCommandLine may return with ErrUnit unset. 3669 if (!Unit && !ErrUnit) 3670 return CXError_ASTReadError; 3671 3672 if (NumErrors != Diags->getClient()->getNumErrors()) { 3673 // Make sure to check that 'Unit' is non-NULL. 3674 if (CXXIdx->getDisplayDiagnostics()) 3675 printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get()); 3676 } 3677 3678 if (isASTReadError(Unit ? Unit.get() : ErrUnit.get())) 3679 return CXError_ASTReadError; 3680 3681 *out_TU = MakeCXTranslationUnit(CXXIdx, std::move(Unit)); 3682 if (CXTranslationUnitImpl *TU = *out_TU) { 3683 TU->ParsingOptions = options; 3684 TU->Arguments.reserve(Args->size()); 3685 for (const char *Arg : *Args) 3686 TU->Arguments.push_back(Arg); 3687 return CXError_Success; 3688 } 3689 return CXError_Failure; 3690 } 3691 3692 CXTranslationUnit 3693 clang_parseTranslationUnit(CXIndex CIdx, const char *source_filename, 3694 const char *const *command_line_args, 3695 int num_command_line_args, 3696 struct CXUnsavedFile *unsaved_files, 3697 unsigned num_unsaved_files, unsigned options) { 3698 CXTranslationUnit TU; 3699 enum CXErrorCode Result = clang_parseTranslationUnit2( 3700 CIdx, source_filename, command_line_args, num_command_line_args, 3701 unsaved_files, num_unsaved_files, options, &TU); 3702 (void)Result; 3703 assert((TU && Result == CXError_Success) || 3704 (!TU && Result != CXError_Success)); 3705 return TU; 3706 } 3707 3708 enum CXErrorCode clang_parseTranslationUnit2( 3709 CXIndex CIdx, const char *source_filename, 3710 const char *const *command_line_args, int num_command_line_args, 3711 struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files, 3712 unsigned options, CXTranslationUnit *out_TU) { 3713 noteBottomOfStack(); 3714 SmallVector<const char *, 4> Args; 3715 Args.push_back("clang"); 3716 Args.append(command_line_args, command_line_args + num_command_line_args); 3717 return clang_parseTranslationUnit2FullArgv( 3718 CIdx, source_filename, Args.data(), Args.size(), unsaved_files, 3719 num_unsaved_files, options, out_TU); 3720 } 3721 3722 enum CXErrorCode clang_parseTranslationUnit2FullArgv( 3723 CXIndex CIdx, const char *source_filename, 3724 const char *const *command_line_args, int num_command_line_args, 3725 struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files, 3726 unsigned options, CXTranslationUnit *out_TU) { 3727 LOG_FUNC_SECTION { 3728 *Log << source_filename << ": "; 3729 for (int i = 0; i != num_command_line_args; ++i) 3730 *Log << command_line_args[i] << " "; 3731 } 3732 3733 if (num_unsaved_files && !unsaved_files) 3734 return CXError_InvalidArguments; 3735 3736 CXErrorCode result = CXError_Failure; 3737 auto ParseTranslationUnitImpl = [=, &result] { 3738 noteBottomOfStack(); 3739 result = clang_parseTranslationUnit_Impl( 3740 CIdx, source_filename, command_line_args, num_command_line_args, 3741 llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU); 3742 }; 3743 3744 llvm::CrashRecoveryContext CRC; 3745 3746 if (!RunSafely(CRC, ParseTranslationUnitImpl)) { 3747 fprintf(stderr, "libclang: crash detected during parsing: {\n"); 3748 fprintf(stderr, " 'source_filename' : '%s'\n", source_filename); 3749 fprintf(stderr, " 'command_line_args' : ["); 3750 for (int i = 0; i != num_command_line_args; ++i) { 3751 if (i) 3752 fprintf(stderr, ", "); 3753 fprintf(stderr, "'%s'", command_line_args[i]); 3754 } 3755 fprintf(stderr, "],\n"); 3756 fprintf(stderr, " 'unsaved_files' : ["); 3757 for (unsigned i = 0; i != num_unsaved_files; ++i) { 3758 if (i) 3759 fprintf(stderr, ", "); 3760 fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename, 3761 unsaved_files[i].Length); 3762 } 3763 fprintf(stderr, "],\n"); 3764 fprintf(stderr, " 'options' : %d,\n", options); 3765 fprintf(stderr, "}\n"); 3766 3767 return CXError_Crashed; 3768 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) { 3769 if (CXTranslationUnit *TU = out_TU) 3770 PrintLibclangResourceUsage(*TU); 3771 } 3772 3773 return result; 3774 } 3775 3776 CXString clang_Type_getObjCEncoding(CXType CT) { 3777 CXTranslationUnit tu = static_cast<CXTranslationUnit>(CT.data[1]); 3778 ASTContext &Ctx = getASTUnit(tu)->getASTContext(); 3779 std::string encoding; 3780 Ctx.getObjCEncodingForType(QualType::getFromOpaquePtr(CT.data[0]), encoding); 3781 3782 return cxstring::createDup(encoding); 3783 } 3784 3785 static const IdentifierInfo *getMacroIdentifier(CXCursor C) { 3786 if (C.kind == CXCursor_MacroDefinition) { 3787 if (const MacroDefinitionRecord *MDR = getCursorMacroDefinition(C)) 3788 return MDR->getName(); 3789 } else if (C.kind == CXCursor_MacroExpansion) { 3790 MacroExpansionCursor ME = getCursorMacroExpansion(C); 3791 return ME.getName(); 3792 } 3793 return nullptr; 3794 } 3795 3796 unsigned clang_Cursor_isMacroFunctionLike(CXCursor C) { 3797 const IdentifierInfo *II = getMacroIdentifier(C); 3798 if (!II) { 3799 return false; 3800 } 3801 ASTUnit *ASTU = getCursorASTUnit(C); 3802 Preprocessor &PP = ASTU->getPreprocessor(); 3803 if (const MacroInfo *MI = PP.getMacroInfo(II)) 3804 return MI->isFunctionLike(); 3805 return false; 3806 } 3807 3808 unsigned clang_Cursor_isMacroBuiltin(CXCursor C) { 3809 const IdentifierInfo *II = getMacroIdentifier(C); 3810 if (!II) { 3811 return false; 3812 } 3813 ASTUnit *ASTU = getCursorASTUnit(C); 3814 Preprocessor &PP = ASTU->getPreprocessor(); 3815 if (const MacroInfo *MI = PP.getMacroInfo(II)) 3816 return MI->isBuiltinMacro(); 3817 return false; 3818 } 3819 3820 unsigned clang_Cursor_isFunctionInlined(CXCursor C) { 3821 const Decl *D = getCursorDecl(C); 3822 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D); 3823 if (!FD) { 3824 return false; 3825 } 3826 return FD->isInlined(); 3827 } 3828 3829 static StringLiteral *getCFSTR_value(CallExpr *callExpr) { 3830 if (callExpr->getNumArgs() != 1) { 3831 return nullptr; 3832 } 3833 3834 StringLiteral *S = nullptr; 3835 auto *arg = callExpr->getArg(0); 3836 if (arg->getStmtClass() == Stmt::ImplicitCastExprClass) { 3837 ImplicitCastExpr *I = static_cast<ImplicitCastExpr *>(arg); 3838 auto *subExpr = I->getSubExprAsWritten(); 3839 3840 if (subExpr->getStmtClass() != Stmt::StringLiteralClass) { 3841 return nullptr; 3842 } 3843 3844 S = static_cast<StringLiteral *>(I->getSubExprAsWritten()); 3845 } else if (arg->getStmtClass() == Stmt::StringLiteralClass) { 3846 S = static_cast<StringLiteral *>(callExpr->getArg(0)); 3847 } else { 3848 return nullptr; 3849 } 3850 return S; 3851 } 3852 3853 struct ExprEvalResult { 3854 CXEvalResultKind EvalType; 3855 union { 3856 unsigned long long unsignedVal; 3857 long long intVal; 3858 double floatVal; 3859 char *stringVal; 3860 } EvalData; 3861 bool IsUnsignedInt; 3862 ~ExprEvalResult() { 3863 if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float && 3864 EvalType != CXEval_Int) { 3865 delete[] EvalData.stringVal; 3866 } 3867 } 3868 }; 3869 3870 void clang_EvalResult_dispose(CXEvalResult E) { 3871 delete static_cast<ExprEvalResult *>(E); 3872 } 3873 3874 CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) { 3875 if (!E) { 3876 return CXEval_UnExposed; 3877 } 3878 return ((ExprEvalResult *)E)->EvalType; 3879 } 3880 3881 int clang_EvalResult_getAsInt(CXEvalResult E) { 3882 return clang_EvalResult_getAsLongLong(E); 3883 } 3884 3885 long long clang_EvalResult_getAsLongLong(CXEvalResult E) { 3886 if (!E) { 3887 return 0; 3888 } 3889 ExprEvalResult *Result = (ExprEvalResult *)E; 3890 if (Result->IsUnsignedInt) 3891 return Result->EvalData.unsignedVal; 3892 return Result->EvalData.intVal; 3893 } 3894 3895 unsigned clang_EvalResult_isUnsignedInt(CXEvalResult E) { 3896 return ((ExprEvalResult *)E)->IsUnsignedInt; 3897 } 3898 3899 unsigned long long clang_EvalResult_getAsUnsigned(CXEvalResult E) { 3900 if (!E) { 3901 return 0; 3902 } 3903 3904 ExprEvalResult *Result = (ExprEvalResult *)E; 3905 if (Result->IsUnsignedInt) 3906 return Result->EvalData.unsignedVal; 3907 return Result->EvalData.intVal; 3908 } 3909 3910 double clang_EvalResult_getAsDouble(CXEvalResult E) { 3911 if (!E) { 3912 return 0; 3913 } 3914 return ((ExprEvalResult *)E)->EvalData.floatVal; 3915 } 3916 3917 const char *clang_EvalResult_getAsStr(CXEvalResult E) { 3918 if (!E) { 3919 return nullptr; 3920 } 3921 return ((ExprEvalResult *)E)->EvalData.stringVal; 3922 } 3923 3924 static const ExprEvalResult *evaluateExpr(Expr *expr, CXCursor C) { 3925 Expr::EvalResult ER; 3926 ASTContext &ctx = getCursorContext(C); 3927 if (!expr) 3928 return nullptr; 3929 3930 expr = expr->IgnoreParens(); 3931 if (expr->isValueDependent()) 3932 return nullptr; 3933 if (!expr->EvaluateAsRValue(ER, ctx)) 3934 return nullptr; 3935 3936 QualType rettype; 3937 CallExpr *callExpr; 3938 auto result = std::make_unique<ExprEvalResult>(); 3939 result->EvalType = CXEval_UnExposed; 3940 result->IsUnsignedInt = false; 3941 3942 if (ER.Val.isInt()) { 3943 result->EvalType = CXEval_Int; 3944 3945 auto &val = ER.Val.getInt(); 3946 if (val.isUnsigned()) { 3947 result->IsUnsignedInt = true; 3948 result->EvalData.unsignedVal = val.getZExtValue(); 3949 } else { 3950 result->EvalData.intVal = val.getExtValue(); 3951 } 3952 3953 return result.release(); 3954 } 3955 3956 if (ER.Val.isFloat()) { 3957 llvm::SmallVector<char, 100> Buffer; 3958 ER.Val.getFloat().toString(Buffer); 3959 std::string floatStr(Buffer.data(), Buffer.size()); 3960 result->EvalType = CXEval_Float; 3961 bool ignored; 3962 llvm::APFloat apFloat = ER.Val.getFloat(); 3963 apFloat.convert(llvm::APFloat::IEEEdouble(), 3964 llvm::APFloat::rmNearestTiesToEven, &ignored); 3965 result->EvalData.floatVal = apFloat.convertToDouble(); 3966 return result.release(); 3967 } 3968 3969 if (expr->getStmtClass() == Stmt::ImplicitCastExprClass) { 3970 const ImplicitCastExpr *I = dyn_cast<ImplicitCastExpr>(expr); 3971 auto *subExpr = I->getSubExprAsWritten(); 3972 if (subExpr->getStmtClass() == Stmt::StringLiteralClass || 3973 subExpr->getStmtClass() == Stmt::ObjCStringLiteralClass) { 3974 const StringLiteral *StrE = nullptr; 3975 const ObjCStringLiteral *ObjCExpr; 3976 ObjCExpr = dyn_cast<ObjCStringLiteral>(subExpr); 3977 3978 if (ObjCExpr) { 3979 StrE = ObjCExpr->getString(); 3980 result->EvalType = CXEval_ObjCStrLiteral; 3981 } else { 3982 StrE = cast<StringLiteral>(I->getSubExprAsWritten()); 3983 result->EvalType = CXEval_StrLiteral; 3984 } 3985 3986 std::string strRef(StrE->getString().str()); 3987 result->EvalData.stringVal = new char[strRef.size() + 1]; 3988 strncpy((char *)result->EvalData.stringVal, strRef.c_str(), 3989 strRef.size()); 3990 result->EvalData.stringVal[strRef.size()] = '\0'; 3991 return result.release(); 3992 } 3993 } else if (expr->getStmtClass() == Stmt::ObjCStringLiteralClass || 3994 expr->getStmtClass() == Stmt::StringLiteralClass) { 3995 const StringLiteral *StrE = nullptr; 3996 const ObjCStringLiteral *ObjCExpr; 3997 ObjCExpr = dyn_cast<ObjCStringLiteral>(expr); 3998 3999 if (ObjCExpr) { 4000 StrE = ObjCExpr->getString(); 4001 result->EvalType = CXEval_ObjCStrLiteral; 4002 } else { 4003 StrE = cast<StringLiteral>(expr); 4004 result->EvalType = CXEval_StrLiteral; 4005 } 4006 4007 std::string strRef(StrE->getString().str()); 4008 result->EvalData.stringVal = new char[strRef.size() + 1]; 4009 strncpy((char *)result->EvalData.stringVal, strRef.c_str(), strRef.size()); 4010 result->EvalData.stringVal[strRef.size()] = '\0'; 4011 return result.release(); 4012 } 4013 4014 if (expr->getStmtClass() == Stmt::CStyleCastExprClass) { 4015 CStyleCastExpr *CC = static_cast<CStyleCastExpr *>(expr); 4016 4017 rettype = CC->getType(); 4018 if (rettype.getAsString() == "CFStringRef" && 4019 CC->getSubExpr()->getStmtClass() == Stmt::CallExprClass) { 4020 4021 callExpr = static_cast<CallExpr *>(CC->getSubExpr()); 4022 StringLiteral *S = getCFSTR_value(callExpr); 4023 if (S) { 4024 std::string strLiteral(S->getString().str()); 4025 result->EvalType = CXEval_CFStr; 4026 4027 result->EvalData.stringVal = new char[strLiteral.size() + 1]; 4028 strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(), 4029 strLiteral.size()); 4030 result->EvalData.stringVal[strLiteral.size()] = '\0'; 4031 return result.release(); 4032 } 4033 } 4034 4035 } else if (expr->getStmtClass() == Stmt::CallExprClass) { 4036 callExpr = static_cast<CallExpr *>(expr); 4037 rettype = callExpr->getCallReturnType(ctx); 4038 4039 if (rettype->isVectorType() || callExpr->getNumArgs() > 1) 4040 return nullptr; 4041 4042 if (rettype->isIntegralType(ctx) || rettype->isRealFloatingType()) { 4043 if (callExpr->getNumArgs() == 1 && 4044 !callExpr->getArg(0)->getType()->isIntegralType(ctx)) 4045 return nullptr; 4046 } else if (rettype.getAsString() == "CFStringRef") { 4047 4048 StringLiteral *S = getCFSTR_value(callExpr); 4049 if (S) { 4050 std::string strLiteral(S->getString().str()); 4051 result->EvalType = CXEval_CFStr; 4052 result->EvalData.stringVal = new char[strLiteral.size() + 1]; 4053 strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(), 4054 strLiteral.size()); 4055 result->EvalData.stringVal[strLiteral.size()] = '\0'; 4056 return result.release(); 4057 } 4058 } 4059 } else if (expr->getStmtClass() == Stmt::DeclRefExprClass) { 4060 DeclRefExpr *D = static_cast<DeclRefExpr *>(expr); 4061 ValueDecl *V = D->getDecl(); 4062 if (V->getKind() == Decl::Function) { 4063 std::string strName = V->getNameAsString(); 4064 result->EvalType = CXEval_Other; 4065 result->EvalData.stringVal = new char[strName.size() + 1]; 4066 strncpy(result->EvalData.stringVal, strName.c_str(), strName.size()); 4067 result->EvalData.stringVal[strName.size()] = '\0'; 4068 return result.release(); 4069 } 4070 } 4071 4072 return nullptr; 4073 } 4074 4075 static const Expr *evaluateDeclExpr(const Decl *D) { 4076 if (!D) 4077 return nullptr; 4078 if (auto *Var = dyn_cast<VarDecl>(D)) 4079 return Var->getInit(); 4080 else if (auto *Field = dyn_cast<FieldDecl>(D)) 4081 return Field->getInClassInitializer(); 4082 return nullptr; 4083 } 4084 4085 static const Expr *evaluateCompoundStmtExpr(const CompoundStmt *CS) { 4086 assert(CS && "invalid compound statement"); 4087 for (auto *bodyIterator : CS->body()) { 4088 if (const auto *E = dyn_cast<Expr>(bodyIterator)) 4089 return E; 4090 } 4091 return nullptr; 4092 } 4093 4094 CXEvalResult clang_Cursor_Evaluate(CXCursor C) { 4095 const Expr *E = nullptr; 4096 if (clang_getCursorKind(C) == CXCursor_CompoundStmt) 4097 E = evaluateCompoundStmtExpr(cast<CompoundStmt>(getCursorStmt(C))); 4098 else if (clang_isDeclaration(C.kind)) 4099 E = evaluateDeclExpr(getCursorDecl(C)); 4100 else if (clang_isExpression(C.kind)) 4101 E = getCursorExpr(C); 4102 if (E) 4103 return const_cast<CXEvalResult>( 4104 reinterpret_cast<const void *>(evaluateExpr(const_cast<Expr *>(E), C))); 4105 return nullptr; 4106 } 4107 4108 unsigned clang_Cursor_hasAttrs(CXCursor C) { 4109 const Decl *D = getCursorDecl(C); 4110 if (!D) { 4111 return 0; 4112 } 4113 4114 if (D->hasAttrs()) { 4115 return 1; 4116 } 4117 4118 return 0; 4119 } 4120 unsigned clang_defaultSaveOptions(CXTranslationUnit TU) { 4121 return CXSaveTranslationUnit_None; 4122 } 4123 4124 static CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU, 4125 const char *FileName, 4126 unsigned options) { 4127 CIndexer *CXXIdx = TU->CIdx; 4128 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) 4129 setThreadBackgroundPriority(); 4130 4131 bool hadError = cxtu::getASTUnit(TU)->Save(FileName); 4132 return hadError ? CXSaveError_Unknown : CXSaveError_None; 4133 } 4134 4135 int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, 4136 unsigned options) { 4137 LOG_FUNC_SECTION { *Log << TU << ' ' << FileName; } 4138 4139 if (isNotUsableTU(TU)) { 4140 LOG_BAD_TU(TU); 4141 return CXSaveError_InvalidTU; 4142 } 4143 4144 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4145 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 4146 if (!CXXUnit->hasSema()) 4147 return CXSaveError_InvalidTU; 4148 4149 CXSaveError result; 4150 auto SaveTranslationUnitImpl = [=, &result]() { 4151 result = clang_saveTranslationUnit_Impl(TU, FileName, options); 4152 }; 4153 4154 if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred()) { 4155 SaveTranslationUnitImpl(); 4156 4157 if (getenv("LIBCLANG_RESOURCE_USAGE")) 4158 PrintLibclangResourceUsage(TU); 4159 4160 return result; 4161 } 4162 4163 // We have an AST that has invalid nodes due to compiler errors. 4164 // Use a crash recovery thread for protection. 4165 4166 llvm::CrashRecoveryContext CRC; 4167 4168 if (!RunSafely(CRC, SaveTranslationUnitImpl)) { 4169 fprintf(stderr, "libclang: crash detected during AST saving: {\n"); 4170 fprintf(stderr, " 'filename' : '%s'\n", FileName); 4171 fprintf(stderr, " 'options' : %d,\n", options); 4172 fprintf(stderr, "}\n"); 4173 4174 return CXSaveError_Unknown; 4175 4176 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) { 4177 PrintLibclangResourceUsage(TU); 4178 } 4179 4180 return result; 4181 } 4182 4183 void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) { 4184 if (CTUnit) { 4185 // If the translation unit has been marked as unsafe to free, just discard 4186 // it. 4187 ASTUnit *Unit = cxtu::getASTUnit(CTUnit); 4188 if (Unit && Unit->isUnsafeToFree()) 4189 return; 4190 4191 delete cxtu::getASTUnit(CTUnit); 4192 delete CTUnit->StringPool; 4193 delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics); 4194 disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool); 4195 delete CTUnit->CommentToXML; 4196 delete CTUnit; 4197 } 4198 } 4199 4200 unsigned clang_suspendTranslationUnit(CXTranslationUnit CTUnit) { 4201 if (CTUnit) { 4202 ASTUnit *Unit = cxtu::getASTUnit(CTUnit); 4203 4204 if (Unit && Unit->isUnsafeToFree()) 4205 return false; 4206 4207 Unit->ResetForParse(); 4208 return true; 4209 } 4210 4211 return false; 4212 } 4213 4214 unsigned clang_defaultReparseOptions(CXTranslationUnit TU) { 4215 return CXReparse_None; 4216 } 4217 4218 static CXErrorCode 4219 clang_reparseTranslationUnit_Impl(CXTranslationUnit TU, 4220 ArrayRef<CXUnsavedFile> unsaved_files, 4221 unsigned options) { 4222 // Check arguments. 4223 if (isNotUsableTU(TU)) { 4224 LOG_BAD_TU(TU); 4225 return CXError_InvalidArguments; 4226 } 4227 4228 // Reset the associated diagnostics. 4229 delete static_cast<CXDiagnosticSetImpl *>(TU->Diagnostics); 4230 TU->Diagnostics = nullptr; 4231 4232 CIndexer *CXXIdx = TU->CIdx; 4233 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) 4234 setThreadBackgroundPriority(); 4235 4236 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4237 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 4238 4239 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles( 4240 new std::vector<ASTUnit::RemappedFile>()); 4241 4242 // Recover resources if we crash before exiting this function. 4243 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<ASTUnit::RemappedFile>> 4244 RemappedCleanup(RemappedFiles.get()); 4245 4246 for (auto &UF : unsaved_files) { 4247 std::unique_ptr<llvm::MemoryBuffer> MB = 4248 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); 4249 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); 4250 } 4251 4252 if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(), 4253 *RemappedFiles.get())) 4254 return CXError_Success; 4255 if (isASTReadError(CXXUnit)) 4256 return CXError_ASTReadError; 4257 return CXError_Failure; 4258 } 4259 4260 int clang_reparseTranslationUnit(CXTranslationUnit TU, 4261 unsigned num_unsaved_files, 4262 struct CXUnsavedFile *unsaved_files, 4263 unsigned options) { 4264 LOG_FUNC_SECTION { *Log << TU; } 4265 4266 if (num_unsaved_files && !unsaved_files) 4267 return CXError_InvalidArguments; 4268 4269 CXErrorCode result; 4270 auto ReparseTranslationUnitImpl = [=, &result]() { 4271 result = clang_reparseTranslationUnit_Impl( 4272 TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options); 4273 }; 4274 4275 llvm::CrashRecoveryContext CRC; 4276 4277 if (!RunSafely(CRC, ReparseTranslationUnitImpl)) { 4278 fprintf(stderr, "libclang: crash detected during reparsing\n"); 4279 cxtu::getASTUnit(TU)->setUnsafeToFree(true); 4280 return CXError_Crashed; 4281 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) 4282 PrintLibclangResourceUsage(TU); 4283 4284 return result; 4285 } 4286 4287 CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) { 4288 if (isNotUsableTU(CTUnit)) { 4289 LOG_BAD_TU(CTUnit); 4290 return cxstring::createEmpty(); 4291 } 4292 4293 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); 4294 return cxstring::createDup(CXXUnit->getOriginalSourceFileName()); 4295 } 4296 4297 CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) { 4298 if (isNotUsableTU(TU)) { 4299 LOG_BAD_TU(TU); 4300 return clang_getNullCursor(); 4301 } 4302 4303 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4304 return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU); 4305 } 4306 4307 CXTargetInfo clang_getTranslationUnitTargetInfo(CXTranslationUnit CTUnit) { 4308 if (isNotUsableTU(CTUnit)) { 4309 LOG_BAD_TU(CTUnit); 4310 return nullptr; 4311 } 4312 4313 CXTargetInfoImpl *impl = new CXTargetInfoImpl(); 4314 impl->TranslationUnit = CTUnit; 4315 return impl; 4316 } 4317 4318 CXString clang_TargetInfo_getTriple(CXTargetInfo TargetInfo) { 4319 if (!TargetInfo) 4320 return cxstring::createEmpty(); 4321 4322 CXTranslationUnit CTUnit = TargetInfo->TranslationUnit; 4323 assert(!isNotUsableTU(CTUnit) && 4324 "Unexpected unusable translation unit in TargetInfo"); 4325 4326 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); 4327 std::string Triple = 4328 CXXUnit->getASTContext().getTargetInfo().getTriple().normalize(); 4329 return cxstring::createDup(Triple); 4330 } 4331 4332 int clang_TargetInfo_getPointerWidth(CXTargetInfo TargetInfo) { 4333 if (!TargetInfo) 4334 return -1; 4335 4336 CXTranslationUnit CTUnit = TargetInfo->TranslationUnit; 4337 assert(!isNotUsableTU(CTUnit) && 4338 "Unexpected unusable translation unit in TargetInfo"); 4339 4340 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); 4341 return CXXUnit->getASTContext().getTargetInfo().getMaxPointerWidth(); 4342 } 4343 4344 void clang_TargetInfo_dispose(CXTargetInfo TargetInfo) { 4345 if (!TargetInfo) 4346 return; 4347 4348 delete TargetInfo; 4349 } 4350 4351 //===----------------------------------------------------------------------===// 4352 // CXFile Operations. 4353 //===----------------------------------------------------------------------===// 4354 4355 CXString clang_getFileName(CXFile SFile) { 4356 if (!SFile) 4357 return cxstring::createNull(); 4358 4359 FileEntry *FEnt = static_cast<FileEntry *>(SFile); 4360 return cxstring::createRef(FEnt->getName()); 4361 } 4362 4363 time_t clang_getFileTime(CXFile SFile) { 4364 if (!SFile) 4365 return 0; 4366 4367 FileEntry *FEnt = static_cast<FileEntry *>(SFile); 4368 return FEnt->getModificationTime(); 4369 } 4370 4371 CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) { 4372 if (isNotUsableTU(TU)) { 4373 LOG_BAD_TU(TU); 4374 return nullptr; 4375 } 4376 4377 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4378 4379 FileManager &FMgr = CXXUnit->getFileManager(); 4380 auto File = FMgr.getFile(file_name); 4381 if (!File) 4382 return nullptr; 4383 return const_cast<FileEntry *>(*File); 4384 } 4385 4386 const char *clang_getFileContents(CXTranslationUnit TU, CXFile file, 4387 size_t *size) { 4388 if (isNotUsableTU(TU)) { 4389 LOG_BAD_TU(TU); 4390 return nullptr; 4391 } 4392 4393 const SourceManager &SM = cxtu::getASTUnit(TU)->getSourceManager(); 4394 FileID fid = SM.translateFile(static_cast<FileEntry *>(file)); 4395 llvm::Optional<llvm::MemoryBufferRef> buf = SM.getBufferOrNone(fid); 4396 if (!buf) { 4397 if (size) 4398 *size = 0; 4399 return nullptr; 4400 } 4401 if (size) 4402 *size = buf->getBufferSize(); 4403 return buf->getBufferStart(); 4404 } 4405 4406 unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, CXFile file) { 4407 if (isNotUsableTU(TU)) { 4408 LOG_BAD_TU(TU); 4409 return 0; 4410 } 4411 4412 if (!file) 4413 return 0; 4414 4415 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4416 FileEntry *FEnt = static_cast<FileEntry *>(file); 4417 return CXXUnit->getPreprocessor() 4418 .getHeaderSearchInfo() 4419 .isFileMultipleIncludeGuarded(FEnt); 4420 } 4421 4422 int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) { 4423 if (!file || !outID) 4424 return 1; 4425 4426 FileEntry *FEnt = static_cast<FileEntry *>(file); 4427 const llvm::sys::fs::UniqueID &ID = FEnt->getUniqueID(); 4428 outID->data[0] = ID.getDevice(); 4429 outID->data[1] = ID.getFile(); 4430 outID->data[2] = FEnt->getModificationTime(); 4431 return 0; 4432 } 4433 4434 int clang_File_isEqual(CXFile file1, CXFile file2) { 4435 if (file1 == file2) 4436 return true; 4437 4438 if (!file1 || !file2) 4439 return false; 4440 4441 FileEntry *FEnt1 = static_cast<FileEntry *>(file1); 4442 FileEntry *FEnt2 = static_cast<FileEntry *>(file2); 4443 return FEnt1->getUniqueID() == FEnt2->getUniqueID(); 4444 } 4445 4446 CXString clang_File_tryGetRealPathName(CXFile SFile) { 4447 if (!SFile) 4448 return cxstring::createNull(); 4449 4450 FileEntry *FEnt = static_cast<FileEntry *>(SFile); 4451 return cxstring::createRef(FEnt->tryGetRealPathName()); 4452 } 4453 4454 //===----------------------------------------------------------------------===// 4455 // CXCursor Operations. 4456 //===----------------------------------------------------------------------===// 4457 4458 static const Decl *getDeclFromExpr(const Stmt *E) { 4459 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 4460 return getDeclFromExpr(CE->getSubExpr()); 4461 4462 if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E)) 4463 return RefExpr->getDecl(); 4464 if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 4465 return ME->getMemberDecl(); 4466 if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E)) 4467 return RE->getDecl(); 4468 if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) { 4469 if (PRE->isExplicitProperty()) 4470 return PRE->getExplicitProperty(); 4471 // It could be messaging both getter and setter as in: 4472 // ++myobj.myprop; 4473 // in which case prefer to associate the setter since it is less obvious 4474 // from inspecting the source that the setter is going to get called. 4475 if (PRE->isMessagingSetter()) 4476 return PRE->getImplicitPropertySetter(); 4477 return PRE->getImplicitPropertyGetter(); 4478 } 4479 if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) 4480 return getDeclFromExpr(POE->getSyntacticForm()); 4481 if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) 4482 if (Expr *Src = OVE->getSourceExpr()) 4483 return getDeclFromExpr(Src); 4484 4485 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) 4486 return getDeclFromExpr(CE->getCallee()); 4487 if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) 4488 if (!CE->isElidable()) 4489 return CE->getConstructor(); 4490 if (const CXXInheritedCtorInitExpr *CE = 4491 dyn_cast<CXXInheritedCtorInitExpr>(E)) 4492 return CE->getConstructor(); 4493 if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E)) 4494 return OME->getMethodDecl(); 4495 4496 if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E)) 4497 return PE->getProtocol(); 4498 if (const SubstNonTypeTemplateParmPackExpr *NTTP = 4499 dyn_cast<SubstNonTypeTemplateParmPackExpr>(E)) 4500 return NTTP->getParameterPack(); 4501 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E)) 4502 if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) || 4503 isa<ParmVarDecl>(SizeOfPack->getPack())) 4504 return SizeOfPack->getPack(); 4505 4506 return nullptr; 4507 } 4508 4509 static SourceLocation getLocationFromExpr(const Expr *E) { 4510 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 4511 return getLocationFromExpr(CE->getSubExpr()); 4512 4513 if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E)) 4514 return /*FIXME:*/ Msg->getLeftLoc(); 4515 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 4516 return DRE->getLocation(); 4517 if (const MemberExpr *Member = dyn_cast<MemberExpr>(E)) 4518 return Member->getMemberLoc(); 4519 if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E)) 4520 return Ivar->getLocation(); 4521 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E)) 4522 return SizeOfPack->getPackLoc(); 4523 if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E)) 4524 return PropRef->getLocation(); 4525 4526 return E->getBeginLoc(); 4527 } 4528 4529 extern "C" { 4530 4531 unsigned clang_visitChildren(CXCursor parent, CXCursorVisitor visitor, 4532 CXClientData client_data) { 4533 CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data, 4534 /*VisitPreprocessorLast=*/false); 4535 return CursorVis.VisitChildren(parent); 4536 } 4537 4538 #ifndef __has_feature 4539 #define __has_feature(x) 0 4540 #endif 4541 #if __has_feature(blocks) 4542 typedef enum CXChildVisitResult (^CXCursorVisitorBlock)(CXCursor cursor, 4543 CXCursor parent); 4544 4545 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 4546 CXClientData client_data) { 4547 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 4548 return block(cursor, parent); 4549 } 4550 #else 4551 // If we are compiled with a compiler that doesn't have native blocks support, 4552 // define and call the block manually, so the 4553 typedef struct _CXChildVisitResult { 4554 void *isa; 4555 int flags; 4556 int reserved; 4557 enum CXChildVisitResult (*invoke)(struct _CXChildVisitResult *, CXCursor, 4558 CXCursor); 4559 } * CXCursorVisitorBlock; 4560 4561 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 4562 CXClientData client_data) { 4563 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 4564 return block->invoke(block, cursor, parent); 4565 } 4566 #endif 4567 4568 unsigned clang_visitChildrenWithBlock(CXCursor parent, 4569 CXCursorVisitorBlock block) { 4570 return clang_visitChildren(parent, visitWithBlock, block); 4571 } 4572 4573 static CXString getDeclSpelling(const Decl *D) { 4574 if (!D) 4575 return cxstring::createEmpty(); 4576 4577 const NamedDecl *ND = dyn_cast<NamedDecl>(D); 4578 if (!ND) { 4579 if (const ObjCPropertyImplDecl *PropImpl = 4580 dyn_cast<ObjCPropertyImplDecl>(D)) 4581 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 4582 return cxstring::createDup(Property->getIdentifier()->getName()); 4583 4584 if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D)) 4585 if (Module *Mod = ImportD->getImportedModule()) 4586 return cxstring::createDup(Mod->getFullModuleName()); 4587 4588 return cxstring::createEmpty(); 4589 } 4590 4591 if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND)) 4592 return cxstring::createDup(OMD->getSelector().getAsString()); 4593 4594 if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND)) 4595 // No, this isn't the same as the code below. getIdentifier() is non-virtual 4596 // and returns different names. NamedDecl returns the class name and 4597 // ObjCCategoryImplDecl returns the category name. 4598 return cxstring::createRef(CIMP->getIdentifier()->getNameStart()); 4599 4600 if (isa<UsingDirectiveDecl>(D)) 4601 return cxstring::createEmpty(); 4602 4603 SmallString<1024> S; 4604 llvm::raw_svector_ostream os(S); 4605 ND->printName(os); 4606 4607 return cxstring::createDup(os.str()); 4608 } 4609 4610 CXString clang_getCursorSpelling(CXCursor C) { 4611 if (clang_isTranslationUnit(C.kind)) 4612 return clang_getTranslationUnitSpelling(getCursorTU(C)); 4613 4614 if (clang_isReference(C.kind)) { 4615 switch (C.kind) { 4616 case CXCursor_ObjCSuperClassRef: { 4617 const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first; 4618 return cxstring::createRef(Super->getIdentifier()->getNameStart()); 4619 } 4620 case CXCursor_ObjCClassRef: { 4621 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 4622 return cxstring::createRef(Class->getIdentifier()->getNameStart()); 4623 } 4624 case CXCursor_ObjCProtocolRef: { 4625 const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first; 4626 assert(OID && "getCursorSpelling(): Missing protocol decl"); 4627 return cxstring::createRef(OID->getIdentifier()->getNameStart()); 4628 } 4629 case CXCursor_CXXBaseSpecifier: { 4630 const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C); 4631 return cxstring::createDup(B->getType().getAsString()); 4632 } 4633 case CXCursor_TypeRef: { 4634 const TypeDecl *Type = getCursorTypeRef(C).first; 4635 assert(Type && "Missing type decl"); 4636 4637 return cxstring::createDup( 4638 getCursorContext(C).getTypeDeclType(Type).getAsString()); 4639 } 4640 case CXCursor_TemplateRef: { 4641 const TemplateDecl *Template = getCursorTemplateRef(C).first; 4642 assert(Template && "Missing template decl"); 4643 4644 return cxstring::createDup(Template->getNameAsString()); 4645 } 4646 4647 case CXCursor_NamespaceRef: { 4648 const NamedDecl *NS = getCursorNamespaceRef(C).first; 4649 assert(NS && "Missing namespace decl"); 4650 4651 return cxstring::createDup(NS->getNameAsString()); 4652 } 4653 4654 case CXCursor_MemberRef: { 4655 const FieldDecl *Field = getCursorMemberRef(C).first; 4656 assert(Field && "Missing member decl"); 4657 4658 return cxstring::createDup(Field->getNameAsString()); 4659 } 4660 4661 case CXCursor_LabelRef: { 4662 const LabelStmt *Label = getCursorLabelRef(C).first; 4663 assert(Label && "Missing label"); 4664 4665 return cxstring::createRef(Label->getName()); 4666 } 4667 4668 case CXCursor_OverloadedDeclRef: { 4669 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 4670 if (const Decl *D = Storage.dyn_cast<const Decl *>()) { 4671 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 4672 return cxstring::createDup(ND->getNameAsString()); 4673 return cxstring::createEmpty(); 4674 } 4675 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 4676 return cxstring::createDup(E->getName().getAsString()); 4677 OverloadedTemplateStorage *Ovl = 4678 Storage.get<OverloadedTemplateStorage *>(); 4679 if (Ovl->size() == 0) 4680 return cxstring::createEmpty(); 4681 return cxstring::createDup((*Ovl->begin())->getNameAsString()); 4682 } 4683 4684 case CXCursor_VariableRef: { 4685 const VarDecl *Var = getCursorVariableRef(C).first; 4686 assert(Var && "Missing variable decl"); 4687 4688 return cxstring::createDup(Var->getNameAsString()); 4689 } 4690 4691 default: 4692 return cxstring::createRef("<not implemented>"); 4693 } 4694 } 4695 4696 if (clang_isExpression(C.kind)) { 4697 const Expr *E = getCursorExpr(C); 4698 4699 if (C.kind == CXCursor_ObjCStringLiteral || 4700 C.kind == CXCursor_StringLiteral) { 4701 const StringLiteral *SLit; 4702 if (const ObjCStringLiteral *OSL = dyn_cast<ObjCStringLiteral>(E)) { 4703 SLit = OSL->getString(); 4704 } else { 4705 SLit = cast<StringLiteral>(E); 4706 } 4707 SmallString<256> Buf; 4708 llvm::raw_svector_ostream OS(Buf); 4709 SLit->outputString(OS); 4710 return cxstring::createDup(OS.str()); 4711 } 4712 4713 const Decl *D = getDeclFromExpr(getCursorExpr(C)); 4714 if (D) 4715 return getDeclSpelling(D); 4716 return cxstring::createEmpty(); 4717 } 4718 4719 if (clang_isStatement(C.kind)) { 4720 const Stmt *S = getCursorStmt(C); 4721 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) 4722 return cxstring::createRef(Label->getName()); 4723 4724 return cxstring::createEmpty(); 4725 } 4726 4727 if (C.kind == CXCursor_MacroExpansion) 4728 return cxstring::createRef( 4729 getCursorMacroExpansion(C).getName()->getNameStart()); 4730 4731 if (C.kind == CXCursor_MacroDefinition) 4732 return cxstring::createRef( 4733 getCursorMacroDefinition(C)->getName()->getNameStart()); 4734 4735 if (C.kind == CXCursor_InclusionDirective) 4736 return cxstring::createDup(getCursorInclusionDirective(C)->getFileName()); 4737 4738 if (clang_isDeclaration(C.kind)) 4739 return getDeclSpelling(getCursorDecl(C)); 4740 4741 if (C.kind == CXCursor_AnnotateAttr) { 4742 const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C)); 4743 return cxstring::createDup(AA->getAnnotation()); 4744 } 4745 4746 if (C.kind == CXCursor_AsmLabelAttr) { 4747 const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C)); 4748 return cxstring::createDup(AA->getLabel()); 4749 } 4750 4751 if (C.kind == CXCursor_PackedAttr) { 4752 return cxstring::createRef("packed"); 4753 } 4754 4755 if (C.kind == CXCursor_VisibilityAttr) { 4756 const VisibilityAttr *AA = cast<VisibilityAttr>(cxcursor::getCursorAttr(C)); 4757 switch (AA->getVisibility()) { 4758 case VisibilityAttr::VisibilityType::Default: 4759 return cxstring::createRef("default"); 4760 case VisibilityAttr::VisibilityType::Hidden: 4761 return cxstring::createRef("hidden"); 4762 case VisibilityAttr::VisibilityType::Protected: 4763 return cxstring::createRef("protected"); 4764 } 4765 llvm_unreachable("unknown visibility type"); 4766 } 4767 4768 return cxstring::createEmpty(); 4769 } 4770 4771 CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C, unsigned pieceIndex, 4772 unsigned options) { 4773 if (clang_Cursor_isNull(C)) 4774 return clang_getNullRange(); 4775 4776 ASTContext &Ctx = getCursorContext(C); 4777 4778 if (clang_isStatement(C.kind)) { 4779 const Stmt *S = getCursorStmt(C); 4780 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) { 4781 if (pieceIndex > 0) 4782 return clang_getNullRange(); 4783 return cxloc::translateSourceRange(Ctx, Label->getIdentLoc()); 4784 } 4785 4786 return clang_getNullRange(); 4787 } 4788 4789 if (C.kind == CXCursor_ObjCMessageExpr) { 4790 if (const ObjCMessageExpr *ME = 4791 dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) { 4792 if (pieceIndex >= ME->getNumSelectorLocs()) 4793 return clang_getNullRange(); 4794 return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex)); 4795 } 4796 } 4797 4798 if (C.kind == CXCursor_ObjCInstanceMethodDecl || 4799 C.kind == CXCursor_ObjCClassMethodDecl) { 4800 if (const ObjCMethodDecl *MD = 4801 dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) { 4802 if (pieceIndex >= MD->getNumSelectorLocs()) 4803 return clang_getNullRange(); 4804 return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex)); 4805 } 4806 } 4807 4808 if (C.kind == CXCursor_ObjCCategoryDecl || 4809 C.kind == CXCursor_ObjCCategoryImplDecl) { 4810 if (pieceIndex > 0) 4811 return clang_getNullRange(); 4812 if (const ObjCCategoryDecl *CD = 4813 dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C))) 4814 return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc()); 4815 if (const ObjCCategoryImplDecl *CID = 4816 dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C))) 4817 return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc()); 4818 } 4819 4820 if (C.kind == CXCursor_ModuleImportDecl) { 4821 if (pieceIndex > 0) 4822 return clang_getNullRange(); 4823 if (const ImportDecl *ImportD = 4824 dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) { 4825 ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs(); 4826 if (!Locs.empty()) 4827 return cxloc::translateSourceRange( 4828 Ctx, SourceRange(Locs.front(), Locs.back())); 4829 } 4830 return clang_getNullRange(); 4831 } 4832 4833 if (C.kind == CXCursor_CXXMethod || C.kind == CXCursor_Destructor || 4834 C.kind == CXCursor_ConversionFunction || 4835 C.kind == CXCursor_FunctionDecl) { 4836 if (pieceIndex > 0) 4837 return clang_getNullRange(); 4838 if (const FunctionDecl *FD = 4839 dyn_cast_or_null<FunctionDecl>(getCursorDecl(C))) { 4840 DeclarationNameInfo FunctionName = FD->getNameInfo(); 4841 return cxloc::translateSourceRange(Ctx, FunctionName.getSourceRange()); 4842 } 4843 return clang_getNullRange(); 4844 } 4845 4846 // FIXME: A CXCursor_InclusionDirective should give the location of the 4847 // filename, but we don't keep track of this. 4848 4849 // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation 4850 // but we don't keep track of this. 4851 4852 // FIXME: A CXCursor_AsmLabelAttr should give the location of the label 4853 // but we don't keep track of this. 4854 4855 // Default handling, give the location of the cursor. 4856 4857 if (pieceIndex > 0) 4858 return clang_getNullRange(); 4859 4860 CXSourceLocation CXLoc = clang_getCursorLocation(C); 4861 SourceLocation Loc = cxloc::translateSourceLocation(CXLoc); 4862 return cxloc::translateSourceRange(Ctx, Loc); 4863 } 4864 4865 CXString clang_Cursor_getMangling(CXCursor C) { 4866 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind)) 4867 return cxstring::createEmpty(); 4868 4869 // Mangling only works for functions and variables. 4870 const Decl *D = getCursorDecl(C); 4871 if (!D || !(isa<FunctionDecl>(D) || isa<VarDecl>(D))) 4872 return cxstring::createEmpty(); 4873 4874 ASTContext &Ctx = D->getASTContext(); 4875 ASTNameGenerator ASTNameGen(Ctx); 4876 return cxstring::createDup(ASTNameGen.getName(D)); 4877 } 4878 4879 CXStringSet *clang_Cursor_getCXXManglings(CXCursor C) { 4880 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind)) 4881 return nullptr; 4882 4883 const Decl *D = getCursorDecl(C); 4884 if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D))) 4885 return nullptr; 4886 4887 ASTContext &Ctx = D->getASTContext(); 4888 ASTNameGenerator ASTNameGen(Ctx); 4889 std::vector<std::string> Manglings = ASTNameGen.getAllManglings(D); 4890 return cxstring::createSet(Manglings); 4891 } 4892 4893 CXStringSet *clang_Cursor_getObjCManglings(CXCursor C) { 4894 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind)) 4895 return nullptr; 4896 4897 const Decl *D = getCursorDecl(C); 4898 if (!(isa<ObjCInterfaceDecl>(D) || isa<ObjCImplementationDecl>(D))) 4899 return nullptr; 4900 4901 ASTContext &Ctx = D->getASTContext(); 4902 ASTNameGenerator ASTNameGen(Ctx); 4903 std::vector<std::string> Manglings = ASTNameGen.getAllManglings(D); 4904 return cxstring::createSet(Manglings); 4905 } 4906 4907 CXPrintingPolicy clang_getCursorPrintingPolicy(CXCursor C) { 4908 if (clang_Cursor_isNull(C)) 4909 return 0; 4910 return new PrintingPolicy(getCursorContext(C).getPrintingPolicy()); 4911 } 4912 4913 void clang_PrintingPolicy_dispose(CXPrintingPolicy Policy) { 4914 if (Policy) 4915 delete static_cast<PrintingPolicy *>(Policy); 4916 } 4917 4918 unsigned 4919 clang_PrintingPolicy_getProperty(CXPrintingPolicy Policy, 4920 enum CXPrintingPolicyProperty Property) { 4921 if (!Policy) 4922 return 0; 4923 4924 PrintingPolicy *P = static_cast<PrintingPolicy *>(Policy); 4925 switch (Property) { 4926 case CXPrintingPolicy_Indentation: 4927 return P->Indentation; 4928 case CXPrintingPolicy_SuppressSpecifiers: 4929 return P->SuppressSpecifiers; 4930 case CXPrintingPolicy_SuppressTagKeyword: 4931 return P->SuppressTagKeyword; 4932 case CXPrintingPolicy_IncludeTagDefinition: 4933 return P->IncludeTagDefinition; 4934 case CXPrintingPolicy_SuppressScope: 4935 return P->SuppressScope; 4936 case CXPrintingPolicy_SuppressUnwrittenScope: 4937 return P->SuppressUnwrittenScope; 4938 case CXPrintingPolicy_SuppressInitializers: 4939 return P->SuppressInitializers; 4940 case CXPrintingPolicy_ConstantArraySizeAsWritten: 4941 return P->ConstantArraySizeAsWritten; 4942 case CXPrintingPolicy_AnonymousTagLocations: 4943 return P->AnonymousTagLocations; 4944 case CXPrintingPolicy_SuppressStrongLifetime: 4945 return P->SuppressStrongLifetime; 4946 case CXPrintingPolicy_SuppressLifetimeQualifiers: 4947 return P->SuppressLifetimeQualifiers; 4948 case CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors: 4949 return P->SuppressTemplateArgsInCXXConstructors; 4950 case CXPrintingPolicy_Bool: 4951 return P->Bool; 4952 case CXPrintingPolicy_Restrict: 4953 return P->Restrict; 4954 case CXPrintingPolicy_Alignof: 4955 return P->Alignof; 4956 case CXPrintingPolicy_UnderscoreAlignof: 4957 return P->UnderscoreAlignof; 4958 case CXPrintingPolicy_UseVoidForZeroParams: 4959 return P->UseVoidForZeroParams; 4960 case CXPrintingPolicy_TerseOutput: 4961 return P->TerseOutput; 4962 case CXPrintingPolicy_PolishForDeclaration: 4963 return P->PolishForDeclaration; 4964 case CXPrintingPolicy_Half: 4965 return P->Half; 4966 case CXPrintingPolicy_MSWChar: 4967 return P->MSWChar; 4968 case CXPrintingPolicy_IncludeNewlines: 4969 return P->IncludeNewlines; 4970 case CXPrintingPolicy_MSVCFormatting: 4971 return P->MSVCFormatting; 4972 case CXPrintingPolicy_ConstantsAsWritten: 4973 return P->ConstantsAsWritten; 4974 case CXPrintingPolicy_SuppressImplicitBase: 4975 return P->SuppressImplicitBase; 4976 case CXPrintingPolicy_FullyQualifiedName: 4977 return P->FullyQualifiedName; 4978 } 4979 4980 assert(false && "Invalid CXPrintingPolicyProperty"); 4981 return 0; 4982 } 4983 4984 void clang_PrintingPolicy_setProperty(CXPrintingPolicy Policy, 4985 enum CXPrintingPolicyProperty Property, 4986 unsigned Value) { 4987 if (!Policy) 4988 return; 4989 4990 PrintingPolicy *P = static_cast<PrintingPolicy *>(Policy); 4991 switch (Property) { 4992 case CXPrintingPolicy_Indentation: 4993 P->Indentation = Value; 4994 return; 4995 case CXPrintingPolicy_SuppressSpecifiers: 4996 P->SuppressSpecifiers = Value; 4997 return; 4998 case CXPrintingPolicy_SuppressTagKeyword: 4999 P->SuppressTagKeyword = Value; 5000 return; 5001 case CXPrintingPolicy_IncludeTagDefinition: 5002 P->IncludeTagDefinition = Value; 5003 return; 5004 case CXPrintingPolicy_SuppressScope: 5005 P->SuppressScope = Value; 5006 return; 5007 case CXPrintingPolicy_SuppressUnwrittenScope: 5008 P->SuppressUnwrittenScope = Value; 5009 return; 5010 case CXPrintingPolicy_SuppressInitializers: 5011 P->SuppressInitializers = Value; 5012 return; 5013 case CXPrintingPolicy_ConstantArraySizeAsWritten: 5014 P->ConstantArraySizeAsWritten = Value; 5015 return; 5016 case CXPrintingPolicy_AnonymousTagLocations: 5017 P->AnonymousTagLocations = Value; 5018 return; 5019 case CXPrintingPolicy_SuppressStrongLifetime: 5020 P->SuppressStrongLifetime = Value; 5021 return; 5022 case CXPrintingPolicy_SuppressLifetimeQualifiers: 5023 P->SuppressLifetimeQualifiers = Value; 5024 return; 5025 case CXPrintingPolicy_SuppressTemplateArgsInCXXConstructors: 5026 P->SuppressTemplateArgsInCXXConstructors = Value; 5027 return; 5028 case CXPrintingPolicy_Bool: 5029 P->Bool = Value; 5030 return; 5031 case CXPrintingPolicy_Restrict: 5032 P->Restrict = Value; 5033 return; 5034 case CXPrintingPolicy_Alignof: 5035 P->Alignof = Value; 5036 return; 5037 case CXPrintingPolicy_UnderscoreAlignof: 5038 P->UnderscoreAlignof = Value; 5039 return; 5040 case CXPrintingPolicy_UseVoidForZeroParams: 5041 P->UseVoidForZeroParams = Value; 5042 return; 5043 case CXPrintingPolicy_TerseOutput: 5044 P->TerseOutput = Value; 5045 return; 5046 case CXPrintingPolicy_PolishForDeclaration: 5047 P->PolishForDeclaration = Value; 5048 return; 5049 case CXPrintingPolicy_Half: 5050 P->Half = Value; 5051 return; 5052 case CXPrintingPolicy_MSWChar: 5053 P->MSWChar = Value; 5054 return; 5055 case CXPrintingPolicy_IncludeNewlines: 5056 P->IncludeNewlines = Value; 5057 return; 5058 case CXPrintingPolicy_MSVCFormatting: 5059 P->MSVCFormatting = Value; 5060 return; 5061 case CXPrintingPolicy_ConstantsAsWritten: 5062 P->ConstantsAsWritten = Value; 5063 return; 5064 case CXPrintingPolicy_SuppressImplicitBase: 5065 P->SuppressImplicitBase = Value; 5066 return; 5067 case CXPrintingPolicy_FullyQualifiedName: 5068 P->FullyQualifiedName = Value; 5069 return; 5070 } 5071 5072 assert(false && "Invalid CXPrintingPolicyProperty"); 5073 } 5074 5075 CXString clang_getCursorPrettyPrinted(CXCursor C, CXPrintingPolicy cxPolicy) { 5076 if (clang_Cursor_isNull(C)) 5077 return cxstring::createEmpty(); 5078 5079 if (clang_isDeclaration(C.kind)) { 5080 const Decl *D = getCursorDecl(C); 5081 if (!D) 5082 return cxstring::createEmpty(); 5083 5084 SmallString<128> Str; 5085 llvm::raw_svector_ostream OS(Str); 5086 PrintingPolicy *UserPolicy = static_cast<PrintingPolicy *>(cxPolicy); 5087 D->print(OS, UserPolicy ? *UserPolicy 5088 : getCursorContext(C).getPrintingPolicy()); 5089 5090 return cxstring::createDup(OS.str()); 5091 } 5092 5093 return cxstring::createEmpty(); 5094 } 5095 5096 CXString clang_getCursorDisplayName(CXCursor C) { 5097 if (!clang_isDeclaration(C.kind)) 5098 return clang_getCursorSpelling(C); 5099 5100 const Decl *D = getCursorDecl(C); 5101 if (!D) 5102 return cxstring::createEmpty(); 5103 5104 PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy(); 5105 if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D)) 5106 D = FunTmpl->getTemplatedDecl(); 5107 5108 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 5109 SmallString<64> Str; 5110 llvm::raw_svector_ostream OS(Str); 5111 OS << *Function; 5112 if (Function->getPrimaryTemplate()) 5113 OS << "<>"; 5114 OS << "("; 5115 for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) { 5116 if (I) 5117 OS << ", "; 5118 OS << Function->getParamDecl(I)->getType().getAsString(Policy); 5119 } 5120 5121 if (Function->isVariadic()) { 5122 if (Function->getNumParams()) 5123 OS << ", "; 5124 OS << "..."; 5125 } 5126 OS << ")"; 5127 return cxstring::createDup(OS.str()); 5128 } 5129 5130 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) { 5131 SmallString<64> Str; 5132 llvm::raw_svector_ostream OS(Str); 5133 OS << *ClassTemplate; 5134 OS << "<"; 5135 TemplateParameterList *Params = ClassTemplate->getTemplateParameters(); 5136 for (unsigned I = 0, N = Params->size(); I != N; ++I) { 5137 if (I) 5138 OS << ", "; 5139 5140 NamedDecl *Param = Params->getParam(I); 5141 if (Param->getIdentifier()) { 5142 OS << Param->getIdentifier()->getName(); 5143 continue; 5144 } 5145 5146 // There is no parameter name, which makes this tricky. Try to come up 5147 // with something useful that isn't too long. 5148 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 5149 if (const auto *TC = TTP->getTypeConstraint()) { 5150 TC->getConceptNameInfo().printName(OS, Policy); 5151 if (TC->hasExplicitTemplateArgs()) 5152 OS << "<...>"; 5153 } else 5154 OS << (TTP->wasDeclaredWithTypename() ? "typename" : "class"); 5155 else if (NonTypeTemplateParmDecl *NTTP = 5156 dyn_cast<NonTypeTemplateParmDecl>(Param)) 5157 OS << NTTP->getType().getAsString(Policy); 5158 else 5159 OS << "template<...> class"; 5160 } 5161 5162 OS << ">"; 5163 return cxstring::createDup(OS.str()); 5164 } 5165 5166 if (const ClassTemplateSpecializationDecl *ClassSpec = 5167 dyn_cast<ClassTemplateSpecializationDecl>(D)) { 5168 // If the type was explicitly written, use that. 5169 if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten()) 5170 return cxstring::createDup(TSInfo->getType().getAsString(Policy)); 5171 5172 SmallString<128> Str; 5173 llvm::raw_svector_ostream OS(Str); 5174 OS << *ClassSpec; 5175 printTemplateArgumentList(OS, ClassSpec->getTemplateArgs().asArray(), 5176 Policy); 5177 return cxstring::createDup(OS.str()); 5178 } 5179 5180 return clang_getCursorSpelling(C); 5181 } 5182 5183 CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { 5184 switch (Kind) { 5185 case CXCursor_FunctionDecl: 5186 return cxstring::createRef("FunctionDecl"); 5187 case CXCursor_TypedefDecl: 5188 return cxstring::createRef("TypedefDecl"); 5189 case CXCursor_EnumDecl: 5190 return cxstring::createRef("EnumDecl"); 5191 case CXCursor_EnumConstantDecl: 5192 return cxstring::createRef("EnumConstantDecl"); 5193 case CXCursor_StructDecl: 5194 return cxstring::createRef("StructDecl"); 5195 case CXCursor_UnionDecl: 5196 return cxstring::createRef("UnionDecl"); 5197 case CXCursor_ClassDecl: 5198 return cxstring::createRef("ClassDecl"); 5199 case CXCursor_FieldDecl: 5200 return cxstring::createRef("FieldDecl"); 5201 case CXCursor_VarDecl: 5202 return cxstring::createRef("VarDecl"); 5203 case CXCursor_ParmDecl: 5204 return cxstring::createRef("ParmDecl"); 5205 case CXCursor_ObjCInterfaceDecl: 5206 return cxstring::createRef("ObjCInterfaceDecl"); 5207 case CXCursor_ObjCCategoryDecl: 5208 return cxstring::createRef("ObjCCategoryDecl"); 5209 case CXCursor_ObjCProtocolDecl: 5210 return cxstring::createRef("ObjCProtocolDecl"); 5211 case CXCursor_ObjCPropertyDecl: 5212 return cxstring::createRef("ObjCPropertyDecl"); 5213 case CXCursor_ObjCIvarDecl: 5214 return cxstring::createRef("ObjCIvarDecl"); 5215 case CXCursor_ObjCInstanceMethodDecl: 5216 return cxstring::createRef("ObjCInstanceMethodDecl"); 5217 case CXCursor_ObjCClassMethodDecl: 5218 return cxstring::createRef("ObjCClassMethodDecl"); 5219 case CXCursor_ObjCImplementationDecl: 5220 return cxstring::createRef("ObjCImplementationDecl"); 5221 case CXCursor_ObjCCategoryImplDecl: 5222 return cxstring::createRef("ObjCCategoryImplDecl"); 5223 case CXCursor_CXXMethod: 5224 return cxstring::createRef("CXXMethod"); 5225 case CXCursor_UnexposedDecl: 5226 return cxstring::createRef("UnexposedDecl"); 5227 case CXCursor_ObjCSuperClassRef: 5228 return cxstring::createRef("ObjCSuperClassRef"); 5229 case CXCursor_ObjCProtocolRef: 5230 return cxstring::createRef("ObjCProtocolRef"); 5231 case CXCursor_ObjCClassRef: 5232 return cxstring::createRef("ObjCClassRef"); 5233 case CXCursor_TypeRef: 5234 return cxstring::createRef("TypeRef"); 5235 case CXCursor_TemplateRef: 5236 return cxstring::createRef("TemplateRef"); 5237 case CXCursor_NamespaceRef: 5238 return cxstring::createRef("NamespaceRef"); 5239 case CXCursor_MemberRef: 5240 return cxstring::createRef("MemberRef"); 5241 case CXCursor_LabelRef: 5242 return cxstring::createRef("LabelRef"); 5243 case CXCursor_OverloadedDeclRef: 5244 return cxstring::createRef("OverloadedDeclRef"); 5245 case CXCursor_VariableRef: 5246 return cxstring::createRef("VariableRef"); 5247 case CXCursor_IntegerLiteral: 5248 return cxstring::createRef("IntegerLiteral"); 5249 case CXCursor_FixedPointLiteral: 5250 return cxstring::createRef("FixedPointLiteral"); 5251 case CXCursor_FloatingLiteral: 5252 return cxstring::createRef("FloatingLiteral"); 5253 case CXCursor_ImaginaryLiteral: 5254 return cxstring::createRef("ImaginaryLiteral"); 5255 case CXCursor_StringLiteral: 5256 return cxstring::createRef("StringLiteral"); 5257 case CXCursor_CharacterLiteral: 5258 return cxstring::createRef("CharacterLiteral"); 5259 case CXCursor_ParenExpr: 5260 return cxstring::createRef("ParenExpr"); 5261 case CXCursor_UnaryOperator: 5262 return cxstring::createRef("UnaryOperator"); 5263 case CXCursor_ArraySubscriptExpr: 5264 return cxstring::createRef("ArraySubscriptExpr"); 5265 case CXCursor_OMPArraySectionExpr: 5266 return cxstring::createRef("OMPArraySectionExpr"); 5267 case CXCursor_OMPArrayShapingExpr: 5268 return cxstring::createRef("OMPArrayShapingExpr"); 5269 case CXCursor_OMPIteratorExpr: 5270 return cxstring::createRef("OMPIteratorExpr"); 5271 case CXCursor_BinaryOperator: 5272 return cxstring::createRef("BinaryOperator"); 5273 case CXCursor_CompoundAssignOperator: 5274 return cxstring::createRef("CompoundAssignOperator"); 5275 case CXCursor_ConditionalOperator: 5276 return cxstring::createRef("ConditionalOperator"); 5277 case CXCursor_CStyleCastExpr: 5278 return cxstring::createRef("CStyleCastExpr"); 5279 case CXCursor_CompoundLiteralExpr: 5280 return cxstring::createRef("CompoundLiteralExpr"); 5281 case CXCursor_InitListExpr: 5282 return cxstring::createRef("InitListExpr"); 5283 case CXCursor_AddrLabelExpr: 5284 return cxstring::createRef("AddrLabelExpr"); 5285 case CXCursor_StmtExpr: 5286 return cxstring::createRef("StmtExpr"); 5287 case CXCursor_GenericSelectionExpr: 5288 return cxstring::createRef("GenericSelectionExpr"); 5289 case CXCursor_GNUNullExpr: 5290 return cxstring::createRef("GNUNullExpr"); 5291 case CXCursor_CXXStaticCastExpr: 5292 return cxstring::createRef("CXXStaticCastExpr"); 5293 case CXCursor_CXXDynamicCastExpr: 5294 return cxstring::createRef("CXXDynamicCastExpr"); 5295 case CXCursor_CXXReinterpretCastExpr: 5296 return cxstring::createRef("CXXReinterpretCastExpr"); 5297 case CXCursor_CXXConstCastExpr: 5298 return cxstring::createRef("CXXConstCastExpr"); 5299 case CXCursor_CXXFunctionalCastExpr: 5300 return cxstring::createRef("CXXFunctionalCastExpr"); 5301 case CXCursor_CXXAddrspaceCastExpr: 5302 return cxstring::createRef("CXXAddrspaceCastExpr"); 5303 case CXCursor_CXXTypeidExpr: 5304 return cxstring::createRef("CXXTypeidExpr"); 5305 case CXCursor_CXXBoolLiteralExpr: 5306 return cxstring::createRef("CXXBoolLiteralExpr"); 5307 case CXCursor_CXXNullPtrLiteralExpr: 5308 return cxstring::createRef("CXXNullPtrLiteralExpr"); 5309 case CXCursor_CXXThisExpr: 5310 return cxstring::createRef("CXXThisExpr"); 5311 case CXCursor_CXXThrowExpr: 5312 return cxstring::createRef("CXXThrowExpr"); 5313 case CXCursor_CXXNewExpr: 5314 return cxstring::createRef("CXXNewExpr"); 5315 case CXCursor_CXXDeleteExpr: 5316 return cxstring::createRef("CXXDeleteExpr"); 5317 case CXCursor_UnaryExpr: 5318 return cxstring::createRef("UnaryExpr"); 5319 case CXCursor_ObjCStringLiteral: 5320 return cxstring::createRef("ObjCStringLiteral"); 5321 case CXCursor_ObjCBoolLiteralExpr: 5322 return cxstring::createRef("ObjCBoolLiteralExpr"); 5323 case CXCursor_ObjCAvailabilityCheckExpr: 5324 return cxstring::createRef("ObjCAvailabilityCheckExpr"); 5325 case CXCursor_ObjCSelfExpr: 5326 return cxstring::createRef("ObjCSelfExpr"); 5327 case CXCursor_ObjCEncodeExpr: 5328 return cxstring::createRef("ObjCEncodeExpr"); 5329 case CXCursor_ObjCSelectorExpr: 5330 return cxstring::createRef("ObjCSelectorExpr"); 5331 case CXCursor_ObjCProtocolExpr: 5332 return cxstring::createRef("ObjCProtocolExpr"); 5333 case CXCursor_ObjCBridgedCastExpr: 5334 return cxstring::createRef("ObjCBridgedCastExpr"); 5335 case CXCursor_BlockExpr: 5336 return cxstring::createRef("BlockExpr"); 5337 case CXCursor_PackExpansionExpr: 5338 return cxstring::createRef("PackExpansionExpr"); 5339 case CXCursor_SizeOfPackExpr: 5340 return cxstring::createRef("SizeOfPackExpr"); 5341 case CXCursor_LambdaExpr: 5342 return cxstring::createRef("LambdaExpr"); 5343 case CXCursor_UnexposedExpr: 5344 return cxstring::createRef("UnexposedExpr"); 5345 case CXCursor_DeclRefExpr: 5346 return cxstring::createRef("DeclRefExpr"); 5347 case CXCursor_MemberRefExpr: 5348 return cxstring::createRef("MemberRefExpr"); 5349 case CXCursor_CallExpr: 5350 return cxstring::createRef("CallExpr"); 5351 case CXCursor_ObjCMessageExpr: 5352 return cxstring::createRef("ObjCMessageExpr"); 5353 case CXCursor_BuiltinBitCastExpr: 5354 return cxstring::createRef("BuiltinBitCastExpr"); 5355 case CXCursor_UnexposedStmt: 5356 return cxstring::createRef("UnexposedStmt"); 5357 case CXCursor_DeclStmt: 5358 return cxstring::createRef("DeclStmt"); 5359 case CXCursor_LabelStmt: 5360 return cxstring::createRef("LabelStmt"); 5361 case CXCursor_CompoundStmt: 5362 return cxstring::createRef("CompoundStmt"); 5363 case CXCursor_CaseStmt: 5364 return cxstring::createRef("CaseStmt"); 5365 case CXCursor_DefaultStmt: 5366 return cxstring::createRef("DefaultStmt"); 5367 case CXCursor_IfStmt: 5368 return cxstring::createRef("IfStmt"); 5369 case CXCursor_SwitchStmt: 5370 return cxstring::createRef("SwitchStmt"); 5371 case CXCursor_WhileStmt: 5372 return cxstring::createRef("WhileStmt"); 5373 case CXCursor_DoStmt: 5374 return cxstring::createRef("DoStmt"); 5375 case CXCursor_ForStmt: 5376 return cxstring::createRef("ForStmt"); 5377 case CXCursor_GotoStmt: 5378 return cxstring::createRef("GotoStmt"); 5379 case CXCursor_IndirectGotoStmt: 5380 return cxstring::createRef("IndirectGotoStmt"); 5381 case CXCursor_ContinueStmt: 5382 return cxstring::createRef("ContinueStmt"); 5383 case CXCursor_BreakStmt: 5384 return cxstring::createRef("BreakStmt"); 5385 case CXCursor_ReturnStmt: 5386 return cxstring::createRef("ReturnStmt"); 5387 case CXCursor_GCCAsmStmt: 5388 return cxstring::createRef("GCCAsmStmt"); 5389 case CXCursor_MSAsmStmt: 5390 return cxstring::createRef("MSAsmStmt"); 5391 case CXCursor_ObjCAtTryStmt: 5392 return cxstring::createRef("ObjCAtTryStmt"); 5393 case CXCursor_ObjCAtCatchStmt: 5394 return cxstring::createRef("ObjCAtCatchStmt"); 5395 case CXCursor_ObjCAtFinallyStmt: 5396 return cxstring::createRef("ObjCAtFinallyStmt"); 5397 case CXCursor_ObjCAtThrowStmt: 5398 return cxstring::createRef("ObjCAtThrowStmt"); 5399 case CXCursor_ObjCAtSynchronizedStmt: 5400 return cxstring::createRef("ObjCAtSynchronizedStmt"); 5401 case CXCursor_ObjCAutoreleasePoolStmt: 5402 return cxstring::createRef("ObjCAutoreleasePoolStmt"); 5403 case CXCursor_ObjCForCollectionStmt: 5404 return cxstring::createRef("ObjCForCollectionStmt"); 5405 case CXCursor_CXXCatchStmt: 5406 return cxstring::createRef("CXXCatchStmt"); 5407 case CXCursor_CXXTryStmt: 5408 return cxstring::createRef("CXXTryStmt"); 5409 case CXCursor_CXXForRangeStmt: 5410 return cxstring::createRef("CXXForRangeStmt"); 5411 case CXCursor_SEHTryStmt: 5412 return cxstring::createRef("SEHTryStmt"); 5413 case CXCursor_SEHExceptStmt: 5414 return cxstring::createRef("SEHExceptStmt"); 5415 case CXCursor_SEHFinallyStmt: 5416 return cxstring::createRef("SEHFinallyStmt"); 5417 case CXCursor_SEHLeaveStmt: 5418 return cxstring::createRef("SEHLeaveStmt"); 5419 case CXCursor_NullStmt: 5420 return cxstring::createRef("NullStmt"); 5421 case CXCursor_InvalidFile: 5422 return cxstring::createRef("InvalidFile"); 5423 case CXCursor_InvalidCode: 5424 return cxstring::createRef("InvalidCode"); 5425 case CXCursor_NoDeclFound: 5426 return cxstring::createRef("NoDeclFound"); 5427 case CXCursor_NotImplemented: 5428 return cxstring::createRef("NotImplemented"); 5429 case CXCursor_TranslationUnit: 5430 return cxstring::createRef("TranslationUnit"); 5431 case CXCursor_UnexposedAttr: 5432 return cxstring::createRef("UnexposedAttr"); 5433 case CXCursor_IBActionAttr: 5434 return cxstring::createRef("attribute(ibaction)"); 5435 case CXCursor_IBOutletAttr: 5436 return cxstring::createRef("attribute(iboutlet)"); 5437 case CXCursor_IBOutletCollectionAttr: 5438 return cxstring::createRef("attribute(iboutletcollection)"); 5439 case CXCursor_CXXFinalAttr: 5440 return cxstring::createRef("attribute(final)"); 5441 case CXCursor_CXXOverrideAttr: 5442 return cxstring::createRef("attribute(override)"); 5443 case CXCursor_AnnotateAttr: 5444 return cxstring::createRef("attribute(annotate)"); 5445 case CXCursor_AsmLabelAttr: 5446 return cxstring::createRef("asm label"); 5447 case CXCursor_PackedAttr: 5448 return cxstring::createRef("attribute(packed)"); 5449 case CXCursor_PureAttr: 5450 return cxstring::createRef("attribute(pure)"); 5451 case CXCursor_ConstAttr: 5452 return cxstring::createRef("attribute(const)"); 5453 case CXCursor_NoDuplicateAttr: 5454 return cxstring::createRef("attribute(noduplicate)"); 5455 case CXCursor_CUDAConstantAttr: 5456 return cxstring::createRef("attribute(constant)"); 5457 case CXCursor_CUDADeviceAttr: 5458 return cxstring::createRef("attribute(device)"); 5459 case CXCursor_CUDAGlobalAttr: 5460 return cxstring::createRef("attribute(global)"); 5461 case CXCursor_CUDAHostAttr: 5462 return cxstring::createRef("attribute(host)"); 5463 case CXCursor_CUDASharedAttr: 5464 return cxstring::createRef("attribute(shared)"); 5465 case CXCursor_VisibilityAttr: 5466 return cxstring::createRef("attribute(visibility)"); 5467 case CXCursor_DLLExport: 5468 return cxstring::createRef("attribute(dllexport)"); 5469 case CXCursor_DLLImport: 5470 return cxstring::createRef("attribute(dllimport)"); 5471 case CXCursor_NSReturnsRetained: 5472 return cxstring::createRef("attribute(ns_returns_retained)"); 5473 case CXCursor_NSReturnsNotRetained: 5474 return cxstring::createRef("attribute(ns_returns_not_retained)"); 5475 case CXCursor_NSReturnsAutoreleased: 5476 return cxstring::createRef("attribute(ns_returns_autoreleased)"); 5477 case CXCursor_NSConsumesSelf: 5478 return cxstring::createRef("attribute(ns_consumes_self)"); 5479 case CXCursor_NSConsumed: 5480 return cxstring::createRef("attribute(ns_consumed)"); 5481 case CXCursor_ObjCException: 5482 return cxstring::createRef("attribute(objc_exception)"); 5483 case CXCursor_ObjCNSObject: 5484 return cxstring::createRef("attribute(NSObject)"); 5485 case CXCursor_ObjCIndependentClass: 5486 return cxstring::createRef("attribute(objc_independent_class)"); 5487 case CXCursor_ObjCPreciseLifetime: 5488 return cxstring::createRef("attribute(objc_precise_lifetime)"); 5489 case CXCursor_ObjCReturnsInnerPointer: 5490 return cxstring::createRef("attribute(objc_returns_inner_pointer)"); 5491 case CXCursor_ObjCRequiresSuper: 5492 return cxstring::createRef("attribute(objc_requires_super)"); 5493 case CXCursor_ObjCRootClass: 5494 return cxstring::createRef("attribute(objc_root_class)"); 5495 case CXCursor_ObjCSubclassingRestricted: 5496 return cxstring::createRef("attribute(objc_subclassing_restricted)"); 5497 case CXCursor_ObjCExplicitProtocolImpl: 5498 return cxstring::createRef( 5499 "attribute(objc_protocol_requires_explicit_implementation)"); 5500 case CXCursor_ObjCDesignatedInitializer: 5501 return cxstring::createRef("attribute(objc_designated_initializer)"); 5502 case CXCursor_ObjCRuntimeVisible: 5503 return cxstring::createRef("attribute(objc_runtime_visible)"); 5504 case CXCursor_ObjCBoxable: 5505 return cxstring::createRef("attribute(objc_boxable)"); 5506 case CXCursor_FlagEnum: 5507 return cxstring::createRef("attribute(flag_enum)"); 5508 case CXCursor_PreprocessingDirective: 5509 return cxstring::createRef("preprocessing directive"); 5510 case CXCursor_MacroDefinition: 5511 return cxstring::createRef("macro definition"); 5512 case CXCursor_MacroExpansion: 5513 return cxstring::createRef("macro expansion"); 5514 case CXCursor_InclusionDirective: 5515 return cxstring::createRef("inclusion directive"); 5516 case CXCursor_Namespace: 5517 return cxstring::createRef("Namespace"); 5518 case CXCursor_LinkageSpec: 5519 return cxstring::createRef("LinkageSpec"); 5520 case CXCursor_CXXBaseSpecifier: 5521 return cxstring::createRef("C++ base class specifier"); 5522 case CXCursor_Constructor: 5523 return cxstring::createRef("CXXConstructor"); 5524 case CXCursor_Destructor: 5525 return cxstring::createRef("CXXDestructor"); 5526 case CXCursor_ConversionFunction: 5527 return cxstring::createRef("CXXConversion"); 5528 case CXCursor_TemplateTypeParameter: 5529 return cxstring::createRef("TemplateTypeParameter"); 5530 case CXCursor_NonTypeTemplateParameter: 5531 return cxstring::createRef("NonTypeTemplateParameter"); 5532 case CXCursor_TemplateTemplateParameter: 5533 return cxstring::createRef("TemplateTemplateParameter"); 5534 case CXCursor_FunctionTemplate: 5535 return cxstring::createRef("FunctionTemplate"); 5536 case CXCursor_ClassTemplate: 5537 return cxstring::createRef("ClassTemplate"); 5538 case CXCursor_ClassTemplatePartialSpecialization: 5539 return cxstring::createRef("ClassTemplatePartialSpecialization"); 5540 case CXCursor_NamespaceAlias: 5541 return cxstring::createRef("NamespaceAlias"); 5542 case CXCursor_UsingDirective: 5543 return cxstring::createRef("UsingDirective"); 5544 case CXCursor_UsingDeclaration: 5545 return cxstring::createRef("UsingDeclaration"); 5546 case CXCursor_TypeAliasDecl: 5547 return cxstring::createRef("TypeAliasDecl"); 5548 case CXCursor_ObjCSynthesizeDecl: 5549 return cxstring::createRef("ObjCSynthesizeDecl"); 5550 case CXCursor_ObjCDynamicDecl: 5551 return cxstring::createRef("ObjCDynamicDecl"); 5552 case CXCursor_CXXAccessSpecifier: 5553 return cxstring::createRef("CXXAccessSpecifier"); 5554 case CXCursor_ModuleImportDecl: 5555 return cxstring::createRef("ModuleImport"); 5556 case CXCursor_OMPCanonicalLoop: 5557 return cxstring::createRef("OMPCanonicalLoop"); 5558 case CXCursor_OMPParallelDirective: 5559 return cxstring::createRef("OMPParallelDirective"); 5560 case CXCursor_OMPSimdDirective: 5561 return cxstring::createRef("OMPSimdDirective"); 5562 case CXCursor_OMPTileDirective: 5563 return cxstring::createRef("OMPTileDirective"); 5564 case CXCursor_OMPForDirective: 5565 return cxstring::createRef("OMPForDirective"); 5566 case CXCursor_OMPForSimdDirective: 5567 return cxstring::createRef("OMPForSimdDirective"); 5568 case CXCursor_OMPSectionsDirective: 5569 return cxstring::createRef("OMPSectionsDirective"); 5570 case CXCursor_OMPSectionDirective: 5571 return cxstring::createRef("OMPSectionDirective"); 5572 case CXCursor_OMPSingleDirective: 5573 return cxstring::createRef("OMPSingleDirective"); 5574 case CXCursor_OMPMasterDirective: 5575 return cxstring::createRef("OMPMasterDirective"); 5576 case CXCursor_OMPCriticalDirective: 5577 return cxstring::createRef("OMPCriticalDirective"); 5578 case CXCursor_OMPParallelForDirective: 5579 return cxstring::createRef("OMPParallelForDirective"); 5580 case CXCursor_OMPParallelForSimdDirective: 5581 return cxstring::createRef("OMPParallelForSimdDirective"); 5582 case CXCursor_OMPParallelMasterDirective: 5583 return cxstring::createRef("OMPParallelMasterDirective"); 5584 case CXCursor_OMPParallelSectionsDirective: 5585 return cxstring::createRef("OMPParallelSectionsDirective"); 5586 case CXCursor_OMPTaskDirective: 5587 return cxstring::createRef("OMPTaskDirective"); 5588 case CXCursor_OMPTaskyieldDirective: 5589 return cxstring::createRef("OMPTaskyieldDirective"); 5590 case CXCursor_OMPBarrierDirective: 5591 return cxstring::createRef("OMPBarrierDirective"); 5592 case CXCursor_OMPTaskwaitDirective: 5593 return cxstring::createRef("OMPTaskwaitDirective"); 5594 case CXCursor_OMPTaskgroupDirective: 5595 return cxstring::createRef("OMPTaskgroupDirective"); 5596 case CXCursor_OMPFlushDirective: 5597 return cxstring::createRef("OMPFlushDirective"); 5598 case CXCursor_OMPDepobjDirective: 5599 return cxstring::createRef("OMPDepobjDirective"); 5600 case CXCursor_OMPScanDirective: 5601 return cxstring::createRef("OMPScanDirective"); 5602 case CXCursor_OMPOrderedDirective: 5603 return cxstring::createRef("OMPOrderedDirective"); 5604 case CXCursor_OMPAtomicDirective: 5605 return cxstring::createRef("OMPAtomicDirective"); 5606 case CXCursor_OMPTargetDirective: 5607 return cxstring::createRef("OMPTargetDirective"); 5608 case CXCursor_OMPTargetDataDirective: 5609 return cxstring::createRef("OMPTargetDataDirective"); 5610 case CXCursor_OMPTargetEnterDataDirective: 5611 return cxstring::createRef("OMPTargetEnterDataDirective"); 5612 case CXCursor_OMPTargetExitDataDirective: 5613 return cxstring::createRef("OMPTargetExitDataDirective"); 5614 case CXCursor_OMPTargetParallelDirective: 5615 return cxstring::createRef("OMPTargetParallelDirective"); 5616 case CXCursor_OMPTargetParallelForDirective: 5617 return cxstring::createRef("OMPTargetParallelForDirective"); 5618 case CXCursor_OMPTargetUpdateDirective: 5619 return cxstring::createRef("OMPTargetUpdateDirective"); 5620 case CXCursor_OMPTeamsDirective: 5621 return cxstring::createRef("OMPTeamsDirective"); 5622 case CXCursor_OMPCancellationPointDirective: 5623 return cxstring::createRef("OMPCancellationPointDirective"); 5624 case CXCursor_OMPCancelDirective: 5625 return cxstring::createRef("OMPCancelDirective"); 5626 case CXCursor_OMPTaskLoopDirective: 5627 return cxstring::createRef("OMPTaskLoopDirective"); 5628 case CXCursor_OMPTaskLoopSimdDirective: 5629 return cxstring::createRef("OMPTaskLoopSimdDirective"); 5630 case CXCursor_OMPMasterTaskLoopDirective: 5631 return cxstring::createRef("OMPMasterTaskLoopDirective"); 5632 case CXCursor_OMPMasterTaskLoopSimdDirective: 5633 return cxstring::createRef("OMPMasterTaskLoopSimdDirective"); 5634 case CXCursor_OMPParallelMasterTaskLoopDirective: 5635 return cxstring::createRef("OMPParallelMasterTaskLoopDirective"); 5636 case CXCursor_OMPParallelMasterTaskLoopSimdDirective: 5637 return cxstring::createRef("OMPParallelMasterTaskLoopSimdDirective"); 5638 case CXCursor_OMPDistributeDirective: 5639 return cxstring::createRef("OMPDistributeDirective"); 5640 case CXCursor_OMPDistributeParallelForDirective: 5641 return cxstring::createRef("OMPDistributeParallelForDirective"); 5642 case CXCursor_OMPDistributeParallelForSimdDirective: 5643 return cxstring::createRef("OMPDistributeParallelForSimdDirective"); 5644 case CXCursor_OMPDistributeSimdDirective: 5645 return cxstring::createRef("OMPDistributeSimdDirective"); 5646 case CXCursor_OMPTargetParallelForSimdDirective: 5647 return cxstring::createRef("OMPTargetParallelForSimdDirective"); 5648 case CXCursor_OMPTargetSimdDirective: 5649 return cxstring::createRef("OMPTargetSimdDirective"); 5650 case CXCursor_OMPTeamsDistributeDirective: 5651 return cxstring::createRef("OMPTeamsDistributeDirective"); 5652 case CXCursor_OMPTeamsDistributeSimdDirective: 5653 return cxstring::createRef("OMPTeamsDistributeSimdDirective"); 5654 case CXCursor_OMPTeamsDistributeParallelForSimdDirective: 5655 return cxstring::createRef("OMPTeamsDistributeParallelForSimdDirective"); 5656 case CXCursor_OMPTeamsDistributeParallelForDirective: 5657 return cxstring::createRef("OMPTeamsDistributeParallelForDirective"); 5658 case CXCursor_OMPTargetTeamsDirective: 5659 return cxstring::createRef("OMPTargetTeamsDirective"); 5660 case CXCursor_OMPTargetTeamsDistributeDirective: 5661 return cxstring::createRef("OMPTargetTeamsDistributeDirective"); 5662 case CXCursor_OMPTargetTeamsDistributeParallelForDirective: 5663 return cxstring::createRef("OMPTargetTeamsDistributeParallelForDirective"); 5664 case CXCursor_OMPTargetTeamsDistributeParallelForSimdDirective: 5665 return cxstring::createRef( 5666 "OMPTargetTeamsDistributeParallelForSimdDirective"); 5667 case CXCursor_OMPTargetTeamsDistributeSimdDirective: 5668 return cxstring::createRef("OMPTargetTeamsDistributeSimdDirective"); 5669 case CXCursor_OMPInteropDirective: 5670 return cxstring::createRef("OMPInteropDirective"); 5671 case CXCursor_OverloadCandidate: 5672 return cxstring::createRef("OverloadCandidate"); 5673 case CXCursor_TypeAliasTemplateDecl: 5674 return cxstring::createRef("TypeAliasTemplateDecl"); 5675 case CXCursor_StaticAssert: 5676 return cxstring::createRef("StaticAssert"); 5677 case CXCursor_FriendDecl: 5678 return cxstring::createRef("FriendDecl"); 5679 case CXCursor_ConvergentAttr: 5680 return cxstring::createRef("attribute(convergent)"); 5681 case CXCursor_WarnUnusedAttr: 5682 return cxstring::createRef("attribute(warn_unused)"); 5683 case CXCursor_WarnUnusedResultAttr: 5684 return cxstring::createRef("attribute(warn_unused_result)"); 5685 case CXCursor_AlignedAttr: 5686 return cxstring::createRef("attribute(aligned)"); 5687 } 5688 5689 llvm_unreachable("Unhandled CXCursorKind"); 5690 } 5691 5692 struct GetCursorData { 5693 SourceLocation TokenBeginLoc; 5694 bool PointsAtMacroArgExpansion; 5695 bool VisitedObjCPropertyImplDecl; 5696 SourceLocation VisitedDeclaratorDeclStartLoc; 5697 CXCursor &BestCursor; 5698 5699 GetCursorData(SourceManager &SM, SourceLocation tokenBegin, 5700 CXCursor &outputCursor) 5701 : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) { 5702 PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin); 5703 VisitedObjCPropertyImplDecl = false; 5704 } 5705 }; 5706 5707 static enum CXChildVisitResult 5708 GetCursorVisitor(CXCursor cursor, CXCursor parent, CXClientData client_data) { 5709 GetCursorData *Data = static_cast<GetCursorData *>(client_data); 5710 CXCursor *BestCursor = &Data->BestCursor; 5711 5712 // If we point inside a macro argument we should provide info of what the 5713 // token is so use the actual cursor, don't replace it with a macro expansion 5714 // cursor. 5715 if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion) 5716 return CXChildVisit_Recurse; 5717 5718 if (clang_isDeclaration(cursor.kind)) { 5719 // Avoid having the implicit methods override the property decls. 5720 if (const ObjCMethodDecl *MD = 5721 dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) { 5722 if (MD->isImplicit()) 5723 return CXChildVisit_Break; 5724 5725 } else if (const ObjCInterfaceDecl *ID = 5726 dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) { 5727 // Check that when we have multiple @class references in the same line, 5728 // that later ones do not override the previous ones. 5729 // If we have: 5730 // @class Foo, Bar; 5731 // source ranges for both start at '@', so 'Bar' will end up overriding 5732 // 'Foo' even though the cursor location was at 'Foo'. 5733 if (BestCursor->kind == CXCursor_ObjCInterfaceDecl || 5734 BestCursor->kind == CXCursor_ObjCClassRef) 5735 if (const ObjCInterfaceDecl *PrevID = 5736 dyn_cast_or_null<ObjCInterfaceDecl>( 5737 getCursorDecl(*BestCursor))) { 5738 if (PrevID != ID && !PrevID->isThisDeclarationADefinition() && 5739 !ID->isThisDeclarationADefinition()) 5740 return CXChildVisit_Break; 5741 } 5742 5743 } else if (const DeclaratorDecl *DD = 5744 dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) { 5745 SourceLocation StartLoc = DD->getSourceRange().getBegin(); 5746 // Check that when we have multiple declarators in the same line, 5747 // that later ones do not override the previous ones. 5748 // If we have: 5749 // int Foo, Bar; 5750 // source ranges for both start at 'int', so 'Bar' will end up overriding 5751 // 'Foo' even though the cursor location was at 'Foo'. 5752 if (Data->VisitedDeclaratorDeclStartLoc == StartLoc) 5753 return CXChildVisit_Break; 5754 Data->VisitedDeclaratorDeclStartLoc = StartLoc; 5755 5756 } else if (const ObjCPropertyImplDecl *PropImp = 5757 dyn_cast_or_null<ObjCPropertyImplDecl>( 5758 getCursorDecl(cursor))) { 5759 (void)PropImp; 5760 // Check that when we have multiple @synthesize in the same line, 5761 // that later ones do not override the previous ones. 5762 // If we have: 5763 // @synthesize Foo, Bar; 5764 // source ranges for both start at '@', so 'Bar' will end up overriding 5765 // 'Foo' even though the cursor location was at 'Foo'. 5766 if (Data->VisitedObjCPropertyImplDecl) 5767 return CXChildVisit_Break; 5768 Data->VisitedObjCPropertyImplDecl = true; 5769 } 5770 } 5771 5772 if (clang_isExpression(cursor.kind) && 5773 clang_isDeclaration(BestCursor->kind)) { 5774 if (const Decl *D = getCursorDecl(*BestCursor)) { 5775 // Avoid having the cursor of an expression replace the declaration cursor 5776 // when the expression source range overlaps the declaration range. 5777 // This can happen for C++ constructor expressions whose range generally 5778 // include the variable declaration, e.g.: 5779 // MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl 5780 // cursor. 5781 if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() && 5782 D->getLocation() == Data->TokenBeginLoc) 5783 return CXChildVisit_Break; 5784 } 5785 } 5786 5787 // If our current best cursor is the construction of a temporary object, 5788 // don't replace that cursor with a type reference, because we want 5789 // clang_getCursor() to point at the constructor. 5790 if (clang_isExpression(BestCursor->kind) && 5791 isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) && 5792 cursor.kind == CXCursor_TypeRef) { 5793 // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it 5794 // as having the actual point on the type reference. 5795 *BestCursor = getTypeRefedCallExprCursor(*BestCursor); 5796 return CXChildVisit_Recurse; 5797 } 5798 5799 // If we already have an Objective-C superclass reference, don't 5800 // update it further. 5801 if (BestCursor->kind == CXCursor_ObjCSuperClassRef) 5802 return CXChildVisit_Break; 5803 5804 *BestCursor = cursor; 5805 return CXChildVisit_Recurse; 5806 } 5807 5808 CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) { 5809 if (isNotUsableTU(TU)) { 5810 LOG_BAD_TU(TU); 5811 return clang_getNullCursor(); 5812 } 5813 5814 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 5815 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 5816 5817 SourceLocation SLoc = cxloc::translateSourceLocation(Loc); 5818 CXCursor Result = cxcursor::getCursor(TU, SLoc); 5819 5820 LOG_FUNC_SECTION { 5821 CXFile SearchFile; 5822 unsigned SearchLine, SearchColumn; 5823 CXFile ResultFile; 5824 unsigned ResultLine, ResultColumn; 5825 CXString SearchFileName, ResultFileName, KindSpelling, USR; 5826 const char *IsDef = clang_isCursorDefinition(Result) ? " (Definition)" : ""; 5827 CXSourceLocation ResultLoc = clang_getCursorLocation(Result); 5828 5829 clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 5830 nullptr); 5831 clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine, &ResultColumn, 5832 nullptr); 5833 SearchFileName = clang_getFileName(SearchFile); 5834 ResultFileName = clang_getFileName(ResultFile); 5835 KindSpelling = clang_getCursorKindSpelling(Result.kind); 5836 USR = clang_getCursorUSR(Result); 5837 *Log << llvm::format("(%s:%d:%d) = %s", clang_getCString(SearchFileName), 5838 SearchLine, SearchColumn, 5839 clang_getCString(KindSpelling)) 5840 << llvm::format("(%s:%d:%d):%s%s", clang_getCString(ResultFileName), 5841 ResultLine, ResultColumn, clang_getCString(USR), 5842 IsDef); 5843 clang_disposeString(SearchFileName); 5844 clang_disposeString(ResultFileName); 5845 clang_disposeString(KindSpelling); 5846 clang_disposeString(USR); 5847 5848 CXCursor Definition = clang_getCursorDefinition(Result); 5849 if (!clang_equalCursors(Definition, clang_getNullCursor())) { 5850 CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition); 5851 CXString DefinitionKindSpelling = 5852 clang_getCursorKindSpelling(Definition.kind); 5853 CXFile DefinitionFile; 5854 unsigned DefinitionLine, DefinitionColumn; 5855 clang_getFileLocation(DefinitionLoc, &DefinitionFile, &DefinitionLine, 5856 &DefinitionColumn, nullptr); 5857 CXString DefinitionFileName = clang_getFileName(DefinitionFile); 5858 *Log << llvm::format(" -> %s(%s:%d:%d)", 5859 clang_getCString(DefinitionKindSpelling), 5860 clang_getCString(DefinitionFileName), DefinitionLine, 5861 DefinitionColumn); 5862 clang_disposeString(DefinitionFileName); 5863 clang_disposeString(DefinitionKindSpelling); 5864 } 5865 } 5866 5867 return Result; 5868 } 5869 5870 CXCursor clang_getNullCursor(void) { 5871 return MakeCXCursorInvalid(CXCursor_InvalidFile); 5872 } 5873 5874 unsigned clang_equalCursors(CXCursor X, CXCursor Y) { 5875 // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we 5876 // can't set consistently. For example, when visiting a DeclStmt we will set 5877 // it but we don't set it on the result of clang_getCursorDefinition for 5878 // a reference of the same declaration. 5879 // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works 5880 // when visiting a DeclStmt currently, the AST should be enhanced to be able 5881 // to provide that kind of info. 5882 if (clang_isDeclaration(X.kind)) 5883 X.data[1] = nullptr; 5884 if (clang_isDeclaration(Y.kind)) 5885 Y.data[1] = nullptr; 5886 5887 return X == Y; 5888 } 5889 5890 unsigned clang_hashCursor(CXCursor C) { 5891 unsigned Index = 0; 5892 if (clang_isExpression(C.kind) || clang_isStatement(C.kind)) 5893 Index = 1; 5894 5895 return llvm::DenseMapInfo<std::pair<unsigned, const void *>>::getHashValue( 5896 std::make_pair(C.kind, C.data[Index])); 5897 } 5898 5899 unsigned clang_isInvalid(enum CXCursorKind K) { 5900 return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid; 5901 } 5902 5903 unsigned clang_isDeclaration(enum CXCursorKind K) { 5904 return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) || 5905 (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl); 5906 } 5907 5908 unsigned clang_isInvalidDeclaration(CXCursor C) { 5909 if (clang_isDeclaration(C.kind)) { 5910 if (const Decl *D = getCursorDecl(C)) 5911 return D->isInvalidDecl(); 5912 } 5913 5914 return 0; 5915 } 5916 5917 unsigned clang_isReference(enum CXCursorKind K) { 5918 return K >= CXCursor_FirstRef && K <= CXCursor_LastRef; 5919 } 5920 5921 unsigned clang_isExpression(enum CXCursorKind K) { 5922 return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr; 5923 } 5924 5925 unsigned clang_isStatement(enum CXCursorKind K) { 5926 return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt; 5927 } 5928 5929 unsigned clang_isAttribute(enum CXCursorKind K) { 5930 return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr; 5931 } 5932 5933 unsigned clang_isTranslationUnit(enum CXCursorKind K) { 5934 return K == CXCursor_TranslationUnit; 5935 } 5936 5937 unsigned clang_isPreprocessing(enum CXCursorKind K) { 5938 return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing; 5939 } 5940 5941 unsigned clang_isUnexposed(enum CXCursorKind K) { 5942 switch (K) { 5943 case CXCursor_UnexposedDecl: 5944 case CXCursor_UnexposedExpr: 5945 case CXCursor_UnexposedStmt: 5946 case CXCursor_UnexposedAttr: 5947 return true; 5948 default: 5949 return false; 5950 } 5951 } 5952 5953 CXCursorKind clang_getCursorKind(CXCursor C) { return C.kind; } 5954 5955 CXSourceLocation clang_getCursorLocation(CXCursor C) { 5956 if (clang_isReference(C.kind)) { 5957 switch (C.kind) { 5958 case CXCursor_ObjCSuperClassRef: { 5959 std::pair<const ObjCInterfaceDecl *, SourceLocation> P = 5960 getCursorObjCSuperClassRef(C); 5961 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 5962 } 5963 5964 case CXCursor_ObjCProtocolRef: { 5965 std::pair<const ObjCProtocolDecl *, SourceLocation> P = 5966 getCursorObjCProtocolRef(C); 5967 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 5968 } 5969 5970 case CXCursor_ObjCClassRef: { 5971 std::pair<const ObjCInterfaceDecl *, SourceLocation> P = 5972 getCursorObjCClassRef(C); 5973 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 5974 } 5975 5976 case CXCursor_TypeRef: { 5977 std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C); 5978 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 5979 } 5980 5981 case CXCursor_TemplateRef: { 5982 std::pair<const TemplateDecl *, SourceLocation> P = 5983 getCursorTemplateRef(C); 5984 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 5985 } 5986 5987 case CXCursor_NamespaceRef: { 5988 std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C); 5989 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 5990 } 5991 5992 case CXCursor_MemberRef: { 5993 std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C); 5994 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 5995 } 5996 5997 case CXCursor_VariableRef: { 5998 std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C); 5999 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 6000 } 6001 6002 case CXCursor_CXXBaseSpecifier: { 6003 const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C); 6004 if (!BaseSpec) 6005 return clang_getNullLocation(); 6006 6007 if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo()) 6008 return cxloc::translateSourceLocation( 6009 getCursorContext(C), TSInfo->getTypeLoc().getBeginLoc()); 6010 6011 return cxloc::translateSourceLocation(getCursorContext(C), 6012 BaseSpec->getBeginLoc()); 6013 } 6014 6015 case CXCursor_LabelRef: { 6016 std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C); 6017 return cxloc::translateSourceLocation(getCursorContext(C), P.second); 6018 } 6019 6020 case CXCursor_OverloadedDeclRef: 6021 return cxloc::translateSourceLocation( 6022 getCursorContext(C), getCursorOverloadedDeclRef(C).second); 6023 6024 default: 6025 // FIXME: Need a way to enumerate all non-reference cases. 6026 llvm_unreachable("Missed a reference kind"); 6027 } 6028 } 6029 6030 if (clang_isExpression(C.kind)) 6031 return cxloc::translateSourceLocation( 6032 getCursorContext(C), getLocationFromExpr(getCursorExpr(C))); 6033 6034 if (clang_isStatement(C.kind)) 6035 return cxloc::translateSourceLocation(getCursorContext(C), 6036 getCursorStmt(C)->getBeginLoc()); 6037 6038 if (C.kind == CXCursor_PreprocessingDirective) { 6039 SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin(); 6040 return cxloc::translateSourceLocation(getCursorContext(C), L); 6041 } 6042 6043 if (C.kind == CXCursor_MacroExpansion) { 6044 SourceLocation L = 6045 cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin(); 6046 return cxloc::translateSourceLocation(getCursorContext(C), L); 6047 } 6048 6049 if (C.kind == CXCursor_MacroDefinition) { 6050 SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation(); 6051 return cxloc::translateSourceLocation(getCursorContext(C), L); 6052 } 6053 6054 if (C.kind == CXCursor_InclusionDirective) { 6055 SourceLocation L = 6056 cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin(); 6057 return cxloc::translateSourceLocation(getCursorContext(C), L); 6058 } 6059 6060 if (clang_isAttribute(C.kind)) { 6061 SourceLocation L = cxcursor::getCursorAttr(C)->getLocation(); 6062 return cxloc::translateSourceLocation(getCursorContext(C), L); 6063 } 6064 6065 if (!clang_isDeclaration(C.kind)) 6066 return clang_getNullLocation(); 6067 6068 const Decl *D = getCursorDecl(C); 6069 if (!D) 6070 return clang_getNullLocation(); 6071 6072 SourceLocation Loc = D->getLocation(); 6073 // FIXME: Multiple variables declared in a single declaration 6074 // currently lack the information needed to correctly determine their 6075 // ranges when accounting for the type-specifier. We use context 6076 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 6077 // and if so, whether it is the first decl. 6078 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 6079 if (!cxcursor::isFirstInDeclGroup(C)) 6080 Loc = VD->getLocation(); 6081 } 6082 6083 // For ObjC methods, give the start location of the method name. 6084 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 6085 Loc = MD->getSelectorStartLoc(); 6086 6087 return cxloc::translateSourceLocation(getCursorContext(C), Loc); 6088 } 6089 6090 } // end extern "C" 6091 6092 CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) { 6093 assert(TU); 6094 6095 // Guard against an invalid SourceLocation, or we may assert in one 6096 // of the following calls. 6097 if (SLoc.isInvalid()) 6098 return clang_getNullCursor(); 6099 6100 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6101 6102 // Translate the given source location to make it point at the beginning of 6103 // the token under the cursor. 6104 SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(), 6105 CXXUnit->getASTContext().getLangOpts()); 6106 6107 CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound); 6108 if (SLoc.isValid()) { 6109 GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result); 6110 CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData, 6111 /*VisitPreprocessorLast=*/true, 6112 /*VisitIncludedEntities=*/false, 6113 SourceLocation(SLoc)); 6114 CursorVis.visitFileRegion(); 6115 } 6116 6117 return Result; 6118 } 6119 6120 static SourceRange getRawCursorExtent(CXCursor C) { 6121 if (clang_isReference(C.kind)) { 6122 switch (C.kind) { 6123 case CXCursor_ObjCSuperClassRef: 6124 return getCursorObjCSuperClassRef(C).second; 6125 6126 case CXCursor_ObjCProtocolRef: 6127 return getCursorObjCProtocolRef(C).second; 6128 6129 case CXCursor_ObjCClassRef: 6130 return getCursorObjCClassRef(C).second; 6131 6132 case CXCursor_TypeRef: 6133 return getCursorTypeRef(C).second; 6134 6135 case CXCursor_TemplateRef: 6136 return getCursorTemplateRef(C).second; 6137 6138 case CXCursor_NamespaceRef: 6139 return getCursorNamespaceRef(C).second; 6140 6141 case CXCursor_MemberRef: 6142 return getCursorMemberRef(C).second; 6143 6144 case CXCursor_CXXBaseSpecifier: 6145 return getCursorCXXBaseSpecifier(C)->getSourceRange(); 6146 6147 case CXCursor_LabelRef: 6148 return getCursorLabelRef(C).second; 6149 6150 case CXCursor_OverloadedDeclRef: 6151 return getCursorOverloadedDeclRef(C).second; 6152 6153 case CXCursor_VariableRef: 6154 return getCursorVariableRef(C).second; 6155 6156 default: 6157 // FIXME: Need a way to enumerate all non-reference cases. 6158 llvm_unreachable("Missed a reference kind"); 6159 } 6160 } 6161 6162 if (clang_isExpression(C.kind)) 6163 return getCursorExpr(C)->getSourceRange(); 6164 6165 if (clang_isStatement(C.kind)) 6166 return getCursorStmt(C)->getSourceRange(); 6167 6168 if (clang_isAttribute(C.kind)) 6169 return getCursorAttr(C)->getRange(); 6170 6171 if (C.kind == CXCursor_PreprocessingDirective) 6172 return cxcursor::getCursorPreprocessingDirective(C); 6173 6174 if (C.kind == CXCursor_MacroExpansion) { 6175 ASTUnit *TU = getCursorASTUnit(C); 6176 SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange(); 6177 return TU->mapRangeFromPreamble(Range); 6178 } 6179 6180 if (C.kind == CXCursor_MacroDefinition) { 6181 ASTUnit *TU = getCursorASTUnit(C); 6182 SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange(); 6183 return TU->mapRangeFromPreamble(Range); 6184 } 6185 6186 if (C.kind == CXCursor_InclusionDirective) { 6187 ASTUnit *TU = getCursorASTUnit(C); 6188 SourceRange Range = 6189 cxcursor::getCursorInclusionDirective(C)->getSourceRange(); 6190 return TU->mapRangeFromPreamble(Range); 6191 } 6192 6193 if (C.kind == CXCursor_TranslationUnit) { 6194 ASTUnit *TU = getCursorASTUnit(C); 6195 FileID MainID = TU->getSourceManager().getMainFileID(); 6196 SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID); 6197 SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID); 6198 return SourceRange(Start, End); 6199 } 6200 6201 if (clang_isDeclaration(C.kind)) { 6202 const Decl *D = cxcursor::getCursorDecl(C); 6203 if (!D) 6204 return SourceRange(); 6205 6206 SourceRange R = D->getSourceRange(); 6207 // FIXME: Multiple variables declared in a single declaration 6208 // currently lack the information needed to correctly determine their 6209 // ranges when accounting for the type-specifier. We use context 6210 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 6211 // and if so, whether it is the first decl. 6212 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 6213 if (!cxcursor::isFirstInDeclGroup(C)) 6214 R.setBegin(VD->getLocation()); 6215 } 6216 return R; 6217 } 6218 return SourceRange(); 6219 } 6220 6221 /// Retrieves the "raw" cursor extent, which is then extended to include 6222 /// the decl-specifier-seq for declarations. 6223 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) { 6224 if (clang_isDeclaration(C.kind)) { 6225 const Decl *D = cxcursor::getCursorDecl(C); 6226 if (!D) 6227 return SourceRange(); 6228 6229 SourceRange R = D->getSourceRange(); 6230 6231 // Adjust the start of the location for declarations preceded by 6232 // declaration specifiers. 6233 SourceLocation StartLoc; 6234 if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) { 6235 if (TypeSourceInfo *TI = DD->getTypeSourceInfo()) 6236 StartLoc = TI->getTypeLoc().getBeginLoc(); 6237 } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) { 6238 if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo()) 6239 StartLoc = TI->getTypeLoc().getBeginLoc(); 6240 } 6241 6242 if (StartLoc.isValid() && R.getBegin().isValid() && 6243 SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin())) 6244 R.setBegin(StartLoc); 6245 6246 // FIXME: Multiple variables declared in a single declaration 6247 // currently lack the information needed to correctly determine their 6248 // ranges when accounting for the type-specifier. We use context 6249 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 6250 // and if so, whether it is the first decl. 6251 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 6252 if (!cxcursor::isFirstInDeclGroup(C)) 6253 R.setBegin(VD->getLocation()); 6254 } 6255 6256 return R; 6257 } 6258 6259 return getRawCursorExtent(C); 6260 } 6261 6262 CXSourceRange clang_getCursorExtent(CXCursor C) { 6263 SourceRange R = getRawCursorExtent(C); 6264 if (R.isInvalid()) 6265 return clang_getNullRange(); 6266 6267 return cxloc::translateSourceRange(getCursorContext(C), R); 6268 } 6269 6270 CXCursor clang_getCursorReferenced(CXCursor C) { 6271 if (clang_isInvalid(C.kind)) 6272 return clang_getNullCursor(); 6273 6274 CXTranslationUnit tu = getCursorTU(C); 6275 if (clang_isDeclaration(C.kind)) { 6276 const Decl *D = getCursorDecl(C); 6277 if (!D) 6278 return clang_getNullCursor(); 6279 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) 6280 return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu); 6281 if (const ObjCPropertyImplDecl *PropImpl = 6282 dyn_cast<ObjCPropertyImplDecl>(D)) 6283 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 6284 return MakeCXCursor(Property, tu); 6285 6286 return C; 6287 } 6288 6289 if (clang_isExpression(C.kind)) { 6290 const Expr *E = getCursorExpr(C); 6291 const Decl *D = getDeclFromExpr(E); 6292 if (D) { 6293 CXCursor declCursor = MakeCXCursor(D, tu); 6294 declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C), 6295 declCursor); 6296 return declCursor; 6297 } 6298 6299 if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E)) 6300 return MakeCursorOverloadedDeclRef(Ovl, tu); 6301 6302 return clang_getNullCursor(); 6303 } 6304 6305 if (clang_isStatement(C.kind)) { 6306 const Stmt *S = getCursorStmt(C); 6307 if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S)) 6308 if (LabelDecl *label = Goto->getLabel()) 6309 if (LabelStmt *labelS = label->getStmt()) 6310 return MakeCXCursor(labelS, getCursorDecl(C), tu); 6311 6312 return clang_getNullCursor(); 6313 } 6314 6315 if (C.kind == CXCursor_MacroExpansion) { 6316 if (const MacroDefinitionRecord *Def = 6317 getCursorMacroExpansion(C).getDefinition()) 6318 return MakeMacroDefinitionCursor(Def, tu); 6319 } 6320 6321 if (!clang_isReference(C.kind)) 6322 return clang_getNullCursor(); 6323 6324 switch (C.kind) { 6325 case CXCursor_ObjCSuperClassRef: 6326 return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu); 6327 6328 case CXCursor_ObjCProtocolRef: { 6329 const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first; 6330 if (const ObjCProtocolDecl *Def = Prot->getDefinition()) 6331 return MakeCXCursor(Def, tu); 6332 6333 return MakeCXCursor(Prot, tu); 6334 } 6335 6336 case CXCursor_ObjCClassRef: { 6337 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 6338 if (const ObjCInterfaceDecl *Def = Class->getDefinition()) 6339 return MakeCXCursor(Def, tu); 6340 6341 return MakeCXCursor(Class, tu); 6342 } 6343 6344 case CXCursor_TypeRef: 6345 return MakeCXCursor(getCursorTypeRef(C).first, tu); 6346 6347 case CXCursor_TemplateRef: 6348 return MakeCXCursor(getCursorTemplateRef(C).first, tu); 6349 6350 case CXCursor_NamespaceRef: 6351 return MakeCXCursor(getCursorNamespaceRef(C).first, tu); 6352 6353 case CXCursor_MemberRef: 6354 return MakeCXCursor(getCursorMemberRef(C).first, tu); 6355 6356 case CXCursor_CXXBaseSpecifier: { 6357 const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C); 6358 return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(), tu)); 6359 } 6360 6361 case CXCursor_LabelRef: 6362 // FIXME: We end up faking the "parent" declaration here because we 6363 // don't want to make CXCursor larger. 6364 return MakeCXCursor( 6365 getCursorLabelRef(C).first, 6366 cxtu::getASTUnit(tu)->getASTContext().getTranslationUnitDecl(), tu); 6367 6368 case CXCursor_OverloadedDeclRef: 6369 return C; 6370 6371 case CXCursor_VariableRef: 6372 return MakeCXCursor(getCursorVariableRef(C).first, tu); 6373 6374 default: 6375 // We would prefer to enumerate all non-reference cursor kinds here. 6376 llvm_unreachable("Unhandled reference cursor kind"); 6377 } 6378 } 6379 6380 CXCursor clang_getCursorDefinition(CXCursor C) { 6381 if (clang_isInvalid(C.kind)) 6382 return clang_getNullCursor(); 6383 6384 CXTranslationUnit TU = getCursorTU(C); 6385 6386 bool WasReference = false; 6387 if (clang_isReference(C.kind) || clang_isExpression(C.kind)) { 6388 C = clang_getCursorReferenced(C); 6389 WasReference = true; 6390 } 6391 6392 if (C.kind == CXCursor_MacroExpansion) 6393 return clang_getCursorReferenced(C); 6394 6395 if (!clang_isDeclaration(C.kind)) 6396 return clang_getNullCursor(); 6397 6398 const Decl *D = getCursorDecl(C); 6399 if (!D) 6400 return clang_getNullCursor(); 6401 6402 switch (D->getKind()) { 6403 // Declaration kinds that don't really separate the notions of 6404 // declaration and definition. 6405 case Decl::Namespace: 6406 case Decl::Typedef: 6407 case Decl::TypeAlias: 6408 case Decl::TypeAliasTemplate: 6409 case Decl::TemplateTypeParm: 6410 case Decl::EnumConstant: 6411 case Decl::Field: 6412 case Decl::Binding: 6413 case Decl::MSProperty: 6414 case Decl::MSGuid: 6415 case Decl::TemplateParamObject: 6416 case Decl::IndirectField: 6417 case Decl::ObjCIvar: 6418 case Decl::ObjCAtDefsField: 6419 case Decl::ImplicitParam: 6420 case Decl::ParmVar: 6421 case Decl::NonTypeTemplateParm: 6422 case Decl::TemplateTemplateParm: 6423 case Decl::ObjCCategoryImpl: 6424 case Decl::ObjCImplementation: 6425 case Decl::AccessSpec: 6426 case Decl::LinkageSpec: 6427 case Decl::Export: 6428 case Decl::ObjCPropertyImpl: 6429 case Decl::FileScopeAsm: 6430 case Decl::StaticAssert: 6431 case Decl::Block: 6432 case Decl::Captured: 6433 case Decl::OMPCapturedExpr: 6434 case Decl::Label: // FIXME: Is this right?? 6435 case Decl::ClassScopeFunctionSpecialization: 6436 case Decl::CXXDeductionGuide: 6437 case Decl::Import: 6438 case Decl::OMPThreadPrivate: 6439 case Decl::OMPAllocate: 6440 case Decl::OMPDeclareReduction: 6441 case Decl::OMPDeclareMapper: 6442 case Decl::OMPRequires: 6443 case Decl::ObjCTypeParam: 6444 case Decl::BuiltinTemplate: 6445 case Decl::PragmaComment: 6446 case Decl::PragmaDetectMismatch: 6447 case Decl::UsingPack: 6448 case Decl::Concept: 6449 case Decl::LifetimeExtendedTemporary: 6450 case Decl::RequiresExprBody: 6451 return C; 6452 6453 // Declaration kinds that don't make any sense here, but are 6454 // nonetheless harmless. 6455 case Decl::Empty: 6456 case Decl::TranslationUnit: 6457 case Decl::ExternCContext: 6458 break; 6459 6460 // Declaration kinds for which the definition is not resolvable. 6461 case Decl::UnresolvedUsingTypename: 6462 case Decl::UnresolvedUsingValue: 6463 break; 6464 6465 case Decl::UsingDirective: 6466 return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(), 6467 TU); 6468 6469 case Decl::NamespaceAlias: 6470 return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU); 6471 6472 case Decl::Enum: 6473 case Decl::Record: 6474 case Decl::CXXRecord: 6475 case Decl::ClassTemplateSpecialization: 6476 case Decl::ClassTemplatePartialSpecialization: 6477 if (TagDecl *Def = cast<TagDecl>(D)->getDefinition()) 6478 return MakeCXCursor(Def, TU); 6479 return clang_getNullCursor(); 6480 6481 case Decl::Function: 6482 case Decl::CXXMethod: 6483 case Decl::CXXConstructor: 6484 case Decl::CXXDestructor: 6485 case Decl::CXXConversion: { 6486 const FunctionDecl *Def = nullptr; 6487 if (cast<FunctionDecl>(D)->getBody(Def)) 6488 return MakeCXCursor(Def, TU); 6489 return clang_getNullCursor(); 6490 } 6491 6492 case Decl::Var: 6493 case Decl::VarTemplateSpecialization: 6494 case Decl::VarTemplatePartialSpecialization: 6495 case Decl::Decomposition: { 6496 // Ask the variable if it has a definition. 6497 if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition()) 6498 return MakeCXCursor(Def, TU); 6499 return clang_getNullCursor(); 6500 } 6501 6502 case Decl::FunctionTemplate: { 6503 const FunctionDecl *Def = nullptr; 6504 if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def)) 6505 return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU); 6506 return clang_getNullCursor(); 6507 } 6508 6509 case Decl::ClassTemplate: { 6510 if (RecordDecl *Def = 6511 cast<ClassTemplateDecl>(D)->getTemplatedDecl()->getDefinition()) 6512 return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(), 6513 TU); 6514 return clang_getNullCursor(); 6515 } 6516 6517 case Decl::VarTemplate: { 6518 if (VarDecl *Def = 6519 cast<VarTemplateDecl>(D)->getTemplatedDecl()->getDefinition()) 6520 return MakeCXCursor(cast<VarDecl>(Def)->getDescribedVarTemplate(), TU); 6521 return clang_getNullCursor(); 6522 } 6523 6524 case Decl::Using: 6525 return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D), D->getLocation(), 6526 TU); 6527 6528 case Decl::UsingShadow: 6529 case Decl::ConstructorUsingShadow: 6530 return clang_getCursorDefinition( 6531 MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(), TU)); 6532 6533 case Decl::ObjCMethod: { 6534 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D); 6535 if (Method->isThisDeclarationADefinition()) 6536 return C; 6537 6538 // Dig out the method definition in the associated 6539 // @implementation, if we have it. 6540 // FIXME: The ASTs should make finding the definition easier. 6541 if (const ObjCInterfaceDecl *Class = 6542 dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) 6543 if (ObjCImplementationDecl *ClassImpl = Class->getImplementation()) 6544 if (ObjCMethodDecl *Def = ClassImpl->getMethod( 6545 Method->getSelector(), Method->isInstanceMethod())) 6546 if (Def->isThisDeclarationADefinition()) 6547 return MakeCXCursor(Def, TU); 6548 6549 return clang_getNullCursor(); 6550 } 6551 6552 case Decl::ObjCCategory: 6553 if (ObjCCategoryImplDecl *Impl = 6554 cast<ObjCCategoryDecl>(D)->getImplementation()) 6555 return MakeCXCursor(Impl, TU); 6556 return clang_getNullCursor(); 6557 6558 case Decl::ObjCProtocol: 6559 if (const ObjCProtocolDecl *Def = 6560 cast<ObjCProtocolDecl>(D)->getDefinition()) 6561 return MakeCXCursor(Def, TU); 6562 return clang_getNullCursor(); 6563 6564 case Decl::ObjCInterface: { 6565 // There are two notions of a "definition" for an Objective-C 6566 // class: the interface and its implementation. When we resolved a 6567 // reference to an Objective-C class, produce the @interface as 6568 // the definition; when we were provided with the interface, 6569 // produce the @implementation as the definition. 6570 const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D); 6571 if (WasReference) { 6572 if (const ObjCInterfaceDecl *Def = IFace->getDefinition()) 6573 return MakeCXCursor(Def, TU); 6574 } else if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 6575 return MakeCXCursor(Impl, TU); 6576 return clang_getNullCursor(); 6577 } 6578 6579 case Decl::ObjCProperty: 6580 // FIXME: We don't really know where to find the 6581 // ObjCPropertyImplDecls that implement this property. 6582 return clang_getNullCursor(); 6583 6584 case Decl::ObjCCompatibleAlias: 6585 if (const ObjCInterfaceDecl *Class = 6586 cast<ObjCCompatibleAliasDecl>(D)->getClassInterface()) 6587 if (const ObjCInterfaceDecl *Def = Class->getDefinition()) 6588 return MakeCXCursor(Def, TU); 6589 6590 return clang_getNullCursor(); 6591 6592 case Decl::Friend: 6593 if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl()) 6594 return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 6595 return clang_getNullCursor(); 6596 6597 case Decl::FriendTemplate: 6598 if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl()) 6599 return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 6600 return clang_getNullCursor(); 6601 } 6602 6603 return clang_getNullCursor(); 6604 } 6605 6606 unsigned clang_isCursorDefinition(CXCursor C) { 6607 if (!clang_isDeclaration(C.kind)) 6608 return 0; 6609 6610 return clang_getCursorDefinition(C) == C; 6611 } 6612 6613 CXCursor clang_getCanonicalCursor(CXCursor C) { 6614 if (!clang_isDeclaration(C.kind)) 6615 return C; 6616 6617 if (const Decl *D = getCursorDecl(C)) { 6618 if (const ObjCCategoryImplDecl *CatImplD = 6619 dyn_cast<ObjCCategoryImplDecl>(D)) 6620 if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl()) 6621 return MakeCXCursor(CatD, getCursorTU(C)); 6622 6623 if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 6624 if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface()) 6625 return MakeCXCursor(IFD, getCursorTU(C)); 6626 6627 return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C)); 6628 } 6629 6630 return C; 6631 } 6632 6633 int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) { 6634 return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first; 6635 } 6636 6637 unsigned clang_getNumOverloadedDecls(CXCursor C) { 6638 if (C.kind != CXCursor_OverloadedDeclRef) 6639 return 0; 6640 6641 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 6642 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 6643 return E->getNumDecls(); 6644 6645 if (OverloadedTemplateStorage *S = 6646 Storage.dyn_cast<OverloadedTemplateStorage *>()) 6647 return S->size(); 6648 6649 const Decl *D = Storage.get<const Decl *>(); 6650 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) 6651 return Using->shadow_size(); 6652 6653 return 0; 6654 } 6655 6656 CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) { 6657 if (cursor.kind != CXCursor_OverloadedDeclRef) 6658 return clang_getNullCursor(); 6659 6660 if (index >= clang_getNumOverloadedDecls(cursor)) 6661 return clang_getNullCursor(); 6662 6663 CXTranslationUnit TU = getCursorTU(cursor); 6664 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first; 6665 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 6666 return MakeCXCursor(E->decls_begin()[index], TU); 6667 6668 if (OverloadedTemplateStorage *S = 6669 Storage.dyn_cast<OverloadedTemplateStorage *>()) 6670 return MakeCXCursor(S->begin()[index], TU); 6671 6672 const Decl *D = Storage.get<const Decl *>(); 6673 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) { 6674 // FIXME: This is, unfortunately, linear time. 6675 UsingDecl::shadow_iterator Pos = Using->shadow_begin(); 6676 std::advance(Pos, index); 6677 return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU); 6678 } 6679 6680 return clang_getNullCursor(); 6681 } 6682 6683 void clang_getDefinitionSpellingAndExtent( 6684 CXCursor C, const char **startBuf, const char **endBuf, unsigned *startLine, 6685 unsigned *startColumn, unsigned *endLine, unsigned *endColumn) { 6686 assert(getCursorDecl(C) && "CXCursor has null decl"); 6687 const FunctionDecl *FD = dyn_cast<FunctionDecl>(getCursorDecl(C)); 6688 CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody()); 6689 6690 SourceManager &SM = FD->getASTContext().getSourceManager(); 6691 *startBuf = SM.getCharacterData(Body->getLBracLoc()); 6692 *endBuf = SM.getCharacterData(Body->getRBracLoc()); 6693 *startLine = SM.getSpellingLineNumber(Body->getLBracLoc()); 6694 *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc()); 6695 *endLine = SM.getSpellingLineNumber(Body->getRBracLoc()); 6696 *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc()); 6697 } 6698 6699 CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags, 6700 unsigned PieceIndex) { 6701 RefNamePieces Pieces; 6702 6703 switch (C.kind) { 6704 case CXCursor_MemberRefExpr: 6705 if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C))) 6706 Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(), 6707 E->getQualifierLoc().getSourceRange()); 6708 break; 6709 6710 case CXCursor_DeclRefExpr: 6711 if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) { 6712 SourceRange TemplateArgLoc(E->getLAngleLoc(), E->getRAngleLoc()); 6713 Pieces = 6714 buildPieces(NameFlags, false, E->getNameInfo(), 6715 E->getQualifierLoc().getSourceRange(), &TemplateArgLoc); 6716 } 6717 break; 6718 6719 case CXCursor_CallExpr: 6720 if (const CXXOperatorCallExpr *OCE = 6721 dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) { 6722 const Expr *Callee = OCE->getCallee(); 6723 if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) 6724 Callee = ICE->getSubExpr(); 6725 6726 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) 6727 Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(), 6728 DRE->getQualifierLoc().getSourceRange()); 6729 } 6730 break; 6731 6732 default: 6733 break; 6734 } 6735 6736 if (Pieces.empty()) { 6737 if (PieceIndex == 0) 6738 return clang_getCursorExtent(C); 6739 } else if (PieceIndex < Pieces.size()) { 6740 SourceRange R = Pieces[PieceIndex]; 6741 if (R.isValid()) 6742 return cxloc::translateSourceRange(getCursorContext(C), R); 6743 } 6744 6745 return clang_getNullRange(); 6746 } 6747 6748 void clang_enableStackTraces(void) { 6749 // FIXME: Provide an argv0 here so we can find llvm-symbolizer. 6750 llvm::sys::PrintStackTraceOnErrorSignal(StringRef()); 6751 } 6752 6753 void clang_executeOnThread(void (*fn)(void *), void *user_data, 6754 unsigned stack_size) { 6755 llvm::llvm_execute_on_thread(fn, user_data, 6756 stack_size == 0 6757 ? clang::DesiredStackSize 6758 : llvm::Optional<unsigned>(stack_size)); 6759 } 6760 6761 //===----------------------------------------------------------------------===// 6762 // Token-based Operations. 6763 //===----------------------------------------------------------------------===// 6764 6765 /* CXToken layout: 6766 * int_data[0]: a CXTokenKind 6767 * int_data[1]: starting token location 6768 * int_data[2]: token length 6769 * int_data[3]: reserved 6770 * ptr_data: for identifiers and keywords, an IdentifierInfo*. 6771 * otherwise unused. 6772 */ 6773 CXTokenKind clang_getTokenKind(CXToken CXTok) { 6774 return static_cast<CXTokenKind>(CXTok.int_data[0]); 6775 } 6776 6777 CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { 6778 switch (clang_getTokenKind(CXTok)) { 6779 case CXToken_Identifier: 6780 case CXToken_Keyword: 6781 // We know we have an IdentifierInfo*, so use that. 6782 return cxstring::createRef( 6783 static_cast<IdentifierInfo *>(CXTok.ptr_data)->getNameStart()); 6784 6785 case CXToken_Literal: { 6786 // We have stashed the starting pointer in the ptr_data field. Use it. 6787 const char *Text = static_cast<const char *>(CXTok.ptr_data); 6788 return cxstring::createDup(StringRef(Text, CXTok.int_data[2])); 6789 } 6790 6791 case CXToken_Punctuation: 6792 case CXToken_Comment: 6793 break; 6794 } 6795 6796 if (isNotUsableTU(TU)) { 6797 LOG_BAD_TU(TU); 6798 return cxstring::createEmpty(); 6799 } 6800 6801 // We have to find the starting buffer pointer the hard way, by 6802 // deconstructing the source location. 6803 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6804 if (!CXXUnit) 6805 return cxstring::createEmpty(); 6806 6807 SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]); 6808 std::pair<FileID, unsigned> LocInfo = 6809 CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc); 6810 bool Invalid = false; 6811 StringRef Buffer = 6812 CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid); 6813 if (Invalid) 6814 return cxstring::createEmpty(); 6815 6816 return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2])); 6817 } 6818 6819 CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) { 6820 if (isNotUsableTU(TU)) { 6821 LOG_BAD_TU(TU); 6822 return clang_getNullLocation(); 6823 } 6824 6825 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6826 if (!CXXUnit) 6827 return clang_getNullLocation(); 6828 6829 return cxloc::translateSourceLocation( 6830 CXXUnit->getASTContext(), 6831 SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 6832 } 6833 6834 CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { 6835 if (isNotUsableTU(TU)) { 6836 LOG_BAD_TU(TU); 6837 return clang_getNullRange(); 6838 } 6839 6840 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6841 if (!CXXUnit) 6842 return clang_getNullRange(); 6843 6844 return cxloc::translateSourceRange( 6845 CXXUnit->getASTContext(), 6846 SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 6847 } 6848 6849 static void getTokens(ASTUnit *CXXUnit, SourceRange Range, 6850 SmallVectorImpl<CXToken> &CXTokens) { 6851 SourceManager &SourceMgr = CXXUnit->getSourceManager(); 6852 std::pair<FileID, unsigned> BeginLocInfo = 6853 SourceMgr.getDecomposedSpellingLoc(Range.getBegin()); 6854 std::pair<FileID, unsigned> EndLocInfo = 6855 SourceMgr.getDecomposedSpellingLoc(Range.getEnd()); 6856 6857 // Cannot tokenize across files. 6858 if (BeginLocInfo.first != EndLocInfo.first) 6859 return; 6860 6861 // Create a lexer 6862 bool Invalid = false; 6863 StringRef Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 6864 if (Invalid) 6865 return; 6866 6867 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 6868 CXXUnit->getASTContext().getLangOpts(), Buffer.begin(), 6869 Buffer.data() + BeginLocInfo.second, Buffer.end()); 6870 Lex.SetCommentRetentionState(true); 6871 6872 // Lex tokens until we hit the end of the range. 6873 const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second; 6874 Token Tok; 6875 bool previousWasAt = false; 6876 do { 6877 // Lex the next token 6878 Lex.LexFromRawLexer(Tok); 6879 if (Tok.is(tok::eof)) 6880 break; 6881 6882 // Initialize the CXToken. 6883 CXToken CXTok; 6884 6885 // - Common fields 6886 CXTok.int_data[1] = Tok.getLocation().getRawEncoding(); 6887 CXTok.int_data[2] = Tok.getLength(); 6888 CXTok.int_data[3] = 0; 6889 6890 // - Kind-specific fields 6891 if (Tok.isLiteral()) { 6892 CXTok.int_data[0] = CXToken_Literal; 6893 CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData()); 6894 } else if (Tok.is(tok::raw_identifier)) { 6895 // Lookup the identifier to determine whether we have a keyword. 6896 IdentifierInfo *II = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok); 6897 6898 if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) { 6899 CXTok.int_data[0] = CXToken_Keyword; 6900 } else { 6901 CXTok.int_data[0] = 6902 Tok.is(tok::identifier) ? CXToken_Identifier : CXToken_Keyword; 6903 } 6904 CXTok.ptr_data = II; 6905 } else if (Tok.is(tok::comment)) { 6906 CXTok.int_data[0] = CXToken_Comment; 6907 CXTok.ptr_data = nullptr; 6908 } else { 6909 CXTok.int_data[0] = CXToken_Punctuation; 6910 CXTok.ptr_data = nullptr; 6911 } 6912 CXTokens.push_back(CXTok); 6913 previousWasAt = Tok.is(tok::at); 6914 } while (Lex.getBufferLocation() < EffectiveBufferEnd); 6915 } 6916 6917 CXToken *clang_getToken(CXTranslationUnit TU, CXSourceLocation Location) { 6918 LOG_FUNC_SECTION { *Log << TU << ' ' << Location; } 6919 6920 if (isNotUsableTU(TU)) { 6921 LOG_BAD_TU(TU); 6922 return NULL; 6923 } 6924 6925 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6926 if (!CXXUnit) 6927 return NULL; 6928 6929 SourceLocation Begin = cxloc::translateSourceLocation(Location); 6930 if (Begin.isInvalid()) 6931 return NULL; 6932 SourceManager &SM = CXXUnit->getSourceManager(); 6933 std::pair<FileID, unsigned> DecomposedEnd = SM.getDecomposedLoc(Begin); 6934 DecomposedEnd.second += 6935 Lexer::MeasureTokenLength(Begin, SM, CXXUnit->getLangOpts()); 6936 6937 SourceLocation End = 6938 SM.getComposedLoc(DecomposedEnd.first, DecomposedEnd.second); 6939 6940 SmallVector<CXToken, 32> CXTokens; 6941 getTokens(CXXUnit, SourceRange(Begin, End), CXTokens); 6942 6943 if (CXTokens.empty()) 6944 return NULL; 6945 6946 CXTokens.resize(1); 6947 CXToken *Token = static_cast<CXToken *>(llvm::safe_malloc(sizeof(CXToken))); 6948 6949 memmove(Token, CXTokens.data(), sizeof(CXToken)); 6950 return Token; 6951 } 6952 6953 void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, CXToken **Tokens, 6954 unsigned *NumTokens) { 6955 LOG_FUNC_SECTION { *Log << TU << ' ' << Range; } 6956 6957 if (Tokens) 6958 *Tokens = nullptr; 6959 if (NumTokens) 6960 *NumTokens = 0; 6961 6962 if (isNotUsableTU(TU)) { 6963 LOG_BAD_TU(TU); 6964 return; 6965 } 6966 6967 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6968 if (!CXXUnit || !Tokens || !NumTokens) 6969 return; 6970 6971 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 6972 6973 SourceRange R = cxloc::translateCXSourceRange(Range); 6974 if (R.isInvalid()) 6975 return; 6976 6977 SmallVector<CXToken, 32> CXTokens; 6978 getTokens(CXXUnit, R, CXTokens); 6979 6980 if (CXTokens.empty()) 6981 return; 6982 6983 *Tokens = static_cast<CXToken *>( 6984 llvm::safe_malloc(sizeof(CXToken) * CXTokens.size())); 6985 memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size()); 6986 *NumTokens = CXTokens.size(); 6987 } 6988 6989 void clang_disposeTokens(CXTranslationUnit TU, CXToken *Tokens, 6990 unsigned NumTokens) { 6991 free(Tokens); 6992 } 6993 6994 //===----------------------------------------------------------------------===// 6995 // Token annotation APIs. 6996 //===----------------------------------------------------------------------===// 6997 6998 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 6999 CXCursor parent, 7000 CXClientData client_data); 7001 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor, 7002 CXClientData client_data); 7003 7004 namespace { 7005 class AnnotateTokensWorker { 7006 CXToken *Tokens; 7007 CXCursor *Cursors; 7008 unsigned NumTokens; 7009 unsigned TokIdx; 7010 unsigned PreprocessingTokIdx; 7011 CursorVisitor AnnotateVis; 7012 SourceManager &SrcMgr; 7013 bool HasContextSensitiveKeywords; 7014 7015 struct PostChildrenAction { 7016 CXCursor cursor; 7017 enum Action { Invalid, Ignore, Postpone } action; 7018 }; 7019 using PostChildrenActions = SmallVector<PostChildrenAction, 0>; 7020 7021 struct PostChildrenInfo { 7022 CXCursor Cursor; 7023 SourceRange CursorRange; 7024 unsigned BeforeReachingCursorIdx; 7025 unsigned BeforeChildrenTokenIdx; 7026 PostChildrenActions ChildActions; 7027 }; 7028 SmallVector<PostChildrenInfo, 8> PostChildrenInfos; 7029 7030 CXToken &getTok(unsigned Idx) { 7031 assert(Idx < NumTokens); 7032 return Tokens[Idx]; 7033 } 7034 const CXToken &getTok(unsigned Idx) const { 7035 assert(Idx < NumTokens); 7036 return Tokens[Idx]; 7037 } 7038 bool MoreTokens() const { return TokIdx < NumTokens; } 7039 unsigned NextToken() const { return TokIdx; } 7040 void AdvanceToken() { ++TokIdx; } 7041 SourceLocation GetTokenLoc(unsigned tokI) { 7042 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]); 7043 } 7044 bool isFunctionMacroToken(unsigned tokI) const { 7045 return getTok(tokI).int_data[3] != 0; 7046 } 7047 SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const { 7048 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[3]); 7049 } 7050 7051 void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange); 7052 bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult, 7053 SourceRange); 7054 7055 public: 7056 AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens, 7057 CXTranslationUnit TU, SourceRange RegionOfInterest) 7058 : Tokens(tokens), Cursors(cursors), NumTokens(numTokens), TokIdx(0), 7059 PreprocessingTokIdx(0), 7060 AnnotateVis(TU, AnnotateTokensVisitor, this, 7061 /*VisitPreprocessorLast=*/true, 7062 /*VisitIncludedEntities=*/false, RegionOfInterest, 7063 /*VisitDeclsOnly=*/false, 7064 AnnotateTokensPostChildrenVisitor), 7065 SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()), 7066 HasContextSensitiveKeywords(false) {} 7067 7068 void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); } 7069 enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent); 7070 bool IsIgnoredChildCursor(CXCursor cursor) const; 7071 PostChildrenActions DetermineChildActions(CXCursor Cursor) const; 7072 7073 bool postVisitChildren(CXCursor cursor); 7074 void HandlePostPonedChildCursors(const PostChildrenInfo &Info); 7075 void HandlePostPonedChildCursor(CXCursor Cursor, unsigned StartTokenIndex); 7076 7077 void AnnotateTokens(); 7078 7079 /// Determine whether the annotator saw any cursors that have 7080 /// context-sensitive keywords. 7081 bool hasContextSensitiveKeywords() const { 7082 return HasContextSensitiveKeywords; 7083 } 7084 7085 ~AnnotateTokensWorker() { assert(PostChildrenInfos.empty()); } 7086 }; 7087 } // namespace 7088 7089 void AnnotateTokensWorker::AnnotateTokens() { 7090 // Walk the AST within the region of interest, annotating tokens 7091 // along the way. 7092 AnnotateVis.visitFileRegion(); 7093 } 7094 7095 bool AnnotateTokensWorker::IsIgnoredChildCursor(CXCursor cursor) const { 7096 if (PostChildrenInfos.empty()) 7097 return false; 7098 7099 for (const auto &ChildAction : PostChildrenInfos.back().ChildActions) { 7100 if (ChildAction.cursor == cursor && 7101 ChildAction.action == PostChildrenAction::Ignore) { 7102 return true; 7103 } 7104 } 7105 7106 return false; 7107 } 7108 7109 const CXXOperatorCallExpr *GetSubscriptOrCallOperator(CXCursor Cursor) { 7110 if (!clang_isExpression(Cursor.kind)) 7111 return nullptr; 7112 7113 const Expr *E = getCursorExpr(Cursor); 7114 if (const auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) { 7115 const OverloadedOperatorKind Kind = OCE->getOperator(); 7116 if (Kind == OO_Call || Kind == OO_Subscript) 7117 return OCE; 7118 } 7119 7120 return nullptr; 7121 } 7122 7123 AnnotateTokensWorker::PostChildrenActions 7124 AnnotateTokensWorker::DetermineChildActions(CXCursor Cursor) const { 7125 PostChildrenActions actions; 7126 7127 // The DeclRefExpr of CXXOperatorCallExpr refering to the custom operator is 7128 // visited before the arguments to the operator call. For the Call and 7129 // Subscript operator the range of this DeclRefExpr includes the whole call 7130 // expression, so that all tokens in that range would be mapped to the 7131 // operator function, including the tokens of the arguments. To avoid that, 7132 // ensure to visit this DeclRefExpr as last node. 7133 if (const auto *OCE = GetSubscriptOrCallOperator(Cursor)) { 7134 const Expr *Callee = OCE->getCallee(); 7135 if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) { 7136 const Expr *SubExpr = ICE->getSubExpr(); 7137 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(SubExpr)) { 7138 const Decl *parentDecl = getCursorDecl(Cursor); 7139 CXTranslationUnit TU = clang_Cursor_getTranslationUnit(Cursor); 7140 7141 // Visit the DeclRefExpr as last. 7142 CXCursor cxChild = MakeCXCursor(DRE, parentDecl, TU); 7143 actions.push_back({cxChild, PostChildrenAction::Postpone}); 7144 7145 // The parent of the DeclRefExpr, an ImplicitCastExpr, has an equally 7146 // wide range as the DeclRefExpr. We can skip visiting this entirely. 7147 cxChild = MakeCXCursor(ICE, parentDecl, TU); 7148 actions.push_back({cxChild, PostChildrenAction::Ignore}); 7149 } 7150 } 7151 } 7152 7153 return actions; 7154 } 7155 7156 static inline void updateCursorAnnotation(CXCursor &Cursor, 7157 const CXCursor &updateC) { 7158 if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind)) 7159 return; 7160 Cursor = updateC; 7161 } 7162 7163 /// It annotates and advances tokens with a cursor until the comparison 7164 //// between the cursor location and the source range is the same as 7165 /// \arg compResult. 7166 /// 7167 /// Pass RangeBefore to annotate tokens with a cursor until a range is reached. 7168 /// Pass RangeOverlap to annotate tokens inside a range. 7169 void AnnotateTokensWorker::annotateAndAdvanceTokens( 7170 CXCursor updateC, RangeComparisonResult compResult, SourceRange range) { 7171 while (MoreTokens()) { 7172 const unsigned I = NextToken(); 7173 if (isFunctionMacroToken(I)) 7174 if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range)) 7175 return; 7176 7177 SourceLocation TokLoc = GetTokenLoc(I); 7178 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) { 7179 updateCursorAnnotation(Cursors[I], updateC); 7180 AdvanceToken(); 7181 continue; 7182 } 7183 break; 7184 } 7185 } 7186 7187 /// Special annotation handling for macro argument tokens. 7188 /// \returns true if it advanced beyond all macro tokens, false otherwise. 7189 bool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens( 7190 CXCursor updateC, RangeComparisonResult compResult, SourceRange range) { 7191 assert(MoreTokens()); 7192 assert(isFunctionMacroToken(NextToken()) && 7193 "Should be called only for macro arg tokens"); 7194 7195 // This works differently than annotateAndAdvanceTokens; because expanded 7196 // macro arguments can have arbitrary translation-unit source order, we do not 7197 // advance the token index one by one until a token fails the range test. 7198 // We only advance once past all of the macro arg tokens if all of them 7199 // pass the range test. If one of them fails we keep the token index pointing 7200 // at the start of the macro arg tokens so that the failing token will be 7201 // annotated by a subsequent annotation try. 7202 7203 bool atLeastOneCompFail = false; 7204 7205 unsigned I = NextToken(); 7206 for (; I < NumTokens && isFunctionMacroToken(I); ++I) { 7207 SourceLocation TokLoc = getFunctionMacroTokenLoc(I); 7208 if (TokLoc.isFileID()) 7209 continue; // not macro arg token, it's parens or comma. 7210 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) { 7211 if (clang_isInvalid(clang_getCursorKind(Cursors[I]))) 7212 Cursors[I] = updateC; 7213 } else 7214 atLeastOneCompFail = true; 7215 } 7216 7217 if (atLeastOneCompFail) 7218 return false; 7219 7220 TokIdx = I; // All of the tokens were handled, advance beyond all of them. 7221 return true; 7222 } 7223 7224 enum CXChildVisitResult AnnotateTokensWorker::Visit(CXCursor cursor, 7225 CXCursor parent) { 7226 SourceRange cursorRange = getRawCursorExtent(cursor); 7227 if (cursorRange.isInvalid()) 7228 return CXChildVisit_Recurse; 7229 7230 if (IsIgnoredChildCursor(cursor)) 7231 return CXChildVisit_Continue; 7232 7233 if (!HasContextSensitiveKeywords) { 7234 // Objective-C properties can have context-sensitive keywords. 7235 if (cursor.kind == CXCursor_ObjCPropertyDecl) { 7236 if (const ObjCPropertyDecl *Property = 7237 dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor))) 7238 HasContextSensitiveKeywords = 7239 Property->getPropertyAttributesAsWritten() != 0; 7240 } 7241 // Objective-C methods can have context-sensitive keywords. 7242 else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl || 7243 cursor.kind == CXCursor_ObjCClassMethodDecl) { 7244 if (const ObjCMethodDecl *Method = 7245 dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) { 7246 if (Method->getObjCDeclQualifier()) 7247 HasContextSensitiveKeywords = true; 7248 else { 7249 for (const auto *P : Method->parameters()) { 7250 if (P->getObjCDeclQualifier()) { 7251 HasContextSensitiveKeywords = true; 7252 break; 7253 } 7254 } 7255 } 7256 } 7257 } 7258 // C++ methods can have context-sensitive keywords. 7259 else if (cursor.kind == CXCursor_CXXMethod) { 7260 if (const CXXMethodDecl *Method = 7261 dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) { 7262 if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>()) 7263 HasContextSensitiveKeywords = true; 7264 } 7265 } 7266 // C++ classes can have context-sensitive keywords. 7267 else if (cursor.kind == CXCursor_StructDecl || 7268 cursor.kind == CXCursor_ClassDecl || 7269 cursor.kind == CXCursor_ClassTemplate || 7270 cursor.kind == CXCursor_ClassTemplatePartialSpecialization) { 7271 if (const Decl *D = getCursorDecl(cursor)) 7272 if (D->hasAttr<FinalAttr>()) 7273 HasContextSensitiveKeywords = true; 7274 } 7275 } 7276 7277 // Don't override a property annotation with its getter/setter method. 7278 if (cursor.kind == CXCursor_ObjCInstanceMethodDecl && 7279 parent.kind == CXCursor_ObjCPropertyDecl) 7280 return CXChildVisit_Continue; 7281 7282 if (clang_isPreprocessing(cursor.kind)) { 7283 // Items in the preprocessing record are kept separate from items in 7284 // declarations, so we keep a separate token index. 7285 unsigned SavedTokIdx = TokIdx; 7286 TokIdx = PreprocessingTokIdx; 7287 7288 // Skip tokens up until we catch up to the beginning of the preprocessing 7289 // entry. 7290 while (MoreTokens()) { 7291 const unsigned I = NextToken(); 7292 SourceLocation TokLoc = GetTokenLoc(I); 7293 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 7294 case RangeBefore: 7295 AdvanceToken(); 7296 continue; 7297 case RangeAfter: 7298 case RangeOverlap: 7299 break; 7300 } 7301 break; 7302 } 7303 7304 // Look at all of the tokens within this range. 7305 while (MoreTokens()) { 7306 const unsigned I = NextToken(); 7307 SourceLocation TokLoc = GetTokenLoc(I); 7308 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 7309 case RangeBefore: 7310 llvm_unreachable("Infeasible"); 7311 case RangeAfter: 7312 break; 7313 case RangeOverlap: 7314 // For macro expansions, just note where the beginning of the macro 7315 // expansion occurs. 7316 if (cursor.kind == CXCursor_MacroExpansion) { 7317 if (TokLoc == cursorRange.getBegin()) 7318 Cursors[I] = cursor; 7319 AdvanceToken(); 7320 break; 7321 } 7322 // We may have already annotated macro names inside macro definitions. 7323 if (Cursors[I].kind != CXCursor_MacroExpansion) 7324 Cursors[I] = cursor; 7325 AdvanceToken(); 7326 continue; 7327 } 7328 break; 7329 } 7330 7331 // Save the preprocessing token index; restore the non-preprocessing 7332 // token index. 7333 PreprocessingTokIdx = TokIdx; 7334 TokIdx = SavedTokIdx; 7335 return CXChildVisit_Recurse; 7336 } 7337 7338 if (cursorRange.isInvalid()) 7339 return CXChildVisit_Continue; 7340 7341 unsigned BeforeReachingCursorIdx = NextToken(); 7342 const enum CXCursorKind cursorK = clang_getCursorKind(cursor); 7343 const enum CXCursorKind K = clang_getCursorKind(parent); 7344 const CXCursor updateC = 7345 (clang_isInvalid(K) || K == CXCursor_TranslationUnit || 7346 // Attributes are annotated out-of-order, skip tokens until we reach it. 7347 clang_isAttribute(cursor.kind)) 7348 ? clang_getNullCursor() 7349 : parent; 7350 7351 annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange); 7352 7353 // Avoid having the cursor of an expression "overwrite" the annotation of the 7354 // variable declaration that it belongs to. 7355 // This can happen for C++ constructor expressions whose range generally 7356 // include the variable declaration, e.g.: 7357 // MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor. 7358 if (clang_isExpression(cursorK) && MoreTokens()) { 7359 const Expr *E = getCursorExpr(cursor); 7360 if (const Decl *D = getCursorDecl(cursor)) { 7361 const unsigned I = NextToken(); 7362 if (E->getBeginLoc().isValid() && D->getLocation().isValid() && 7363 E->getBeginLoc() == D->getLocation() && 7364 E->getBeginLoc() == GetTokenLoc(I)) { 7365 updateCursorAnnotation(Cursors[I], updateC); 7366 AdvanceToken(); 7367 } 7368 } 7369 } 7370 7371 // Before recursing into the children keep some state that we are going 7372 // to use in the AnnotateTokensWorker::postVisitChildren callback to do some 7373 // extra work after the child nodes are visited. 7374 // Note that we don't call VisitChildren here to avoid traversing statements 7375 // code-recursively which can blow the stack. 7376 7377 PostChildrenInfo Info; 7378 Info.Cursor = cursor; 7379 Info.CursorRange = cursorRange; 7380 Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx; 7381 Info.BeforeChildrenTokenIdx = NextToken(); 7382 Info.ChildActions = DetermineChildActions(cursor); 7383 PostChildrenInfos.push_back(Info); 7384 7385 return CXChildVisit_Recurse; 7386 } 7387 7388 bool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) { 7389 if (PostChildrenInfos.empty()) 7390 return false; 7391 const PostChildrenInfo &Info = PostChildrenInfos.back(); 7392 if (!clang_equalCursors(Info.Cursor, cursor)) 7393 return false; 7394 7395 HandlePostPonedChildCursors(Info); 7396 7397 const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx; 7398 const unsigned AfterChildren = NextToken(); 7399 SourceRange cursorRange = Info.CursorRange; 7400 7401 // Scan the tokens that are at the end of the cursor, but are not captured 7402 // but the child cursors. 7403 annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange); 7404 7405 // Scan the tokens that are at the beginning of the cursor, but are not 7406 // capture by the child cursors. 7407 for (unsigned I = BeforeChildren; I != AfterChildren; ++I) { 7408 if (!clang_isInvalid(clang_getCursorKind(Cursors[I]))) 7409 break; 7410 7411 Cursors[I] = cursor; 7412 } 7413 7414 // Attributes are annotated out-of-order, rewind TokIdx to when we first 7415 // encountered the attribute cursor. 7416 if (clang_isAttribute(cursor.kind)) 7417 TokIdx = Info.BeforeReachingCursorIdx; 7418 7419 PostChildrenInfos.pop_back(); 7420 return false; 7421 } 7422 7423 void AnnotateTokensWorker::HandlePostPonedChildCursors( 7424 const PostChildrenInfo &Info) { 7425 for (const auto &ChildAction : Info.ChildActions) { 7426 if (ChildAction.action == PostChildrenAction::Postpone) { 7427 HandlePostPonedChildCursor(ChildAction.cursor, 7428 Info.BeforeChildrenTokenIdx); 7429 } 7430 } 7431 } 7432 7433 void AnnotateTokensWorker::HandlePostPonedChildCursor( 7434 CXCursor Cursor, unsigned StartTokenIndex) { 7435 unsigned I = StartTokenIndex; 7436 7437 // The bracket tokens of a Call or Subscript operator are mapped to 7438 // CallExpr/CXXOperatorCallExpr because we skipped visiting the corresponding 7439 // DeclRefExpr. Remap these tokens to the DeclRefExpr cursors. 7440 for (unsigned RefNameRangeNr = 0; I < NumTokens; RefNameRangeNr++) { 7441 const CXSourceRange CXRefNameRange = clang_getCursorReferenceNameRange( 7442 Cursor, CXNameRange_WantQualifier, RefNameRangeNr); 7443 if (clang_Range_isNull(CXRefNameRange)) 7444 break; // All ranges handled. 7445 7446 SourceRange RefNameRange = cxloc::translateCXSourceRange(CXRefNameRange); 7447 while (I < NumTokens) { 7448 const SourceLocation TokenLocation = GetTokenLoc(I); 7449 if (!TokenLocation.isValid()) 7450 break; 7451 7452 // Adapt the end range, because LocationCompare() reports 7453 // RangeOverlap even for the not-inclusive end location. 7454 const SourceLocation fixedEnd = 7455 RefNameRange.getEnd().getLocWithOffset(-1); 7456 RefNameRange = SourceRange(RefNameRange.getBegin(), fixedEnd); 7457 7458 const RangeComparisonResult ComparisonResult = 7459 LocationCompare(SrcMgr, TokenLocation, RefNameRange); 7460 7461 if (ComparisonResult == RangeOverlap) { 7462 Cursors[I++] = Cursor; 7463 } else if (ComparisonResult == RangeBefore) { 7464 ++I; // Not relevant token, check next one. 7465 } else if (ComparisonResult == RangeAfter) { 7466 break; // All tokens updated for current range, check next. 7467 } 7468 } 7469 } 7470 } 7471 7472 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 7473 CXCursor parent, 7474 CXClientData client_data) { 7475 return static_cast<AnnotateTokensWorker *>(client_data) 7476 ->Visit(cursor, parent); 7477 } 7478 7479 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor, 7480 CXClientData client_data) { 7481 return static_cast<AnnotateTokensWorker *>(client_data) 7482 ->postVisitChildren(cursor); 7483 } 7484 7485 namespace { 7486 7487 /// Uses the macro expansions in the preprocessing record to find 7488 /// and mark tokens that are macro arguments. This info is used by the 7489 /// AnnotateTokensWorker. 7490 class MarkMacroArgTokensVisitor { 7491 SourceManager &SM; 7492 CXToken *Tokens; 7493 unsigned NumTokens; 7494 unsigned CurIdx; 7495 7496 public: 7497 MarkMacroArgTokensVisitor(SourceManager &SM, CXToken *tokens, 7498 unsigned numTokens) 7499 : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) {} 7500 7501 CXChildVisitResult visit(CXCursor cursor, CXCursor parent) { 7502 if (cursor.kind != CXCursor_MacroExpansion) 7503 return CXChildVisit_Continue; 7504 7505 SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange(); 7506 if (macroRange.getBegin() == macroRange.getEnd()) 7507 return CXChildVisit_Continue; // it's not a function macro. 7508 7509 for (; CurIdx < NumTokens; ++CurIdx) { 7510 if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx), 7511 macroRange.getBegin())) 7512 break; 7513 } 7514 7515 if (CurIdx == NumTokens) 7516 return CXChildVisit_Break; 7517 7518 for (; CurIdx < NumTokens; ++CurIdx) { 7519 SourceLocation tokLoc = getTokenLoc(CurIdx); 7520 if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd())) 7521 break; 7522 7523 setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc)); 7524 } 7525 7526 if (CurIdx == NumTokens) 7527 return CXChildVisit_Break; 7528 7529 return CXChildVisit_Continue; 7530 } 7531 7532 private: 7533 CXToken &getTok(unsigned Idx) { 7534 assert(Idx < NumTokens); 7535 return Tokens[Idx]; 7536 } 7537 const CXToken &getTok(unsigned Idx) const { 7538 assert(Idx < NumTokens); 7539 return Tokens[Idx]; 7540 } 7541 7542 SourceLocation getTokenLoc(unsigned tokI) { 7543 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]); 7544 } 7545 7546 void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) { 7547 // The third field is reserved and currently not used. Use it here 7548 // to mark macro arg expanded tokens with their expanded locations. 7549 getTok(tokI).int_data[3] = loc.getRawEncoding(); 7550 } 7551 }; 7552 7553 } // end anonymous namespace 7554 7555 static CXChildVisitResult 7556 MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent, 7557 CXClientData client_data) { 7558 return static_cast<MarkMacroArgTokensVisitor *>(client_data) 7559 ->visit(cursor, parent); 7560 } 7561 7562 /// Used by \c annotatePreprocessorTokens. 7563 /// \returns true if lexing was finished, false otherwise. 7564 static bool lexNext(Lexer &Lex, Token &Tok, unsigned &NextIdx, 7565 unsigned NumTokens) { 7566 if (NextIdx >= NumTokens) 7567 return true; 7568 7569 ++NextIdx; 7570 Lex.LexFromRawLexer(Tok); 7571 return Tok.is(tok::eof); 7572 } 7573 7574 static void annotatePreprocessorTokens(CXTranslationUnit TU, 7575 SourceRange RegionOfInterest, 7576 CXCursor *Cursors, CXToken *Tokens, 7577 unsigned NumTokens) { 7578 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 7579 7580 Preprocessor &PP = CXXUnit->getPreprocessor(); 7581 SourceManager &SourceMgr = CXXUnit->getSourceManager(); 7582 std::pair<FileID, unsigned> BeginLocInfo = 7583 SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin()); 7584 std::pair<FileID, unsigned> EndLocInfo = 7585 SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd()); 7586 7587 if (BeginLocInfo.first != EndLocInfo.first) 7588 return; 7589 7590 StringRef Buffer; 7591 bool Invalid = false; 7592 Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 7593 if (Buffer.empty() || Invalid) 7594 return; 7595 7596 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 7597 CXXUnit->getASTContext().getLangOpts(), Buffer.begin(), 7598 Buffer.data() + BeginLocInfo.second, Buffer.end()); 7599 Lex.SetCommentRetentionState(true); 7600 7601 unsigned NextIdx = 0; 7602 // Lex tokens in raw mode until we hit the end of the range, to avoid 7603 // entering #includes or expanding macros. 7604 while (true) { 7605 Token Tok; 7606 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 7607 break; 7608 unsigned TokIdx = NextIdx - 1; 7609 assert(Tok.getLocation() == 7610 SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1])); 7611 7612 reprocess: 7613 if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) { 7614 // We have found a preprocessing directive. Annotate the tokens 7615 // appropriately. 7616 // 7617 // FIXME: Some simple tests here could identify macro definitions and 7618 // #undefs, to provide specific cursor kinds for those. 7619 7620 SourceLocation BeginLoc = Tok.getLocation(); 7621 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 7622 break; 7623 7624 MacroInfo *MI = nullptr; 7625 if (Tok.is(tok::raw_identifier) && Tok.getRawIdentifier() == "define") { 7626 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 7627 break; 7628 7629 if (Tok.is(tok::raw_identifier)) { 7630 IdentifierInfo &II = 7631 PP.getIdentifierTable().get(Tok.getRawIdentifier()); 7632 SourceLocation MappedTokLoc = 7633 CXXUnit->mapLocationToPreamble(Tok.getLocation()); 7634 MI = getMacroInfo(II, MappedTokLoc, TU); 7635 } 7636 } 7637 7638 bool finished = false; 7639 do { 7640 if (lexNext(Lex, Tok, NextIdx, NumTokens)) { 7641 finished = true; 7642 break; 7643 } 7644 // If we are in a macro definition, check if the token was ever a 7645 // macro name and annotate it if that's the case. 7646 if (MI) { 7647 SourceLocation SaveLoc = Tok.getLocation(); 7648 Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc)); 7649 MacroDefinitionRecord *MacroDef = 7650 checkForMacroInMacroDefinition(MI, Tok, TU); 7651 Tok.setLocation(SaveLoc); 7652 if (MacroDef) 7653 Cursors[NextIdx - 1] = 7654 MakeMacroExpansionCursor(MacroDef, Tok.getLocation(), TU); 7655 } 7656 } while (!Tok.isAtStartOfLine()); 7657 7658 unsigned LastIdx = finished ? NextIdx - 1 : NextIdx - 2; 7659 assert(TokIdx <= LastIdx); 7660 SourceLocation EndLoc = 7661 SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]); 7662 CXCursor Cursor = 7663 MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU); 7664 7665 for (; TokIdx <= LastIdx; ++TokIdx) 7666 updateCursorAnnotation(Cursors[TokIdx], Cursor); 7667 7668 if (finished) 7669 break; 7670 goto reprocess; 7671 } 7672 } 7673 } 7674 7675 // This gets run a separate thread to avoid stack blowout. 7676 static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit, 7677 CXToken *Tokens, unsigned NumTokens, 7678 CXCursor *Cursors) { 7679 CIndexer *CXXIdx = TU->CIdx; 7680 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) 7681 setThreadBackgroundPriority(); 7682 7683 // Determine the region of interest, which contains all of the tokens. 7684 SourceRange RegionOfInterest; 7685 RegionOfInterest.setBegin( 7686 cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0]))); 7687 RegionOfInterest.setEnd(cxloc::translateSourceLocation( 7688 clang_getTokenLocation(TU, Tokens[NumTokens - 1]))); 7689 7690 // Relex the tokens within the source range to look for preprocessing 7691 // directives. 7692 annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens); 7693 7694 // If begin location points inside a macro argument, set it to the expansion 7695 // location so we can have the full context when annotating semantically. 7696 { 7697 SourceManager &SM = CXXUnit->getSourceManager(); 7698 SourceLocation Loc = 7699 SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin()); 7700 if (Loc.isMacroID()) 7701 RegionOfInterest.setBegin(SM.getExpansionLoc(Loc)); 7702 } 7703 7704 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) { 7705 // Search and mark tokens that are macro argument expansions. 7706 MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(), Tokens, 7707 NumTokens); 7708 CursorVisitor MacroArgMarker( 7709 TU, MarkMacroArgTokensVisitorDelegate, &Visitor, 7710 /*VisitPreprocessorLast=*/true, 7711 /*VisitIncludedEntities=*/false, RegionOfInterest); 7712 MacroArgMarker.visitPreprocessedEntitiesInRegion(); 7713 } 7714 7715 // Annotate all of the source locations in the region of interest that map to 7716 // a specific cursor. 7717 AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest); 7718 7719 // FIXME: We use a ridiculous stack size here because the data-recursion 7720 // algorithm uses a large stack frame than the non-data recursive version, 7721 // and AnnotationTokensWorker currently transforms the data-recursion 7722 // algorithm back into a traditional recursion by explicitly calling 7723 // VisitChildren(). We will need to remove this explicit recursive call. 7724 W.AnnotateTokens(); 7725 7726 // If we ran into any entities that involve context-sensitive keywords, 7727 // take another pass through the tokens to mark them as such. 7728 if (W.hasContextSensitiveKeywords()) { 7729 for (unsigned I = 0; I != NumTokens; ++I) { 7730 if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier) 7731 continue; 7732 7733 if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) { 7734 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data); 7735 if (const ObjCPropertyDecl *Property = 7736 dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) { 7737 if (Property->getPropertyAttributesAsWritten() != 0 && 7738 llvm::StringSwitch<bool>(II->getName()) 7739 .Case("readonly", true) 7740 .Case("assign", true) 7741 .Case("unsafe_unretained", true) 7742 .Case("readwrite", true) 7743 .Case("retain", true) 7744 .Case("copy", true) 7745 .Case("nonatomic", true) 7746 .Case("atomic", true) 7747 .Case("getter", true) 7748 .Case("setter", true) 7749 .Case("strong", true) 7750 .Case("weak", true) 7751 .Case("class", true) 7752 .Default(false)) 7753 Tokens[I].int_data[0] = CXToken_Keyword; 7754 } 7755 continue; 7756 } 7757 7758 if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl || 7759 Cursors[I].kind == CXCursor_ObjCClassMethodDecl) { 7760 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data); 7761 if (llvm::StringSwitch<bool>(II->getName()) 7762 .Case("in", true) 7763 .Case("out", true) 7764 .Case("inout", true) 7765 .Case("oneway", true) 7766 .Case("bycopy", true) 7767 .Case("byref", true) 7768 .Default(false)) 7769 Tokens[I].int_data[0] = CXToken_Keyword; 7770 continue; 7771 } 7772 7773 if (Cursors[I].kind == CXCursor_CXXFinalAttr || 7774 Cursors[I].kind == CXCursor_CXXOverrideAttr) { 7775 Tokens[I].int_data[0] = CXToken_Keyword; 7776 continue; 7777 } 7778 } 7779 } 7780 } 7781 7782 void clang_annotateTokens(CXTranslationUnit TU, CXToken *Tokens, 7783 unsigned NumTokens, CXCursor *Cursors) { 7784 if (isNotUsableTU(TU)) { 7785 LOG_BAD_TU(TU); 7786 return; 7787 } 7788 if (NumTokens == 0 || !Tokens || !Cursors) { 7789 LOG_FUNC_SECTION { *Log << "<null input>"; } 7790 return; 7791 } 7792 7793 LOG_FUNC_SECTION { 7794 *Log << TU << ' '; 7795 CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]); 7796 CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens - 1]); 7797 *Log << clang_getRange(bloc, eloc); 7798 } 7799 7800 // Any token we don't specifically annotate will have a NULL cursor. 7801 CXCursor C = clang_getNullCursor(); 7802 for (unsigned I = 0; I != NumTokens; ++I) 7803 Cursors[I] = C; 7804 7805 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 7806 if (!CXXUnit) 7807 return; 7808 7809 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 7810 7811 auto AnnotateTokensImpl = [=]() { 7812 clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors); 7813 }; 7814 llvm::CrashRecoveryContext CRC; 7815 if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) { 7816 fprintf(stderr, "libclang: crash detected while annotating tokens\n"); 7817 } 7818 } 7819 7820 //===----------------------------------------------------------------------===// 7821 // Operations for querying linkage of a cursor. 7822 //===----------------------------------------------------------------------===// 7823 7824 CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { 7825 if (!clang_isDeclaration(cursor.kind)) 7826 return CXLinkage_Invalid; 7827 7828 const Decl *D = cxcursor::getCursorDecl(cursor); 7829 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D)) 7830 switch (ND->getLinkageInternal()) { 7831 case NoLinkage: 7832 case VisibleNoLinkage: 7833 return CXLinkage_NoLinkage; 7834 case ModuleInternalLinkage: 7835 case InternalLinkage: 7836 return CXLinkage_Internal; 7837 case UniqueExternalLinkage: 7838 return CXLinkage_UniqueExternal; 7839 case ModuleLinkage: 7840 case ExternalLinkage: 7841 return CXLinkage_External; 7842 }; 7843 7844 return CXLinkage_Invalid; 7845 } 7846 7847 //===----------------------------------------------------------------------===// 7848 // Operations for querying visibility of a cursor. 7849 //===----------------------------------------------------------------------===// 7850 7851 CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) { 7852 if (!clang_isDeclaration(cursor.kind)) 7853 return CXVisibility_Invalid; 7854 7855 const Decl *D = cxcursor::getCursorDecl(cursor); 7856 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D)) 7857 switch (ND->getVisibility()) { 7858 case HiddenVisibility: 7859 return CXVisibility_Hidden; 7860 case ProtectedVisibility: 7861 return CXVisibility_Protected; 7862 case DefaultVisibility: 7863 return CXVisibility_Default; 7864 }; 7865 7866 return CXVisibility_Invalid; 7867 } 7868 7869 //===----------------------------------------------------------------------===// 7870 // Operations for querying language of a cursor. 7871 //===----------------------------------------------------------------------===// 7872 7873 static CXLanguageKind getDeclLanguage(const Decl *D) { 7874 if (!D) 7875 return CXLanguage_C; 7876 7877 switch (D->getKind()) { 7878 default: 7879 break; 7880 case Decl::ImplicitParam: 7881 case Decl::ObjCAtDefsField: 7882 case Decl::ObjCCategory: 7883 case Decl::ObjCCategoryImpl: 7884 case Decl::ObjCCompatibleAlias: 7885 case Decl::ObjCImplementation: 7886 case Decl::ObjCInterface: 7887 case Decl::ObjCIvar: 7888 case Decl::ObjCMethod: 7889 case Decl::ObjCProperty: 7890 case Decl::ObjCPropertyImpl: 7891 case Decl::ObjCProtocol: 7892 case Decl::ObjCTypeParam: 7893 return CXLanguage_ObjC; 7894 case Decl::CXXConstructor: 7895 case Decl::CXXConversion: 7896 case Decl::CXXDestructor: 7897 case Decl::CXXMethod: 7898 case Decl::CXXRecord: 7899 case Decl::ClassTemplate: 7900 case Decl::ClassTemplatePartialSpecialization: 7901 case Decl::ClassTemplateSpecialization: 7902 case Decl::Friend: 7903 case Decl::FriendTemplate: 7904 case Decl::FunctionTemplate: 7905 case Decl::LinkageSpec: 7906 case Decl::Namespace: 7907 case Decl::NamespaceAlias: 7908 case Decl::NonTypeTemplateParm: 7909 case Decl::StaticAssert: 7910 case Decl::TemplateTemplateParm: 7911 case Decl::TemplateTypeParm: 7912 case Decl::UnresolvedUsingTypename: 7913 case Decl::UnresolvedUsingValue: 7914 case Decl::Using: 7915 case Decl::UsingDirective: 7916 case Decl::UsingShadow: 7917 return CXLanguage_CPlusPlus; 7918 } 7919 7920 return CXLanguage_C; 7921 } 7922 7923 static CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) { 7924 if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted()) 7925 return CXAvailability_NotAvailable; 7926 7927 switch (D->getAvailability()) { 7928 case AR_Available: 7929 case AR_NotYetIntroduced: 7930 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D)) 7931 return getCursorAvailabilityForDecl( 7932 cast<Decl>(EnumConst->getDeclContext())); 7933 return CXAvailability_Available; 7934 7935 case AR_Deprecated: 7936 return CXAvailability_Deprecated; 7937 7938 case AR_Unavailable: 7939 return CXAvailability_NotAvailable; 7940 } 7941 7942 llvm_unreachable("Unknown availability kind!"); 7943 } 7944 7945 enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) { 7946 if (clang_isDeclaration(cursor.kind)) 7947 if (const Decl *D = cxcursor::getCursorDecl(cursor)) 7948 return getCursorAvailabilityForDecl(D); 7949 7950 return CXAvailability_Available; 7951 } 7952 7953 static CXVersion convertVersion(VersionTuple In) { 7954 CXVersion Out = {-1, -1, -1}; 7955 if (In.empty()) 7956 return Out; 7957 7958 Out.Major = In.getMajor(); 7959 7960 Optional<unsigned> Minor = In.getMinor(); 7961 if (Minor.hasValue()) 7962 Out.Minor = *Minor; 7963 else 7964 return Out; 7965 7966 Optional<unsigned> Subminor = In.getSubminor(); 7967 if (Subminor.hasValue()) 7968 Out.Subminor = *Subminor; 7969 7970 return Out; 7971 } 7972 7973 static void getCursorPlatformAvailabilityForDecl( 7974 const Decl *D, int *always_deprecated, CXString *deprecated_message, 7975 int *always_unavailable, CXString *unavailable_message, 7976 SmallVectorImpl<AvailabilityAttr *> &AvailabilityAttrs) { 7977 bool HadAvailAttr = false; 7978 for (auto A : D->attrs()) { 7979 if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) { 7980 HadAvailAttr = true; 7981 if (always_deprecated) 7982 *always_deprecated = 1; 7983 if (deprecated_message) { 7984 clang_disposeString(*deprecated_message); 7985 *deprecated_message = cxstring::createDup(Deprecated->getMessage()); 7986 } 7987 continue; 7988 } 7989 7990 if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) { 7991 HadAvailAttr = true; 7992 if (always_unavailable) 7993 *always_unavailable = 1; 7994 if (unavailable_message) { 7995 clang_disposeString(*unavailable_message); 7996 *unavailable_message = cxstring::createDup(Unavailable->getMessage()); 7997 } 7998 continue; 7999 } 8000 8001 if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) { 8002 AvailabilityAttrs.push_back(Avail); 8003 HadAvailAttr = true; 8004 } 8005 } 8006 8007 if (!HadAvailAttr) 8008 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D)) 8009 return getCursorPlatformAvailabilityForDecl( 8010 cast<Decl>(EnumConst->getDeclContext()), always_deprecated, 8011 deprecated_message, always_unavailable, unavailable_message, 8012 AvailabilityAttrs); 8013 8014 if (AvailabilityAttrs.empty()) 8015 return; 8016 8017 llvm::sort( 8018 AvailabilityAttrs, [](AvailabilityAttr *LHS, AvailabilityAttr *RHS) { 8019 return LHS->getPlatform()->getName() < RHS->getPlatform()->getName(); 8020 }); 8021 ASTContext &Ctx = D->getASTContext(); 8022 auto It = std::unique( 8023 AvailabilityAttrs.begin(), AvailabilityAttrs.end(), 8024 [&Ctx](AvailabilityAttr *LHS, AvailabilityAttr *RHS) { 8025 if (LHS->getPlatform() != RHS->getPlatform()) 8026 return false; 8027 8028 if (LHS->getIntroduced() == RHS->getIntroduced() && 8029 LHS->getDeprecated() == RHS->getDeprecated() && 8030 LHS->getObsoleted() == RHS->getObsoleted() && 8031 LHS->getMessage() == RHS->getMessage() && 8032 LHS->getReplacement() == RHS->getReplacement()) 8033 return true; 8034 8035 if ((!LHS->getIntroduced().empty() && !RHS->getIntroduced().empty()) || 8036 (!LHS->getDeprecated().empty() && !RHS->getDeprecated().empty()) || 8037 (!LHS->getObsoleted().empty() && !RHS->getObsoleted().empty())) 8038 return false; 8039 8040 if (LHS->getIntroduced().empty() && !RHS->getIntroduced().empty()) 8041 LHS->setIntroduced(Ctx, RHS->getIntroduced()); 8042 8043 if (LHS->getDeprecated().empty() && !RHS->getDeprecated().empty()) { 8044 LHS->setDeprecated(Ctx, RHS->getDeprecated()); 8045 if (LHS->getMessage().empty()) 8046 LHS->setMessage(Ctx, RHS->getMessage()); 8047 if (LHS->getReplacement().empty()) 8048 LHS->setReplacement(Ctx, RHS->getReplacement()); 8049 } 8050 8051 if (LHS->getObsoleted().empty() && !RHS->getObsoleted().empty()) { 8052 LHS->setObsoleted(Ctx, RHS->getObsoleted()); 8053 if (LHS->getMessage().empty()) 8054 LHS->setMessage(Ctx, RHS->getMessage()); 8055 if (LHS->getReplacement().empty()) 8056 LHS->setReplacement(Ctx, RHS->getReplacement()); 8057 } 8058 8059 return true; 8060 }); 8061 AvailabilityAttrs.erase(It, AvailabilityAttrs.end()); 8062 } 8063 8064 int clang_getCursorPlatformAvailability(CXCursor cursor, int *always_deprecated, 8065 CXString *deprecated_message, 8066 int *always_unavailable, 8067 CXString *unavailable_message, 8068 CXPlatformAvailability *availability, 8069 int availability_size) { 8070 if (always_deprecated) 8071 *always_deprecated = 0; 8072 if (deprecated_message) 8073 *deprecated_message = cxstring::createEmpty(); 8074 if (always_unavailable) 8075 *always_unavailable = 0; 8076 if (unavailable_message) 8077 *unavailable_message = cxstring::createEmpty(); 8078 8079 if (!clang_isDeclaration(cursor.kind)) 8080 return 0; 8081 8082 const Decl *D = cxcursor::getCursorDecl(cursor); 8083 if (!D) 8084 return 0; 8085 8086 SmallVector<AvailabilityAttr *, 8> AvailabilityAttrs; 8087 getCursorPlatformAvailabilityForDecl(D, always_deprecated, deprecated_message, 8088 always_unavailable, unavailable_message, 8089 AvailabilityAttrs); 8090 for (const auto &Avail : 8091 llvm::enumerate(llvm::makeArrayRef(AvailabilityAttrs) 8092 .take_front(availability_size))) { 8093 availability[Avail.index()].Platform = 8094 cxstring::createDup(Avail.value()->getPlatform()->getName()); 8095 availability[Avail.index()].Introduced = 8096 convertVersion(Avail.value()->getIntroduced()); 8097 availability[Avail.index()].Deprecated = 8098 convertVersion(Avail.value()->getDeprecated()); 8099 availability[Avail.index()].Obsoleted = 8100 convertVersion(Avail.value()->getObsoleted()); 8101 availability[Avail.index()].Unavailable = Avail.value()->getUnavailable(); 8102 availability[Avail.index()].Message = 8103 cxstring::createDup(Avail.value()->getMessage()); 8104 } 8105 8106 return AvailabilityAttrs.size(); 8107 } 8108 8109 void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) { 8110 clang_disposeString(availability->Platform); 8111 clang_disposeString(availability->Message); 8112 } 8113 8114 CXLanguageKind clang_getCursorLanguage(CXCursor cursor) { 8115 if (clang_isDeclaration(cursor.kind)) 8116 return getDeclLanguage(cxcursor::getCursorDecl(cursor)); 8117 8118 return CXLanguage_Invalid; 8119 } 8120 8121 CXTLSKind clang_getCursorTLSKind(CXCursor cursor) { 8122 const Decl *D = cxcursor::getCursorDecl(cursor); 8123 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 8124 switch (VD->getTLSKind()) { 8125 case VarDecl::TLS_None: 8126 return CXTLS_None; 8127 case VarDecl::TLS_Dynamic: 8128 return CXTLS_Dynamic; 8129 case VarDecl::TLS_Static: 8130 return CXTLS_Static; 8131 } 8132 } 8133 8134 return CXTLS_None; 8135 } 8136 8137 /// If the given cursor is the "templated" declaration 8138 /// describing a class or function template, return the class or 8139 /// function template. 8140 static const Decl *maybeGetTemplateCursor(const Decl *D) { 8141 if (!D) 8142 return nullptr; 8143 8144 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 8145 if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate()) 8146 return FunTmpl; 8147 8148 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) 8149 if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate()) 8150 return ClassTmpl; 8151 8152 return D; 8153 } 8154 8155 enum CX_StorageClass clang_Cursor_getStorageClass(CXCursor C) { 8156 StorageClass sc = SC_None; 8157 const Decl *D = getCursorDecl(C); 8158 if (D) { 8159 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 8160 sc = FD->getStorageClass(); 8161 } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 8162 sc = VD->getStorageClass(); 8163 } else { 8164 return CX_SC_Invalid; 8165 } 8166 } else { 8167 return CX_SC_Invalid; 8168 } 8169 switch (sc) { 8170 case SC_None: 8171 return CX_SC_None; 8172 case SC_Extern: 8173 return CX_SC_Extern; 8174 case SC_Static: 8175 return CX_SC_Static; 8176 case SC_PrivateExtern: 8177 return CX_SC_PrivateExtern; 8178 case SC_Auto: 8179 return CX_SC_Auto; 8180 case SC_Register: 8181 return CX_SC_Register; 8182 } 8183 llvm_unreachable("Unhandled storage class!"); 8184 } 8185 8186 CXCursor clang_getCursorSemanticParent(CXCursor cursor) { 8187 if (clang_isDeclaration(cursor.kind)) { 8188 if (const Decl *D = getCursorDecl(cursor)) { 8189 const DeclContext *DC = D->getDeclContext(); 8190 if (!DC) 8191 return clang_getNullCursor(); 8192 8193 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)), 8194 getCursorTU(cursor)); 8195 } 8196 } 8197 8198 if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) { 8199 if (const Decl *D = getCursorDecl(cursor)) 8200 return MakeCXCursor(D, getCursorTU(cursor)); 8201 } 8202 8203 return clang_getNullCursor(); 8204 } 8205 8206 CXCursor clang_getCursorLexicalParent(CXCursor cursor) { 8207 if (clang_isDeclaration(cursor.kind)) { 8208 if (const Decl *D = getCursorDecl(cursor)) { 8209 const DeclContext *DC = D->getLexicalDeclContext(); 8210 if (!DC) 8211 return clang_getNullCursor(); 8212 8213 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)), 8214 getCursorTU(cursor)); 8215 } 8216 } 8217 8218 // FIXME: Note that we can't easily compute the lexical context of a 8219 // statement or expression, so we return nothing. 8220 return clang_getNullCursor(); 8221 } 8222 8223 CXFile clang_getIncludedFile(CXCursor cursor) { 8224 if (cursor.kind != CXCursor_InclusionDirective) 8225 return nullptr; 8226 8227 const InclusionDirective *ID = getCursorInclusionDirective(cursor); 8228 return const_cast<FileEntry *>(ID->getFile()); 8229 } 8230 8231 unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) { 8232 if (C.kind != CXCursor_ObjCPropertyDecl) 8233 return CXObjCPropertyAttr_noattr; 8234 8235 unsigned Result = CXObjCPropertyAttr_noattr; 8236 const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C)); 8237 ObjCPropertyAttribute::Kind Attr = PD->getPropertyAttributesAsWritten(); 8238 8239 #define SET_CXOBJCPROP_ATTR(A) \ 8240 if (Attr & ObjCPropertyAttribute::kind_##A) \ 8241 Result |= CXObjCPropertyAttr_##A 8242 SET_CXOBJCPROP_ATTR(readonly); 8243 SET_CXOBJCPROP_ATTR(getter); 8244 SET_CXOBJCPROP_ATTR(assign); 8245 SET_CXOBJCPROP_ATTR(readwrite); 8246 SET_CXOBJCPROP_ATTR(retain); 8247 SET_CXOBJCPROP_ATTR(copy); 8248 SET_CXOBJCPROP_ATTR(nonatomic); 8249 SET_CXOBJCPROP_ATTR(setter); 8250 SET_CXOBJCPROP_ATTR(atomic); 8251 SET_CXOBJCPROP_ATTR(weak); 8252 SET_CXOBJCPROP_ATTR(strong); 8253 SET_CXOBJCPROP_ATTR(unsafe_unretained); 8254 SET_CXOBJCPROP_ATTR(class); 8255 #undef SET_CXOBJCPROP_ATTR 8256 8257 return Result; 8258 } 8259 8260 CXString clang_Cursor_getObjCPropertyGetterName(CXCursor C) { 8261 if (C.kind != CXCursor_ObjCPropertyDecl) 8262 return cxstring::createNull(); 8263 8264 const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C)); 8265 Selector sel = PD->getGetterName(); 8266 if (sel.isNull()) 8267 return cxstring::createNull(); 8268 8269 return cxstring::createDup(sel.getAsString()); 8270 } 8271 8272 CXString clang_Cursor_getObjCPropertySetterName(CXCursor C) { 8273 if (C.kind != CXCursor_ObjCPropertyDecl) 8274 return cxstring::createNull(); 8275 8276 const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C)); 8277 Selector sel = PD->getSetterName(); 8278 if (sel.isNull()) 8279 return cxstring::createNull(); 8280 8281 return cxstring::createDup(sel.getAsString()); 8282 } 8283 8284 unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) { 8285 if (!clang_isDeclaration(C.kind)) 8286 return CXObjCDeclQualifier_None; 8287 8288 Decl::ObjCDeclQualifier QT = Decl::OBJC_TQ_None; 8289 const Decl *D = getCursorDecl(C); 8290 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 8291 QT = MD->getObjCDeclQualifier(); 8292 else if (const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D)) 8293 QT = PD->getObjCDeclQualifier(); 8294 if (QT == Decl::OBJC_TQ_None) 8295 return CXObjCDeclQualifier_None; 8296 8297 unsigned Result = CXObjCDeclQualifier_None; 8298 if (QT & Decl::OBJC_TQ_In) 8299 Result |= CXObjCDeclQualifier_In; 8300 if (QT & Decl::OBJC_TQ_Inout) 8301 Result |= CXObjCDeclQualifier_Inout; 8302 if (QT & Decl::OBJC_TQ_Out) 8303 Result |= CXObjCDeclQualifier_Out; 8304 if (QT & Decl::OBJC_TQ_Bycopy) 8305 Result |= CXObjCDeclQualifier_Bycopy; 8306 if (QT & Decl::OBJC_TQ_Byref) 8307 Result |= CXObjCDeclQualifier_Byref; 8308 if (QT & Decl::OBJC_TQ_Oneway) 8309 Result |= CXObjCDeclQualifier_Oneway; 8310 8311 return Result; 8312 } 8313 8314 unsigned clang_Cursor_isObjCOptional(CXCursor C) { 8315 if (!clang_isDeclaration(C.kind)) 8316 return 0; 8317 8318 const Decl *D = getCursorDecl(C); 8319 if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D)) 8320 return PD->getPropertyImplementation() == ObjCPropertyDecl::Optional; 8321 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 8322 return MD->getImplementationControl() == ObjCMethodDecl::Optional; 8323 8324 return 0; 8325 } 8326 8327 unsigned clang_Cursor_isVariadic(CXCursor C) { 8328 if (!clang_isDeclaration(C.kind)) 8329 return 0; 8330 8331 const Decl *D = getCursorDecl(C); 8332 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 8333 return FD->isVariadic(); 8334 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 8335 return MD->isVariadic(); 8336 8337 return 0; 8338 } 8339 8340 unsigned clang_Cursor_isExternalSymbol(CXCursor C, CXString *language, 8341 CXString *definedIn, 8342 unsigned *isGenerated) { 8343 if (!clang_isDeclaration(C.kind)) 8344 return 0; 8345 8346 const Decl *D = getCursorDecl(C); 8347 8348 if (auto *attr = D->getExternalSourceSymbolAttr()) { 8349 if (language) 8350 *language = cxstring::createDup(attr->getLanguage()); 8351 if (definedIn) 8352 *definedIn = cxstring::createDup(attr->getDefinedIn()); 8353 if (isGenerated) 8354 *isGenerated = attr->getGeneratedDeclaration(); 8355 return 1; 8356 } 8357 return 0; 8358 } 8359 8360 CXSourceRange clang_Cursor_getCommentRange(CXCursor C) { 8361 if (!clang_isDeclaration(C.kind)) 8362 return clang_getNullRange(); 8363 8364 const Decl *D = getCursorDecl(C); 8365 ASTContext &Context = getCursorContext(C); 8366 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 8367 if (!RC) 8368 return clang_getNullRange(); 8369 8370 return cxloc::translateSourceRange(Context, RC->getSourceRange()); 8371 } 8372 8373 CXString clang_Cursor_getRawCommentText(CXCursor C) { 8374 if (!clang_isDeclaration(C.kind)) 8375 return cxstring::createNull(); 8376 8377 const Decl *D = getCursorDecl(C); 8378 ASTContext &Context = getCursorContext(C); 8379 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 8380 StringRef RawText = 8381 RC ? RC->getRawText(Context.getSourceManager()) : StringRef(); 8382 8383 // Don't duplicate the string because RawText points directly into source 8384 // code. 8385 return cxstring::createRef(RawText); 8386 } 8387 8388 CXString clang_Cursor_getBriefCommentText(CXCursor C) { 8389 if (!clang_isDeclaration(C.kind)) 8390 return cxstring::createNull(); 8391 8392 const Decl *D = getCursorDecl(C); 8393 const ASTContext &Context = getCursorContext(C); 8394 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 8395 8396 if (RC) { 8397 StringRef BriefText = RC->getBriefText(Context); 8398 8399 // Don't duplicate the string because RawComment ensures that this memory 8400 // will not go away. 8401 return cxstring::createRef(BriefText); 8402 } 8403 8404 return cxstring::createNull(); 8405 } 8406 8407 CXModule clang_Cursor_getModule(CXCursor C) { 8408 if (C.kind == CXCursor_ModuleImportDecl) { 8409 if (const ImportDecl *ImportD = 8410 dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) 8411 return ImportD->getImportedModule(); 8412 } 8413 8414 return nullptr; 8415 } 8416 8417 CXModule clang_getModuleForFile(CXTranslationUnit TU, CXFile File) { 8418 if (isNotUsableTU(TU)) { 8419 LOG_BAD_TU(TU); 8420 return nullptr; 8421 } 8422 if (!File) 8423 return nullptr; 8424 FileEntry *FE = static_cast<FileEntry *>(File); 8425 8426 ASTUnit &Unit = *cxtu::getASTUnit(TU); 8427 HeaderSearch &HS = Unit.getPreprocessor().getHeaderSearchInfo(); 8428 ModuleMap::KnownHeader Header = HS.findModuleForHeader(FE); 8429 8430 return Header.getModule(); 8431 } 8432 8433 CXFile clang_Module_getASTFile(CXModule CXMod) { 8434 if (!CXMod) 8435 return nullptr; 8436 Module *Mod = static_cast<Module *>(CXMod); 8437 if (auto File = Mod->getASTFile()) 8438 return const_cast<FileEntry *>(&File->getFileEntry()); 8439 return nullptr; 8440 } 8441 8442 CXModule clang_Module_getParent(CXModule CXMod) { 8443 if (!CXMod) 8444 return nullptr; 8445 Module *Mod = static_cast<Module *>(CXMod); 8446 return Mod->Parent; 8447 } 8448 8449 CXString clang_Module_getName(CXModule CXMod) { 8450 if (!CXMod) 8451 return cxstring::createEmpty(); 8452 Module *Mod = static_cast<Module *>(CXMod); 8453 return cxstring::createDup(Mod->Name); 8454 } 8455 8456 CXString clang_Module_getFullName(CXModule CXMod) { 8457 if (!CXMod) 8458 return cxstring::createEmpty(); 8459 Module *Mod = static_cast<Module *>(CXMod); 8460 return cxstring::createDup(Mod->getFullModuleName()); 8461 } 8462 8463 int clang_Module_isSystem(CXModule CXMod) { 8464 if (!CXMod) 8465 return 0; 8466 Module *Mod = static_cast<Module *>(CXMod); 8467 return Mod->IsSystem; 8468 } 8469 8470 unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU, 8471 CXModule CXMod) { 8472 if (isNotUsableTU(TU)) { 8473 LOG_BAD_TU(TU); 8474 return 0; 8475 } 8476 if (!CXMod) 8477 return 0; 8478 Module *Mod = static_cast<Module *>(CXMod); 8479 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager(); 8480 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr); 8481 return TopHeaders.size(); 8482 } 8483 8484 CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU, CXModule CXMod, 8485 unsigned Index) { 8486 if (isNotUsableTU(TU)) { 8487 LOG_BAD_TU(TU); 8488 return nullptr; 8489 } 8490 if (!CXMod) 8491 return nullptr; 8492 Module *Mod = static_cast<Module *>(CXMod); 8493 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager(); 8494 8495 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr); 8496 if (Index < TopHeaders.size()) 8497 return const_cast<FileEntry *>(TopHeaders[Index]); 8498 8499 return nullptr; 8500 } 8501 8502 //===----------------------------------------------------------------------===// 8503 // C++ AST instrospection. 8504 //===----------------------------------------------------------------------===// 8505 8506 unsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C) { 8507 if (!clang_isDeclaration(C.kind)) 8508 return 0; 8509 8510 const Decl *D = cxcursor::getCursorDecl(C); 8511 const CXXConstructorDecl *Constructor = 8512 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr; 8513 return (Constructor && Constructor->isDefaultConstructor()) ? 1 : 0; 8514 } 8515 8516 unsigned clang_CXXConstructor_isCopyConstructor(CXCursor C) { 8517 if (!clang_isDeclaration(C.kind)) 8518 return 0; 8519 8520 const Decl *D = cxcursor::getCursorDecl(C); 8521 const CXXConstructorDecl *Constructor = 8522 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr; 8523 return (Constructor && Constructor->isCopyConstructor()) ? 1 : 0; 8524 } 8525 8526 unsigned clang_CXXConstructor_isMoveConstructor(CXCursor C) { 8527 if (!clang_isDeclaration(C.kind)) 8528 return 0; 8529 8530 const Decl *D = cxcursor::getCursorDecl(C); 8531 const CXXConstructorDecl *Constructor = 8532 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr; 8533 return (Constructor && Constructor->isMoveConstructor()) ? 1 : 0; 8534 } 8535 8536 unsigned clang_CXXConstructor_isConvertingConstructor(CXCursor C) { 8537 if (!clang_isDeclaration(C.kind)) 8538 return 0; 8539 8540 const Decl *D = cxcursor::getCursorDecl(C); 8541 const CXXConstructorDecl *Constructor = 8542 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr; 8543 // Passing 'false' excludes constructors marked 'explicit'. 8544 return (Constructor && Constructor->isConvertingConstructor(false)) ? 1 : 0; 8545 } 8546 8547 unsigned clang_CXXField_isMutable(CXCursor C) { 8548 if (!clang_isDeclaration(C.kind)) 8549 return 0; 8550 8551 if (const auto D = cxcursor::getCursorDecl(C)) 8552 if (const auto FD = dyn_cast_or_null<FieldDecl>(D)) 8553 return FD->isMutable() ? 1 : 0; 8554 return 0; 8555 } 8556 8557 unsigned clang_CXXMethod_isPureVirtual(CXCursor C) { 8558 if (!clang_isDeclaration(C.kind)) 8559 return 0; 8560 8561 const Decl *D = cxcursor::getCursorDecl(C); 8562 const CXXMethodDecl *Method = 8563 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8564 return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0; 8565 } 8566 8567 unsigned clang_CXXMethod_isConst(CXCursor C) { 8568 if (!clang_isDeclaration(C.kind)) 8569 return 0; 8570 8571 const Decl *D = cxcursor::getCursorDecl(C); 8572 const CXXMethodDecl *Method = 8573 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8574 return (Method && Method->getMethodQualifiers().hasConst()) ? 1 : 0; 8575 } 8576 8577 unsigned clang_CXXMethod_isDefaulted(CXCursor C) { 8578 if (!clang_isDeclaration(C.kind)) 8579 return 0; 8580 8581 const Decl *D = cxcursor::getCursorDecl(C); 8582 const CXXMethodDecl *Method = 8583 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8584 return (Method && Method->isDefaulted()) ? 1 : 0; 8585 } 8586 8587 unsigned clang_CXXMethod_isStatic(CXCursor C) { 8588 if (!clang_isDeclaration(C.kind)) 8589 return 0; 8590 8591 const Decl *D = cxcursor::getCursorDecl(C); 8592 const CXXMethodDecl *Method = 8593 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8594 return (Method && Method->isStatic()) ? 1 : 0; 8595 } 8596 8597 unsigned clang_CXXMethod_isVirtual(CXCursor C) { 8598 if (!clang_isDeclaration(C.kind)) 8599 return 0; 8600 8601 const Decl *D = cxcursor::getCursorDecl(C); 8602 const CXXMethodDecl *Method = 8603 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 8604 return (Method && Method->isVirtual()) ? 1 : 0; 8605 } 8606 8607 unsigned clang_CXXRecord_isAbstract(CXCursor C) { 8608 if (!clang_isDeclaration(C.kind)) 8609 return 0; 8610 8611 const auto *D = cxcursor::getCursorDecl(C); 8612 const auto *RD = dyn_cast_or_null<CXXRecordDecl>(D); 8613 if (RD) 8614 RD = RD->getDefinition(); 8615 return (RD && RD->isAbstract()) ? 1 : 0; 8616 } 8617 8618 unsigned clang_EnumDecl_isScoped(CXCursor C) { 8619 if (!clang_isDeclaration(C.kind)) 8620 return 0; 8621 8622 const Decl *D = cxcursor::getCursorDecl(C); 8623 auto *Enum = dyn_cast_or_null<EnumDecl>(D); 8624 return (Enum && Enum->isScoped()) ? 1 : 0; 8625 } 8626 8627 //===----------------------------------------------------------------------===// 8628 // Attribute introspection. 8629 //===----------------------------------------------------------------------===// 8630 8631 CXType clang_getIBOutletCollectionType(CXCursor C) { 8632 if (C.kind != CXCursor_IBOutletCollectionAttr) 8633 return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C)); 8634 8635 const IBOutletCollectionAttr *A = 8636 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C)); 8637 8638 return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C)); 8639 } 8640 8641 //===----------------------------------------------------------------------===// 8642 // Inspecting memory usage. 8643 //===----------------------------------------------------------------------===// 8644 8645 typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries; 8646 8647 static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries, 8648 enum CXTUResourceUsageKind k, 8649 unsigned long amount) { 8650 CXTUResourceUsageEntry entry = {k, amount}; 8651 entries.push_back(entry); 8652 } 8653 8654 const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) { 8655 const char *str = ""; 8656 switch (kind) { 8657 case CXTUResourceUsage_AST: 8658 str = "ASTContext: expressions, declarations, and types"; 8659 break; 8660 case CXTUResourceUsage_Identifiers: 8661 str = "ASTContext: identifiers"; 8662 break; 8663 case CXTUResourceUsage_Selectors: 8664 str = "ASTContext: selectors"; 8665 break; 8666 case CXTUResourceUsage_GlobalCompletionResults: 8667 str = "Code completion: cached global results"; 8668 break; 8669 case CXTUResourceUsage_SourceManagerContentCache: 8670 str = "SourceManager: content cache allocator"; 8671 break; 8672 case CXTUResourceUsage_AST_SideTables: 8673 str = "ASTContext: side tables"; 8674 break; 8675 case CXTUResourceUsage_SourceManager_Membuffer_Malloc: 8676 str = "SourceManager: malloc'ed memory buffers"; 8677 break; 8678 case CXTUResourceUsage_SourceManager_Membuffer_MMap: 8679 str = "SourceManager: mmap'ed memory buffers"; 8680 break; 8681 case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc: 8682 str = "ExternalASTSource: malloc'ed memory buffers"; 8683 break; 8684 case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap: 8685 str = "ExternalASTSource: mmap'ed memory buffers"; 8686 break; 8687 case CXTUResourceUsage_Preprocessor: 8688 str = "Preprocessor: malloc'ed memory"; 8689 break; 8690 case CXTUResourceUsage_PreprocessingRecord: 8691 str = "Preprocessor: PreprocessingRecord"; 8692 break; 8693 case CXTUResourceUsage_SourceManager_DataStructures: 8694 str = "SourceManager: data structures and tables"; 8695 break; 8696 case CXTUResourceUsage_Preprocessor_HeaderSearch: 8697 str = "Preprocessor: header search tables"; 8698 break; 8699 } 8700 return str; 8701 } 8702 8703 CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) { 8704 if (isNotUsableTU(TU)) { 8705 LOG_BAD_TU(TU); 8706 CXTUResourceUsage usage = {(void *)nullptr, 0, nullptr}; 8707 return usage; 8708 } 8709 8710 ASTUnit *astUnit = cxtu::getASTUnit(TU); 8711 std::unique_ptr<MemUsageEntries> entries(new MemUsageEntries()); 8712 ASTContext &astContext = astUnit->getASTContext(); 8713 8714 // How much memory is used by AST nodes and types? 8715 createCXTUResourceUsageEntry( 8716 *entries, CXTUResourceUsage_AST, 8717 (unsigned long)astContext.getASTAllocatedMemory()); 8718 8719 // How much memory is used by identifiers? 8720 createCXTUResourceUsageEntry( 8721 *entries, CXTUResourceUsage_Identifiers, 8722 (unsigned long)astContext.Idents.getAllocator().getTotalMemory()); 8723 8724 // How much memory is used for selectors? 8725 createCXTUResourceUsageEntry( 8726 *entries, CXTUResourceUsage_Selectors, 8727 (unsigned long)astContext.Selectors.getTotalMemory()); 8728 8729 // How much memory is used by ASTContext's side tables? 8730 createCXTUResourceUsageEntry( 8731 *entries, CXTUResourceUsage_AST_SideTables, 8732 (unsigned long)astContext.getSideTableAllocatedMemory()); 8733 8734 // How much memory is used for caching global code completion results? 8735 unsigned long completionBytes = 0; 8736 if (GlobalCodeCompletionAllocator *completionAllocator = 8737 astUnit->getCachedCompletionAllocator().get()) { 8738 completionBytes = completionAllocator->getTotalMemory(); 8739 } 8740 createCXTUResourceUsageEntry( 8741 *entries, CXTUResourceUsage_GlobalCompletionResults, completionBytes); 8742 8743 // How much memory is being used by SourceManager's content cache? 8744 createCXTUResourceUsageEntry( 8745 *entries, CXTUResourceUsage_SourceManagerContentCache, 8746 (unsigned long)astContext.getSourceManager().getContentCacheSize()); 8747 8748 // How much memory is being used by the MemoryBuffer's in SourceManager? 8749 const SourceManager::MemoryBufferSizes &srcBufs = 8750 astUnit->getSourceManager().getMemoryBufferSizes(); 8751 8752 createCXTUResourceUsageEntry(*entries, 8753 CXTUResourceUsage_SourceManager_Membuffer_Malloc, 8754 (unsigned long)srcBufs.malloc_bytes); 8755 createCXTUResourceUsageEntry(*entries, 8756 CXTUResourceUsage_SourceManager_Membuffer_MMap, 8757 (unsigned long)srcBufs.mmap_bytes); 8758 createCXTUResourceUsageEntry( 8759 *entries, CXTUResourceUsage_SourceManager_DataStructures, 8760 (unsigned long)astContext.getSourceManager().getDataStructureSizes()); 8761 8762 // How much memory is being used by the ExternalASTSource? 8763 if (ExternalASTSource *esrc = astContext.getExternalSource()) { 8764 const ExternalASTSource::MemoryBufferSizes &sizes = 8765 esrc->getMemoryBufferSizes(); 8766 8767 createCXTUResourceUsageEntry( 8768 *entries, CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc, 8769 (unsigned long)sizes.malloc_bytes); 8770 createCXTUResourceUsageEntry( 8771 *entries, CXTUResourceUsage_ExternalASTSource_Membuffer_MMap, 8772 (unsigned long)sizes.mmap_bytes); 8773 } 8774 8775 // How much memory is being used by the Preprocessor? 8776 Preprocessor &pp = astUnit->getPreprocessor(); 8777 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Preprocessor, 8778 pp.getTotalMemory()); 8779 8780 if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) { 8781 createCXTUResourceUsageEntry(*entries, 8782 CXTUResourceUsage_PreprocessingRecord, 8783 pRec->getTotalMemory()); 8784 } 8785 8786 createCXTUResourceUsageEntry(*entries, 8787 CXTUResourceUsage_Preprocessor_HeaderSearch, 8788 pp.getHeaderSearchInfo().getTotalMemory()); 8789 8790 CXTUResourceUsage usage = {(void *)entries.get(), (unsigned)entries->size(), 8791 !entries->empty() ? &(*entries)[0] : nullptr}; 8792 (void)entries.release(); 8793 return usage; 8794 } 8795 8796 void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) { 8797 if (usage.data) 8798 delete (MemUsageEntries *)usage.data; 8799 } 8800 8801 CXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) { 8802 CXSourceRangeList *skipped = new CXSourceRangeList; 8803 skipped->count = 0; 8804 skipped->ranges = nullptr; 8805 8806 if (isNotUsableTU(TU)) { 8807 LOG_BAD_TU(TU); 8808 return skipped; 8809 } 8810 8811 if (!file) 8812 return skipped; 8813 8814 ASTUnit *astUnit = cxtu::getASTUnit(TU); 8815 PreprocessingRecord *ppRec = 8816 astUnit->getPreprocessor().getPreprocessingRecord(); 8817 if (!ppRec) 8818 return skipped; 8819 8820 ASTContext &Ctx = astUnit->getASTContext(); 8821 SourceManager &sm = Ctx.getSourceManager(); 8822 FileEntry *fileEntry = static_cast<FileEntry *>(file); 8823 FileID wantedFileID = sm.translateFile(fileEntry); 8824 bool isMainFile = wantedFileID == sm.getMainFileID(); 8825 8826 const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges(); 8827 std::vector<SourceRange> wantedRanges; 8828 for (std::vector<SourceRange>::const_iterator i = SkippedRanges.begin(), 8829 ei = SkippedRanges.end(); 8830 i != ei; ++i) { 8831 if (sm.getFileID(i->getBegin()) == wantedFileID || 8832 sm.getFileID(i->getEnd()) == wantedFileID) 8833 wantedRanges.push_back(*i); 8834 else if (isMainFile && (astUnit->isInPreambleFileID(i->getBegin()) || 8835 astUnit->isInPreambleFileID(i->getEnd()))) 8836 wantedRanges.push_back(*i); 8837 } 8838 8839 skipped->count = wantedRanges.size(); 8840 skipped->ranges = new CXSourceRange[skipped->count]; 8841 for (unsigned i = 0, ei = skipped->count; i != ei; ++i) 8842 skipped->ranges[i] = cxloc::translateSourceRange(Ctx, wantedRanges[i]); 8843 8844 return skipped; 8845 } 8846 8847 CXSourceRangeList *clang_getAllSkippedRanges(CXTranslationUnit TU) { 8848 CXSourceRangeList *skipped = new CXSourceRangeList; 8849 skipped->count = 0; 8850 skipped->ranges = nullptr; 8851 8852 if (isNotUsableTU(TU)) { 8853 LOG_BAD_TU(TU); 8854 return skipped; 8855 } 8856 8857 ASTUnit *astUnit = cxtu::getASTUnit(TU); 8858 PreprocessingRecord *ppRec = 8859 astUnit->getPreprocessor().getPreprocessingRecord(); 8860 if (!ppRec) 8861 return skipped; 8862 8863 ASTContext &Ctx = astUnit->getASTContext(); 8864 8865 const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges(); 8866 8867 skipped->count = SkippedRanges.size(); 8868 skipped->ranges = new CXSourceRange[skipped->count]; 8869 for (unsigned i = 0, ei = skipped->count; i != ei; ++i) 8870 skipped->ranges[i] = cxloc::translateSourceRange(Ctx, SkippedRanges[i]); 8871 8872 return skipped; 8873 } 8874 8875 void clang_disposeSourceRangeList(CXSourceRangeList *ranges) { 8876 if (ranges) { 8877 delete[] ranges->ranges; 8878 delete ranges; 8879 } 8880 } 8881 8882 void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) { 8883 CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU); 8884 for (unsigned I = 0; I != Usage.numEntries; ++I) 8885 fprintf(stderr, " %s: %lu\n", 8886 clang_getTUResourceUsageName(Usage.entries[I].kind), 8887 Usage.entries[I].amount); 8888 8889 clang_disposeCXTUResourceUsage(Usage); 8890 } 8891 8892 CXCursor clang_Cursor_getVarDeclInitializer(CXCursor cursor) { 8893 const Decl *const D = getCursorDecl(cursor); 8894 if (!D) 8895 return clang_getNullCursor(); 8896 const auto *const VD = dyn_cast<VarDecl>(D); 8897 if (!VD) 8898 return clang_getNullCursor(); 8899 const Expr *const Init = VD->getInit(); 8900 if (!Init) 8901 return clang_getNullCursor(); 8902 8903 return cxcursor::MakeCXCursor(Init, VD, cxcursor::getCursorTU(cursor)); 8904 } 8905 8906 int clang_Cursor_hasVarDeclGlobalStorage(CXCursor cursor) { 8907 const Decl *const D = getCursorDecl(cursor); 8908 if (!D) 8909 return -1; 8910 const auto *const VD = dyn_cast<VarDecl>(D); 8911 if (!VD) 8912 return -1; 8913 8914 return VD->hasGlobalStorage(); 8915 } 8916 8917 int clang_Cursor_hasVarDeclExternalStorage(CXCursor cursor) { 8918 const Decl *const D = getCursorDecl(cursor); 8919 if (!D) 8920 return -1; 8921 const auto *const VD = dyn_cast<VarDecl>(D); 8922 if (!VD) 8923 return -1; 8924 8925 return VD->hasExternalStorage(); 8926 } 8927 8928 //===----------------------------------------------------------------------===// 8929 // Misc. utility functions. 8930 //===----------------------------------------------------------------------===// 8931 8932 /// Default to using our desired 8 MB stack size on "safety" threads. 8933 static unsigned SafetyStackThreadSize = DesiredStackSize; 8934 8935 namespace clang { 8936 8937 bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn, 8938 unsigned Size) { 8939 if (!Size) 8940 Size = GetSafetyThreadStackSize(); 8941 if (Size && !getenv("LIBCLANG_NOTHREADS")) 8942 return CRC.RunSafelyOnThread(Fn, Size); 8943 return CRC.RunSafely(Fn); 8944 } 8945 8946 unsigned GetSafetyThreadStackSize() { return SafetyStackThreadSize; } 8947 8948 void SetSafetyThreadStackSize(unsigned Value) { SafetyStackThreadSize = Value; } 8949 8950 } // namespace clang 8951 8952 void clang::setThreadBackgroundPriority() { 8953 if (getenv("LIBCLANG_BGPRIO_DISABLE")) 8954 return; 8955 8956 #if LLVM_ENABLE_THREADS 8957 llvm::set_thread_priority(llvm::ThreadPriority::Background); 8958 #endif 8959 } 8960 8961 void cxindex::printDiagsToStderr(ASTUnit *Unit) { 8962 if (!Unit) 8963 return; 8964 8965 for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(), 8966 DEnd = Unit->stored_diag_end(); 8967 D != DEnd; ++D) { 8968 CXStoredDiagnostic Diag(*D, Unit->getLangOpts()); 8969 CXString Msg = 8970 clang_formatDiagnostic(&Diag, clang_defaultDiagnosticDisplayOptions()); 8971 fprintf(stderr, "%s\n", clang_getCString(Msg)); 8972 clang_disposeString(Msg); 8973 } 8974 #ifdef _WIN32 8975 // On Windows, force a flush, since there may be multiple copies of 8976 // stderr and stdout in the file system, all with different buffers 8977 // but writing to the same device. 8978 fflush(stderr); 8979 #endif 8980 } 8981 8982 MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II, 8983 SourceLocation MacroDefLoc, 8984 CXTranslationUnit TU) { 8985 if (MacroDefLoc.isInvalid() || !TU) 8986 return nullptr; 8987 if (!II.hadMacroDefinition()) 8988 return nullptr; 8989 8990 ASTUnit *Unit = cxtu::getASTUnit(TU); 8991 Preprocessor &PP = Unit->getPreprocessor(); 8992 MacroDirective *MD = PP.getLocalMacroDirectiveHistory(&II); 8993 if (MD) { 8994 for (MacroDirective::DefInfo Def = MD->getDefinition(); Def; 8995 Def = Def.getPreviousDefinition()) { 8996 if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc()) 8997 return Def.getMacroInfo(); 8998 } 8999 } 9000 9001 return nullptr; 9002 } 9003 9004 const MacroInfo *cxindex::getMacroInfo(const MacroDefinitionRecord *MacroDef, 9005 CXTranslationUnit TU) { 9006 if (!MacroDef || !TU) 9007 return nullptr; 9008 const IdentifierInfo *II = MacroDef->getName(); 9009 if (!II) 9010 return nullptr; 9011 9012 return getMacroInfo(*II, MacroDef->getLocation(), TU); 9013 } 9014 9015 MacroDefinitionRecord * 9016 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, const Token &Tok, 9017 CXTranslationUnit TU) { 9018 if (!MI || !TU) 9019 return nullptr; 9020 if (Tok.isNot(tok::raw_identifier)) 9021 return nullptr; 9022 9023 if (MI->getNumTokens() == 0) 9024 return nullptr; 9025 SourceRange DefRange(MI->getReplacementToken(0).getLocation(), 9026 MI->getDefinitionEndLoc()); 9027 ASTUnit *Unit = cxtu::getASTUnit(TU); 9028 9029 // Check that the token is inside the definition and not its argument list. 9030 SourceManager &SM = Unit->getSourceManager(); 9031 if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin())) 9032 return nullptr; 9033 if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation())) 9034 return nullptr; 9035 9036 Preprocessor &PP = Unit->getPreprocessor(); 9037 PreprocessingRecord *PPRec = PP.getPreprocessingRecord(); 9038 if (!PPRec) 9039 return nullptr; 9040 9041 IdentifierInfo &II = PP.getIdentifierTable().get(Tok.getRawIdentifier()); 9042 if (!II.hadMacroDefinition()) 9043 return nullptr; 9044 9045 // Check that the identifier is not one of the macro arguments. 9046 if (std::find(MI->param_begin(), MI->param_end(), &II) != MI->param_end()) 9047 return nullptr; 9048 9049 MacroDirective *InnerMD = PP.getLocalMacroDirectiveHistory(&II); 9050 if (!InnerMD) 9051 return nullptr; 9052 9053 return PPRec->findMacroDefinition(InnerMD->getMacroInfo()); 9054 } 9055 9056 MacroDefinitionRecord * 9057 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, SourceLocation Loc, 9058 CXTranslationUnit TU) { 9059 if (Loc.isInvalid() || !MI || !TU) 9060 return nullptr; 9061 9062 if (MI->getNumTokens() == 0) 9063 return nullptr; 9064 ASTUnit *Unit = cxtu::getASTUnit(TU); 9065 Preprocessor &PP = Unit->getPreprocessor(); 9066 if (!PP.getPreprocessingRecord()) 9067 return nullptr; 9068 Loc = Unit->getSourceManager().getSpellingLoc(Loc); 9069 Token Tok; 9070 if (PP.getRawToken(Loc, Tok)) 9071 return nullptr; 9072 9073 return checkForMacroInMacroDefinition(MI, Tok, TU); 9074 } 9075 9076 CXString clang_getClangVersion() { 9077 return cxstring::createDup(getClangFullVersion()); 9078 } 9079 9080 Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) { 9081 if (TU) { 9082 if (ASTUnit *Unit = cxtu::getASTUnit(TU)) { 9083 LogOS << '<' << Unit->getMainFileName() << '>'; 9084 if (Unit->isMainFileAST()) 9085 LogOS << " (" << Unit->getASTFileName() << ')'; 9086 return *this; 9087 } 9088 } else { 9089 LogOS << "<NULL TU>"; 9090 } 9091 return *this; 9092 } 9093 9094 Logger &cxindex::Logger::operator<<(const FileEntry *FE) { 9095 *this << FE->getName(); 9096 return *this; 9097 } 9098 9099 Logger &cxindex::Logger::operator<<(CXCursor cursor) { 9100 CXString cursorName = clang_getCursorDisplayName(cursor); 9101 *this << cursorName << "@" << clang_getCursorLocation(cursor); 9102 clang_disposeString(cursorName); 9103 return *this; 9104 } 9105 9106 Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) { 9107 CXFile File; 9108 unsigned Line, Column; 9109 clang_getFileLocation(Loc, &File, &Line, &Column, nullptr); 9110 CXString FileName = clang_getFileName(File); 9111 *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column); 9112 clang_disposeString(FileName); 9113 return *this; 9114 } 9115 9116 Logger &cxindex::Logger::operator<<(CXSourceRange range) { 9117 CXSourceLocation BLoc = clang_getRangeStart(range); 9118 CXSourceLocation ELoc = clang_getRangeEnd(range); 9119 9120 CXFile BFile; 9121 unsigned BLine, BColumn; 9122 clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, nullptr); 9123 9124 CXFile EFile; 9125 unsigned ELine, EColumn; 9126 clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, nullptr); 9127 9128 CXString BFileName = clang_getFileName(BFile); 9129 if (BFile == EFile) { 9130 *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName), 9131 BLine, BColumn, ELine, EColumn); 9132 } else { 9133 CXString EFileName = clang_getFileName(EFile); 9134 *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName), BLine, 9135 BColumn) 9136 << llvm::format("%s:%d:%d]", clang_getCString(EFileName), ELine, 9137 EColumn); 9138 clang_disposeString(EFileName); 9139 } 9140 clang_disposeString(BFileName); 9141 return *this; 9142 } 9143 9144 Logger &cxindex::Logger::operator<<(CXString Str) { 9145 *this << clang_getCString(Str); 9146 return *this; 9147 } 9148 9149 Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) { 9150 LogOS << Fmt; 9151 return *this; 9152 } 9153 9154 static llvm::ManagedStatic<std::mutex> LoggingMutex; 9155 9156 cxindex::Logger::~Logger() { 9157 std::lock_guard<std::mutex> L(*LoggingMutex); 9158 9159 static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime(); 9160 9161 raw_ostream &OS = llvm::errs(); 9162 OS << "[libclang:" << Name << ':'; 9163 9164 #ifdef USE_DARWIN_THREADS 9165 // TODO: Portability. 9166 mach_port_t tid = pthread_mach_thread_np(pthread_self()); 9167 OS << tid << ':'; 9168 #endif 9169 9170 llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime(); 9171 OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime()); 9172 OS << Msg << '\n'; 9173 9174 if (Trace) { 9175 llvm::sys::PrintStackTrace(OS); 9176 OS << "--------------------------------------------------\n"; 9177 } 9178 } 9179