1 //===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the main API hooks in the Clang-C Source Indexing 11 // library. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "CIndexer.h" 16 #include "CIndexDiagnostic.h" 17 #include "CLog.h" 18 #include "CXCursor.h" 19 #include "CXSourceLocation.h" 20 #include "CXString.h" 21 #include "CXTranslationUnit.h" 22 #include "CXType.h" 23 #include "CursorVisitor.h" 24 #include "clang/AST/Attr.h" 25 #include "clang/AST/Mangle.h" 26 #include "clang/AST/StmtVisitor.h" 27 #include "clang/Basic/Diagnostic.h" 28 #include "clang/Basic/DiagnosticCategories.h" 29 #include "clang/Basic/DiagnosticIDs.h" 30 #include "clang/Basic/TargetInfo.h" 31 #include "clang/Basic/Version.h" 32 #include "clang/Frontend/ASTUnit.h" 33 #include "clang/Frontend/CompilerInstance.h" 34 #include "clang/Frontend/FrontendDiagnostic.h" 35 #include "clang/Index/CommentToXML.h" 36 #include "clang/Lex/HeaderSearch.h" 37 #include "clang/Lex/Lexer.h" 38 #include "clang/Lex/PreprocessingRecord.h" 39 #include "clang/Lex/Preprocessor.h" 40 #include "clang/Serialization/SerializationDiagnostic.h" 41 #include "llvm/ADT/Optional.h" 42 #include "llvm/ADT/STLExtras.h" 43 #include "llvm/ADT/StringSwitch.h" 44 #include "llvm/Config/llvm-config.h" 45 #include "llvm/IR/DataLayout.h" 46 #include "llvm/IR/Mangler.h" 47 #include "llvm/Support/Compiler.h" 48 #include "llvm/Support/CrashRecoveryContext.h" 49 #include "llvm/Support/Format.h" 50 #include "llvm/Support/ManagedStatic.h" 51 #include "llvm/Support/MemoryBuffer.h" 52 #include "llvm/Support/Mutex.h" 53 #include "llvm/Support/Program.h" 54 #include "llvm/Support/SaveAndRestore.h" 55 #include "llvm/Support/Signals.h" 56 #include "llvm/Support/Threading.h" 57 #include "llvm/Support/Timer.h" 58 #include "llvm/Support/raw_ostream.h" 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, ASTUnit *AU) { 74 if (!AU) 75 return nullptr; 76 assert(CIdx); 77 CXTranslationUnit D = new CXTranslationUnitImpl(); 78 D->CIdx = CIdx; 79 D->TheASTUnit = AU; 80 D->StringPool = new cxstring::CXStringPool(); 81 D->Diagnostics = nullptr; 82 D->OverridenCursorsPool = createOverridenCXCursorsPool(); 83 D->CommentToXML = nullptr; 84 return D; 85 } 86 87 bool cxtu::isASTReadError(ASTUnit *AU) { 88 for (ASTUnit::stored_diag_iterator D = AU->stored_diag_begin(), 89 DEnd = AU->stored_diag_end(); 90 D != DEnd; ++D) { 91 if (D->getLevel() >= DiagnosticsEngine::Error && 92 DiagnosticIDs::getCategoryNumberForDiag(D->getID()) == 93 diag::DiagCat_AST_Deserialization_Issue) 94 return true; 95 } 96 return false; 97 } 98 99 cxtu::CXTUOwner::~CXTUOwner() { 100 if (TU) 101 clang_disposeTranslationUnit(TU); 102 } 103 104 /// \brief Compare two source ranges to determine their relative position in 105 /// the translation unit. 106 static RangeComparisonResult RangeCompare(SourceManager &SM, 107 SourceRange R1, 108 SourceRange R2) { 109 assert(R1.isValid() && "First range is invalid?"); 110 assert(R2.isValid() && "Second range is invalid?"); 111 if (R1.getEnd() != R2.getBegin() && 112 SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin())) 113 return RangeBefore; 114 if (R2.getEnd() != R1.getBegin() && 115 SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin())) 116 return RangeAfter; 117 return RangeOverlap; 118 } 119 120 /// \brief Determine if a source location falls within, before, or after a 121 /// a given source range. 122 static RangeComparisonResult LocationCompare(SourceManager &SM, 123 SourceLocation L, SourceRange R) { 124 assert(R.isValid() && "First range is invalid?"); 125 assert(L.isValid() && "Second range is invalid?"); 126 if (L == R.getBegin() || L == R.getEnd()) 127 return RangeOverlap; 128 if (SM.isBeforeInTranslationUnit(L, R.getBegin())) 129 return RangeBefore; 130 if (SM.isBeforeInTranslationUnit(R.getEnd(), L)) 131 return RangeAfter; 132 return RangeOverlap; 133 } 134 135 /// \brief Translate a Clang source range into a CIndex source range. 136 /// 137 /// Clang internally represents ranges where the end location points to the 138 /// start of the token at the end. However, for external clients it is more 139 /// useful to have a CXSourceRange be a proper half-open interval. This routine 140 /// does the appropriate translation. 141 CXSourceRange cxloc::translateSourceRange(const SourceManager &SM, 142 const LangOptions &LangOpts, 143 const CharSourceRange &R) { 144 // We want the last character in this location, so we will adjust the 145 // location accordingly. 146 SourceLocation EndLoc = R.getEnd(); 147 if (EndLoc.isValid() && EndLoc.isMacroID() && !SM.isMacroArgExpansion(EndLoc)) 148 EndLoc = SM.getExpansionRange(EndLoc).second; 149 if (R.isTokenRange() && !EndLoc.isInvalid()) { 150 unsigned Length = Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc), 151 SM, LangOpts); 152 EndLoc = EndLoc.getLocWithOffset(Length); 153 } 154 155 CXSourceRange Result = { 156 { &SM, &LangOpts }, 157 R.getBegin().getRawEncoding(), 158 EndLoc.getRawEncoding() 159 }; 160 return Result; 161 } 162 163 //===----------------------------------------------------------------------===// 164 // Cursor visitor. 165 //===----------------------------------------------------------------------===// 166 167 static SourceRange getRawCursorExtent(CXCursor C); 168 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr); 169 170 171 RangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) { 172 return RangeCompare(AU->getSourceManager(), R, RegionOfInterest); 173 } 174 175 /// \brief Visit the given cursor and, if requested by the visitor, 176 /// its children. 177 /// 178 /// \param Cursor the cursor to visit. 179 /// 180 /// \param CheckedRegionOfInterest if true, then the caller already checked 181 /// that this cursor is within the region of interest. 182 /// 183 /// \returns true if the visitation should be aborted, false if it 184 /// should continue. 185 bool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) { 186 if (clang_isInvalid(Cursor.kind)) 187 return false; 188 189 if (clang_isDeclaration(Cursor.kind)) { 190 const Decl *D = getCursorDecl(Cursor); 191 if (!D) { 192 assert(0 && "Invalid declaration cursor"); 193 return true; // abort. 194 } 195 196 // Ignore implicit declarations, unless it's an objc method because 197 // currently we should report implicit methods for properties when indexing. 198 if (D->isImplicit() && !isa<ObjCMethodDecl>(D)) 199 return false; 200 } 201 202 // If we have a range of interest, and this cursor doesn't intersect with it, 203 // we're done. 204 if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) { 205 SourceRange Range = getRawCursorExtent(Cursor); 206 if (Range.isInvalid() || CompareRegionOfInterest(Range)) 207 return false; 208 } 209 210 switch (Visitor(Cursor, Parent, ClientData)) { 211 case CXChildVisit_Break: 212 return true; 213 214 case CXChildVisit_Continue: 215 return false; 216 217 case CXChildVisit_Recurse: { 218 bool ret = VisitChildren(Cursor); 219 if (PostChildrenVisitor) 220 if (PostChildrenVisitor(Cursor, ClientData)) 221 return true; 222 return ret; 223 } 224 } 225 226 llvm_unreachable("Invalid CXChildVisitResult!"); 227 } 228 229 static bool visitPreprocessedEntitiesInRange(SourceRange R, 230 PreprocessingRecord &PPRec, 231 CursorVisitor &Visitor) { 232 SourceManager &SM = Visitor.getASTUnit()->getSourceManager(); 233 FileID FID; 234 235 if (!Visitor.shouldVisitIncludedEntities()) { 236 // If the begin/end of the range lie in the same FileID, do the optimization 237 // where we skip preprocessed entities that do not come from the same FileID. 238 FID = SM.getFileID(SM.getFileLoc(R.getBegin())); 239 if (FID != SM.getFileID(SM.getFileLoc(R.getEnd()))) 240 FID = FileID(); 241 } 242 243 const auto &Entities = PPRec.getPreprocessedEntitiesInRange(R); 244 return Visitor.visitPreprocessedEntities(Entities.begin(), Entities.end(), 245 PPRec, FID); 246 } 247 248 bool CursorVisitor::visitFileRegion() { 249 if (RegionOfInterest.isInvalid()) 250 return false; 251 252 ASTUnit *Unit = cxtu::getASTUnit(TU); 253 SourceManager &SM = Unit->getSourceManager(); 254 255 std::pair<FileID, unsigned> 256 Begin = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getBegin())), 257 End = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getEnd())); 258 259 if (End.first != Begin.first) { 260 // If the end does not reside in the same file, try to recover by 261 // picking the end of the file of begin location. 262 End.first = Begin.first; 263 End.second = SM.getFileIDSize(Begin.first); 264 } 265 266 assert(Begin.first == End.first); 267 if (Begin.second > End.second) 268 return false; 269 270 FileID File = Begin.first; 271 unsigned Offset = Begin.second; 272 unsigned Length = End.second - Begin.second; 273 274 if (!VisitDeclsOnly && !VisitPreprocessorLast) 275 if (visitPreprocessedEntitiesInRegion()) 276 return true; // visitation break. 277 278 if (visitDeclsFromFileRegion(File, Offset, Length)) 279 return true; // visitation break. 280 281 if (!VisitDeclsOnly && VisitPreprocessorLast) 282 return visitPreprocessedEntitiesInRegion(); 283 284 return false; 285 } 286 287 static bool isInLexicalContext(Decl *D, DeclContext *DC) { 288 if (!DC) 289 return false; 290 291 for (DeclContext *DeclDC = D->getLexicalDeclContext(); 292 DeclDC; DeclDC = DeclDC->getLexicalParent()) { 293 if (DeclDC == DC) 294 return true; 295 } 296 return false; 297 } 298 299 bool CursorVisitor::visitDeclsFromFileRegion(FileID File, 300 unsigned Offset, unsigned Length) { 301 ASTUnit *Unit = cxtu::getASTUnit(TU); 302 SourceManager &SM = Unit->getSourceManager(); 303 SourceRange Range = RegionOfInterest; 304 305 SmallVector<Decl *, 16> Decls; 306 Unit->findFileRegionDecls(File, Offset, Length, Decls); 307 308 // If we didn't find any file level decls for the file, try looking at the 309 // file that it was included from. 310 while (Decls.empty() || Decls.front()->isTopLevelDeclInObjCContainer()) { 311 bool Invalid = false; 312 const SrcMgr::SLocEntry &SLEntry = SM.getSLocEntry(File, &Invalid); 313 if (Invalid) 314 return false; 315 316 SourceLocation Outer; 317 if (SLEntry.isFile()) 318 Outer = SLEntry.getFile().getIncludeLoc(); 319 else 320 Outer = SLEntry.getExpansion().getExpansionLocStart(); 321 if (Outer.isInvalid()) 322 return false; 323 324 std::tie(File, Offset) = SM.getDecomposedExpansionLoc(Outer); 325 Length = 0; 326 Unit->findFileRegionDecls(File, Offset, Length, Decls); 327 } 328 329 assert(!Decls.empty()); 330 331 bool VisitedAtLeastOnce = false; 332 DeclContext *CurDC = nullptr; 333 SmallVectorImpl<Decl *>::iterator DIt = Decls.begin(); 334 for (SmallVectorImpl<Decl *>::iterator DE = Decls.end(); DIt != DE; ++DIt) { 335 Decl *D = *DIt; 336 if (D->getSourceRange().isInvalid()) 337 continue; 338 339 if (isInLexicalContext(D, CurDC)) 340 continue; 341 342 CurDC = dyn_cast<DeclContext>(D); 343 344 if (TagDecl *TD = dyn_cast<TagDecl>(D)) 345 if (!TD->isFreeStanding()) 346 continue; 347 348 RangeComparisonResult CompRes = RangeCompare(SM, D->getSourceRange(),Range); 349 if (CompRes == RangeBefore) 350 continue; 351 if (CompRes == RangeAfter) 352 break; 353 354 assert(CompRes == RangeOverlap); 355 VisitedAtLeastOnce = true; 356 357 if (isa<ObjCContainerDecl>(D)) { 358 FileDI_current = &DIt; 359 FileDE_current = DE; 360 } else { 361 FileDI_current = nullptr; 362 } 363 364 if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true)) 365 return true; // visitation break. 366 } 367 368 if (VisitedAtLeastOnce) 369 return false; 370 371 // No Decls overlapped with the range. Move up the lexical context until there 372 // is a context that contains the range or we reach the translation unit 373 // level. 374 DeclContext *DC = DIt == Decls.begin() ? (*DIt)->getLexicalDeclContext() 375 : (*(DIt-1))->getLexicalDeclContext(); 376 377 while (DC && !DC->isTranslationUnit()) { 378 Decl *D = cast<Decl>(DC); 379 SourceRange CurDeclRange = D->getSourceRange(); 380 if (CurDeclRange.isInvalid()) 381 break; 382 383 if (RangeCompare(SM, CurDeclRange, Range) == RangeOverlap) { 384 if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true)) 385 return true; // visitation break. 386 } 387 388 DC = D->getLexicalDeclContext(); 389 } 390 391 return false; 392 } 393 394 bool CursorVisitor::visitPreprocessedEntitiesInRegion() { 395 if (!AU->getPreprocessor().getPreprocessingRecord()) 396 return false; 397 398 PreprocessingRecord &PPRec 399 = *AU->getPreprocessor().getPreprocessingRecord(); 400 SourceManager &SM = AU->getSourceManager(); 401 402 if (RegionOfInterest.isValid()) { 403 SourceRange MappedRange = AU->mapRangeToPreamble(RegionOfInterest); 404 SourceLocation B = MappedRange.getBegin(); 405 SourceLocation E = MappedRange.getEnd(); 406 407 if (AU->isInPreambleFileID(B)) { 408 if (SM.isLoadedSourceLocation(E)) 409 return visitPreprocessedEntitiesInRange(SourceRange(B, E), 410 PPRec, *this); 411 412 // Beginning of range lies in the preamble but it also extends beyond 413 // it into the main file. Split the range into 2 parts, one covering 414 // the preamble and another covering the main file. This allows subsequent 415 // calls to visitPreprocessedEntitiesInRange to accept a source range that 416 // lies in the same FileID, allowing it to skip preprocessed entities that 417 // do not come from the same FileID. 418 bool breaked = 419 visitPreprocessedEntitiesInRange( 420 SourceRange(B, AU->getEndOfPreambleFileID()), 421 PPRec, *this); 422 if (breaked) return true; 423 return visitPreprocessedEntitiesInRange( 424 SourceRange(AU->getStartOfMainFileID(), E), 425 PPRec, *this); 426 } 427 428 return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec, *this); 429 } 430 431 bool OnlyLocalDecls 432 = !AU->isMainFileAST() && AU->getOnlyLocalDecls(); 433 434 if (OnlyLocalDecls) 435 return visitPreprocessedEntities(PPRec.local_begin(), PPRec.local_end(), 436 PPRec); 437 438 return visitPreprocessedEntities(PPRec.begin(), PPRec.end(), PPRec); 439 } 440 441 template<typename InputIterator> 442 bool CursorVisitor::visitPreprocessedEntities(InputIterator First, 443 InputIterator Last, 444 PreprocessingRecord &PPRec, 445 FileID FID) { 446 for (; First != Last; ++First) { 447 if (!FID.isInvalid() && !PPRec.isEntityInFileID(First, FID)) 448 continue; 449 450 PreprocessedEntity *PPE = *First; 451 if (!PPE) 452 continue; 453 454 if (MacroExpansion *ME = dyn_cast<MacroExpansion>(PPE)) { 455 if (Visit(MakeMacroExpansionCursor(ME, TU))) 456 return true; 457 458 continue; 459 } 460 461 if (MacroDefinition *MD = dyn_cast<MacroDefinition>(PPE)) { 462 if (Visit(MakeMacroDefinitionCursor(MD, TU))) 463 return true; 464 465 continue; 466 } 467 468 if (InclusionDirective *ID = dyn_cast<InclusionDirective>(PPE)) { 469 if (Visit(MakeInclusionDirectiveCursor(ID, TU))) 470 return true; 471 472 continue; 473 } 474 } 475 476 return false; 477 } 478 479 /// \brief Visit the children of the given cursor. 480 /// 481 /// \returns true if the visitation should be aborted, false if it 482 /// should continue. 483 bool CursorVisitor::VisitChildren(CXCursor Cursor) { 484 if (clang_isReference(Cursor.kind) && 485 Cursor.kind != CXCursor_CXXBaseSpecifier) { 486 // By definition, references have no children. 487 return false; 488 } 489 490 // Set the Parent field to Cursor, then back to its old value once we're 491 // done. 492 SetParentRAII SetParent(Parent, StmtParent, Cursor); 493 494 if (clang_isDeclaration(Cursor.kind)) { 495 Decl *D = const_cast<Decl *>(getCursorDecl(Cursor)); 496 if (!D) 497 return false; 498 499 return VisitAttributes(D) || Visit(D); 500 } 501 502 if (clang_isStatement(Cursor.kind)) { 503 if (const Stmt *S = getCursorStmt(Cursor)) 504 return Visit(S); 505 506 return false; 507 } 508 509 if (clang_isExpression(Cursor.kind)) { 510 if (const Expr *E = getCursorExpr(Cursor)) 511 return Visit(E); 512 513 return false; 514 } 515 516 if (clang_isTranslationUnit(Cursor.kind)) { 517 CXTranslationUnit TU = getCursorTU(Cursor); 518 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 519 520 int VisitOrder[2] = { VisitPreprocessorLast, !VisitPreprocessorLast }; 521 for (unsigned I = 0; I != 2; ++I) { 522 if (VisitOrder[I]) { 523 if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() && 524 RegionOfInterest.isInvalid()) { 525 for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(), 526 TLEnd = CXXUnit->top_level_end(); 527 TL != TLEnd; ++TL) { 528 if (Visit(MakeCXCursor(*TL, TU, RegionOfInterest), true)) 529 return true; 530 } 531 } else if (VisitDeclContext( 532 CXXUnit->getASTContext().getTranslationUnitDecl())) 533 return true; 534 continue; 535 } 536 537 // Walk the preprocessing record. 538 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) 539 visitPreprocessedEntitiesInRegion(); 540 } 541 542 return false; 543 } 544 545 if (Cursor.kind == CXCursor_CXXBaseSpecifier) { 546 if (const CXXBaseSpecifier *Base = getCursorCXXBaseSpecifier(Cursor)) { 547 if (TypeSourceInfo *BaseTSInfo = Base->getTypeSourceInfo()) { 548 return Visit(BaseTSInfo->getTypeLoc()); 549 } 550 } 551 } 552 553 if (Cursor.kind == CXCursor_IBOutletCollectionAttr) { 554 const IBOutletCollectionAttr *A = 555 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(Cursor)); 556 if (const ObjCObjectType *ObjT = A->getInterface()->getAs<ObjCObjectType>()) 557 return Visit(cxcursor::MakeCursorObjCClassRef( 558 ObjT->getInterface(), 559 A->getInterfaceLoc()->getTypeLoc().getLocStart(), TU)); 560 } 561 562 // If pointing inside a macro definition, check if the token is an identifier 563 // that was ever defined as a macro. In such a case, create a "pseudo" macro 564 // expansion cursor for that token. 565 SourceLocation BeginLoc = RegionOfInterest.getBegin(); 566 if (Cursor.kind == CXCursor_MacroDefinition && 567 BeginLoc == RegionOfInterest.getEnd()) { 568 SourceLocation Loc = AU->mapLocationToPreamble(BeginLoc); 569 const MacroInfo *MI = 570 getMacroInfo(cxcursor::getCursorMacroDefinition(Cursor), TU); 571 if (MacroDefinition *MacroDef = 572 checkForMacroInMacroDefinition(MI, Loc, TU)) 573 return Visit(cxcursor::MakeMacroExpansionCursor(MacroDef, BeginLoc, TU)); 574 } 575 576 // Nothing to visit at the moment. 577 return false; 578 } 579 580 bool CursorVisitor::VisitBlockDecl(BlockDecl *B) { 581 if (TypeSourceInfo *TSInfo = B->getSignatureAsWritten()) 582 if (Visit(TSInfo->getTypeLoc())) 583 return true; 584 585 if (Stmt *Body = B->getBody()) 586 return Visit(MakeCXCursor(Body, StmtParent, TU, RegionOfInterest)); 587 588 return false; 589 } 590 591 Optional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) { 592 if (RegionOfInterest.isValid()) { 593 SourceRange Range = getFullCursorExtent(Cursor, AU->getSourceManager()); 594 if (Range.isInvalid()) 595 return None; 596 597 switch (CompareRegionOfInterest(Range)) { 598 case RangeBefore: 599 // This declaration comes before the region of interest; skip it. 600 return None; 601 602 case RangeAfter: 603 // This declaration comes after the region of interest; we're done. 604 return false; 605 606 case RangeOverlap: 607 // This declaration overlaps the region of interest; visit it. 608 break; 609 } 610 } 611 return true; 612 } 613 614 bool CursorVisitor::VisitDeclContext(DeclContext *DC) { 615 DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end(); 616 617 // FIXME: Eventually remove. This part of a hack to support proper 618 // iteration over all Decls contained lexically within an ObjC container. 619 SaveAndRestore<DeclContext::decl_iterator*> DI_saved(DI_current, &I); 620 SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E); 621 622 for ( ; I != E; ++I) { 623 Decl *D = *I; 624 if (D->getLexicalDeclContext() != DC) 625 continue; 626 CXCursor Cursor = MakeCXCursor(D, TU, RegionOfInterest); 627 628 // Ignore synthesized ivars here, otherwise if we have something like: 629 // @synthesize prop = _prop; 630 // and '_prop' is not declared, we will encounter a '_prop' ivar before 631 // encountering the 'prop' synthesize declaration and we will think that 632 // we passed the region-of-interest. 633 if (ObjCIvarDecl *ivarD = dyn_cast<ObjCIvarDecl>(D)) { 634 if (ivarD->getSynthesize()) 635 continue; 636 } 637 638 // FIXME: ObjCClassRef/ObjCProtocolRef for forward class/protocol 639 // declarations is a mismatch with the compiler semantics. 640 if (Cursor.kind == CXCursor_ObjCInterfaceDecl) { 641 ObjCInterfaceDecl *ID = cast<ObjCInterfaceDecl>(D); 642 if (!ID->isThisDeclarationADefinition()) 643 Cursor = MakeCursorObjCClassRef(ID, ID->getLocation(), TU); 644 645 } else if (Cursor.kind == CXCursor_ObjCProtocolDecl) { 646 ObjCProtocolDecl *PD = cast<ObjCProtocolDecl>(D); 647 if (!PD->isThisDeclarationADefinition()) 648 Cursor = MakeCursorObjCProtocolRef(PD, PD->getLocation(), TU); 649 } 650 651 const Optional<bool> &V = shouldVisitCursor(Cursor); 652 if (!V.hasValue()) 653 continue; 654 if (!V.getValue()) 655 return false; 656 if (Visit(Cursor, true)) 657 return true; 658 } 659 return false; 660 } 661 662 bool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 663 llvm_unreachable("Translation units are visited directly by Visit()"); 664 } 665 666 bool CursorVisitor::VisitTypeAliasDecl(TypeAliasDecl *D) { 667 if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo()) 668 return Visit(TSInfo->getTypeLoc()); 669 670 return false; 671 } 672 673 bool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) { 674 if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo()) 675 return Visit(TSInfo->getTypeLoc()); 676 677 return false; 678 } 679 680 bool CursorVisitor::VisitTagDecl(TagDecl *D) { 681 return VisitDeclContext(D); 682 } 683 684 bool CursorVisitor::VisitClassTemplateSpecializationDecl( 685 ClassTemplateSpecializationDecl *D) { 686 bool ShouldVisitBody = false; 687 switch (D->getSpecializationKind()) { 688 case TSK_Undeclared: 689 case TSK_ImplicitInstantiation: 690 // Nothing to visit 691 return false; 692 693 case TSK_ExplicitInstantiationDeclaration: 694 case TSK_ExplicitInstantiationDefinition: 695 break; 696 697 case TSK_ExplicitSpecialization: 698 ShouldVisitBody = true; 699 break; 700 } 701 702 // Visit the template arguments used in the specialization. 703 if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) { 704 TypeLoc TL = SpecType->getTypeLoc(); 705 if (TemplateSpecializationTypeLoc TSTLoc = 706 TL.getAs<TemplateSpecializationTypeLoc>()) { 707 for (unsigned I = 0, N = TSTLoc.getNumArgs(); I != N; ++I) 708 if (VisitTemplateArgumentLoc(TSTLoc.getArgLoc(I))) 709 return true; 710 } 711 } 712 713 if (ShouldVisitBody && VisitCXXRecordDecl(D)) 714 return true; 715 716 return false; 717 } 718 719 bool CursorVisitor::VisitClassTemplatePartialSpecializationDecl( 720 ClassTemplatePartialSpecializationDecl *D) { 721 // FIXME: Visit the "outer" template parameter lists on the TagDecl 722 // before visiting these template parameters. 723 if (VisitTemplateParameters(D->getTemplateParameters())) 724 return true; 725 726 // Visit the partial specialization arguments. 727 const ASTTemplateArgumentListInfo *Info = D->getTemplateArgsAsWritten(); 728 const TemplateArgumentLoc *TemplateArgs = Info->getTemplateArgs(); 729 for (unsigned I = 0, N = Info->NumTemplateArgs; I != N; ++I) 730 if (VisitTemplateArgumentLoc(TemplateArgs[I])) 731 return true; 732 733 return VisitCXXRecordDecl(D); 734 } 735 736 bool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { 737 // Visit the default argument. 738 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) 739 if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo()) 740 if (Visit(DefArg->getTypeLoc())) 741 return true; 742 743 return false; 744 } 745 746 bool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) { 747 if (Expr *Init = D->getInitExpr()) 748 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest)); 749 return false; 750 } 751 752 bool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) { 753 unsigned NumParamList = DD->getNumTemplateParameterLists(); 754 for (unsigned i = 0; i < NumParamList; i++) { 755 TemplateParameterList* Params = DD->getTemplateParameterList(i); 756 if (VisitTemplateParameters(Params)) 757 return true; 758 } 759 760 if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo()) 761 if (Visit(TSInfo->getTypeLoc())) 762 return true; 763 764 // Visit the nested-name-specifier, if present. 765 if (NestedNameSpecifierLoc QualifierLoc = DD->getQualifierLoc()) 766 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 767 return true; 768 769 return false; 770 } 771 772 /// \brief Compare two base or member initializers based on their source order. 773 static int CompareCXXCtorInitializers(CXXCtorInitializer *const *X, 774 CXXCtorInitializer *const *Y) { 775 return (*X)->getSourceOrder() - (*Y)->getSourceOrder(); 776 } 777 778 bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) { 779 unsigned NumParamList = ND->getNumTemplateParameterLists(); 780 for (unsigned i = 0; i < NumParamList; i++) { 781 TemplateParameterList* Params = ND->getTemplateParameterList(i); 782 if (VisitTemplateParameters(Params)) 783 return true; 784 } 785 786 if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) { 787 // Visit the function declaration's syntactic components in the order 788 // written. This requires a bit of work. 789 TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens(); 790 FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>(); 791 792 // If we have a function declared directly (without the use of a typedef), 793 // visit just the return type. Otherwise, just visit the function's type 794 // now. 795 if ((FTL && !isa<CXXConversionDecl>(ND) && Visit(FTL.getReturnLoc())) || 796 (!FTL && Visit(TL))) 797 return true; 798 799 // Visit the nested-name-specifier, if present. 800 if (NestedNameSpecifierLoc QualifierLoc = ND->getQualifierLoc()) 801 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 802 return true; 803 804 // Visit the declaration name. 805 if (!isa<CXXDestructorDecl>(ND)) 806 if (VisitDeclarationNameInfo(ND->getNameInfo())) 807 return true; 808 809 // FIXME: Visit explicitly-specified template arguments! 810 811 // Visit the function parameters, if we have a function type. 812 if (FTL && VisitFunctionTypeLoc(FTL, true)) 813 return true; 814 815 // FIXME: Attributes? 816 } 817 818 if (ND->doesThisDeclarationHaveABody() && !ND->isLateTemplateParsed()) { 819 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) { 820 // Find the initializers that were written in the source. 821 SmallVector<CXXCtorInitializer *, 4> WrittenInits; 822 for (auto *I : Constructor->inits()) { 823 if (!I->isWritten()) 824 continue; 825 826 WrittenInits.push_back(I); 827 } 828 829 // Sort the initializers in source order 830 llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(), 831 &CompareCXXCtorInitializers); 832 833 // Visit the initializers in source order 834 for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) { 835 CXXCtorInitializer *Init = WrittenInits[I]; 836 if (Init->isAnyMemberInitializer()) { 837 if (Visit(MakeCursorMemberRef(Init->getAnyMember(), 838 Init->getMemberLocation(), TU))) 839 return true; 840 } else if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo()) { 841 if (Visit(TInfo->getTypeLoc())) 842 return true; 843 } 844 845 // Visit the initializer value. 846 if (Expr *Initializer = Init->getInit()) 847 if (Visit(MakeCXCursor(Initializer, ND, TU, RegionOfInterest))) 848 return true; 849 } 850 } 851 852 if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest))) 853 return true; 854 } 855 856 return false; 857 } 858 859 bool CursorVisitor::VisitFieldDecl(FieldDecl *D) { 860 if (VisitDeclaratorDecl(D)) 861 return true; 862 863 if (Expr *BitWidth = D->getBitWidth()) 864 return Visit(MakeCXCursor(BitWidth, StmtParent, TU, RegionOfInterest)); 865 866 return false; 867 } 868 869 bool CursorVisitor::VisitVarDecl(VarDecl *D) { 870 if (VisitDeclaratorDecl(D)) 871 return true; 872 873 if (Expr *Init = D->getInit()) 874 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest)); 875 876 return false; 877 } 878 879 bool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { 880 if (VisitDeclaratorDecl(D)) 881 return true; 882 883 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) 884 if (Expr *DefArg = D->getDefaultArgument()) 885 return Visit(MakeCXCursor(DefArg, StmtParent, TU, RegionOfInterest)); 886 887 return false; 888 } 889 890 bool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 891 // FIXME: Visit the "outer" template parameter lists on the FunctionDecl 892 // before visiting these template parameters. 893 if (VisitTemplateParameters(D->getTemplateParameters())) 894 return true; 895 896 return VisitFunctionDecl(D->getTemplatedDecl()); 897 } 898 899 bool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) { 900 // FIXME: Visit the "outer" template parameter lists on the TagDecl 901 // before visiting these template parameters. 902 if (VisitTemplateParameters(D->getTemplateParameters())) 903 return true; 904 905 return VisitCXXRecordDecl(D->getTemplatedDecl()); 906 } 907 908 bool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { 909 if (VisitTemplateParameters(D->getTemplateParameters())) 910 return true; 911 912 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() && 913 VisitTemplateArgumentLoc(D->getDefaultArgument())) 914 return true; 915 916 return false; 917 } 918 919 bool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) { 920 if (TypeSourceInfo *TSInfo = ND->getReturnTypeSourceInfo()) 921 if (Visit(TSInfo->getTypeLoc())) 922 return true; 923 924 for (const auto *P : ND->params()) { 925 if (Visit(MakeCXCursor(P, TU, RegionOfInterest))) 926 return true; 927 } 928 929 if (ND->isThisDeclarationADefinition() && 930 Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest))) 931 return true; 932 933 return false; 934 } 935 936 template <typename DeclIt> 937 static void addRangedDeclsInContainer(DeclIt *DI_current, DeclIt DE_current, 938 SourceManager &SM, SourceLocation EndLoc, 939 SmallVectorImpl<Decl *> &Decls) { 940 DeclIt next = *DI_current; 941 while (++next != DE_current) { 942 Decl *D_next = *next; 943 if (!D_next) 944 break; 945 SourceLocation L = D_next->getLocStart(); 946 if (!L.isValid()) 947 break; 948 if (SM.isBeforeInTranslationUnit(L, EndLoc)) { 949 *DI_current = next; 950 Decls.push_back(D_next); 951 continue; 952 } 953 break; 954 } 955 } 956 957 bool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) { 958 // FIXME: Eventually convert back to just 'VisitDeclContext()'. Essentially 959 // an @implementation can lexically contain Decls that are not properly 960 // nested in the AST. When we identify such cases, we need to retrofit 961 // this nesting here. 962 if (!DI_current && !FileDI_current) 963 return VisitDeclContext(D); 964 965 // Scan the Decls that immediately come after the container 966 // in the current DeclContext. If any fall within the 967 // container's lexical region, stash them into a vector 968 // for later processing. 969 SmallVector<Decl *, 24> DeclsInContainer; 970 SourceLocation EndLoc = D->getSourceRange().getEnd(); 971 SourceManager &SM = AU->getSourceManager(); 972 if (EndLoc.isValid()) { 973 if (DI_current) { 974 addRangedDeclsInContainer(DI_current, DE_current, SM, EndLoc, 975 DeclsInContainer); 976 } else { 977 addRangedDeclsInContainer(FileDI_current, FileDE_current, SM, EndLoc, 978 DeclsInContainer); 979 } 980 } 981 982 // The common case. 983 if (DeclsInContainer.empty()) 984 return VisitDeclContext(D); 985 986 // Get all the Decls in the DeclContext, and sort them with the 987 // additional ones we've collected. Then visit them. 988 for (auto *SubDecl : D->decls()) { 989 if (!SubDecl || SubDecl->getLexicalDeclContext() != D || 990 SubDecl->getLocStart().isInvalid()) 991 continue; 992 DeclsInContainer.push_back(SubDecl); 993 } 994 995 // Now sort the Decls so that they appear in lexical order. 996 std::sort(DeclsInContainer.begin(), DeclsInContainer.end(), 997 [&SM](Decl *A, Decl *B) { 998 SourceLocation L_A = A->getLocStart(); 999 SourceLocation L_B = B->getLocStart(); 1000 assert(L_A.isValid() && L_B.isValid()); 1001 return SM.isBeforeInTranslationUnit(L_A, L_B); 1002 }); 1003 1004 // Now visit the decls. 1005 for (SmallVectorImpl<Decl*>::iterator I = DeclsInContainer.begin(), 1006 E = DeclsInContainer.end(); I != E; ++I) { 1007 CXCursor Cursor = MakeCXCursor(*I, TU, RegionOfInterest); 1008 const Optional<bool> &V = shouldVisitCursor(Cursor); 1009 if (!V.hasValue()) 1010 continue; 1011 if (!V.getValue()) 1012 return false; 1013 if (Visit(Cursor, true)) 1014 return true; 1015 } 1016 return false; 1017 } 1018 1019 bool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) { 1020 if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(), 1021 TU))) 1022 return true; 1023 1024 ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin(); 1025 for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(), 1026 E = ND->protocol_end(); I != E; ++I, ++PL) 1027 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 1028 return true; 1029 1030 return VisitObjCContainerDecl(ND); 1031 } 1032 1033 bool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) { 1034 if (!PID->isThisDeclarationADefinition()) 1035 return Visit(MakeCursorObjCProtocolRef(PID, PID->getLocation(), TU)); 1036 1037 ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin(); 1038 for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(), 1039 E = PID->protocol_end(); I != E; ++I, ++PL) 1040 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 1041 return true; 1042 1043 return VisitObjCContainerDecl(PID); 1044 } 1045 1046 bool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) { 1047 if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc())) 1048 return true; 1049 1050 // FIXME: This implements a workaround with @property declarations also being 1051 // installed in the DeclContext for the @interface. Eventually this code 1052 // should be removed. 1053 ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext()); 1054 if (!CDecl || !CDecl->IsClassExtension()) 1055 return false; 1056 1057 ObjCInterfaceDecl *ID = CDecl->getClassInterface(); 1058 if (!ID) 1059 return false; 1060 1061 IdentifierInfo *PropertyId = PD->getIdentifier(); 1062 ObjCPropertyDecl *prevDecl = 1063 ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(ID), PropertyId); 1064 1065 if (!prevDecl) 1066 return false; 1067 1068 // Visit synthesized methods since they will be skipped when visiting 1069 // the @interface. 1070 if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl()) 1071 if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl) 1072 if (Visit(MakeCXCursor(MD, TU, RegionOfInterest))) 1073 return true; 1074 1075 if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl()) 1076 if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl) 1077 if (Visit(MakeCXCursor(MD, TU, RegionOfInterest))) 1078 return true; 1079 1080 return false; 1081 } 1082 1083 bool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) { 1084 if (!D->isThisDeclarationADefinition()) { 1085 // Forward declaration is treated like a reference. 1086 return Visit(MakeCursorObjCClassRef(D, D->getLocation(), TU)); 1087 } 1088 1089 // Issue callbacks for super class. 1090 if (D->getSuperClass() && 1091 Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(), 1092 D->getSuperClassLoc(), 1093 TU))) 1094 return true; 1095 1096 ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin(); 1097 for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(), 1098 E = D->protocol_end(); I != E; ++I, ++PL) 1099 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU))) 1100 return true; 1101 1102 return VisitObjCContainerDecl(D); 1103 } 1104 1105 bool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) { 1106 return VisitObjCContainerDecl(D); 1107 } 1108 1109 bool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) { 1110 // 'ID' could be null when dealing with invalid code. 1111 if (ObjCInterfaceDecl *ID = D->getClassInterface()) 1112 if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU))) 1113 return true; 1114 1115 return VisitObjCImplDecl(D); 1116 } 1117 1118 bool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) { 1119 #if 0 1120 // Issue callbacks for super class. 1121 // FIXME: No source location information! 1122 if (D->getSuperClass() && 1123 Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(), 1124 D->getSuperClassLoc(), 1125 TU))) 1126 return true; 1127 #endif 1128 1129 return VisitObjCImplDecl(D); 1130 } 1131 1132 bool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) { 1133 if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl()) 1134 if (PD->isIvarNameSpecified()) 1135 return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU)); 1136 1137 return false; 1138 } 1139 1140 bool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) { 1141 return VisitDeclContext(D); 1142 } 1143 1144 bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 1145 // Visit nested-name-specifier. 1146 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) 1147 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1148 return true; 1149 1150 return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(), 1151 D->getTargetNameLoc(), TU)); 1152 } 1153 1154 bool CursorVisitor::VisitUsingDecl(UsingDecl *D) { 1155 // Visit nested-name-specifier. 1156 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) { 1157 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1158 return true; 1159 } 1160 1161 if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU))) 1162 return true; 1163 1164 return VisitDeclarationNameInfo(D->getNameInfo()); 1165 } 1166 1167 bool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 1168 // Visit nested-name-specifier. 1169 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) 1170 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1171 return true; 1172 1173 return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(), 1174 D->getIdentLocation(), TU)); 1175 } 1176 1177 bool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 1178 // Visit nested-name-specifier. 1179 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) { 1180 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1181 return true; 1182 } 1183 1184 return VisitDeclarationNameInfo(D->getNameInfo()); 1185 } 1186 1187 bool CursorVisitor::VisitUnresolvedUsingTypenameDecl( 1188 UnresolvedUsingTypenameDecl *D) { 1189 // Visit nested-name-specifier. 1190 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) 1191 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1192 return true; 1193 1194 return false; 1195 } 1196 1197 bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) { 1198 switch (Name.getName().getNameKind()) { 1199 case clang::DeclarationName::Identifier: 1200 case clang::DeclarationName::CXXLiteralOperatorName: 1201 case clang::DeclarationName::CXXOperatorName: 1202 case clang::DeclarationName::CXXUsingDirective: 1203 return false; 1204 1205 case clang::DeclarationName::CXXConstructorName: 1206 case clang::DeclarationName::CXXDestructorName: 1207 case clang::DeclarationName::CXXConversionFunctionName: 1208 if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo()) 1209 return Visit(TSInfo->getTypeLoc()); 1210 return false; 1211 1212 case clang::DeclarationName::ObjCZeroArgSelector: 1213 case clang::DeclarationName::ObjCOneArgSelector: 1214 case clang::DeclarationName::ObjCMultiArgSelector: 1215 // FIXME: Per-identifier location info? 1216 return false; 1217 } 1218 1219 llvm_unreachable("Invalid DeclarationName::Kind!"); 1220 } 1221 1222 bool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS, 1223 SourceRange Range) { 1224 // FIXME: This whole routine is a hack to work around the lack of proper 1225 // source information in nested-name-specifiers (PR5791). Since we do have 1226 // a beginning source location, we can visit the first component of the 1227 // nested-name-specifier, if it's a single-token component. 1228 if (!NNS) 1229 return false; 1230 1231 // Get the first component in the nested-name-specifier. 1232 while (NestedNameSpecifier *Prefix = NNS->getPrefix()) 1233 NNS = Prefix; 1234 1235 switch (NNS->getKind()) { 1236 case NestedNameSpecifier::Namespace: 1237 return Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(), 1238 TU)); 1239 1240 case NestedNameSpecifier::NamespaceAlias: 1241 return Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(), 1242 Range.getBegin(), TU)); 1243 1244 case NestedNameSpecifier::TypeSpec: { 1245 // If the type has a form where we know that the beginning of the source 1246 // range matches up with a reference cursor. Visit the appropriate reference 1247 // cursor. 1248 const Type *T = NNS->getAsType(); 1249 if (const TypedefType *Typedef = dyn_cast<TypedefType>(T)) 1250 return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU)); 1251 if (const TagType *Tag = dyn_cast<TagType>(T)) 1252 return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU)); 1253 if (const TemplateSpecializationType *TST 1254 = dyn_cast<TemplateSpecializationType>(T)) 1255 return VisitTemplateName(TST->getTemplateName(), Range.getBegin()); 1256 break; 1257 } 1258 1259 case NestedNameSpecifier::TypeSpecWithTemplate: 1260 case NestedNameSpecifier::Global: 1261 case NestedNameSpecifier::Identifier: 1262 case NestedNameSpecifier::Super: 1263 break; 1264 } 1265 1266 return false; 1267 } 1268 1269 bool 1270 CursorVisitor::VisitNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) { 1271 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 1272 for (; Qualifier; Qualifier = Qualifier.getPrefix()) 1273 Qualifiers.push_back(Qualifier); 1274 1275 while (!Qualifiers.empty()) { 1276 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 1277 NestedNameSpecifier *NNS = Q.getNestedNameSpecifier(); 1278 switch (NNS->getKind()) { 1279 case NestedNameSpecifier::Namespace: 1280 if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), 1281 Q.getLocalBeginLoc(), 1282 TU))) 1283 return true; 1284 1285 break; 1286 1287 case NestedNameSpecifier::NamespaceAlias: 1288 if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(), 1289 Q.getLocalBeginLoc(), 1290 TU))) 1291 return true; 1292 1293 break; 1294 1295 case NestedNameSpecifier::TypeSpec: 1296 case NestedNameSpecifier::TypeSpecWithTemplate: 1297 if (Visit(Q.getTypeLoc())) 1298 return true; 1299 1300 break; 1301 1302 case NestedNameSpecifier::Global: 1303 case NestedNameSpecifier::Identifier: 1304 case NestedNameSpecifier::Super: 1305 break; 1306 } 1307 } 1308 1309 return false; 1310 } 1311 1312 bool CursorVisitor::VisitTemplateParameters( 1313 const TemplateParameterList *Params) { 1314 if (!Params) 1315 return false; 1316 1317 for (TemplateParameterList::const_iterator P = Params->begin(), 1318 PEnd = Params->end(); 1319 P != PEnd; ++P) { 1320 if (Visit(MakeCXCursor(*P, TU, RegionOfInterest))) 1321 return true; 1322 } 1323 1324 return false; 1325 } 1326 1327 bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) { 1328 switch (Name.getKind()) { 1329 case TemplateName::Template: 1330 return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU)); 1331 1332 case TemplateName::OverloadedTemplate: 1333 // Visit the overloaded template set. 1334 if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU))) 1335 return true; 1336 1337 return false; 1338 1339 case TemplateName::DependentTemplate: 1340 // FIXME: Visit nested-name-specifier. 1341 return false; 1342 1343 case TemplateName::QualifiedTemplate: 1344 // FIXME: Visit nested-name-specifier. 1345 return Visit(MakeCursorTemplateRef( 1346 Name.getAsQualifiedTemplateName()->getDecl(), 1347 Loc, TU)); 1348 1349 case TemplateName::SubstTemplateTemplateParm: 1350 return Visit(MakeCursorTemplateRef( 1351 Name.getAsSubstTemplateTemplateParm()->getParameter(), 1352 Loc, TU)); 1353 1354 case TemplateName::SubstTemplateTemplateParmPack: 1355 return Visit(MakeCursorTemplateRef( 1356 Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(), 1357 Loc, TU)); 1358 } 1359 1360 llvm_unreachable("Invalid TemplateName::Kind!"); 1361 } 1362 1363 bool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) { 1364 switch (TAL.getArgument().getKind()) { 1365 case TemplateArgument::Null: 1366 case TemplateArgument::Integral: 1367 case TemplateArgument::Pack: 1368 return false; 1369 1370 case TemplateArgument::Type: 1371 if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo()) 1372 return Visit(TSInfo->getTypeLoc()); 1373 return false; 1374 1375 case TemplateArgument::Declaration: 1376 if (Expr *E = TAL.getSourceDeclExpression()) 1377 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest)); 1378 return false; 1379 1380 case TemplateArgument::NullPtr: 1381 if (Expr *E = TAL.getSourceNullPtrExpression()) 1382 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest)); 1383 return false; 1384 1385 case TemplateArgument::Expression: 1386 if (Expr *E = TAL.getSourceExpression()) 1387 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest)); 1388 return false; 1389 1390 case TemplateArgument::Template: 1391 case TemplateArgument::TemplateExpansion: 1392 if (VisitNestedNameSpecifierLoc(TAL.getTemplateQualifierLoc())) 1393 return true; 1394 1395 return VisitTemplateName(TAL.getArgument().getAsTemplateOrTemplatePattern(), 1396 TAL.getTemplateNameLoc()); 1397 } 1398 1399 llvm_unreachable("Invalid TemplateArgument::Kind!"); 1400 } 1401 1402 bool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) { 1403 return VisitDeclContext(D); 1404 } 1405 1406 bool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 1407 return Visit(TL.getUnqualifiedLoc()); 1408 } 1409 1410 bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 1411 ASTContext &Context = AU->getASTContext(); 1412 1413 // Some builtin types (such as Objective-C's "id", "sel", and 1414 // "Class") have associated declarations. Create cursors for those. 1415 QualType VisitType; 1416 switch (TL.getTypePtr()->getKind()) { 1417 1418 case BuiltinType::Void: 1419 case BuiltinType::NullPtr: 1420 case BuiltinType::Dependent: 1421 case BuiltinType::OCLImage1d: 1422 case BuiltinType::OCLImage1dArray: 1423 case BuiltinType::OCLImage1dBuffer: 1424 case BuiltinType::OCLImage2d: 1425 case BuiltinType::OCLImage2dArray: 1426 case BuiltinType::OCLImage3d: 1427 case BuiltinType::OCLSampler: 1428 case BuiltinType::OCLEvent: 1429 #define BUILTIN_TYPE(Id, SingletonId) 1430 #define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id: 1431 #define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id: 1432 #define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id: 1433 #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id: 1434 #include "clang/AST/BuiltinTypes.def" 1435 break; 1436 1437 case BuiltinType::ObjCId: 1438 VisitType = Context.getObjCIdType(); 1439 break; 1440 1441 case BuiltinType::ObjCClass: 1442 VisitType = Context.getObjCClassType(); 1443 break; 1444 1445 case BuiltinType::ObjCSel: 1446 VisitType = Context.getObjCSelType(); 1447 break; 1448 } 1449 1450 if (!VisitType.isNull()) { 1451 if (const TypedefType *Typedef = VisitType->getAs<TypedefType>()) 1452 return Visit(MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(), 1453 TU)); 1454 } 1455 1456 return false; 1457 } 1458 1459 bool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 1460 return Visit(MakeCursorTypeRef(TL.getTypedefNameDecl(), TL.getNameLoc(), TU)); 1461 } 1462 1463 bool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 1464 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1465 } 1466 1467 bool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) { 1468 if (TL.isDefinition()) 1469 return Visit(MakeCXCursor(TL.getDecl(), TU, RegionOfInterest)); 1470 1471 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1472 } 1473 1474 bool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 1475 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1476 } 1477 1478 bool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 1479 if (Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU))) 1480 return true; 1481 1482 return false; 1483 } 1484 1485 bool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 1486 if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc())) 1487 return true; 1488 1489 for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) { 1490 if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I), 1491 TU))) 1492 return true; 1493 } 1494 1495 return false; 1496 } 1497 1498 bool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 1499 return Visit(TL.getPointeeLoc()); 1500 } 1501 1502 bool CursorVisitor::VisitParenTypeLoc(ParenTypeLoc TL) { 1503 return Visit(TL.getInnerLoc()); 1504 } 1505 1506 bool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) { 1507 return Visit(TL.getPointeeLoc()); 1508 } 1509 1510 bool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 1511 return Visit(TL.getPointeeLoc()); 1512 } 1513 1514 bool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 1515 return Visit(TL.getPointeeLoc()); 1516 } 1517 1518 bool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 1519 return Visit(TL.getPointeeLoc()); 1520 } 1521 1522 bool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 1523 return Visit(TL.getPointeeLoc()); 1524 } 1525 1526 bool CursorVisitor::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 1527 return Visit(TL.getModifiedLoc()); 1528 } 1529 1530 bool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL, 1531 bool SkipResultType) { 1532 if (!SkipResultType && Visit(TL.getReturnLoc())) 1533 return true; 1534 1535 for (unsigned I = 0, N = TL.getNumParams(); I != N; ++I) 1536 if (Decl *D = TL.getParam(I)) 1537 if (Visit(MakeCXCursor(D, TU, RegionOfInterest))) 1538 return true; 1539 1540 return false; 1541 } 1542 1543 bool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) { 1544 if (Visit(TL.getElementLoc())) 1545 return true; 1546 1547 if (Expr *Size = TL.getSizeExpr()) 1548 return Visit(MakeCXCursor(Size, StmtParent, TU, RegionOfInterest)); 1549 1550 return false; 1551 } 1552 1553 bool CursorVisitor::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 1554 return Visit(TL.getOriginalLoc()); 1555 } 1556 1557 bool CursorVisitor::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 1558 return Visit(TL.getOriginalLoc()); 1559 } 1560 1561 bool CursorVisitor::VisitTemplateSpecializationTypeLoc( 1562 TemplateSpecializationTypeLoc TL) { 1563 // Visit the template name. 1564 if (VisitTemplateName(TL.getTypePtr()->getTemplateName(), 1565 TL.getTemplateNameLoc())) 1566 return true; 1567 1568 // Visit the template arguments. 1569 for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I) 1570 if (VisitTemplateArgumentLoc(TL.getArgLoc(I))) 1571 return true; 1572 1573 return false; 1574 } 1575 1576 bool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 1577 return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU)); 1578 } 1579 1580 bool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 1581 if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo()) 1582 return Visit(TSInfo->getTypeLoc()); 1583 1584 return false; 1585 } 1586 1587 bool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 1588 if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo()) 1589 return Visit(TSInfo->getTypeLoc()); 1590 1591 return false; 1592 } 1593 1594 bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 1595 if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) 1596 return true; 1597 1598 return false; 1599 } 1600 1601 bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc( 1602 DependentTemplateSpecializationTypeLoc TL) { 1603 // Visit the nested-name-specifier, if there is one. 1604 if (TL.getQualifierLoc() && 1605 VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) 1606 return true; 1607 1608 // Visit the template arguments. 1609 for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I) 1610 if (VisitTemplateArgumentLoc(TL.getArgLoc(I))) 1611 return true; 1612 1613 return false; 1614 } 1615 1616 bool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 1617 if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc())) 1618 return true; 1619 1620 return Visit(TL.getNamedTypeLoc()); 1621 } 1622 1623 bool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 1624 return Visit(TL.getPatternLoc()); 1625 } 1626 1627 bool CursorVisitor::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 1628 if (Expr *E = TL.getUnderlyingExpr()) 1629 return Visit(MakeCXCursor(E, StmtParent, TU)); 1630 1631 return false; 1632 } 1633 1634 bool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 1635 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU)); 1636 } 1637 1638 bool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 1639 return Visit(TL.getValueLoc()); 1640 } 1641 1642 #define DEFAULT_TYPELOC_IMPL(CLASS, PARENT) \ 1643 bool CursorVisitor::Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { \ 1644 return Visit##PARENT##Loc(TL); \ 1645 } 1646 1647 DEFAULT_TYPELOC_IMPL(Complex, Type) 1648 DEFAULT_TYPELOC_IMPL(ConstantArray, ArrayType) 1649 DEFAULT_TYPELOC_IMPL(IncompleteArray, ArrayType) 1650 DEFAULT_TYPELOC_IMPL(VariableArray, ArrayType) 1651 DEFAULT_TYPELOC_IMPL(DependentSizedArray, ArrayType) 1652 DEFAULT_TYPELOC_IMPL(DependentSizedExtVector, Type) 1653 DEFAULT_TYPELOC_IMPL(Vector, Type) 1654 DEFAULT_TYPELOC_IMPL(ExtVector, VectorType) 1655 DEFAULT_TYPELOC_IMPL(FunctionProto, FunctionType) 1656 DEFAULT_TYPELOC_IMPL(FunctionNoProto, FunctionType) 1657 DEFAULT_TYPELOC_IMPL(Record, TagType) 1658 DEFAULT_TYPELOC_IMPL(Enum, TagType) 1659 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type) 1660 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type) 1661 DEFAULT_TYPELOC_IMPL(Auto, Type) 1662 1663 bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) { 1664 // Visit the nested-name-specifier, if present. 1665 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) 1666 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 1667 return true; 1668 1669 if (D->isCompleteDefinition()) { 1670 for (const auto &I : D->bases()) { 1671 if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(&I, TU))) 1672 return true; 1673 } 1674 } 1675 1676 return VisitTagDecl(D); 1677 } 1678 1679 bool CursorVisitor::VisitAttributes(Decl *D) { 1680 for (const auto *I : D->attrs()) 1681 if (Visit(MakeCXCursor(I, D, TU))) 1682 return true; 1683 1684 return false; 1685 } 1686 1687 //===----------------------------------------------------------------------===// 1688 // Data-recursive visitor methods. 1689 //===----------------------------------------------------------------------===// 1690 1691 namespace { 1692 #define DEF_JOB(NAME, DATA, KIND)\ 1693 class NAME : public VisitorJob {\ 1694 public:\ 1695 NAME(const DATA *d, CXCursor parent) : \ 1696 VisitorJob(parent, VisitorJob::KIND, d) {} \ 1697 static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\ 1698 const DATA *get() const { return static_cast<const DATA*>(data[0]); }\ 1699 }; 1700 1701 DEF_JOB(StmtVisit, Stmt, StmtVisitKind) 1702 DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind) 1703 DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind) 1704 DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind) 1705 DEF_JOB(ExplicitTemplateArgsVisit, ASTTemplateArgumentListInfo, 1706 ExplicitTemplateArgsVisitKind) 1707 DEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind) 1708 DEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind) 1709 DEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind) 1710 #undef DEF_JOB 1711 1712 class DeclVisit : public VisitorJob { 1713 public: 1714 DeclVisit(const Decl *D, CXCursor parent, bool isFirst) : 1715 VisitorJob(parent, VisitorJob::DeclVisitKind, 1716 D, isFirst ? (void*) 1 : (void*) nullptr) {} 1717 static bool classof(const VisitorJob *VJ) { 1718 return VJ->getKind() == DeclVisitKind; 1719 } 1720 const Decl *get() const { return static_cast<const Decl *>(data[0]); } 1721 bool isFirst() const { return data[1] != nullptr; } 1722 }; 1723 class TypeLocVisit : public VisitorJob { 1724 public: 1725 TypeLocVisit(TypeLoc tl, CXCursor parent) : 1726 VisitorJob(parent, VisitorJob::TypeLocVisitKind, 1727 tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {} 1728 1729 static bool classof(const VisitorJob *VJ) { 1730 return VJ->getKind() == TypeLocVisitKind; 1731 } 1732 1733 TypeLoc get() const { 1734 QualType T = QualType::getFromOpaquePtr(data[0]); 1735 return TypeLoc(T, const_cast<void *>(data[1])); 1736 } 1737 }; 1738 1739 class LabelRefVisit : public VisitorJob { 1740 public: 1741 LabelRefVisit(LabelDecl *LD, SourceLocation labelLoc, CXCursor parent) 1742 : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LD, 1743 labelLoc.getPtrEncoding()) {} 1744 1745 static bool classof(const VisitorJob *VJ) { 1746 return VJ->getKind() == VisitorJob::LabelRefVisitKind; 1747 } 1748 const LabelDecl *get() const { 1749 return static_cast<const LabelDecl *>(data[0]); 1750 } 1751 SourceLocation getLoc() const { 1752 return SourceLocation::getFromPtrEncoding(data[1]); } 1753 }; 1754 1755 class NestedNameSpecifierLocVisit : public VisitorJob { 1756 public: 1757 NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent) 1758 : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind, 1759 Qualifier.getNestedNameSpecifier(), 1760 Qualifier.getOpaqueData()) { } 1761 1762 static bool classof(const VisitorJob *VJ) { 1763 return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind; 1764 } 1765 1766 NestedNameSpecifierLoc get() const { 1767 return NestedNameSpecifierLoc( 1768 const_cast<NestedNameSpecifier *>( 1769 static_cast<const NestedNameSpecifier *>(data[0])), 1770 const_cast<void *>(data[1])); 1771 } 1772 }; 1773 1774 class DeclarationNameInfoVisit : public VisitorJob { 1775 public: 1776 DeclarationNameInfoVisit(const Stmt *S, CXCursor parent) 1777 : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {} 1778 static bool classof(const VisitorJob *VJ) { 1779 return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind; 1780 } 1781 DeclarationNameInfo get() const { 1782 const Stmt *S = static_cast<const Stmt *>(data[0]); 1783 switch (S->getStmtClass()) { 1784 default: 1785 llvm_unreachable("Unhandled Stmt"); 1786 case clang::Stmt::MSDependentExistsStmtClass: 1787 return cast<MSDependentExistsStmt>(S)->getNameInfo(); 1788 case Stmt::CXXDependentScopeMemberExprClass: 1789 return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo(); 1790 case Stmt::DependentScopeDeclRefExprClass: 1791 return cast<DependentScopeDeclRefExpr>(S)->getNameInfo(); 1792 case Stmt::OMPCriticalDirectiveClass: 1793 return cast<OMPCriticalDirective>(S)->getDirectiveName(); 1794 } 1795 } 1796 }; 1797 class MemberRefVisit : public VisitorJob { 1798 public: 1799 MemberRefVisit(const FieldDecl *D, SourceLocation L, CXCursor parent) 1800 : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D, 1801 L.getPtrEncoding()) {} 1802 static bool classof(const VisitorJob *VJ) { 1803 return VJ->getKind() == VisitorJob::MemberRefVisitKind; 1804 } 1805 const FieldDecl *get() const { 1806 return static_cast<const FieldDecl *>(data[0]); 1807 } 1808 SourceLocation getLoc() const { 1809 return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]); 1810 } 1811 }; 1812 class EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void> { 1813 friend class OMPClauseEnqueue; 1814 VisitorWorkList &WL; 1815 CXCursor Parent; 1816 public: 1817 EnqueueVisitor(VisitorWorkList &wl, CXCursor parent) 1818 : WL(wl), Parent(parent) {} 1819 1820 void VisitAddrLabelExpr(const AddrLabelExpr *E); 1821 void VisitBlockExpr(const BlockExpr *B); 1822 void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E); 1823 void VisitCompoundStmt(const CompoundStmt *S); 1824 void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ } 1825 void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S); 1826 void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E); 1827 void VisitCXXNewExpr(const CXXNewExpr *E); 1828 void VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E); 1829 void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *E); 1830 void VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E); 1831 void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E); 1832 void VisitCXXTypeidExpr(const CXXTypeidExpr *E); 1833 void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *E); 1834 void VisitCXXUuidofExpr(const CXXUuidofExpr *E); 1835 void VisitCXXCatchStmt(const CXXCatchStmt *S); 1836 void VisitCXXForRangeStmt(const CXXForRangeStmt *S); 1837 void VisitDeclRefExpr(const DeclRefExpr *D); 1838 void VisitDeclStmt(const DeclStmt *S); 1839 void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *E); 1840 void VisitDesignatedInitExpr(const DesignatedInitExpr *E); 1841 void VisitExplicitCastExpr(const ExplicitCastExpr *E); 1842 void VisitForStmt(const ForStmt *FS); 1843 void VisitGotoStmt(const GotoStmt *GS); 1844 void VisitIfStmt(const IfStmt *If); 1845 void VisitInitListExpr(const InitListExpr *IE); 1846 void VisitMemberExpr(const MemberExpr *M); 1847 void VisitOffsetOfExpr(const OffsetOfExpr *E); 1848 void VisitObjCEncodeExpr(const ObjCEncodeExpr *E); 1849 void VisitObjCMessageExpr(const ObjCMessageExpr *M); 1850 void VisitOverloadExpr(const OverloadExpr *E); 1851 void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E); 1852 void VisitStmt(const Stmt *S); 1853 void VisitSwitchStmt(const SwitchStmt *S); 1854 void VisitWhileStmt(const WhileStmt *W); 1855 void VisitTypeTraitExpr(const TypeTraitExpr *E); 1856 void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E); 1857 void VisitExpressionTraitExpr(const ExpressionTraitExpr *E); 1858 void VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U); 1859 void VisitVAArgExpr(const VAArgExpr *E); 1860 void VisitSizeOfPackExpr(const SizeOfPackExpr *E); 1861 void VisitPseudoObjectExpr(const PseudoObjectExpr *E); 1862 void VisitOpaqueValueExpr(const OpaqueValueExpr *E); 1863 void VisitLambdaExpr(const LambdaExpr *E); 1864 void VisitOMPExecutableDirective(const OMPExecutableDirective *D); 1865 void VisitOMPLoopDirective(const OMPLoopDirective *D); 1866 void VisitOMPParallelDirective(const OMPParallelDirective *D); 1867 void VisitOMPSimdDirective(const OMPSimdDirective *D); 1868 void VisitOMPForDirective(const OMPForDirective *D); 1869 void VisitOMPForSimdDirective(const OMPForSimdDirective *D); 1870 void VisitOMPSectionsDirective(const OMPSectionsDirective *D); 1871 void VisitOMPSectionDirective(const OMPSectionDirective *D); 1872 void VisitOMPSingleDirective(const OMPSingleDirective *D); 1873 void VisitOMPMasterDirective(const OMPMasterDirective *D); 1874 void VisitOMPCriticalDirective(const OMPCriticalDirective *D); 1875 void VisitOMPParallelForDirective(const OMPParallelForDirective *D); 1876 void VisitOMPParallelForSimdDirective(const OMPParallelForSimdDirective *D); 1877 void VisitOMPParallelSectionsDirective(const OMPParallelSectionsDirective *D); 1878 void VisitOMPTaskDirective(const OMPTaskDirective *D); 1879 void VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D); 1880 void VisitOMPBarrierDirective(const OMPBarrierDirective *D); 1881 void VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D); 1882 void VisitOMPFlushDirective(const OMPFlushDirective *D); 1883 void VisitOMPOrderedDirective(const OMPOrderedDirective *D); 1884 void VisitOMPAtomicDirective(const OMPAtomicDirective *D); 1885 void VisitOMPTargetDirective(const OMPTargetDirective *D); 1886 void VisitOMPTeamsDirective(const OMPTeamsDirective *D); 1887 1888 private: 1889 void AddDeclarationNameInfo(const Stmt *S); 1890 void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier); 1891 void AddExplicitTemplateArgs(const ASTTemplateArgumentListInfo *A); 1892 void AddMemberRef(const FieldDecl *D, SourceLocation L); 1893 void AddStmt(const Stmt *S); 1894 void AddDecl(const Decl *D, bool isFirst = true); 1895 void AddTypeLoc(TypeSourceInfo *TI); 1896 void EnqueueChildren(const Stmt *S); 1897 void EnqueueChildren(const OMPClause *S); 1898 }; 1899 } // end anonyous namespace 1900 1901 void EnqueueVisitor::AddDeclarationNameInfo(const Stmt *S) { 1902 // 'S' should always be non-null, since it comes from the 1903 // statement we are visiting. 1904 WL.push_back(DeclarationNameInfoVisit(S, Parent)); 1905 } 1906 1907 void 1908 EnqueueVisitor::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) { 1909 if (Qualifier) 1910 WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent)); 1911 } 1912 1913 void EnqueueVisitor::AddStmt(const Stmt *S) { 1914 if (S) 1915 WL.push_back(StmtVisit(S, Parent)); 1916 } 1917 void EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) { 1918 if (D) 1919 WL.push_back(DeclVisit(D, Parent, isFirst)); 1920 } 1921 void EnqueueVisitor:: 1922 AddExplicitTemplateArgs(const ASTTemplateArgumentListInfo *A) { 1923 if (A) 1924 WL.push_back(ExplicitTemplateArgsVisit(A, Parent)); 1925 } 1926 void EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) { 1927 if (D) 1928 WL.push_back(MemberRefVisit(D, L, Parent)); 1929 } 1930 void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) { 1931 if (TI) 1932 WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent)); 1933 } 1934 void EnqueueVisitor::EnqueueChildren(const Stmt *S) { 1935 unsigned size = WL.size(); 1936 for (Stmt::const_child_range Child = S->children(); Child; ++Child) { 1937 AddStmt(*Child); 1938 } 1939 if (size == WL.size()) 1940 return; 1941 // Now reverse the entries we just added. This will match the DFS 1942 // ordering performed by the worklist. 1943 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 1944 std::reverse(I, E); 1945 } 1946 namespace { 1947 class OMPClauseEnqueue : public ConstOMPClauseVisitor<OMPClauseEnqueue> { 1948 EnqueueVisitor *Visitor; 1949 /// \brief Process clauses with list of variables. 1950 template <typename T> 1951 void VisitOMPClauseList(T *Node); 1952 public: 1953 OMPClauseEnqueue(EnqueueVisitor *Visitor) : Visitor(Visitor) { } 1954 #define OPENMP_CLAUSE(Name, Class) \ 1955 void Visit##Class(const Class *C); 1956 #include "clang/Basic/OpenMPKinds.def" 1957 }; 1958 1959 void OMPClauseEnqueue::VisitOMPIfClause(const OMPIfClause *C) { 1960 Visitor->AddStmt(C->getCondition()); 1961 } 1962 1963 void OMPClauseEnqueue::VisitOMPFinalClause(const OMPFinalClause *C) { 1964 Visitor->AddStmt(C->getCondition()); 1965 } 1966 1967 void OMPClauseEnqueue::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) { 1968 Visitor->AddStmt(C->getNumThreads()); 1969 } 1970 1971 void OMPClauseEnqueue::VisitOMPSafelenClause(const OMPSafelenClause *C) { 1972 Visitor->AddStmt(C->getSafelen()); 1973 } 1974 1975 void OMPClauseEnqueue::VisitOMPCollapseClause(const OMPCollapseClause *C) { 1976 Visitor->AddStmt(C->getNumForLoops()); 1977 } 1978 1979 void OMPClauseEnqueue::VisitOMPDefaultClause(const OMPDefaultClause *C) { } 1980 1981 void OMPClauseEnqueue::VisitOMPProcBindClause(const OMPProcBindClause *C) { } 1982 1983 void OMPClauseEnqueue::VisitOMPScheduleClause(const OMPScheduleClause *C) { 1984 Visitor->AddStmt(C->getChunkSize()); 1985 } 1986 1987 void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *) {} 1988 1989 void OMPClauseEnqueue::VisitOMPNowaitClause(const OMPNowaitClause *) {} 1990 1991 void OMPClauseEnqueue::VisitOMPUntiedClause(const OMPUntiedClause *) {} 1992 1993 void OMPClauseEnqueue::VisitOMPMergeableClause(const OMPMergeableClause *) {} 1994 1995 void OMPClauseEnqueue::VisitOMPReadClause(const OMPReadClause *) {} 1996 1997 void OMPClauseEnqueue::VisitOMPWriteClause(const OMPWriteClause *) {} 1998 1999 void OMPClauseEnqueue::VisitOMPUpdateClause(const OMPUpdateClause *) {} 2000 2001 void OMPClauseEnqueue::VisitOMPCaptureClause(const OMPCaptureClause *) {} 2002 2003 void OMPClauseEnqueue::VisitOMPSeqCstClause(const OMPSeqCstClause *) {} 2004 2005 template<typename T> 2006 void OMPClauseEnqueue::VisitOMPClauseList(T *Node) { 2007 for (const auto *I : Node->varlists()) { 2008 Visitor->AddStmt(I); 2009 } 2010 } 2011 2012 void OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) { 2013 VisitOMPClauseList(C); 2014 for (const auto *E : C->private_copies()) { 2015 Visitor->AddStmt(E); 2016 } 2017 } 2018 void OMPClauseEnqueue::VisitOMPFirstprivateClause( 2019 const OMPFirstprivateClause *C) { 2020 VisitOMPClauseList(C); 2021 } 2022 void OMPClauseEnqueue::VisitOMPLastprivateClause( 2023 const OMPLastprivateClause *C) { 2024 VisitOMPClauseList(C); 2025 for (auto *E : C->private_copies()) { 2026 Visitor->AddStmt(E); 2027 } 2028 for (auto *E : C->source_exprs()) { 2029 Visitor->AddStmt(E); 2030 } 2031 for (auto *E : C->destination_exprs()) { 2032 Visitor->AddStmt(E); 2033 } 2034 for (auto *E : C->assignment_ops()) { 2035 Visitor->AddStmt(E); 2036 } 2037 } 2038 void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) { 2039 VisitOMPClauseList(C); 2040 } 2041 void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) { 2042 VisitOMPClauseList(C); 2043 for (auto *E : C->lhs_exprs()) { 2044 Visitor->AddStmt(E); 2045 } 2046 for (auto *E : C->rhs_exprs()) { 2047 Visitor->AddStmt(E); 2048 } 2049 for (auto *E : C->reduction_ops()) { 2050 Visitor->AddStmt(E); 2051 } 2052 } 2053 void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) { 2054 VisitOMPClauseList(C); 2055 for (const auto *E : C->inits()) { 2056 Visitor->AddStmt(E); 2057 } 2058 for (const auto *E : C->updates()) { 2059 Visitor->AddStmt(E); 2060 } 2061 for (const auto *E : C->finals()) { 2062 Visitor->AddStmt(E); 2063 } 2064 Visitor->AddStmt(C->getStep()); 2065 Visitor->AddStmt(C->getCalcStep()); 2066 } 2067 void OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) { 2068 VisitOMPClauseList(C); 2069 Visitor->AddStmt(C->getAlignment()); 2070 } 2071 void OMPClauseEnqueue::VisitOMPCopyinClause(const OMPCopyinClause *C) { 2072 VisitOMPClauseList(C); 2073 for (auto *E : C->source_exprs()) { 2074 Visitor->AddStmt(E); 2075 } 2076 for (auto *E : C->destination_exprs()) { 2077 Visitor->AddStmt(E); 2078 } 2079 for (auto *E : C->assignment_ops()) { 2080 Visitor->AddStmt(E); 2081 } 2082 } 2083 void 2084 OMPClauseEnqueue::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) { 2085 VisitOMPClauseList(C); 2086 for (auto *E : C->source_exprs()) { 2087 Visitor->AddStmt(E); 2088 } 2089 for (auto *E : C->destination_exprs()) { 2090 Visitor->AddStmt(E); 2091 } 2092 for (auto *E : C->assignment_ops()) { 2093 Visitor->AddStmt(E); 2094 } 2095 } 2096 void OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) { 2097 VisitOMPClauseList(C); 2098 } 2099 } 2100 2101 void EnqueueVisitor::EnqueueChildren(const OMPClause *S) { 2102 unsigned size = WL.size(); 2103 OMPClauseEnqueue Visitor(this); 2104 Visitor.Visit(S); 2105 if (size == WL.size()) 2106 return; 2107 // Now reverse the entries we just added. This will match the DFS 2108 // ordering performed by the worklist. 2109 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 2110 std::reverse(I, E); 2111 } 2112 void EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) { 2113 WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent)); 2114 } 2115 void EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) { 2116 AddDecl(B->getBlockDecl()); 2117 } 2118 void EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { 2119 EnqueueChildren(E); 2120 AddTypeLoc(E->getTypeSourceInfo()); 2121 } 2122 void EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) { 2123 for (CompoundStmt::const_reverse_body_iterator I = S->body_rbegin(), 2124 E = S->body_rend(); I != E; ++I) { 2125 AddStmt(*I); 2126 } 2127 } 2128 void EnqueueVisitor:: 2129 VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) { 2130 AddStmt(S->getSubStmt()); 2131 AddDeclarationNameInfo(S); 2132 if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc()) 2133 AddNestedNameSpecifierLoc(QualifierLoc); 2134 } 2135 2136 void EnqueueVisitor:: 2137 VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E) { 2138 AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); 2139 AddDeclarationNameInfo(E); 2140 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc()) 2141 AddNestedNameSpecifierLoc(QualifierLoc); 2142 if (!E->isImplicitAccess()) 2143 AddStmt(E->getBase()); 2144 } 2145 void EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) { 2146 // Enqueue the initializer , if any. 2147 AddStmt(E->getInitializer()); 2148 // Enqueue the array size, if any. 2149 AddStmt(E->getArraySize()); 2150 // Enqueue the allocated type. 2151 AddTypeLoc(E->getAllocatedTypeSourceInfo()); 2152 // Enqueue the placement arguments. 2153 for (unsigned I = E->getNumPlacementArgs(); I > 0; --I) 2154 AddStmt(E->getPlacementArg(I-1)); 2155 } 2156 void EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) { 2157 for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I) 2158 AddStmt(CE->getArg(I-1)); 2159 AddStmt(CE->getCallee()); 2160 AddStmt(CE->getArg(0)); 2161 } 2162 void EnqueueVisitor::VisitCXXPseudoDestructorExpr( 2163 const CXXPseudoDestructorExpr *E) { 2164 // Visit the name of the type being destroyed. 2165 AddTypeLoc(E->getDestroyedTypeInfo()); 2166 // Visit the scope type that looks disturbingly like the nested-name-specifier 2167 // but isn't. 2168 AddTypeLoc(E->getScopeTypeInfo()); 2169 // Visit the nested-name-specifier. 2170 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc()) 2171 AddNestedNameSpecifierLoc(QualifierLoc); 2172 // Visit base expression. 2173 AddStmt(E->getBase()); 2174 } 2175 void EnqueueVisitor::VisitCXXScalarValueInitExpr( 2176 const CXXScalarValueInitExpr *E) { 2177 AddTypeLoc(E->getTypeSourceInfo()); 2178 } 2179 void EnqueueVisitor::VisitCXXTemporaryObjectExpr( 2180 const CXXTemporaryObjectExpr *E) { 2181 EnqueueChildren(E); 2182 AddTypeLoc(E->getTypeSourceInfo()); 2183 } 2184 void EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) { 2185 EnqueueChildren(E); 2186 if (E->isTypeOperand()) 2187 AddTypeLoc(E->getTypeOperandSourceInfo()); 2188 } 2189 2190 void EnqueueVisitor::VisitCXXUnresolvedConstructExpr( 2191 const CXXUnresolvedConstructExpr *E) { 2192 EnqueueChildren(E); 2193 AddTypeLoc(E->getTypeSourceInfo()); 2194 } 2195 void EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) { 2196 EnqueueChildren(E); 2197 if (E->isTypeOperand()) 2198 AddTypeLoc(E->getTypeOperandSourceInfo()); 2199 } 2200 2201 void EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) { 2202 EnqueueChildren(S); 2203 AddDecl(S->getExceptionDecl()); 2204 } 2205 2206 void EnqueueVisitor::VisitCXXForRangeStmt(const CXXForRangeStmt *S) { 2207 AddStmt(S->getBody()); 2208 AddStmt(S->getRangeInit()); 2209 AddDecl(S->getLoopVariable()); 2210 } 2211 2212 void EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) { 2213 if (DR->hasExplicitTemplateArgs()) { 2214 AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs()); 2215 } 2216 WL.push_back(DeclRefExprParts(DR, Parent)); 2217 } 2218 void EnqueueVisitor::VisitDependentScopeDeclRefExpr( 2219 const DependentScopeDeclRefExpr *E) { 2220 AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); 2221 AddDeclarationNameInfo(E); 2222 AddNestedNameSpecifierLoc(E->getQualifierLoc()); 2223 } 2224 void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) { 2225 unsigned size = WL.size(); 2226 bool isFirst = true; 2227 for (const auto *D : S->decls()) { 2228 AddDecl(D, isFirst); 2229 isFirst = false; 2230 } 2231 if (size == WL.size()) 2232 return; 2233 // Now reverse the entries we just added. This will match the DFS 2234 // ordering performed by the worklist. 2235 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); 2236 std::reverse(I, E); 2237 } 2238 void EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) { 2239 AddStmt(E->getInit()); 2240 for (DesignatedInitExpr::const_reverse_designators_iterator 2241 D = E->designators_rbegin(), DEnd = E->designators_rend(); 2242 D != DEnd; ++D) { 2243 if (D->isFieldDesignator()) { 2244 if (FieldDecl *Field = D->getField()) 2245 AddMemberRef(Field, D->getFieldLoc()); 2246 continue; 2247 } 2248 if (D->isArrayDesignator()) { 2249 AddStmt(E->getArrayIndex(*D)); 2250 continue; 2251 } 2252 assert(D->isArrayRangeDesignator() && "Unknown designator kind"); 2253 AddStmt(E->getArrayRangeEnd(*D)); 2254 AddStmt(E->getArrayRangeStart(*D)); 2255 } 2256 } 2257 void EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) { 2258 EnqueueChildren(E); 2259 AddTypeLoc(E->getTypeInfoAsWritten()); 2260 } 2261 void EnqueueVisitor::VisitForStmt(const ForStmt *FS) { 2262 AddStmt(FS->getBody()); 2263 AddStmt(FS->getInc()); 2264 AddStmt(FS->getCond()); 2265 AddDecl(FS->getConditionVariable()); 2266 AddStmt(FS->getInit()); 2267 } 2268 void EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) { 2269 WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent)); 2270 } 2271 void EnqueueVisitor::VisitIfStmt(const IfStmt *If) { 2272 AddStmt(If->getElse()); 2273 AddStmt(If->getThen()); 2274 AddStmt(If->getCond()); 2275 AddDecl(If->getConditionVariable()); 2276 } 2277 void EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) { 2278 // We care about the syntactic form of the initializer list, only. 2279 if (InitListExpr *Syntactic = IE->getSyntacticForm()) 2280 IE = Syntactic; 2281 EnqueueChildren(IE); 2282 } 2283 void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) { 2284 WL.push_back(MemberExprParts(M, Parent)); 2285 2286 // If the base of the member access expression is an implicit 'this', don't 2287 // visit it. 2288 // FIXME: If we ever want to show these implicit accesses, this will be 2289 // unfortunate. However, clang_getCursor() relies on this behavior. 2290 if (M->isImplicitAccess()) 2291 return; 2292 2293 // Ignore base anonymous struct/union fields, otherwise they will shadow the 2294 // real field that that we are interested in. 2295 if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) { 2296 if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) { 2297 if (FD->isAnonymousStructOrUnion()) { 2298 AddStmt(SubME->getBase()); 2299 return; 2300 } 2301 } 2302 } 2303 2304 AddStmt(M->getBase()); 2305 } 2306 void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) { 2307 AddTypeLoc(E->getEncodedTypeSourceInfo()); 2308 } 2309 void EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) { 2310 EnqueueChildren(M); 2311 AddTypeLoc(M->getClassReceiverTypeInfo()); 2312 } 2313 void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) { 2314 // Visit the components of the offsetof expression. 2315 for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) { 2316 typedef OffsetOfExpr::OffsetOfNode OffsetOfNode; 2317 const OffsetOfNode &Node = E->getComponent(I-1); 2318 switch (Node.getKind()) { 2319 case OffsetOfNode::Array: 2320 AddStmt(E->getIndexExpr(Node.getArrayExprIndex())); 2321 break; 2322 case OffsetOfNode::Field: 2323 AddMemberRef(Node.getField(), Node.getSourceRange().getEnd()); 2324 break; 2325 case OffsetOfNode::Identifier: 2326 case OffsetOfNode::Base: 2327 continue; 2328 } 2329 } 2330 // Visit the type into which we're computing the offset. 2331 AddTypeLoc(E->getTypeSourceInfo()); 2332 } 2333 void EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) { 2334 AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs()); 2335 WL.push_back(OverloadExprParts(E, Parent)); 2336 } 2337 void EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr( 2338 const UnaryExprOrTypeTraitExpr *E) { 2339 EnqueueChildren(E); 2340 if (E->isArgumentType()) 2341 AddTypeLoc(E->getArgumentTypeInfo()); 2342 } 2343 void EnqueueVisitor::VisitStmt(const Stmt *S) { 2344 EnqueueChildren(S); 2345 } 2346 void EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) { 2347 AddStmt(S->getBody()); 2348 AddStmt(S->getCond()); 2349 AddDecl(S->getConditionVariable()); 2350 } 2351 2352 void EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) { 2353 AddStmt(W->getBody()); 2354 AddStmt(W->getCond()); 2355 AddDecl(W->getConditionVariable()); 2356 } 2357 2358 void EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) { 2359 for (unsigned I = E->getNumArgs(); I > 0; --I) 2360 AddTypeLoc(E->getArg(I-1)); 2361 } 2362 2363 void EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) { 2364 AddTypeLoc(E->getQueriedTypeSourceInfo()); 2365 } 2366 2367 void EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) { 2368 EnqueueChildren(E); 2369 } 2370 2371 void EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) { 2372 VisitOverloadExpr(U); 2373 if (!U->isImplicitAccess()) 2374 AddStmt(U->getBase()); 2375 } 2376 void EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) { 2377 AddStmt(E->getSubExpr()); 2378 AddTypeLoc(E->getWrittenTypeInfo()); 2379 } 2380 void EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) { 2381 WL.push_back(SizeOfPackExprParts(E, Parent)); 2382 } 2383 void EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) { 2384 // If the opaque value has a source expression, just transparently 2385 // visit that. This is useful for (e.g.) pseudo-object expressions. 2386 if (Expr *SourceExpr = E->getSourceExpr()) 2387 return Visit(SourceExpr); 2388 } 2389 void EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) { 2390 AddStmt(E->getBody()); 2391 WL.push_back(LambdaExprParts(E, Parent)); 2392 } 2393 void EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) { 2394 // Treat the expression like its syntactic form. 2395 Visit(E->getSyntacticForm()); 2396 } 2397 2398 void EnqueueVisitor::VisitOMPExecutableDirective( 2399 const OMPExecutableDirective *D) { 2400 EnqueueChildren(D); 2401 for (ArrayRef<OMPClause *>::iterator I = D->clauses().begin(), 2402 E = D->clauses().end(); 2403 I != E; ++I) 2404 EnqueueChildren(*I); 2405 } 2406 2407 void EnqueueVisitor::VisitOMPLoopDirective(const OMPLoopDirective *D) { 2408 VisitOMPExecutableDirective(D); 2409 } 2410 2411 void EnqueueVisitor::VisitOMPParallelDirective(const OMPParallelDirective *D) { 2412 VisitOMPExecutableDirective(D); 2413 } 2414 2415 void EnqueueVisitor::VisitOMPSimdDirective(const OMPSimdDirective *D) { 2416 VisitOMPLoopDirective(D); 2417 } 2418 2419 void EnqueueVisitor::VisitOMPForDirective(const OMPForDirective *D) { 2420 VisitOMPLoopDirective(D); 2421 } 2422 2423 void EnqueueVisitor::VisitOMPForSimdDirective(const OMPForSimdDirective *D) { 2424 VisitOMPLoopDirective(D); 2425 } 2426 2427 void EnqueueVisitor::VisitOMPSectionsDirective(const OMPSectionsDirective *D) { 2428 VisitOMPExecutableDirective(D); 2429 } 2430 2431 void EnqueueVisitor::VisitOMPSectionDirective(const OMPSectionDirective *D) { 2432 VisitOMPExecutableDirective(D); 2433 } 2434 2435 void EnqueueVisitor::VisitOMPSingleDirective(const OMPSingleDirective *D) { 2436 VisitOMPExecutableDirective(D); 2437 } 2438 2439 void EnqueueVisitor::VisitOMPMasterDirective(const OMPMasterDirective *D) { 2440 VisitOMPExecutableDirective(D); 2441 } 2442 2443 void EnqueueVisitor::VisitOMPCriticalDirective(const OMPCriticalDirective *D) { 2444 VisitOMPExecutableDirective(D); 2445 AddDeclarationNameInfo(D); 2446 } 2447 2448 void 2449 EnqueueVisitor::VisitOMPParallelForDirective(const OMPParallelForDirective *D) { 2450 VisitOMPLoopDirective(D); 2451 } 2452 2453 void EnqueueVisitor::VisitOMPParallelForSimdDirective( 2454 const OMPParallelForSimdDirective *D) { 2455 VisitOMPLoopDirective(D); 2456 } 2457 2458 void EnqueueVisitor::VisitOMPParallelSectionsDirective( 2459 const OMPParallelSectionsDirective *D) { 2460 VisitOMPExecutableDirective(D); 2461 } 2462 2463 void EnqueueVisitor::VisitOMPTaskDirective(const OMPTaskDirective *D) { 2464 VisitOMPExecutableDirective(D); 2465 } 2466 2467 void 2468 EnqueueVisitor::VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D) { 2469 VisitOMPExecutableDirective(D); 2470 } 2471 2472 void EnqueueVisitor::VisitOMPBarrierDirective(const OMPBarrierDirective *D) { 2473 VisitOMPExecutableDirective(D); 2474 } 2475 2476 void EnqueueVisitor::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D) { 2477 VisitOMPExecutableDirective(D); 2478 } 2479 2480 void EnqueueVisitor::VisitOMPFlushDirective(const OMPFlushDirective *D) { 2481 VisitOMPExecutableDirective(D); 2482 } 2483 2484 void EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) { 2485 VisitOMPExecutableDirective(D); 2486 } 2487 2488 void EnqueueVisitor::VisitOMPAtomicDirective(const OMPAtomicDirective *D) { 2489 VisitOMPExecutableDirective(D); 2490 } 2491 2492 void EnqueueVisitor::VisitOMPTargetDirective(const OMPTargetDirective *D) { 2493 VisitOMPExecutableDirective(D); 2494 } 2495 2496 void EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) { 2497 VisitOMPExecutableDirective(D); 2498 } 2499 2500 void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) { 2501 EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S); 2502 } 2503 2504 bool CursorVisitor::IsInRegionOfInterest(CXCursor C) { 2505 if (RegionOfInterest.isValid()) { 2506 SourceRange Range = getRawCursorExtent(C); 2507 if (Range.isInvalid() || CompareRegionOfInterest(Range)) 2508 return false; 2509 } 2510 return true; 2511 } 2512 2513 bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { 2514 while (!WL.empty()) { 2515 // Dequeue the worklist item. 2516 VisitorJob LI = WL.pop_back_val(); 2517 2518 // Set the Parent field, then back to its old value once we're done. 2519 SetParentRAII SetParent(Parent, StmtParent, LI.getParent()); 2520 2521 switch (LI.getKind()) { 2522 case VisitorJob::DeclVisitKind: { 2523 const Decl *D = cast<DeclVisit>(&LI)->get(); 2524 if (!D) 2525 continue; 2526 2527 // For now, perform default visitation for Decls. 2528 if (Visit(MakeCXCursor(D, TU, RegionOfInterest, 2529 cast<DeclVisit>(&LI)->isFirst()))) 2530 return true; 2531 2532 continue; 2533 } 2534 case VisitorJob::ExplicitTemplateArgsVisitKind: { 2535 const ASTTemplateArgumentListInfo *ArgList = 2536 cast<ExplicitTemplateArgsVisit>(&LI)->get(); 2537 for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(), 2538 *ArgEnd = Arg + ArgList->NumTemplateArgs; 2539 Arg != ArgEnd; ++Arg) { 2540 if (VisitTemplateArgumentLoc(*Arg)) 2541 return true; 2542 } 2543 continue; 2544 } 2545 case VisitorJob::TypeLocVisitKind: { 2546 // Perform default visitation for TypeLocs. 2547 if (Visit(cast<TypeLocVisit>(&LI)->get())) 2548 return true; 2549 continue; 2550 } 2551 case VisitorJob::LabelRefVisitKind: { 2552 const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get(); 2553 if (LabelStmt *stmt = LS->getStmt()) { 2554 if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(), 2555 TU))) { 2556 return true; 2557 } 2558 } 2559 continue; 2560 } 2561 2562 case VisitorJob::NestedNameSpecifierLocVisitKind: { 2563 NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI); 2564 if (VisitNestedNameSpecifierLoc(V->get())) 2565 return true; 2566 continue; 2567 } 2568 2569 case VisitorJob::DeclarationNameInfoVisitKind: { 2570 if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI) 2571 ->get())) 2572 return true; 2573 continue; 2574 } 2575 case VisitorJob::MemberRefVisitKind: { 2576 MemberRefVisit *V = cast<MemberRefVisit>(&LI); 2577 if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU))) 2578 return true; 2579 continue; 2580 } 2581 case VisitorJob::StmtVisitKind: { 2582 const Stmt *S = cast<StmtVisit>(&LI)->get(); 2583 if (!S) 2584 continue; 2585 2586 // Update the current cursor. 2587 CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest); 2588 if (!IsInRegionOfInterest(Cursor)) 2589 continue; 2590 switch (Visitor(Cursor, Parent, ClientData)) { 2591 case CXChildVisit_Break: return true; 2592 case CXChildVisit_Continue: break; 2593 case CXChildVisit_Recurse: 2594 if (PostChildrenVisitor) 2595 WL.push_back(PostChildrenVisit(nullptr, Cursor)); 2596 EnqueueWorkList(WL, S); 2597 break; 2598 } 2599 continue; 2600 } 2601 case VisitorJob::MemberExprPartsKind: { 2602 // Handle the other pieces in the MemberExpr besides the base. 2603 const MemberExpr *M = cast<MemberExprParts>(&LI)->get(); 2604 2605 // Visit the nested-name-specifier 2606 if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc()) 2607 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 2608 return true; 2609 2610 // Visit the declaration name. 2611 if (VisitDeclarationNameInfo(M->getMemberNameInfo())) 2612 return true; 2613 2614 // Visit the explicitly-specified template arguments, if any. 2615 if (M->hasExplicitTemplateArgs()) { 2616 for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(), 2617 *ArgEnd = Arg + M->getNumTemplateArgs(); 2618 Arg != ArgEnd; ++Arg) { 2619 if (VisitTemplateArgumentLoc(*Arg)) 2620 return true; 2621 } 2622 } 2623 continue; 2624 } 2625 case VisitorJob::DeclRefExprPartsKind: { 2626 const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get(); 2627 // Visit nested-name-specifier, if present. 2628 if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc()) 2629 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 2630 return true; 2631 // Visit declaration name. 2632 if (VisitDeclarationNameInfo(DR->getNameInfo())) 2633 return true; 2634 continue; 2635 } 2636 case VisitorJob::OverloadExprPartsKind: { 2637 const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get(); 2638 // Visit the nested-name-specifier. 2639 if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc()) 2640 if (VisitNestedNameSpecifierLoc(QualifierLoc)) 2641 return true; 2642 // Visit the declaration name. 2643 if (VisitDeclarationNameInfo(O->getNameInfo())) 2644 return true; 2645 // Visit the overloaded declaration reference. 2646 if (Visit(MakeCursorOverloadedDeclRef(O, TU))) 2647 return true; 2648 continue; 2649 } 2650 case VisitorJob::SizeOfPackExprPartsKind: { 2651 const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get(); 2652 NamedDecl *Pack = E->getPack(); 2653 if (isa<TemplateTypeParmDecl>(Pack)) { 2654 if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack), 2655 E->getPackLoc(), TU))) 2656 return true; 2657 2658 continue; 2659 } 2660 2661 if (isa<TemplateTemplateParmDecl>(Pack)) { 2662 if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack), 2663 E->getPackLoc(), TU))) 2664 return true; 2665 2666 continue; 2667 } 2668 2669 // Non-type template parameter packs and function parameter packs are 2670 // treated like DeclRefExpr cursors. 2671 continue; 2672 } 2673 2674 case VisitorJob::LambdaExprPartsKind: { 2675 // Visit captures. 2676 const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get(); 2677 for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(), 2678 CEnd = E->explicit_capture_end(); 2679 C != CEnd; ++C) { 2680 // FIXME: Lambda init-captures. 2681 if (!C->capturesVariable()) 2682 continue; 2683 2684 if (Visit(MakeCursorVariableRef(C->getCapturedVar(), 2685 C->getLocation(), 2686 TU))) 2687 return true; 2688 } 2689 2690 // Visit parameters and return type, if present. 2691 if (E->hasExplicitParameters() || E->hasExplicitResultType()) { 2692 TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc(); 2693 if (E->hasExplicitParameters() && E->hasExplicitResultType()) { 2694 // Visit the whole type. 2695 if (Visit(TL)) 2696 return true; 2697 } else if (FunctionProtoTypeLoc Proto = 2698 TL.getAs<FunctionProtoTypeLoc>()) { 2699 if (E->hasExplicitParameters()) { 2700 // Visit parameters. 2701 for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) 2702 if (Visit(MakeCXCursor(Proto.getParam(I), TU))) 2703 return true; 2704 } else { 2705 // Visit result type. 2706 if (Visit(Proto.getReturnLoc())) 2707 return true; 2708 } 2709 } 2710 } 2711 break; 2712 } 2713 2714 case VisitorJob::PostChildrenVisitKind: 2715 if (PostChildrenVisitor(Parent, ClientData)) 2716 return true; 2717 break; 2718 } 2719 } 2720 return false; 2721 } 2722 2723 bool CursorVisitor::Visit(const Stmt *S) { 2724 VisitorWorkList *WL = nullptr; 2725 if (!WorkListFreeList.empty()) { 2726 WL = WorkListFreeList.back(); 2727 WL->clear(); 2728 WorkListFreeList.pop_back(); 2729 } 2730 else { 2731 WL = new VisitorWorkList(); 2732 WorkListCache.push_back(WL); 2733 } 2734 EnqueueWorkList(*WL, S); 2735 bool result = RunVisitorWorkList(*WL); 2736 WorkListFreeList.push_back(WL); 2737 return result; 2738 } 2739 2740 namespace { 2741 typedef SmallVector<SourceRange, 4> RefNamePieces; 2742 RefNamePieces 2743 buildPieces(unsigned NameFlags, bool IsMemberRefExpr, 2744 const DeclarationNameInfo &NI, const SourceRange &QLoc, 2745 const ASTTemplateArgumentListInfo *TemplateArgs = nullptr) { 2746 const bool WantQualifier = NameFlags & CXNameRange_WantQualifier; 2747 const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs; 2748 const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece; 2749 2750 const DeclarationName::NameKind Kind = NI.getName().getNameKind(); 2751 2752 RefNamePieces Pieces; 2753 2754 if (WantQualifier && QLoc.isValid()) 2755 Pieces.push_back(QLoc); 2756 2757 if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr) 2758 Pieces.push_back(NI.getLoc()); 2759 2760 if (WantTemplateArgs && TemplateArgs) 2761 Pieces.push_back(SourceRange(TemplateArgs->LAngleLoc, 2762 TemplateArgs->RAngleLoc)); 2763 2764 if (Kind == DeclarationName::CXXOperatorName) { 2765 Pieces.push_back(SourceLocation::getFromRawEncoding( 2766 NI.getInfo().CXXOperatorName.BeginOpNameLoc)); 2767 Pieces.push_back(SourceLocation::getFromRawEncoding( 2768 NI.getInfo().CXXOperatorName.EndOpNameLoc)); 2769 } 2770 2771 if (WantSinglePiece) { 2772 SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd()); 2773 Pieces.clear(); 2774 Pieces.push_back(R); 2775 } 2776 2777 return Pieces; 2778 } 2779 } 2780 2781 //===----------------------------------------------------------------------===// 2782 // Misc. API hooks. 2783 //===----------------------------------------------------------------------===// 2784 2785 static void fatal_error_handler(void *user_data, const std::string& reason, 2786 bool gen_crash_diag) { 2787 // Write the result out to stderr avoiding errs() because raw_ostreams can 2788 // call report_fatal_error. 2789 fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str()); 2790 ::abort(); 2791 } 2792 2793 namespace { 2794 struct RegisterFatalErrorHandler { 2795 RegisterFatalErrorHandler() { 2796 llvm::install_fatal_error_handler(fatal_error_handler, nullptr); 2797 } 2798 }; 2799 } 2800 2801 static llvm::ManagedStatic<RegisterFatalErrorHandler> RegisterFatalErrorHandlerOnce; 2802 2803 extern "C" { 2804 CXIndex clang_createIndex(int excludeDeclarationsFromPCH, 2805 int displayDiagnostics) { 2806 // We use crash recovery to make some of our APIs more reliable, implicitly 2807 // enable it. 2808 if (!getenv("LIBCLANG_DISABLE_CRASH_RECOVERY")) 2809 llvm::CrashRecoveryContext::Enable(); 2810 2811 // Look through the managed static to trigger construction of the managed 2812 // static which registers our fatal error handler. This ensures it is only 2813 // registered once. 2814 (void)*RegisterFatalErrorHandlerOnce; 2815 2816 CIndexer *CIdxr = new CIndexer(); 2817 if (excludeDeclarationsFromPCH) 2818 CIdxr->setOnlyLocalDecls(); 2819 if (displayDiagnostics) 2820 CIdxr->setDisplayDiagnostics(); 2821 2822 if (getenv("LIBCLANG_BGPRIO_INDEX")) 2823 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | 2824 CXGlobalOpt_ThreadBackgroundPriorityForIndexing); 2825 if (getenv("LIBCLANG_BGPRIO_EDIT")) 2826 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | 2827 CXGlobalOpt_ThreadBackgroundPriorityForEditing); 2828 2829 return CIdxr; 2830 } 2831 2832 void clang_disposeIndex(CXIndex CIdx) { 2833 if (CIdx) 2834 delete static_cast<CIndexer *>(CIdx); 2835 } 2836 2837 void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) { 2838 if (CIdx) 2839 static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options); 2840 } 2841 2842 unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) { 2843 if (CIdx) 2844 return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags(); 2845 return 0; 2846 } 2847 2848 void clang_toggleCrashRecovery(unsigned isEnabled) { 2849 if (isEnabled) 2850 llvm::CrashRecoveryContext::Enable(); 2851 else 2852 llvm::CrashRecoveryContext::Disable(); 2853 } 2854 2855 CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx, 2856 const char *ast_filename) { 2857 CXTranslationUnit TU; 2858 enum CXErrorCode Result = 2859 clang_createTranslationUnit2(CIdx, ast_filename, &TU); 2860 (void)Result; 2861 assert((TU && Result == CXError_Success) || 2862 (!TU && Result != CXError_Success)); 2863 return TU; 2864 } 2865 2866 enum CXErrorCode clang_createTranslationUnit2(CXIndex CIdx, 2867 const char *ast_filename, 2868 CXTranslationUnit *out_TU) { 2869 if (out_TU) 2870 *out_TU = nullptr; 2871 2872 if (!CIdx || !ast_filename || !out_TU) 2873 return CXError_InvalidArguments; 2874 2875 LOG_FUNC_SECTION { 2876 *Log << ast_filename; 2877 } 2878 2879 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); 2880 FileSystemOptions FileSystemOpts; 2881 2882 IntrusiveRefCntPtr<DiagnosticsEngine> Diags = 2883 CompilerInstance::createDiagnostics(new DiagnosticOptions()); 2884 std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile( 2885 ast_filename, Diags, FileSystemOpts, CXXIdx->getOnlyLocalDecls(), None, 2886 /*CaptureDiagnostics=*/true, 2887 /*AllowPCHWithCompilerErrors=*/true, 2888 /*UserFilesAreVolatile=*/true); 2889 *out_TU = MakeCXTranslationUnit(CXXIdx, AU.release()); 2890 return *out_TU ? CXError_Success : CXError_Failure; 2891 } 2892 2893 unsigned clang_defaultEditingTranslationUnitOptions() { 2894 return CXTranslationUnit_PrecompiledPreamble | 2895 CXTranslationUnit_CacheCompletionResults; 2896 } 2897 2898 CXTranslationUnit 2899 clang_createTranslationUnitFromSourceFile(CXIndex CIdx, 2900 const char *source_filename, 2901 int num_command_line_args, 2902 const char * const *command_line_args, 2903 unsigned num_unsaved_files, 2904 struct CXUnsavedFile *unsaved_files) { 2905 unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord; 2906 return clang_parseTranslationUnit(CIdx, source_filename, 2907 command_line_args, num_command_line_args, 2908 unsaved_files, num_unsaved_files, 2909 Options); 2910 } 2911 2912 struct ParseTranslationUnitInfo { 2913 CXIndex CIdx; 2914 const char *source_filename; 2915 const char *const *command_line_args; 2916 int num_command_line_args; 2917 ArrayRef<CXUnsavedFile> unsaved_files; 2918 unsigned options; 2919 CXTranslationUnit *out_TU; 2920 CXErrorCode &result; 2921 }; 2922 static void clang_parseTranslationUnit_Impl(void *UserData) { 2923 const ParseTranslationUnitInfo *PTUI = 2924 static_cast<ParseTranslationUnitInfo *>(UserData); 2925 CXIndex CIdx = PTUI->CIdx; 2926 const char *source_filename = PTUI->source_filename; 2927 const char * const *command_line_args = PTUI->command_line_args; 2928 int num_command_line_args = PTUI->num_command_line_args; 2929 unsigned options = PTUI->options; 2930 CXTranslationUnit *out_TU = PTUI->out_TU; 2931 2932 // Set up the initial return values. 2933 if (out_TU) 2934 *out_TU = nullptr; 2935 2936 // Check arguments. 2937 if (!CIdx || !out_TU) { 2938 PTUI->result = CXError_InvalidArguments; 2939 return; 2940 } 2941 2942 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); 2943 2944 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) 2945 setThreadBackgroundPriority(); 2946 2947 bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble; 2948 // FIXME: Add a flag for modules. 2949 TranslationUnitKind TUKind 2950 = (options & CXTranslationUnit_Incomplete)? TU_Prefix : TU_Complete; 2951 bool CacheCodeCompletionResults 2952 = options & CXTranslationUnit_CacheCompletionResults; 2953 bool IncludeBriefCommentsInCodeCompletion 2954 = options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion; 2955 bool SkipFunctionBodies = options & CXTranslationUnit_SkipFunctionBodies; 2956 bool ForSerialization = options & CXTranslationUnit_ForSerialization; 2957 2958 // Configure the diagnostics. 2959 IntrusiveRefCntPtr<DiagnosticsEngine> 2960 Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions)); 2961 2962 // Recover resources if we crash before exiting this function. 2963 llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine, 2964 llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> > 2965 DiagCleanup(Diags.get()); 2966 2967 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles( 2968 new std::vector<ASTUnit::RemappedFile>()); 2969 2970 // Recover resources if we crash before exiting this function. 2971 llvm::CrashRecoveryContextCleanupRegistrar< 2972 std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get()); 2973 2974 for (auto &UF : PTUI->unsaved_files) { 2975 std::unique_ptr<llvm::MemoryBuffer> MB = 2976 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); 2977 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); 2978 } 2979 2980 std::unique_ptr<std::vector<const char *>> Args( 2981 new std::vector<const char *>()); 2982 2983 // Recover resources if we crash before exiting this method. 2984 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char*> > 2985 ArgsCleanup(Args.get()); 2986 2987 // Since the Clang C library is primarily used by batch tools dealing with 2988 // (often very broken) source code, where spell-checking can have a 2989 // significant negative impact on performance (particularly when 2990 // precompiled headers are involved), we disable it by default. 2991 // Only do this if we haven't found a spell-checking-related argument. 2992 bool FoundSpellCheckingArgument = false; 2993 for (int I = 0; I != num_command_line_args; ++I) { 2994 if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 || 2995 strcmp(command_line_args[I], "-fspell-checking") == 0) { 2996 FoundSpellCheckingArgument = true; 2997 break; 2998 } 2999 } 3000 if (!FoundSpellCheckingArgument) 3001 Args->push_back("-fno-spell-checking"); 3002 3003 Args->insert(Args->end(), command_line_args, 3004 command_line_args + num_command_line_args); 3005 3006 // The 'source_filename' argument is optional. If the caller does not 3007 // specify it then it is assumed that the source file is specified 3008 // in the actual argument list. 3009 // Put the source file after command_line_args otherwise if '-x' flag is 3010 // present it will be unused. 3011 if (source_filename) 3012 Args->push_back(source_filename); 3013 3014 // Do we need the detailed preprocessing record? 3015 if (options & CXTranslationUnit_DetailedPreprocessingRecord) { 3016 Args->push_back("-Xclang"); 3017 Args->push_back("-detailed-preprocessing-record"); 3018 } 3019 3020 unsigned NumErrors = Diags->getClient()->getNumErrors(); 3021 std::unique_ptr<ASTUnit> ErrUnit; 3022 std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine( 3023 Args->data(), Args->data() + Args->size(), Diags, 3024 CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(), 3025 /*CaptureDiagnostics=*/true, *RemappedFiles.get(), 3026 /*RemappedFilesKeepOriginalName=*/true, PrecompilePreamble, TUKind, 3027 CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion, 3028 /*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies, 3029 /*UserFilesAreVolatile=*/true, ForSerialization, &ErrUnit)); 3030 3031 if (NumErrors != Diags->getClient()->getNumErrors()) { 3032 // Make sure to check that 'Unit' is non-NULL. 3033 if (CXXIdx->getDisplayDiagnostics()) 3034 printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get()); 3035 } 3036 3037 if (isASTReadError(Unit ? Unit.get() : ErrUnit.get())) { 3038 PTUI->result = CXError_ASTReadError; 3039 } else { 3040 *PTUI->out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release()); 3041 PTUI->result = *PTUI->out_TU ? CXError_Success : CXError_Failure; 3042 } 3043 } 3044 3045 CXTranslationUnit 3046 clang_parseTranslationUnit(CXIndex CIdx, 3047 const char *source_filename, 3048 const char *const *command_line_args, 3049 int num_command_line_args, 3050 struct CXUnsavedFile *unsaved_files, 3051 unsigned num_unsaved_files, 3052 unsigned options) { 3053 CXTranslationUnit TU; 3054 enum CXErrorCode Result = clang_parseTranslationUnit2( 3055 CIdx, source_filename, command_line_args, num_command_line_args, 3056 unsaved_files, num_unsaved_files, options, &TU); 3057 (void)Result; 3058 assert((TU && Result == CXError_Success) || 3059 (!TU && Result != CXError_Success)); 3060 return TU; 3061 } 3062 3063 enum CXErrorCode clang_parseTranslationUnit2( 3064 CXIndex CIdx, 3065 const char *source_filename, 3066 const char *const *command_line_args, 3067 int num_command_line_args, 3068 struct CXUnsavedFile *unsaved_files, 3069 unsigned num_unsaved_files, 3070 unsigned options, 3071 CXTranslationUnit *out_TU) { 3072 LOG_FUNC_SECTION { 3073 *Log << source_filename << ": "; 3074 for (int i = 0; i != num_command_line_args; ++i) 3075 *Log << command_line_args[i] << " "; 3076 } 3077 3078 if (num_unsaved_files && !unsaved_files) 3079 return CXError_InvalidArguments; 3080 3081 CXErrorCode result = CXError_Failure; 3082 ParseTranslationUnitInfo PTUI = { 3083 CIdx, 3084 source_filename, 3085 command_line_args, 3086 num_command_line_args, 3087 llvm::makeArrayRef(unsaved_files, num_unsaved_files), 3088 options, 3089 out_TU, 3090 result}; 3091 llvm::CrashRecoveryContext CRC; 3092 3093 if (!RunSafely(CRC, clang_parseTranslationUnit_Impl, &PTUI)) { 3094 fprintf(stderr, "libclang: crash detected during parsing: {\n"); 3095 fprintf(stderr, " 'source_filename' : '%s'\n", source_filename); 3096 fprintf(stderr, " 'command_line_args' : ["); 3097 for (int i = 0; i != num_command_line_args; ++i) { 3098 if (i) 3099 fprintf(stderr, ", "); 3100 fprintf(stderr, "'%s'", command_line_args[i]); 3101 } 3102 fprintf(stderr, "],\n"); 3103 fprintf(stderr, " 'unsaved_files' : ["); 3104 for (unsigned i = 0; i != num_unsaved_files; ++i) { 3105 if (i) 3106 fprintf(stderr, ", "); 3107 fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename, 3108 unsaved_files[i].Length); 3109 } 3110 fprintf(stderr, "],\n"); 3111 fprintf(stderr, " 'options' : %d,\n", options); 3112 fprintf(stderr, "}\n"); 3113 3114 return CXError_Crashed; 3115 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) { 3116 if (CXTranslationUnit *TU = PTUI.out_TU) 3117 PrintLibclangResourceUsage(*TU); 3118 } 3119 3120 return result; 3121 } 3122 3123 unsigned clang_defaultSaveOptions(CXTranslationUnit TU) { 3124 return CXSaveTranslationUnit_None; 3125 } 3126 3127 namespace { 3128 3129 struct SaveTranslationUnitInfo { 3130 CXTranslationUnit TU; 3131 const char *FileName; 3132 unsigned options; 3133 CXSaveError result; 3134 }; 3135 3136 } 3137 3138 static void clang_saveTranslationUnit_Impl(void *UserData) { 3139 SaveTranslationUnitInfo *STUI = 3140 static_cast<SaveTranslationUnitInfo*>(UserData); 3141 3142 CIndexer *CXXIdx = STUI->TU->CIdx; 3143 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) 3144 setThreadBackgroundPriority(); 3145 3146 bool hadError = cxtu::getASTUnit(STUI->TU)->Save(STUI->FileName); 3147 STUI->result = hadError ? CXSaveError_Unknown : CXSaveError_None; 3148 } 3149 3150 int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName, 3151 unsigned options) { 3152 LOG_FUNC_SECTION { 3153 *Log << TU << ' ' << FileName; 3154 } 3155 3156 if (isNotUsableTU(TU)) { 3157 LOG_BAD_TU(TU); 3158 return CXSaveError_InvalidTU; 3159 } 3160 3161 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 3162 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 3163 if (!CXXUnit->hasSema()) 3164 return CXSaveError_InvalidTU; 3165 3166 SaveTranslationUnitInfo STUI = { TU, FileName, options, CXSaveError_None }; 3167 3168 if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() || 3169 getenv("LIBCLANG_NOTHREADS")) { 3170 clang_saveTranslationUnit_Impl(&STUI); 3171 3172 if (getenv("LIBCLANG_RESOURCE_USAGE")) 3173 PrintLibclangResourceUsage(TU); 3174 3175 return STUI.result; 3176 } 3177 3178 // We have an AST that has invalid nodes due to compiler errors. 3179 // Use a crash recovery thread for protection. 3180 3181 llvm::CrashRecoveryContext CRC; 3182 3183 if (!RunSafely(CRC, clang_saveTranslationUnit_Impl, &STUI)) { 3184 fprintf(stderr, "libclang: crash detected during AST saving: {\n"); 3185 fprintf(stderr, " 'filename' : '%s'\n", FileName); 3186 fprintf(stderr, " 'options' : %d,\n", options); 3187 fprintf(stderr, "}\n"); 3188 3189 return CXSaveError_Unknown; 3190 3191 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) { 3192 PrintLibclangResourceUsage(TU); 3193 } 3194 3195 return STUI.result; 3196 } 3197 3198 void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) { 3199 if (CTUnit) { 3200 // If the translation unit has been marked as unsafe to free, just discard 3201 // it. 3202 ASTUnit *Unit = cxtu::getASTUnit(CTUnit); 3203 if (Unit && Unit->isUnsafeToFree()) 3204 return; 3205 3206 delete cxtu::getASTUnit(CTUnit); 3207 delete CTUnit->StringPool; 3208 delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics); 3209 disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool); 3210 delete CTUnit->CommentToXML; 3211 delete CTUnit; 3212 } 3213 } 3214 3215 unsigned clang_defaultReparseOptions(CXTranslationUnit TU) { 3216 return CXReparse_None; 3217 } 3218 3219 struct ReparseTranslationUnitInfo { 3220 CXTranslationUnit TU; 3221 ArrayRef<CXUnsavedFile> unsaved_files; 3222 unsigned options; 3223 CXErrorCode &result; 3224 }; 3225 3226 static void clang_reparseTranslationUnit_Impl(void *UserData) { 3227 const ReparseTranslationUnitInfo *RTUI = 3228 static_cast<ReparseTranslationUnitInfo *>(UserData); 3229 CXTranslationUnit TU = RTUI->TU; 3230 unsigned options = RTUI->options; 3231 (void) options; 3232 3233 // Check arguments. 3234 if (isNotUsableTU(TU)) { 3235 LOG_BAD_TU(TU); 3236 RTUI->result = CXError_InvalidArguments; 3237 return; 3238 } 3239 3240 // Reset the associated diagnostics. 3241 delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics); 3242 TU->Diagnostics = nullptr; 3243 3244 CIndexer *CXXIdx = TU->CIdx; 3245 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) 3246 setThreadBackgroundPriority(); 3247 3248 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 3249 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 3250 3251 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles( 3252 new std::vector<ASTUnit::RemappedFile>()); 3253 3254 // Recover resources if we crash before exiting this function. 3255 llvm::CrashRecoveryContextCleanupRegistrar< 3256 std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get()); 3257 3258 for (auto &UF : RTUI->unsaved_files) { 3259 std::unique_ptr<llvm::MemoryBuffer> MB = 3260 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename); 3261 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release())); 3262 } 3263 3264 if (!CXXUnit->Reparse(*RemappedFiles.get())) 3265 RTUI->result = CXError_Success; 3266 else if (isASTReadError(CXXUnit)) 3267 RTUI->result = CXError_ASTReadError; 3268 } 3269 3270 int clang_reparseTranslationUnit(CXTranslationUnit TU, 3271 unsigned num_unsaved_files, 3272 struct CXUnsavedFile *unsaved_files, 3273 unsigned options) { 3274 LOG_FUNC_SECTION { 3275 *Log << TU; 3276 } 3277 3278 if (num_unsaved_files && !unsaved_files) 3279 return CXError_InvalidArguments; 3280 3281 CXErrorCode result = CXError_Failure; 3282 ReparseTranslationUnitInfo RTUI = { 3283 TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, 3284 result}; 3285 3286 if (getenv("LIBCLANG_NOTHREADS")) { 3287 clang_reparseTranslationUnit_Impl(&RTUI); 3288 return result; 3289 } 3290 3291 llvm::CrashRecoveryContext CRC; 3292 3293 if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) { 3294 fprintf(stderr, "libclang: crash detected during reparsing\n"); 3295 cxtu::getASTUnit(TU)->setUnsafeToFree(true); 3296 return CXError_Crashed; 3297 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) 3298 PrintLibclangResourceUsage(TU); 3299 3300 return result; 3301 } 3302 3303 3304 CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) { 3305 if (isNotUsableTU(CTUnit)) { 3306 LOG_BAD_TU(CTUnit); 3307 return cxstring::createEmpty(); 3308 } 3309 3310 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit); 3311 return cxstring::createDup(CXXUnit->getOriginalSourceFileName()); 3312 } 3313 3314 CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) { 3315 if (isNotUsableTU(TU)) { 3316 LOG_BAD_TU(TU); 3317 return clang_getNullCursor(); 3318 } 3319 3320 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 3321 return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU); 3322 } 3323 3324 } // end: extern "C" 3325 3326 //===----------------------------------------------------------------------===// 3327 // CXFile Operations. 3328 //===----------------------------------------------------------------------===// 3329 3330 extern "C" { 3331 CXString clang_getFileName(CXFile SFile) { 3332 if (!SFile) 3333 return cxstring::createNull(); 3334 3335 FileEntry *FEnt = static_cast<FileEntry *>(SFile); 3336 return cxstring::createRef(FEnt->getName()); 3337 } 3338 3339 time_t clang_getFileTime(CXFile SFile) { 3340 if (!SFile) 3341 return 0; 3342 3343 FileEntry *FEnt = static_cast<FileEntry *>(SFile); 3344 return FEnt->getModificationTime(); 3345 } 3346 3347 CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) { 3348 if (isNotUsableTU(TU)) { 3349 LOG_BAD_TU(TU); 3350 return nullptr; 3351 } 3352 3353 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 3354 3355 FileManager &FMgr = CXXUnit->getFileManager(); 3356 return const_cast<FileEntry *>(FMgr.getFile(file_name)); 3357 } 3358 3359 unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU, 3360 CXFile file) { 3361 if (isNotUsableTU(TU)) { 3362 LOG_BAD_TU(TU); 3363 return 0; 3364 } 3365 3366 if (!file) 3367 return 0; 3368 3369 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 3370 FileEntry *FEnt = static_cast<FileEntry *>(file); 3371 return CXXUnit->getPreprocessor().getHeaderSearchInfo() 3372 .isFileMultipleIncludeGuarded(FEnt); 3373 } 3374 3375 int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) { 3376 if (!file || !outID) 3377 return 1; 3378 3379 FileEntry *FEnt = static_cast<FileEntry *>(file); 3380 const llvm::sys::fs::UniqueID &ID = FEnt->getUniqueID(); 3381 outID->data[0] = ID.getDevice(); 3382 outID->data[1] = ID.getFile(); 3383 outID->data[2] = FEnt->getModificationTime(); 3384 return 0; 3385 } 3386 3387 int clang_File_isEqual(CXFile file1, CXFile file2) { 3388 if (file1 == file2) 3389 return true; 3390 3391 if (!file1 || !file2) 3392 return false; 3393 3394 FileEntry *FEnt1 = static_cast<FileEntry *>(file1); 3395 FileEntry *FEnt2 = static_cast<FileEntry *>(file2); 3396 return FEnt1->getUniqueID() == FEnt2->getUniqueID(); 3397 } 3398 3399 } // end: extern "C" 3400 3401 //===----------------------------------------------------------------------===// 3402 // CXCursor Operations. 3403 //===----------------------------------------------------------------------===// 3404 3405 static const Decl *getDeclFromExpr(const Stmt *E) { 3406 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 3407 return getDeclFromExpr(CE->getSubExpr()); 3408 3409 if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E)) 3410 return RefExpr->getDecl(); 3411 if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) 3412 return ME->getMemberDecl(); 3413 if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E)) 3414 return RE->getDecl(); 3415 if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) { 3416 if (PRE->isExplicitProperty()) 3417 return PRE->getExplicitProperty(); 3418 // It could be messaging both getter and setter as in: 3419 // ++myobj.myprop; 3420 // in which case prefer to associate the setter since it is less obvious 3421 // from inspecting the source that the setter is going to get called. 3422 if (PRE->isMessagingSetter()) 3423 return PRE->getImplicitPropertySetter(); 3424 return PRE->getImplicitPropertyGetter(); 3425 } 3426 if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) 3427 return getDeclFromExpr(POE->getSyntacticForm()); 3428 if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) 3429 if (Expr *Src = OVE->getSourceExpr()) 3430 return getDeclFromExpr(Src); 3431 3432 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) 3433 return getDeclFromExpr(CE->getCallee()); 3434 if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) 3435 if (!CE->isElidable()) 3436 return CE->getConstructor(); 3437 if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E)) 3438 return OME->getMethodDecl(); 3439 3440 if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E)) 3441 return PE->getProtocol(); 3442 if (const SubstNonTypeTemplateParmPackExpr *NTTP 3443 = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E)) 3444 return NTTP->getParameterPack(); 3445 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E)) 3446 if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) || 3447 isa<ParmVarDecl>(SizeOfPack->getPack())) 3448 return SizeOfPack->getPack(); 3449 3450 return nullptr; 3451 } 3452 3453 static SourceLocation getLocationFromExpr(const Expr *E) { 3454 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 3455 return getLocationFromExpr(CE->getSubExpr()); 3456 3457 if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E)) 3458 return /*FIXME:*/Msg->getLeftLoc(); 3459 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 3460 return DRE->getLocation(); 3461 if (const MemberExpr *Member = dyn_cast<MemberExpr>(E)) 3462 return Member->getMemberLoc(); 3463 if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E)) 3464 return Ivar->getLocation(); 3465 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E)) 3466 return SizeOfPack->getPackLoc(); 3467 if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E)) 3468 return PropRef->getLocation(); 3469 3470 return E->getLocStart(); 3471 } 3472 3473 extern "C" { 3474 3475 unsigned clang_visitChildren(CXCursor parent, 3476 CXCursorVisitor visitor, 3477 CXClientData client_data) { 3478 CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data, 3479 /*VisitPreprocessorLast=*/false); 3480 return CursorVis.VisitChildren(parent); 3481 } 3482 3483 #ifndef __has_feature 3484 #define __has_feature(x) 0 3485 #endif 3486 #if __has_feature(blocks) 3487 typedef enum CXChildVisitResult 3488 (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent); 3489 3490 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 3491 CXClientData client_data) { 3492 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 3493 return block(cursor, parent); 3494 } 3495 #else 3496 // If we are compiled with a compiler that doesn't have native blocks support, 3497 // define and call the block manually, so the 3498 typedef struct _CXChildVisitResult 3499 { 3500 void *isa; 3501 int flags; 3502 int reserved; 3503 enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor, 3504 CXCursor); 3505 } *CXCursorVisitorBlock; 3506 3507 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 3508 CXClientData client_data) { 3509 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 3510 return block->invoke(block, cursor, parent); 3511 } 3512 #endif 3513 3514 3515 unsigned clang_visitChildrenWithBlock(CXCursor parent, 3516 CXCursorVisitorBlock block) { 3517 return clang_visitChildren(parent, visitWithBlock, block); 3518 } 3519 3520 static CXString getDeclSpelling(const Decl *D) { 3521 if (!D) 3522 return cxstring::createEmpty(); 3523 3524 const NamedDecl *ND = dyn_cast<NamedDecl>(D); 3525 if (!ND) { 3526 if (const ObjCPropertyImplDecl *PropImpl = 3527 dyn_cast<ObjCPropertyImplDecl>(D)) 3528 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 3529 return cxstring::createDup(Property->getIdentifier()->getName()); 3530 3531 if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D)) 3532 if (Module *Mod = ImportD->getImportedModule()) 3533 return cxstring::createDup(Mod->getFullModuleName()); 3534 3535 return cxstring::createEmpty(); 3536 } 3537 3538 if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND)) 3539 return cxstring::createDup(OMD->getSelector().getAsString()); 3540 3541 if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND)) 3542 // No, this isn't the same as the code below. getIdentifier() is non-virtual 3543 // and returns different names. NamedDecl returns the class name and 3544 // ObjCCategoryImplDecl returns the category name. 3545 return cxstring::createRef(CIMP->getIdentifier()->getNameStart()); 3546 3547 if (isa<UsingDirectiveDecl>(D)) 3548 return cxstring::createEmpty(); 3549 3550 SmallString<1024> S; 3551 llvm::raw_svector_ostream os(S); 3552 ND->printName(os); 3553 3554 return cxstring::createDup(os.str()); 3555 } 3556 3557 CXString clang_getCursorSpelling(CXCursor C) { 3558 if (clang_isTranslationUnit(C.kind)) 3559 return clang_getTranslationUnitSpelling(getCursorTU(C)); 3560 3561 if (clang_isReference(C.kind)) { 3562 switch (C.kind) { 3563 case CXCursor_ObjCSuperClassRef: { 3564 const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first; 3565 return cxstring::createRef(Super->getIdentifier()->getNameStart()); 3566 } 3567 case CXCursor_ObjCClassRef: { 3568 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 3569 return cxstring::createRef(Class->getIdentifier()->getNameStart()); 3570 } 3571 case CXCursor_ObjCProtocolRef: { 3572 const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first; 3573 assert(OID && "getCursorSpelling(): Missing protocol decl"); 3574 return cxstring::createRef(OID->getIdentifier()->getNameStart()); 3575 } 3576 case CXCursor_CXXBaseSpecifier: { 3577 const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C); 3578 return cxstring::createDup(B->getType().getAsString()); 3579 } 3580 case CXCursor_TypeRef: { 3581 const TypeDecl *Type = getCursorTypeRef(C).first; 3582 assert(Type && "Missing type decl"); 3583 3584 return cxstring::createDup(getCursorContext(C).getTypeDeclType(Type). 3585 getAsString()); 3586 } 3587 case CXCursor_TemplateRef: { 3588 const TemplateDecl *Template = getCursorTemplateRef(C).first; 3589 assert(Template && "Missing template decl"); 3590 3591 return cxstring::createDup(Template->getNameAsString()); 3592 } 3593 3594 case CXCursor_NamespaceRef: { 3595 const NamedDecl *NS = getCursorNamespaceRef(C).first; 3596 assert(NS && "Missing namespace decl"); 3597 3598 return cxstring::createDup(NS->getNameAsString()); 3599 } 3600 3601 case CXCursor_MemberRef: { 3602 const FieldDecl *Field = getCursorMemberRef(C).first; 3603 assert(Field && "Missing member decl"); 3604 3605 return cxstring::createDup(Field->getNameAsString()); 3606 } 3607 3608 case CXCursor_LabelRef: { 3609 const LabelStmt *Label = getCursorLabelRef(C).first; 3610 assert(Label && "Missing label"); 3611 3612 return cxstring::createRef(Label->getName()); 3613 } 3614 3615 case CXCursor_OverloadedDeclRef: { 3616 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 3617 if (const Decl *D = Storage.dyn_cast<const Decl *>()) { 3618 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) 3619 return cxstring::createDup(ND->getNameAsString()); 3620 return cxstring::createEmpty(); 3621 } 3622 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 3623 return cxstring::createDup(E->getName().getAsString()); 3624 OverloadedTemplateStorage *Ovl 3625 = Storage.get<OverloadedTemplateStorage*>(); 3626 if (Ovl->size() == 0) 3627 return cxstring::createEmpty(); 3628 return cxstring::createDup((*Ovl->begin())->getNameAsString()); 3629 } 3630 3631 case CXCursor_VariableRef: { 3632 const VarDecl *Var = getCursorVariableRef(C).first; 3633 assert(Var && "Missing variable decl"); 3634 3635 return cxstring::createDup(Var->getNameAsString()); 3636 } 3637 3638 default: 3639 return cxstring::createRef("<not implemented>"); 3640 } 3641 } 3642 3643 if (clang_isExpression(C.kind)) { 3644 const Expr *E = getCursorExpr(C); 3645 3646 if (C.kind == CXCursor_ObjCStringLiteral || 3647 C.kind == CXCursor_StringLiteral) { 3648 const StringLiteral *SLit; 3649 if (const ObjCStringLiteral *OSL = dyn_cast<ObjCStringLiteral>(E)) { 3650 SLit = OSL->getString(); 3651 } else { 3652 SLit = cast<StringLiteral>(E); 3653 } 3654 SmallString<256> Buf; 3655 llvm::raw_svector_ostream OS(Buf); 3656 SLit->outputString(OS); 3657 return cxstring::createDup(OS.str()); 3658 } 3659 3660 const Decl *D = getDeclFromExpr(getCursorExpr(C)); 3661 if (D) 3662 return getDeclSpelling(D); 3663 return cxstring::createEmpty(); 3664 } 3665 3666 if (clang_isStatement(C.kind)) { 3667 const Stmt *S = getCursorStmt(C); 3668 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) 3669 return cxstring::createRef(Label->getName()); 3670 3671 return cxstring::createEmpty(); 3672 } 3673 3674 if (C.kind == CXCursor_MacroExpansion) 3675 return cxstring::createRef(getCursorMacroExpansion(C).getName() 3676 ->getNameStart()); 3677 3678 if (C.kind == CXCursor_MacroDefinition) 3679 return cxstring::createRef(getCursorMacroDefinition(C)->getName() 3680 ->getNameStart()); 3681 3682 if (C.kind == CXCursor_InclusionDirective) 3683 return cxstring::createDup(getCursorInclusionDirective(C)->getFileName()); 3684 3685 if (clang_isDeclaration(C.kind)) 3686 return getDeclSpelling(getCursorDecl(C)); 3687 3688 if (C.kind == CXCursor_AnnotateAttr) { 3689 const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C)); 3690 return cxstring::createDup(AA->getAnnotation()); 3691 } 3692 3693 if (C.kind == CXCursor_AsmLabelAttr) { 3694 const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C)); 3695 return cxstring::createDup(AA->getLabel()); 3696 } 3697 3698 if (C.kind == CXCursor_PackedAttr) { 3699 return cxstring::createRef("packed"); 3700 } 3701 3702 return cxstring::createEmpty(); 3703 } 3704 3705 CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C, 3706 unsigned pieceIndex, 3707 unsigned options) { 3708 if (clang_Cursor_isNull(C)) 3709 return clang_getNullRange(); 3710 3711 ASTContext &Ctx = getCursorContext(C); 3712 3713 if (clang_isStatement(C.kind)) { 3714 const Stmt *S = getCursorStmt(C); 3715 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) { 3716 if (pieceIndex > 0) 3717 return clang_getNullRange(); 3718 return cxloc::translateSourceRange(Ctx, Label->getIdentLoc()); 3719 } 3720 3721 return clang_getNullRange(); 3722 } 3723 3724 if (C.kind == CXCursor_ObjCMessageExpr) { 3725 if (const ObjCMessageExpr * 3726 ME = dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) { 3727 if (pieceIndex >= ME->getNumSelectorLocs()) 3728 return clang_getNullRange(); 3729 return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex)); 3730 } 3731 } 3732 3733 if (C.kind == CXCursor_ObjCInstanceMethodDecl || 3734 C.kind == CXCursor_ObjCClassMethodDecl) { 3735 if (const ObjCMethodDecl * 3736 MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) { 3737 if (pieceIndex >= MD->getNumSelectorLocs()) 3738 return clang_getNullRange(); 3739 return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex)); 3740 } 3741 } 3742 3743 if (C.kind == CXCursor_ObjCCategoryDecl || 3744 C.kind == CXCursor_ObjCCategoryImplDecl) { 3745 if (pieceIndex > 0) 3746 return clang_getNullRange(); 3747 if (const ObjCCategoryDecl * 3748 CD = dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C))) 3749 return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc()); 3750 if (const ObjCCategoryImplDecl * 3751 CID = dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C))) 3752 return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc()); 3753 } 3754 3755 if (C.kind == CXCursor_ModuleImportDecl) { 3756 if (pieceIndex > 0) 3757 return clang_getNullRange(); 3758 if (const ImportDecl *ImportD = 3759 dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) { 3760 ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs(); 3761 if (!Locs.empty()) 3762 return cxloc::translateSourceRange(Ctx, 3763 SourceRange(Locs.front(), Locs.back())); 3764 } 3765 return clang_getNullRange(); 3766 } 3767 3768 if (C.kind == CXCursor_CXXMethod || C.kind == CXCursor_Destructor || 3769 C.kind == CXCursor_ConversionFunction) { 3770 if (pieceIndex > 0) 3771 return clang_getNullRange(); 3772 if (const FunctionDecl *FD = 3773 dyn_cast_or_null<FunctionDecl>(getCursorDecl(C))) { 3774 DeclarationNameInfo FunctionName = FD->getNameInfo(); 3775 return cxloc::translateSourceRange(Ctx, FunctionName.getSourceRange()); 3776 } 3777 return clang_getNullRange(); 3778 } 3779 3780 // FIXME: A CXCursor_InclusionDirective should give the location of the 3781 // filename, but we don't keep track of this. 3782 3783 // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation 3784 // but we don't keep track of this. 3785 3786 // FIXME: A CXCursor_AsmLabelAttr should give the location of the label 3787 // but we don't keep track of this. 3788 3789 // Default handling, give the location of the cursor. 3790 3791 if (pieceIndex > 0) 3792 return clang_getNullRange(); 3793 3794 CXSourceLocation CXLoc = clang_getCursorLocation(C); 3795 SourceLocation Loc = cxloc::translateSourceLocation(CXLoc); 3796 return cxloc::translateSourceRange(Ctx, Loc); 3797 } 3798 3799 CXString clang_Cursor_getMangling(CXCursor C) { 3800 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind)) 3801 return cxstring::createEmpty(); 3802 3803 // Mangling only works for functions and variables. 3804 const Decl *D = getCursorDecl(C); 3805 if (!D || !(isa<FunctionDecl>(D) || isa<VarDecl>(D))) 3806 return cxstring::createEmpty(); 3807 3808 // First apply frontend mangling. 3809 const NamedDecl *ND = cast<NamedDecl>(D); 3810 ASTContext &Ctx = ND->getASTContext(); 3811 std::unique_ptr<MangleContext> MC(Ctx.createMangleContext()); 3812 3813 std::string FrontendBuf; 3814 llvm::raw_string_ostream FrontendBufOS(FrontendBuf); 3815 MC->mangleName(ND, FrontendBufOS); 3816 3817 // Now apply backend mangling. 3818 std::unique_ptr<llvm::DataLayout> DL( 3819 new llvm::DataLayout(Ctx.getTargetInfo().getTargetDescription())); 3820 llvm::Mangler BackendMangler(DL.get()); 3821 3822 std::string FinalBuf; 3823 llvm::raw_string_ostream FinalBufOS(FinalBuf); 3824 BackendMangler.getNameWithPrefix(FinalBufOS, 3825 llvm::Twine(FrontendBufOS.str())); 3826 3827 return cxstring::createDup(FinalBufOS.str()); 3828 } 3829 3830 CXString clang_getCursorDisplayName(CXCursor C) { 3831 if (!clang_isDeclaration(C.kind)) 3832 return clang_getCursorSpelling(C); 3833 3834 const Decl *D = getCursorDecl(C); 3835 if (!D) 3836 return cxstring::createEmpty(); 3837 3838 PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy(); 3839 if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D)) 3840 D = FunTmpl->getTemplatedDecl(); 3841 3842 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 3843 SmallString<64> Str; 3844 llvm::raw_svector_ostream OS(Str); 3845 OS << *Function; 3846 if (Function->getPrimaryTemplate()) 3847 OS << "<>"; 3848 OS << "("; 3849 for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) { 3850 if (I) 3851 OS << ", "; 3852 OS << Function->getParamDecl(I)->getType().getAsString(Policy); 3853 } 3854 3855 if (Function->isVariadic()) { 3856 if (Function->getNumParams()) 3857 OS << ", "; 3858 OS << "..."; 3859 } 3860 OS << ")"; 3861 return cxstring::createDup(OS.str()); 3862 } 3863 3864 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) { 3865 SmallString<64> Str; 3866 llvm::raw_svector_ostream OS(Str); 3867 OS << *ClassTemplate; 3868 OS << "<"; 3869 TemplateParameterList *Params = ClassTemplate->getTemplateParameters(); 3870 for (unsigned I = 0, N = Params->size(); I != N; ++I) { 3871 if (I) 3872 OS << ", "; 3873 3874 NamedDecl *Param = Params->getParam(I); 3875 if (Param->getIdentifier()) { 3876 OS << Param->getIdentifier()->getName(); 3877 continue; 3878 } 3879 3880 // There is no parameter name, which makes this tricky. Try to come up 3881 // with something useful that isn't too long. 3882 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 3883 OS << (TTP->wasDeclaredWithTypename()? "typename" : "class"); 3884 else if (NonTypeTemplateParmDecl *NTTP 3885 = dyn_cast<NonTypeTemplateParmDecl>(Param)) 3886 OS << NTTP->getType().getAsString(Policy); 3887 else 3888 OS << "template<...> class"; 3889 } 3890 3891 OS << ">"; 3892 return cxstring::createDup(OS.str()); 3893 } 3894 3895 if (const ClassTemplateSpecializationDecl *ClassSpec 3896 = dyn_cast<ClassTemplateSpecializationDecl>(D)) { 3897 // If the type was explicitly written, use that. 3898 if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten()) 3899 return cxstring::createDup(TSInfo->getType().getAsString(Policy)); 3900 3901 SmallString<128> Str; 3902 llvm::raw_svector_ostream OS(Str); 3903 OS << *ClassSpec; 3904 TemplateSpecializationType::PrintTemplateArgumentList(OS, 3905 ClassSpec->getTemplateArgs().data(), 3906 ClassSpec->getTemplateArgs().size(), 3907 Policy); 3908 return cxstring::createDup(OS.str()); 3909 } 3910 3911 return clang_getCursorSpelling(C); 3912 } 3913 3914 CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { 3915 switch (Kind) { 3916 case CXCursor_FunctionDecl: 3917 return cxstring::createRef("FunctionDecl"); 3918 case CXCursor_TypedefDecl: 3919 return cxstring::createRef("TypedefDecl"); 3920 case CXCursor_EnumDecl: 3921 return cxstring::createRef("EnumDecl"); 3922 case CXCursor_EnumConstantDecl: 3923 return cxstring::createRef("EnumConstantDecl"); 3924 case CXCursor_StructDecl: 3925 return cxstring::createRef("StructDecl"); 3926 case CXCursor_UnionDecl: 3927 return cxstring::createRef("UnionDecl"); 3928 case CXCursor_ClassDecl: 3929 return cxstring::createRef("ClassDecl"); 3930 case CXCursor_FieldDecl: 3931 return cxstring::createRef("FieldDecl"); 3932 case CXCursor_VarDecl: 3933 return cxstring::createRef("VarDecl"); 3934 case CXCursor_ParmDecl: 3935 return cxstring::createRef("ParmDecl"); 3936 case CXCursor_ObjCInterfaceDecl: 3937 return cxstring::createRef("ObjCInterfaceDecl"); 3938 case CXCursor_ObjCCategoryDecl: 3939 return cxstring::createRef("ObjCCategoryDecl"); 3940 case CXCursor_ObjCProtocolDecl: 3941 return cxstring::createRef("ObjCProtocolDecl"); 3942 case CXCursor_ObjCPropertyDecl: 3943 return cxstring::createRef("ObjCPropertyDecl"); 3944 case CXCursor_ObjCIvarDecl: 3945 return cxstring::createRef("ObjCIvarDecl"); 3946 case CXCursor_ObjCInstanceMethodDecl: 3947 return cxstring::createRef("ObjCInstanceMethodDecl"); 3948 case CXCursor_ObjCClassMethodDecl: 3949 return cxstring::createRef("ObjCClassMethodDecl"); 3950 case CXCursor_ObjCImplementationDecl: 3951 return cxstring::createRef("ObjCImplementationDecl"); 3952 case CXCursor_ObjCCategoryImplDecl: 3953 return cxstring::createRef("ObjCCategoryImplDecl"); 3954 case CXCursor_CXXMethod: 3955 return cxstring::createRef("CXXMethod"); 3956 case CXCursor_UnexposedDecl: 3957 return cxstring::createRef("UnexposedDecl"); 3958 case CXCursor_ObjCSuperClassRef: 3959 return cxstring::createRef("ObjCSuperClassRef"); 3960 case CXCursor_ObjCProtocolRef: 3961 return cxstring::createRef("ObjCProtocolRef"); 3962 case CXCursor_ObjCClassRef: 3963 return cxstring::createRef("ObjCClassRef"); 3964 case CXCursor_TypeRef: 3965 return cxstring::createRef("TypeRef"); 3966 case CXCursor_TemplateRef: 3967 return cxstring::createRef("TemplateRef"); 3968 case CXCursor_NamespaceRef: 3969 return cxstring::createRef("NamespaceRef"); 3970 case CXCursor_MemberRef: 3971 return cxstring::createRef("MemberRef"); 3972 case CXCursor_LabelRef: 3973 return cxstring::createRef("LabelRef"); 3974 case CXCursor_OverloadedDeclRef: 3975 return cxstring::createRef("OverloadedDeclRef"); 3976 case CXCursor_VariableRef: 3977 return cxstring::createRef("VariableRef"); 3978 case CXCursor_IntegerLiteral: 3979 return cxstring::createRef("IntegerLiteral"); 3980 case CXCursor_FloatingLiteral: 3981 return cxstring::createRef("FloatingLiteral"); 3982 case CXCursor_ImaginaryLiteral: 3983 return cxstring::createRef("ImaginaryLiteral"); 3984 case CXCursor_StringLiteral: 3985 return cxstring::createRef("StringLiteral"); 3986 case CXCursor_CharacterLiteral: 3987 return cxstring::createRef("CharacterLiteral"); 3988 case CXCursor_ParenExpr: 3989 return cxstring::createRef("ParenExpr"); 3990 case CXCursor_UnaryOperator: 3991 return cxstring::createRef("UnaryOperator"); 3992 case CXCursor_ArraySubscriptExpr: 3993 return cxstring::createRef("ArraySubscriptExpr"); 3994 case CXCursor_BinaryOperator: 3995 return cxstring::createRef("BinaryOperator"); 3996 case CXCursor_CompoundAssignOperator: 3997 return cxstring::createRef("CompoundAssignOperator"); 3998 case CXCursor_ConditionalOperator: 3999 return cxstring::createRef("ConditionalOperator"); 4000 case CXCursor_CStyleCastExpr: 4001 return cxstring::createRef("CStyleCastExpr"); 4002 case CXCursor_CompoundLiteralExpr: 4003 return cxstring::createRef("CompoundLiteralExpr"); 4004 case CXCursor_InitListExpr: 4005 return cxstring::createRef("InitListExpr"); 4006 case CXCursor_AddrLabelExpr: 4007 return cxstring::createRef("AddrLabelExpr"); 4008 case CXCursor_StmtExpr: 4009 return cxstring::createRef("StmtExpr"); 4010 case CXCursor_GenericSelectionExpr: 4011 return cxstring::createRef("GenericSelectionExpr"); 4012 case CXCursor_GNUNullExpr: 4013 return cxstring::createRef("GNUNullExpr"); 4014 case CXCursor_CXXStaticCastExpr: 4015 return cxstring::createRef("CXXStaticCastExpr"); 4016 case CXCursor_CXXDynamicCastExpr: 4017 return cxstring::createRef("CXXDynamicCastExpr"); 4018 case CXCursor_CXXReinterpretCastExpr: 4019 return cxstring::createRef("CXXReinterpretCastExpr"); 4020 case CXCursor_CXXConstCastExpr: 4021 return cxstring::createRef("CXXConstCastExpr"); 4022 case CXCursor_CXXFunctionalCastExpr: 4023 return cxstring::createRef("CXXFunctionalCastExpr"); 4024 case CXCursor_CXXTypeidExpr: 4025 return cxstring::createRef("CXXTypeidExpr"); 4026 case CXCursor_CXXBoolLiteralExpr: 4027 return cxstring::createRef("CXXBoolLiteralExpr"); 4028 case CXCursor_CXXNullPtrLiteralExpr: 4029 return cxstring::createRef("CXXNullPtrLiteralExpr"); 4030 case CXCursor_CXXThisExpr: 4031 return cxstring::createRef("CXXThisExpr"); 4032 case CXCursor_CXXThrowExpr: 4033 return cxstring::createRef("CXXThrowExpr"); 4034 case CXCursor_CXXNewExpr: 4035 return cxstring::createRef("CXXNewExpr"); 4036 case CXCursor_CXXDeleteExpr: 4037 return cxstring::createRef("CXXDeleteExpr"); 4038 case CXCursor_UnaryExpr: 4039 return cxstring::createRef("UnaryExpr"); 4040 case CXCursor_ObjCStringLiteral: 4041 return cxstring::createRef("ObjCStringLiteral"); 4042 case CXCursor_ObjCBoolLiteralExpr: 4043 return cxstring::createRef("ObjCBoolLiteralExpr"); 4044 case CXCursor_ObjCSelfExpr: 4045 return cxstring::createRef("ObjCSelfExpr"); 4046 case CXCursor_ObjCEncodeExpr: 4047 return cxstring::createRef("ObjCEncodeExpr"); 4048 case CXCursor_ObjCSelectorExpr: 4049 return cxstring::createRef("ObjCSelectorExpr"); 4050 case CXCursor_ObjCProtocolExpr: 4051 return cxstring::createRef("ObjCProtocolExpr"); 4052 case CXCursor_ObjCBridgedCastExpr: 4053 return cxstring::createRef("ObjCBridgedCastExpr"); 4054 case CXCursor_BlockExpr: 4055 return cxstring::createRef("BlockExpr"); 4056 case CXCursor_PackExpansionExpr: 4057 return cxstring::createRef("PackExpansionExpr"); 4058 case CXCursor_SizeOfPackExpr: 4059 return cxstring::createRef("SizeOfPackExpr"); 4060 case CXCursor_LambdaExpr: 4061 return cxstring::createRef("LambdaExpr"); 4062 case CXCursor_UnexposedExpr: 4063 return cxstring::createRef("UnexposedExpr"); 4064 case CXCursor_DeclRefExpr: 4065 return cxstring::createRef("DeclRefExpr"); 4066 case CXCursor_MemberRefExpr: 4067 return cxstring::createRef("MemberRefExpr"); 4068 case CXCursor_CallExpr: 4069 return cxstring::createRef("CallExpr"); 4070 case CXCursor_ObjCMessageExpr: 4071 return cxstring::createRef("ObjCMessageExpr"); 4072 case CXCursor_UnexposedStmt: 4073 return cxstring::createRef("UnexposedStmt"); 4074 case CXCursor_DeclStmt: 4075 return cxstring::createRef("DeclStmt"); 4076 case CXCursor_LabelStmt: 4077 return cxstring::createRef("LabelStmt"); 4078 case CXCursor_CompoundStmt: 4079 return cxstring::createRef("CompoundStmt"); 4080 case CXCursor_CaseStmt: 4081 return cxstring::createRef("CaseStmt"); 4082 case CXCursor_DefaultStmt: 4083 return cxstring::createRef("DefaultStmt"); 4084 case CXCursor_IfStmt: 4085 return cxstring::createRef("IfStmt"); 4086 case CXCursor_SwitchStmt: 4087 return cxstring::createRef("SwitchStmt"); 4088 case CXCursor_WhileStmt: 4089 return cxstring::createRef("WhileStmt"); 4090 case CXCursor_DoStmt: 4091 return cxstring::createRef("DoStmt"); 4092 case CXCursor_ForStmt: 4093 return cxstring::createRef("ForStmt"); 4094 case CXCursor_GotoStmt: 4095 return cxstring::createRef("GotoStmt"); 4096 case CXCursor_IndirectGotoStmt: 4097 return cxstring::createRef("IndirectGotoStmt"); 4098 case CXCursor_ContinueStmt: 4099 return cxstring::createRef("ContinueStmt"); 4100 case CXCursor_BreakStmt: 4101 return cxstring::createRef("BreakStmt"); 4102 case CXCursor_ReturnStmt: 4103 return cxstring::createRef("ReturnStmt"); 4104 case CXCursor_GCCAsmStmt: 4105 return cxstring::createRef("GCCAsmStmt"); 4106 case CXCursor_MSAsmStmt: 4107 return cxstring::createRef("MSAsmStmt"); 4108 case CXCursor_ObjCAtTryStmt: 4109 return cxstring::createRef("ObjCAtTryStmt"); 4110 case CXCursor_ObjCAtCatchStmt: 4111 return cxstring::createRef("ObjCAtCatchStmt"); 4112 case CXCursor_ObjCAtFinallyStmt: 4113 return cxstring::createRef("ObjCAtFinallyStmt"); 4114 case CXCursor_ObjCAtThrowStmt: 4115 return cxstring::createRef("ObjCAtThrowStmt"); 4116 case CXCursor_ObjCAtSynchronizedStmt: 4117 return cxstring::createRef("ObjCAtSynchronizedStmt"); 4118 case CXCursor_ObjCAutoreleasePoolStmt: 4119 return cxstring::createRef("ObjCAutoreleasePoolStmt"); 4120 case CXCursor_ObjCForCollectionStmt: 4121 return cxstring::createRef("ObjCForCollectionStmt"); 4122 case CXCursor_CXXCatchStmt: 4123 return cxstring::createRef("CXXCatchStmt"); 4124 case CXCursor_CXXTryStmt: 4125 return cxstring::createRef("CXXTryStmt"); 4126 case CXCursor_CXXForRangeStmt: 4127 return cxstring::createRef("CXXForRangeStmt"); 4128 case CXCursor_SEHTryStmt: 4129 return cxstring::createRef("SEHTryStmt"); 4130 case CXCursor_SEHExceptStmt: 4131 return cxstring::createRef("SEHExceptStmt"); 4132 case CXCursor_SEHFinallyStmt: 4133 return cxstring::createRef("SEHFinallyStmt"); 4134 case CXCursor_SEHLeaveStmt: 4135 return cxstring::createRef("SEHLeaveStmt"); 4136 case CXCursor_NullStmt: 4137 return cxstring::createRef("NullStmt"); 4138 case CXCursor_InvalidFile: 4139 return cxstring::createRef("InvalidFile"); 4140 case CXCursor_InvalidCode: 4141 return cxstring::createRef("InvalidCode"); 4142 case CXCursor_NoDeclFound: 4143 return cxstring::createRef("NoDeclFound"); 4144 case CXCursor_NotImplemented: 4145 return cxstring::createRef("NotImplemented"); 4146 case CXCursor_TranslationUnit: 4147 return cxstring::createRef("TranslationUnit"); 4148 case CXCursor_UnexposedAttr: 4149 return cxstring::createRef("UnexposedAttr"); 4150 case CXCursor_IBActionAttr: 4151 return cxstring::createRef("attribute(ibaction)"); 4152 case CXCursor_IBOutletAttr: 4153 return cxstring::createRef("attribute(iboutlet)"); 4154 case CXCursor_IBOutletCollectionAttr: 4155 return cxstring::createRef("attribute(iboutletcollection)"); 4156 case CXCursor_CXXFinalAttr: 4157 return cxstring::createRef("attribute(final)"); 4158 case CXCursor_CXXOverrideAttr: 4159 return cxstring::createRef("attribute(override)"); 4160 case CXCursor_AnnotateAttr: 4161 return cxstring::createRef("attribute(annotate)"); 4162 case CXCursor_AsmLabelAttr: 4163 return cxstring::createRef("asm label"); 4164 case CXCursor_PackedAttr: 4165 return cxstring::createRef("attribute(packed)"); 4166 case CXCursor_PureAttr: 4167 return cxstring::createRef("attribute(pure)"); 4168 case CXCursor_ConstAttr: 4169 return cxstring::createRef("attribute(const)"); 4170 case CXCursor_NoDuplicateAttr: 4171 return cxstring::createRef("attribute(noduplicate)"); 4172 case CXCursor_CUDAConstantAttr: 4173 return cxstring::createRef("attribute(constant)"); 4174 case CXCursor_CUDADeviceAttr: 4175 return cxstring::createRef("attribute(device)"); 4176 case CXCursor_CUDAGlobalAttr: 4177 return cxstring::createRef("attribute(global)"); 4178 case CXCursor_CUDAHostAttr: 4179 return cxstring::createRef("attribute(host)"); 4180 case CXCursor_CUDASharedAttr: 4181 return cxstring::createRef("attribute(shared)"); 4182 case CXCursor_PreprocessingDirective: 4183 return cxstring::createRef("preprocessing directive"); 4184 case CXCursor_MacroDefinition: 4185 return cxstring::createRef("macro definition"); 4186 case CXCursor_MacroExpansion: 4187 return cxstring::createRef("macro expansion"); 4188 case CXCursor_InclusionDirective: 4189 return cxstring::createRef("inclusion directive"); 4190 case CXCursor_Namespace: 4191 return cxstring::createRef("Namespace"); 4192 case CXCursor_LinkageSpec: 4193 return cxstring::createRef("LinkageSpec"); 4194 case CXCursor_CXXBaseSpecifier: 4195 return cxstring::createRef("C++ base class specifier"); 4196 case CXCursor_Constructor: 4197 return cxstring::createRef("CXXConstructor"); 4198 case CXCursor_Destructor: 4199 return cxstring::createRef("CXXDestructor"); 4200 case CXCursor_ConversionFunction: 4201 return cxstring::createRef("CXXConversion"); 4202 case CXCursor_TemplateTypeParameter: 4203 return cxstring::createRef("TemplateTypeParameter"); 4204 case CXCursor_NonTypeTemplateParameter: 4205 return cxstring::createRef("NonTypeTemplateParameter"); 4206 case CXCursor_TemplateTemplateParameter: 4207 return cxstring::createRef("TemplateTemplateParameter"); 4208 case CXCursor_FunctionTemplate: 4209 return cxstring::createRef("FunctionTemplate"); 4210 case CXCursor_ClassTemplate: 4211 return cxstring::createRef("ClassTemplate"); 4212 case CXCursor_ClassTemplatePartialSpecialization: 4213 return cxstring::createRef("ClassTemplatePartialSpecialization"); 4214 case CXCursor_NamespaceAlias: 4215 return cxstring::createRef("NamespaceAlias"); 4216 case CXCursor_UsingDirective: 4217 return cxstring::createRef("UsingDirective"); 4218 case CXCursor_UsingDeclaration: 4219 return cxstring::createRef("UsingDeclaration"); 4220 case CXCursor_TypeAliasDecl: 4221 return cxstring::createRef("TypeAliasDecl"); 4222 case CXCursor_ObjCSynthesizeDecl: 4223 return cxstring::createRef("ObjCSynthesizeDecl"); 4224 case CXCursor_ObjCDynamicDecl: 4225 return cxstring::createRef("ObjCDynamicDecl"); 4226 case CXCursor_CXXAccessSpecifier: 4227 return cxstring::createRef("CXXAccessSpecifier"); 4228 case CXCursor_ModuleImportDecl: 4229 return cxstring::createRef("ModuleImport"); 4230 case CXCursor_OMPParallelDirective: 4231 return cxstring::createRef("OMPParallelDirective"); 4232 case CXCursor_OMPSimdDirective: 4233 return cxstring::createRef("OMPSimdDirective"); 4234 case CXCursor_OMPForDirective: 4235 return cxstring::createRef("OMPForDirective"); 4236 case CXCursor_OMPForSimdDirective: 4237 return cxstring::createRef("OMPForSimdDirective"); 4238 case CXCursor_OMPSectionsDirective: 4239 return cxstring::createRef("OMPSectionsDirective"); 4240 case CXCursor_OMPSectionDirective: 4241 return cxstring::createRef("OMPSectionDirective"); 4242 case CXCursor_OMPSingleDirective: 4243 return cxstring::createRef("OMPSingleDirective"); 4244 case CXCursor_OMPMasterDirective: 4245 return cxstring::createRef("OMPMasterDirective"); 4246 case CXCursor_OMPCriticalDirective: 4247 return cxstring::createRef("OMPCriticalDirective"); 4248 case CXCursor_OMPParallelForDirective: 4249 return cxstring::createRef("OMPParallelForDirective"); 4250 case CXCursor_OMPParallelForSimdDirective: 4251 return cxstring::createRef("OMPParallelForSimdDirective"); 4252 case CXCursor_OMPParallelSectionsDirective: 4253 return cxstring::createRef("OMPParallelSectionsDirective"); 4254 case CXCursor_OMPTaskDirective: 4255 return cxstring::createRef("OMPTaskDirective"); 4256 case CXCursor_OMPTaskyieldDirective: 4257 return cxstring::createRef("OMPTaskyieldDirective"); 4258 case CXCursor_OMPBarrierDirective: 4259 return cxstring::createRef("OMPBarrierDirective"); 4260 case CXCursor_OMPTaskwaitDirective: 4261 return cxstring::createRef("OMPTaskwaitDirective"); 4262 case CXCursor_OMPFlushDirective: 4263 return cxstring::createRef("OMPFlushDirective"); 4264 case CXCursor_OMPOrderedDirective: 4265 return cxstring::createRef("OMPOrderedDirective"); 4266 case CXCursor_OMPAtomicDirective: 4267 return cxstring::createRef("OMPAtomicDirective"); 4268 case CXCursor_OMPTargetDirective: 4269 return cxstring::createRef("OMPTargetDirective"); 4270 case CXCursor_OMPTeamsDirective: 4271 return cxstring::createRef("OMPTeamsDirective"); 4272 case CXCursor_OverloadCandidate: 4273 return cxstring::createRef("OverloadCandidate"); 4274 } 4275 4276 llvm_unreachable("Unhandled CXCursorKind"); 4277 } 4278 4279 struct GetCursorData { 4280 SourceLocation TokenBeginLoc; 4281 bool PointsAtMacroArgExpansion; 4282 bool VisitedObjCPropertyImplDecl; 4283 SourceLocation VisitedDeclaratorDeclStartLoc; 4284 CXCursor &BestCursor; 4285 4286 GetCursorData(SourceManager &SM, 4287 SourceLocation tokenBegin, CXCursor &outputCursor) 4288 : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) { 4289 PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin); 4290 VisitedObjCPropertyImplDecl = false; 4291 } 4292 }; 4293 4294 static enum CXChildVisitResult GetCursorVisitor(CXCursor cursor, 4295 CXCursor parent, 4296 CXClientData client_data) { 4297 GetCursorData *Data = static_cast<GetCursorData *>(client_data); 4298 CXCursor *BestCursor = &Data->BestCursor; 4299 4300 // If we point inside a macro argument we should provide info of what the 4301 // token is so use the actual cursor, don't replace it with a macro expansion 4302 // cursor. 4303 if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion) 4304 return CXChildVisit_Recurse; 4305 4306 if (clang_isDeclaration(cursor.kind)) { 4307 // Avoid having the implicit methods override the property decls. 4308 if (const ObjCMethodDecl *MD 4309 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) { 4310 if (MD->isImplicit()) 4311 return CXChildVisit_Break; 4312 4313 } else if (const ObjCInterfaceDecl *ID 4314 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) { 4315 // Check that when we have multiple @class references in the same line, 4316 // that later ones do not override the previous ones. 4317 // If we have: 4318 // @class Foo, Bar; 4319 // source ranges for both start at '@', so 'Bar' will end up overriding 4320 // 'Foo' even though the cursor location was at 'Foo'. 4321 if (BestCursor->kind == CXCursor_ObjCInterfaceDecl || 4322 BestCursor->kind == CXCursor_ObjCClassRef) 4323 if (const ObjCInterfaceDecl *PrevID 4324 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(*BestCursor))){ 4325 if (PrevID != ID && 4326 !PrevID->isThisDeclarationADefinition() && 4327 !ID->isThisDeclarationADefinition()) 4328 return CXChildVisit_Break; 4329 } 4330 4331 } else if (const DeclaratorDecl *DD 4332 = dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) { 4333 SourceLocation StartLoc = DD->getSourceRange().getBegin(); 4334 // Check that when we have multiple declarators in the same line, 4335 // that later ones do not override the previous ones. 4336 // If we have: 4337 // int Foo, Bar; 4338 // source ranges for both start at 'int', so 'Bar' will end up overriding 4339 // 'Foo' even though the cursor location was at 'Foo'. 4340 if (Data->VisitedDeclaratorDeclStartLoc == StartLoc) 4341 return CXChildVisit_Break; 4342 Data->VisitedDeclaratorDeclStartLoc = StartLoc; 4343 4344 } else if (const ObjCPropertyImplDecl *PropImp 4345 = dyn_cast_or_null<ObjCPropertyImplDecl>(getCursorDecl(cursor))) { 4346 (void)PropImp; 4347 // Check that when we have multiple @synthesize in the same line, 4348 // that later ones do not override the previous ones. 4349 // If we have: 4350 // @synthesize Foo, Bar; 4351 // source ranges for both start at '@', so 'Bar' will end up overriding 4352 // 'Foo' even though the cursor location was at 'Foo'. 4353 if (Data->VisitedObjCPropertyImplDecl) 4354 return CXChildVisit_Break; 4355 Data->VisitedObjCPropertyImplDecl = true; 4356 } 4357 } 4358 4359 if (clang_isExpression(cursor.kind) && 4360 clang_isDeclaration(BestCursor->kind)) { 4361 if (const Decl *D = getCursorDecl(*BestCursor)) { 4362 // Avoid having the cursor of an expression replace the declaration cursor 4363 // when the expression source range overlaps the declaration range. 4364 // This can happen for C++ constructor expressions whose range generally 4365 // include the variable declaration, e.g.: 4366 // MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor. 4367 if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() && 4368 D->getLocation() == Data->TokenBeginLoc) 4369 return CXChildVisit_Break; 4370 } 4371 } 4372 4373 // If our current best cursor is the construction of a temporary object, 4374 // don't replace that cursor with a type reference, because we want 4375 // clang_getCursor() to point at the constructor. 4376 if (clang_isExpression(BestCursor->kind) && 4377 isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) && 4378 cursor.kind == CXCursor_TypeRef) { 4379 // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it 4380 // as having the actual point on the type reference. 4381 *BestCursor = getTypeRefedCallExprCursor(*BestCursor); 4382 return CXChildVisit_Recurse; 4383 } 4384 4385 *BestCursor = cursor; 4386 return CXChildVisit_Recurse; 4387 } 4388 4389 CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) { 4390 if (isNotUsableTU(TU)) { 4391 LOG_BAD_TU(TU); 4392 return clang_getNullCursor(); 4393 } 4394 4395 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4396 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 4397 4398 SourceLocation SLoc = cxloc::translateSourceLocation(Loc); 4399 CXCursor Result = cxcursor::getCursor(TU, SLoc); 4400 4401 LOG_FUNC_SECTION { 4402 CXFile SearchFile; 4403 unsigned SearchLine, SearchColumn; 4404 CXFile ResultFile; 4405 unsigned ResultLine, ResultColumn; 4406 CXString SearchFileName, ResultFileName, KindSpelling, USR; 4407 const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : ""; 4408 CXSourceLocation ResultLoc = clang_getCursorLocation(Result); 4409 4410 clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 4411 nullptr); 4412 clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine, 4413 &ResultColumn, nullptr); 4414 SearchFileName = clang_getFileName(SearchFile); 4415 ResultFileName = clang_getFileName(ResultFile); 4416 KindSpelling = clang_getCursorKindSpelling(Result.kind); 4417 USR = clang_getCursorUSR(Result); 4418 *Log << llvm::format("(%s:%d:%d) = %s", 4419 clang_getCString(SearchFileName), SearchLine, SearchColumn, 4420 clang_getCString(KindSpelling)) 4421 << llvm::format("(%s:%d:%d):%s%s", 4422 clang_getCString(ResultFileName), ResultLine, ResultColumn, 4423 clang_getCString(USR), IsDef); 4424 clang_disposeString(SearchFileName); 4425 clang_disposeString(ResultFileName); 4426 clang_disposeString(KindSpelling); 4427 clang_disposeString(USR); 4428 4429 CXCursor Definition = clang_getCursorDefinition(Result); 4430 if (!clang_equalCursors(Definition, clang_getNullCursor())) { 4431 CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition); 4432 CXString DefinitionKindSpelling 4433 = clang_getCursorKindSpelling(Definition.kind); 4434 CXFile DefinitionFile; 4435 unsigned DefinitionLine, DefinitionColumn; 4436 clang_getFileLocation(DefinitionLoc, &DefinitionFile, 4437 &DefinitionLine, &DefinitionColumn, nullptr); 4438 CXString DefinitionFileName = clang_getFileName(DefinitionFile); 4439 *Log << llvm::format(" -> %s(%s:%d:%d)", 4440 clang_getCString(DefinitionKindSpelling), 4441 clang_getCString(DefinitionFileName), 4442 DefinitionLine, DefinitionColumn); 4443 clang_disposeString(DefinitionFileName); 4444 clang_disposeString(DefinitionKindSpelling); 4445 } 4446 } 4447 4448 return Result; 4449 } 4450 4451 CXCursor clang_getNullCursor(void) { 4452 return MakeCXCursorInvalid(CXCursor_InvalidFile); 4453 } 4454 4455 unsigned clang_equalCursors(CXCursor X, CXCursor Y) { 4456 // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we 4457 // can't set consistently. For example, when visiting a DeclStmt we will set 4458 // it but we don't set it on the result of clang_getCursorDefinition for 4459 // a reference of the same declaration. 4460 // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works 4461 // when visiting a DeclStmt currently, the AST should be enhanced to be able 4462 // to provide that kind of info. 4463 if (clang_isDeclaration(X.kind)) 4464 X.data[1] = nullptr; 4465 if (clang_isDeclaration(Y.kind)) 4466 Y.data[1] = nullptr; 4467 4468 return X == Y; 4469 } 4470 4471 unsigned clang_hashCursor(CXCursor C) { 4472 unsigned Index = 0; 4473 if (clang_isExpression(C.kind) || clang_isStatement(C.kind)) 4474 Index = 1; 4475 4476 return llvm::DenseMapInfo<std::pair<unsigned, const void*> >::getHashValue( 4477 std::make_pair(C.kind, C.data[Index])); 4478 } 4479 4480 unsigned clang_isInvalid(enum CXCursorKind K) { 4481 return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid; 4482 } 4483 4484 unsigned clang_isDeclaration(enum CXCursorKind K) { 4485 return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) || 4486 (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl); 4487 } 4488 4489 unsigned clang_isReference(enum CXCursorKind K) { 4490 return K >= CXCursor_FirstRef && K <= CXCursor_LastRef; 4491 } 4492 4493 unsigned clang_isExpression(enum CXCursorKind K) { 4494 return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr; 4495 } 4496 4497 unsigned clang_isStatement(enum CXCursorKind K) { 4498 return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt; 4499 } 4500 4501 unsigned clang_isAttribute(enum CXCursorKind K) { 4502 return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr; 4503 } 4504 4505 unsigned clang_isTranslationUnit(enum CXCursorKind K) { 4506 return K == CXCursor_TranslationUnit; 4507 } 4508 4509 unsigned clang_isPreprocessing(enum CXCursorKind K) { 4510 return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing; 4511 } 4512 4513 unsigned clang_isUnexposed(enum CXCursorKind K) { 4514 switch (K) { 4515 case CXCursor_UnexposedDecl: 4516 case CXCursor_UnexposedExpr: 4517 case CXCursor_UnexposedStmt: 4518 case CXCursor_UnexposedAttr: 4519 return true; 4520 default: 4521 return false; 4522 } 4523 } 4524 4525 CXCursorKind clang_getCursorKind(CXCursor C) { 4526 return C.kind; 4527 } 4528 4529 CXSourceLocation clang_getCursorLocation(CXCursor C) { 4530 if (clang_isReference(C.kind)) { 4531 switch (C.kind) { 4532 case CXCursor_ObjCSuperClassRef: { 4533 std::pair<const ObjCInterfaceDecl *, SourceLocation> P 4534 = getCursorObjCSuperClassRef(C); 4535 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 4536 } 4537 4538 case CXCursor_ObjCProtocolRef: { 4539 std::pair<const ObjCProtocolDecl *, SourceLocation> P 4540 = getCursorObjCProtocolRef(C); 4541 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 4542 } 4543 4544 case CXCursor_ObjCClassRef: { 4545 std::pair<const ObjCInterfaceDecl *, SourceLocation> P 4546 = getCursorObjCClassRef(C); 4547 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 4548 } 4549 4550 case CXCursor_TypeRef: { 4551 std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C); 4552 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 4553 } 4554 4555 case CXCursor_TemplateRef: { 4556 std::pair<const TemplateDecl *, SourceLocation> P = 4557 getCursorTemplateRef(C); 4558 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 4559 } 4560 4561 case CXCursor_NamespaceRef: { 4562 std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C); 4563 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 4564 } 4565 4566 case CXCursor_MemberRef: { 4567 std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C); 4568 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 4569 } 4570 4571 case CXCursor_VariableRef: { 4572 std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C); 4573 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 4574 } 4575 4576 case CXCursor_CXXBaseSpecifier: { 4577 const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C); 4578 if (!BaseSpec) 4579 return clang_getNullLocation(); 4580 4581 if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo()) 4582 return cxloc::translateSourceLocation(getCursorContext(C), 4583 TSInfo->getTypeLoc().getBeginLoc()); 4584 4585 return cxloc::translateSourceLocation(getCursorContext(C), 4586 BaseSpec->getLocStart()); 4587 } 4588 4589 case CXCursor_LabelRef: { 4590 std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C); 4591 return cxloc::translateSourceLocation(getCursorContext(C), P.second); 4592 } 4593 4594 case CXCursor_OverloadedDeclRef: 4595 return cxloc::translateSourceLocation(getCursorContext(C), 4596 getCursorOverloadedDeclRef(C).second); 4597 4598 default: 4599 // FIXME: Need a way to enumerate all non-reference cases. 4600 llvm_unreachable("Missed a reference kind"); 4601 } 4602 } 4603 4604 if (clang_isExpression(C.kind)) 4605 return cxloc::translateSourceLocation(getCursorContext(C), 4606 getLocationFromExpr(getCursorExpr(C))); 4607 4608 if (clang_isStatement(C.kind)) 4609 return cxloc::translateSourceLocation(getCursorContext(C), 4610 getCursorStmt(C)->getLocStart()); 4611 4612 if (C.kind == CXCursor_PreprocessingDirective) { 4613 SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin(); 4614 return cxloc::translateSourceLocation(getCursorContext(C), L); 4615 } 4616 4617 if (C.kind == CXCursor_MacroExpansion) { 4618 SourceLocation L 4619 = cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin(); 4620 return cxloc::translateSourceLocation(getCursorContext(C), L); 4621 } 4622 4623 if (C.kind == CXCursor_MacroDefinition) { 4624 SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation(); 4625 return cxloc::translateSourceLocation(getCursorContext(C), L); 4626 } 4627 4628 if (C.kind == CXCursor_InclusionDirective) { 4629 SourceLocation L 4630 = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin(); 4631 return cxloc::translateSourceLocation(getCursorContext(C), L); 4632 } 4633 4634 if (clang_isAttribute(C.kind)) { 4635 SourceLocation L 4636 = cxcursor::getCursorAttr(C)->getLocation(); 4637 return cxloc::translateSourceLocation(getCursorContext(C), L); 4638 } 4639 4640 if (!clang_isDeclaration(C.kind)) 4641 return clang_getNullLocation(); 4642 4643 const Decl *D = getCursorDecl(C); 4644 if (!D) 4645 return clang_getNullLocation(); 4646 4647 SourceLocation Loc = D->getLocation(); 4648 // FIXME: Multiple variables declared in a single declaration 4649 // currently lack the information needed to correctly determine their 4650 // ranges when accounting for the type-specifier. We use context 4651 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 4652 // and if so, whether it is the first decl. 4653 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 4654 if (!cxcursor::isFirstInDeclGroup(C)) 4655 Loc = VD->getLocation(); 4656 } 4657 4658 // For ObjC methods, give the start location of the method name. 4659 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 4660 Loc = MD->getSelectorStartLoc(); 4661 4662 return cxloc::translateSourceLocation(getCursorContext(C), Loc); 4663 } 4664 4665 } // end extern "C" 4666 4667 CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) { 4668 assert(TU); 4669 4670 // Guard against an invalid SourceLocation, or we may assert in one 4671 // of the following calls. 4672 if (SLoc.isInvalid()) 4673 return clang_getNullCursor(); 4674 4675 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 4676 4677 // Translate the given source location to make it point at the beginning of 4678 // the token under the cursor. 4679 SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(), 4680 CXXUnit->getASTContext().getLangOpts()); 4681 4682 CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound); 4683 if (SLoc.isValid()) { 4684 GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result); 4685 CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData, 4686 /*VisitPreprocessorLast=*/true, 4687 /*VisitIncludedEntities=*/false, 4688 SourceLocation(SLoc)); 4689 CursorVis.visitFileRegion(); 4690 } 4691 4692 return Result; 4693 } 4694 4695 static SourceRange getRawCursorExtent(CXCursor C) { 4696 if (clang_isReference(C.kind)) { 4697 switch (C.kind) { 4698 case CXCursor_ObjCSuperClassRef: 4699 return getCursorObjCSuperClassRef(C).second; 4700 4701 case CXCursor_ObjCProtocolRef: 4702 return getCursorObjCProtocolRef(C).second; 4703 4704 case CXCursor_ObjCClassRef: 4705 return getCursorObjCClassRef(C).second; 4706 4707 case CXCursor_TypeRef: 4708 return getCursorTypeRef(C).second; 4709 4710 case CXCursor_TemplateRef: 4711 return getCursorTemplateRef(C).second; 4712 4713 case CXCursor_NamespaceRef: 4714 return getCursorNamespaceRef(C).second; 4715 4716 case CXCursor_MemberRef: 4717 return getCursorMemberRef(C).second; 4718 4719 case CXCursor_CXXBaseSpecifier: 4720 return getCursorCXXBaseSpecifier(C)->getSourceRange(); 4721 4722 case CXCursor_LabelRef: 4723 return getCursorLabelRef(C).second; 4724 4725 case CXCursor_OverloadedDeclRef: 4726 return getCursorOverloadedDeclRef(C).second; 4727 4728 case CXCursor_VariableRef: 4729 return getCursorVariableRef(C).second; 4730 4731 default: 4732 // FIXME: Need a way to enumerate all non-reference cases. 4733 llvm_unreachable("Missed a reference kind"); 4734 } 4735 } 4736 4737 if (clang_isExpression(C.kind)) 4738 return getCursorExpr(C)->getSourceRange(); 4739 4740 if (clang_isStatement(C.kind)) 4741 return getCursorStmt(C)->getSourceRange(); 4742 4743 if (clang_isAttribute(C.kind)) 4744 return getCursorAttr(C)->getRange(); 4745 4746 if (C.kind == CXCursor_PreprocessingDirective) 4747 return cxcursor::getCursorPreprocessingDirective(C); 4748 4749 if (C.kind == CXCursor_MacroExpansion) { 4750 ASTUnit *TU = getCursorASTUnit(C); 4751 SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange(); 4752 return TU->mapRangeFromPreamble(Range); 4753 } 4754 4755 if (C.kind == CXCursor_MacroDefinition) { 4756 ASTUnit *TU = getCursorASTUnit(C); 4757 SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange(); 4758 return TU->mapRangeFromPreamble(Range); 4759 } 4760 4761 if (C.kind == CXCursor_InclusionDirective) { 4762 ASTUnit *TU = getCursorASTUnit(C); 4763 SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange(); 4764 return TU->mapRangeFromPreamble(Range); 4765 } 4766 4767 if (C.kind == CXCursor_TranslationUnit) { 4768 ASTUnit *TU = getCursorASTUnit(C); 4769 FileID MainID = TU->getSourceManager().getMainFileID(); 4770 SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID); 4771 SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID); 4772 return SourceRange(Start, End); 4773 } 4774 4775 if (clang_isDeclaration(C.kind)) { 4776 const Decl *D = cxcursor::getCursorDecl(C); 4777 if (!D) 4778 return SourceRange(); 4779 4780 SourceRange R = D->getSourceRange(); 4781 // FIXME: Multiple variables declared in a single declaration 4782 // currently lack the information needed to correctly determine their 4783 // ranges when accounting for the type-specifier. We use context 4784 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 4785 // and if so, whether it is the first decl. 4786 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 4787 if (!cxcursor::isFirstInDeclGroup(C)) 4788 R.setBegin(VD->getLocation()); 4789 } 4790 return R; 4791 } 4792 return SourceRange(); 4793 } 4794 4795 /// \brief Retrieves the "raw" cursor extent, which is then extended to include 4796 /// the decl-specifier-seq for declarations. 4797 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) { 4798 if (clang_isDeclaration(C.kind)) { 4799 const Decl *D = cxcursor::getCursorDecl(C); 4800 if (!D) 4801 return SourceRange(); 4802 4803 SourceRange R = D->getSourceRange(); 4804 4805 // Adjust the start of the location for declarations preceded by 4806 // declaration specifiers. 4807 SourceLocation StartLoc; 4808 if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) { 4809 if (TypeSourceInfo *TI = DD->getTypeSourceInfo()) 4810 StartLoc = TI->getTypeLoc().getLocStart(); 4811 } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) { 4812 if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo()) 4813 StartLoc = TI->getTypeLoc().getLocStart(); 4814 } 4815 4816 if (StartLoc.isValid() && R.getBegin().isValid() && 4817 SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin())) 4818 R.setBegin(StartLoc); 4819 4820 // FIXME: Multiple variables declared in a single declaration 4821 // currently lack the information needed to correctly determine their 4822 // ranges when accounting for the type-specifier. We use context 4823 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 4824 // and if so, whether it is the first decl. 4825 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 4826 if (!cxcursor::isFirstInDeclGroup(C)) 4827 R.setBegin(VD->getLocation()); 4828 } 4829 4830 return R; 4831 } 4832 4833 return getRawCursorExtent(C); 4834 } 4835 4836 extern "C" { 4837 4838 CXSourceRange clang_getCursorExtent(CXCursor C) { 4839 SourceRange R = getRawCursorExtent(C); 4840 if (R.isInvalid()) 4841 return clang_getNullRange(); 4842 4843 return cxloc::translateSourceRange(getCursorContext(C), R); 4844 } 4845 4846 CXCursor clang_getCursorReferenced(CXCursor C) { 4847 if (clang_isInvalid(C.kind)) 4848 return clang_getNullCursor(); 4849 4850 CXTranslationUnit tu = getCursorTU(C); 4851 if (clang_isDeclaration(C.kind)) { 4852 const Decl *D = getCursorDecl(C); 4853 if (!D) 4854 return clang_getNullCursor(); 4855 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) 4856 return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu); 4857 if (const ObjCPropertyImplDecl *PropImpl = 4858 dyn_cast<ObjCPropertyImplDecl>(D)) 4859 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 4860 return MakeCXCursor(Property, tu); 4861 4862 return C; 4863 } 4864 4865 if (clang_isExpression(C.kind)) { 4866 const Expr *E = getCursorExpr(C); 4867 const Decl *D = getDeclFromExpr(E); 4868 if (D) { 4869 CXCursor declCursor = MakeCXCursor(D, tu); 4870 declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C), 4871 declCursor); 4872 return declCursor; 4873 } 4874 4875 if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E)) 4876 return MakeCursorOverloadedDeclRef(Ovl, tu); 4877 4878 return clang_getNullCursor(); 4879 } 4880 4881 if (clang_isStatement(C.kind)) { 4882 const Stmt *S = getCursorStmt(C); 4883 if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S)) 4884 if (LabelDecl *label = Goto->getLabel()) 4885 if (LabelStmt *labelS = label->getStmt()) 4886 return MakeCXCursor(labelS, getCursorDecl(C), tu); 4887 4888 return clang_getNullCursor(); 4889 } 4890 4891 if (C.kind == CXCursor_MacroExpansion) { 4892 if (const MacroDefinition *Def = getCursorMacroExpansion(C).getDefinition()) 4893 return MakeMacroDefinitionCursor(Def, tu); 4894 } 4895 4896 if (!clang_isReference(C.kind)) 4897 return clang_getNullCursor(); 4898 4899 switch (C.kind) { 4900 case CXCursor_ObjCSuperClassRef: 4901 return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu); 4902 4903 case CXCursor_ObjCProtocolRef: { 4904 const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first; 4905 if (const ObjCProtocolDecl *Def = Prot->getDefinition()) 4906 return MakeCXCursor(Def, tu); 4907 4908 return MakeCXCursor(Prot, tu); 4909 } 4910 4911 case CXCursor_ObjCClassRef: { 4912 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 4913 if (const ObjCInterfaceDecl *Def = Class->getDefinition()) 4914 return MakeCXCursor(Def, tu); 4915 4916 return MakeCXCursor(Class, tu); 4917 } 4918 4919 case CXCursor_TypeRef: 4920 return MakeCXCursor(getCursorTypeRef(C).first, tu ); 4921 4922 case CXCursor_TemplateRef: 4923 return MakeCXCursor(getCursorTemplateRef(C).first, tu ); 4924 4925 case CXCursor_NamespaceRef: 4926 return MakeCXCursor(getCursorNamespaceRef(C).first, tu ); 4927 4928 case CXCursor_MemberRef: 4929 return MakeCXCursor(getCursorMemberRef(C).first, tu ); 4930 4931 case CXCursor_CXXBaseSpecifier: { 4932 const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C); 4933 return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(), 4934 tu )); 4935 } 4936 4937 case CXCursor_LabelRef: 4938 // FIXME: We end up faking the "parent" declaration here because we 4939 // don't want to make CXCursor larger. 4940 return MakeCXCursor(getCursorLabelRef(C).first, 4941 cxtu::getASTUnit(tu)->getASTContext() 4942 .getTranslationUnitDecl(), 4943 tu); 4944 4945 case CXCursor_OverloadedDeclRef: 4946 return C; 4947 4948 case CXCursor_VariableRef: 4949 return MakeCXCursor(getCursorVariableRef(C).first, tu); 4950 4951 default: 4952 // We would prefer to enumerate all non-reference cursor kinds here. 4953 llvm_unreachable("Unhandled reference cursor kind"); 4954 } 4955 } 4956 4957 CXCursor clang_getCursorDefinition(CXCursor C) { 4958 if (clang_isInvalid(C.kind)) 4959 return clang_getNullCursor(); 4960 4961 CXTranslationUnit TU = getCursorTU(C); 4962 4963 bool WasReference = false; 4964 if (clang_isReference(C.kind) || clang_isExpression(C.kind)) { 4965 C = clang_getCursorReferenced(C); 4966 WasReference = true; 4967 } 4968 4969 if (C.kind == CXCursor_MacroExpansion) 4970 return clang_getCursorReferenced(C); 4971 4972 if (!clang_isDeclaration(C.kind)) 4973 return clang_getNullCursor(); 4974 4975 const Decl *D = getCursorDecl(C); 4976 if (!D) 4977 return clang_getNullCursor(); 4978 4979 switch (D->getKind()) { 4980 // Declaration kinds that don't really separate the notions of 4981 // declaration and definition. 4982 case Decl::Namespace: 4983 case Decl::Typedef: 4984 case Decl::TypeAlias: 4985 case Decl::TypeAliasTemplate: 4986 case Decl::TemplateTypeParm: 4987 case Decl::EnumConstant: 4988 case Decl::Field: 4989 case Decl::MSProperty: 4990 case Decl::IndirectField: 4991 case Decl::ObjCIvar: 4992 case Decl::ObjCAtDefsField: 4993 case Decl::ImplicitParam: 4994 case Decl::ParmVar: 4995 case Decl::NonTypeTemplateParm: 4996 case Decl::TemplateTemplateParm: 4997 case Decl::ObjCCategoryImpl: 4998 case Decl::ObjCImplementation: 4999 case Decl::AccessSpec: 5000 case Decl::LinkageSpec: 5001 case Decl::ObjCPropertyImpl: 5002 case Decl::FileScopeAsm: 5003 case Decl::StaticAssert: 5004 case Decl::Block: 5005 case Decl::Captured: 5006 case Decl::Label: // FIXME: Is this right?? 5007 case Decl::ClassScopeFunctionSpecialization: 5008 case Decl::Import: 5009 case Decl::OMPThreadPrivate: 5010 return C; 5011 5012 // Declaration kinds that don't make any sense here, but are 5013 // nonetheless harmless. 5014 case Decl::Empty: 5015 case Decl::TranslationUnit: 5016 case Decl::ExternCContext: 5017 break; 5018 5019 // Declaration kinds for which the definition is not resolvable. 5020 case Decl::UnresolvedUsingTypename: 5021 case Decl::UnresolvedUsingValue: 5022 break; 5023 5024 case Decl::UsingDirective: 5025 return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(), 5026 TU); 5027 5028 case Decl::NamespaceAlias: 5029 return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU); 5030 5031 case Decl::Enum: 5032 case Decl::Record: 5033 case Decl::CXXRecord: 5034 case Decl::ClassTemplateSpecialization: 5035 case Decl::ClassTemplatePartialSpecialization: 5036 if (TagDecl *Def = cast<TagDecl>(D)->getDefinition()) 5037 return MakeCXCursor(Def, TU); 5038 return clang_getNullCursor(); 5039 5040 case Decl::Function: 5041 case Decl::CXXMethod: 5042 case Decl::CXXConstructor: 5043 case Decl::CXXDestructor: 5044 case Decl::CXXConversion: { 5045 const FunctionDecl *Def = nullptr; 5046 if (cast<FunctionDecl>(D)->getBody(Def)) 5047 return MakeCXCursor(Def, TU); 5048 return clang_getNullCursor(); 5049 } 5050 5051 case Decl::Var: 5052 case Decl::VarTemplateSpecialization: 5053 case Decl::VarTemplatePartialSpecialization: { 5054 // Ask the variable if it has a definition. 5055 if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition()) 5056 return MakeCXCursor(Def, TU); 5057 return clang_getNullCursor(); 5058 } 5059 5060 case Decl::FunctionTemplate: { 5061 const FunctionDecl *Def = nullptr; 5062 if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def)) 5063 return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU); 5064 return clang_getNullCursor(); 5065 } 5066 5067 case Decl::ClassTemplate: { 5068 if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl() 5069 ->getDefinition()) 5070 return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(), 5071 TU); 5072 return clang_getNullCursor(); 5073 } 5074 5075 case Decl::VarTemplate: { 5076 if (VarDecl *Def = 5077 cast<VarTemplateDecl>(D)->getTemplatedDecl()->getDefinition()) 5078 return MakeCXCursor(cast<VarDecl>(Def)->getDescribedVarTemplate(), TU); 5079 return clang_getNullCursor(); 5080 } 5081 5082 case Decl::Using: 5083 return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D), 5084 D->getLocation(), TU); 5085 5086 case Decl::UsingShadow: 5087 return clang_getCursorDefinition( 5088 MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(), 5089 TU)); 5090 5091 case Decl::ObjCMethod: { 5092 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D); 5093 if (Method->isThisDeclarationADefinition()) 5094 return C; 5095 5096 // Dig out the method definition in the associated 5097 // @implementation, if we have it. 5098 // FIXME: The ASTs should make finding the definition easier. 5099 if (const ObjCInterfaceDecl *Class 5100 = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) 5101 if (ObjCImplementationDecl *ClassImpl = Class->getImplementation()) 5102 if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(), 5103 Method->isInstanceMethod())) 5104 if (Def->isThisDeclarationADefinition()) 5105 return MakeCXCursor(Def, TU); 5106 5107 return clang_getNullCursor(); 5108 } 5109 5110 case Decl::ObjCCategory: 5111 if (ObjCCategoryImplDecl *Impl 5112 = cast<ObjCCategoryDecl>(D)->getImplementation()) 5113 return MakeCXCursor(Impl, TU); 5114 return clang_getNullCursor(); 5115 5116 case Decl::ObjCProtocol: 5117 if (const ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition()) 5118 return MakeCXCursor(Def, TU); 5119 return clang_getNullCursor(); 5120 5121 case Decl::ObjCInterface: { 5122 // There are two notions of a "definition" for an Objective-C 5123 // class: the interface and its implementation. When we resolved a 5124 // reference to an Objective-C class, produce the @interface as 5125 // the definition; when we were provided with the interface, 5126 // produce the @implementation as the definition. 5127 const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D); 5128 if (WasReference) { 5129 if (const ObjCInterfaceDecl *Def = IFace->getDefinition()) 5130 return MakeCXCursor(Def, TU); 5131 } else if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 5132 return MakeCXCursor(Impl, TU); 5133 return clang_getNullCursor(); 5134 } 5135 5136 case Decl::ObjCProperty: 5137 // FIXME: We don't really know where to find the 5138 // ObjCPropertyImplDecls that implement this property. 5139 return clang_getNullCursor(); 5140 5141 case Decl::ObjCCompatibleAlias: 5142 if (const ObjCInterfaceDecl *Class 5143 = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface()) 5144 if (const ObjCInterfaceDecl *Def = Class->getDefinition()) 5145 return MakeCXCursor(Def, TU); 5146 5147 return clang_getNullCursor(); 5148 5149 case Decl::Friend: 5150 if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl()) 5151 return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 5152 return clang_getNullCursor(); 5153 5154 case Decl::FriendTemplate: 5155 if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl()) 5156 return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 5157 return clang_getNullCursor(); 5158 } 5159 5160 return clang_getNullCursor(); 5161 } 5162 5163 unsigned clang_isCursorDefinition(CXCursor C) { 5164 if (!clang_isDeclaration(C.kind)) 5165 return 0; 5166 5167 return clang_getCursorDefinition(C) == C; 5168 } 5169 5170 CXCursor clang_getCanonicalCursor(CXCursor C) { 5171 if (!clang_isDeclaration(C.kind)) 5172 return C; 5173 5174 if (const Decl *D = getCursorDecl(C)) { 5175 if (const ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) 5176 if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl()) 5177 return MakeCXCursor(CatD, getCursorTU(C)); 5178 5179 if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 5180 if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface()) 5181 return MakeCXCursor(IFD, getCursorTU(C)); 5182 5183 return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C)); 5184 } 5185 5186 return C; 5187 } 5188 5189 int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) { 5190 return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first; 5191 } 5192 5193 unsigned clang_getNumOverloadedDecls(CXCursor C) { 5194 if (C.kind != CXCursor_OverloadedDeclRef) 5195 return 0; 5196 5197 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 5198 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 5199 return E->getNumDecls(); 5200 5201 if (OverloadedTemplateStorage *S 5202 = Storage.dyn_cast<OverloadedTemplateStorage*>()) 5203 return S->size(); 5204 5205 const Decl *D = Storage.get<const Decl *>(); 5206 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) 5207 return Using->shadow_size(); 5208 5209 return 0; 5210 } 5211 5212 CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) { 5213 if (cursor.kind != CXCursor_OverloadedDeclRef) 5214 return clang_getNullCursor(); 5215 5216 if (index >= clang_getNumOverloadedDecls(cursor)) 5217 return clang_getNullCursor(); 5218 5219 CXTranslationUnit TU = getCursorTU(cursor); 5220 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first; 5221 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>()) 5222 return MakeCXCursor(E->decls_begin()[index], TU); 5223 5224 if (OverloadedTemplateStorage *S 5225 = Storage.dyn_cast<OverloadedTemplateStorage*>()) 5226 return MakeCXCursor(S->begin()[index], TU); 5227 5228 const Decl *D = Storage.get<const Decl *>(); 5229 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) { 5230 // FIXME: This is, unfortunately, linear time. 5231 UsingDecl::shadow_iterator Pos = Using->shadow_begin(); 5232 std::advance(Pos, index); 5233 return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU); 5234 } 5235 5236 return clang_getNullCursor(); 5237 } 5238 5239 void clang_getDefinitionSpellingAndExtent(CXCursor C, 5240 const char **startBuf, 5241 const char **endBuf, 5242 unsigned *startLine, 5243 unsigned *startColumn, 5244 unsigned *endLine, 5245 unsigned *endColumn) { 5246 assert(getCursorDecl(C) && "CXCursor has null decl"); 5247 const FunctionDecl *FD = dyn_cast<FunctionDecl>(getCursorDecl(C)); 5248 CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody()); 5249 5250 SourceManager &SM = FD->getASTContext().getSourceManager(); 5251 *startBuf = SM.getCharacterData(Body->getLBracLoc()); 5252 *endBuf = SM.getCharacterData(Body->getRBracLoc()); 5253 *startLine = SM.getSpellingLineNumber(Body->getLBracLoc()); 5254 *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc()); 5255 *endLine = SM.getSpellingLineNumber(Body->getRBracLoc()); 5256 *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc()); 5257 } 5258 5259 5260 CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags, 5261 unsigned PieceIndex) { 5262 RefNamePieces Pieces; 5263 5264 switch (C.kind) { 5265 case CXCursor_MemberRefExpr: 5266 if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C))) 5267 Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(), 5268 E->getQualifierLoc().getSourceRange()); 5269 break; 5270 5271 case CXCursor_DeclRefExpr: 5272 if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) 5273 Pieces = buildPieces(NameFlags, false, E->getNameInfo(), 5274 E->getQualifierLoc().getSourceRange(), 5275 E->getOptionalExplicitTemplateArgs()); 5276 break; 5277 5278 case CXCursor_CallExpr: 5279 if (const CXXOperatorCallExpr *OCE = 5280 dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) { 5281 const Expr *Callee = OCE->getCallee(); 5282 if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) 5283 Callee = ICE->getSubExpr(); 5284 5285 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) 5286 Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(), 5287 DRE->getQualifierLoc().getSourceRange()); 5288 } 5289 break; 5290 5291 default: 5292 break; 5293 } 5294 5295 if (Pieces.empty()) { 5296 if (PieceIndex == 0) 5297 return clang_getCursorExtent(C); 5298 } else if (PieceIndex < Pieces.size()) { 5299 SourceRange R = Pieces[PieceIndex]; 5300 if (R.isValid()) 5301 return cxloc::translateSourceRange(getCursorContext(C), R); 5302 } 5303 5304 return clang_getNullRange(); 5305 } 5306 5307 void clang_enableStackTraces(void) { 5308 llvm::sys::PrintStackTraceOnErrorSignal(); 5309 } 5310 5311 void clang_executeOnThread(void (*fn)(void*), void *user_data, 5312 unsigned stack_size) { 5313 llvm::llvm_execute_on_thread(fn, user_data, stack_size); 5314 } 5315 5316 } // end: extern "C" 5317 5318 //===----------------------------------------------------------------------===// 5319 // Token-based Operations. 5320 //===----------------------------------------------------------------------===// 5321 5322 /* CXToken layout: 5323 * int_data[0]: a CXTokenKind 5324 * int_data[1]: starting token location 5325 * int_data[2]: token length 5326 * int_data[3]: reserved 5327 * ptr_data: for identifiers and keywords, an IdentifierInfo*. 5328 * otherwise unused. 5329 */ 5330 extern "C" { 5331 5332 CXTokenKind clang_getTokenKind(CXToken CXTok) { 5333 return static_cast<CXTokenKind>(CXTok.int_data[0]); 5334 } 5335 5336 CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { 5337 switch (clang_getTokenKind(CXTok)) { 5338 case CXToken_Identifier: 5339 case CXToken_Keyword: 5340 // We know we have an IdentifierInfo*, so use that. 5341 return cxstring::createRef(static_cast<IdentifierInfo *>(CXTok.ptr_data) 5342 ->getNameStart()); 5343 5344 case CXToken_Literal: { 5345 // We have stashed the starting pointer in the ptr_data field. Use it. 5346 const char *Text = static_cast<const char *>(CXTok.ptr_data); 5347 return cxstring::createDup(StringRef(Text, CXTok.int_data[2])); 5348 } 5349 5350 case CXToken_Punctuation: 5351 case CXToken_Comment: 5352 break; 5353 } 5354 5355 if (isNotUsableTU(TU)) { 5356 LOG_BAD_TU(TU); 5357 return cxstring::createEmpty(); 5358 } 5359 5360 // We have to find the starting buffer pointer the hard way, by 5361 // deconstructing the source location. 5362 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 5363 if (!CXXUnit) 5364 return cxstring::createEmpty(); 5365 5366 SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]); 5367 std::pair<FileID, unsigned> LocInfo 5368 = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc); 5369 bool Invalid = false; 5370 StringRef Buffer 5371 = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid); 5372 if (Invalid) 5373 return cxstring::createEmpty(); 5374 5375 return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2])); 5376 } 5377 5378 CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) { 5379 if (isNotUsableTU(TU)) { 5380 LOG_BAD_TU(TU); 5381 return clang_getNullLocation(); 5382 } 5383 5384 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 5385 if (!CXXUnit) 5386 return clang_getNullLocation(); 5387 5388 return cxloc::translateSourceLocation(CXXUnit->getASTContext(), 5389 SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 5390 } 5391 5392 CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { 5393 if (isNotUsableTU(TU)) { 5394 LOG_BAD_TU(TU); 5395 return clang_getNullRange(); 5396 } 5397 5398 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 5399 if (!CXXUnit) 5400 return clang_getNullRange(); 5401 5402 return cxloc::translateSourceRange(CXXUnit->getASTContext(), 5403 SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 5404 } 5405 5406 static void getTokens(ASTUnit *CXXUnit, SourceRange Range, 5407 SmallVectorImpl<CXToken> &CXTokens) { 5408 SourceManager &SourceMgr = CXXUnit->getSourceManager(); 5409 std::pair<FileID, unsigned> BeginLocInfo 5410 = SourceMgr.getDecomposedSpellingLoc(Range.getBegin()); 5411 std::pair<FileID, unsigned> EndLocInfo 5412 = SourceMgr.getDecomposedSpellingLoc(Range.getEnd()); 5413 5414 // Cannot tokenize across files. 5415 if (BeginLocInfo.first != EndLocInfo.first) 5416 return; 5417 5418 // Create a lexer 5419 bool Invalid = false; 5420 StringRef Buffer 5421 = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 5422 if (Invalid) 5423 return; 5424 5425 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 5426 CXXUnit->getASTContext().getLangOpts(), 5427 Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end()); 5428 Lex.SetCommentRetentionState(true); 5429 5430 // Lex tokens until we hit the end of the range. 5431 const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second; 5432 Token Tok; 5433 bool previousWasAt = false; 5434 do { 5435 // Lex the next token 5436 Lex.LexFromRawLexer(Tok); 5437 if (Tok.is(tok::eof)) 5438 break; 5439 5440 // Initialize the CXToken. 5441 CXToken CXTok; 5442 5443 // - Common fields 5444 CXTok.int_data[1] = Tok.getLocation().getRawEncoding(); 5445 CXTok.int_data[2] = Tok.getLength(); 5446 CXTok.int_data[3] = 0; 5447 5448 // - Kind-specific fields 5449 if (Tok.isLiteral()) { 5450 CXTok.int_data[0] = CXToken_Literal; 5451 CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData()); 5452 } else if (Tok.is(tok::raw_identifier)) { 5453 // Lookup the identifier to determine whether we have a keyword. 5454 IdentifierInfo *II 5455 = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok); 5456 5457 if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) { 5458 CXTok.int_data[0] = CXToken_Keyword; 5459 } 5460 else { 5461 CXTok.int_data[0] = Tok.is(tok::identifier) 5462 ? CXToken_Identifier 5463 : CXToken_Keyword; 5464 } 5465 CXTok.ptr_data = II; 5466 } else if (Tok.is(tok::comment)) { 5467 CXTok.int_data[0] = CXToken_Comment; 5468 CXTok.ptr_data = nullptr; 5469 } else { 5470 CXTok.int_data[0] = CXToken_Punctuation; 5471 CXTok.ptr_data = nullptr; 5472 } 5473 CXTokens.push_back(CXTok); 5474 previousWasAt = Tok.is(tok::at); 5475 } while (Lex.getBufferLocation() <= EffectiveBufferEnd); 5476 } 5477 5478 void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, 5479 CXToken **Tokens, unsigned *NumTokens) { 5480 LOG_FUNC_SECTION { 5481 *Log << TU << ' ' << Range; 5482 } 5483 5484 if (Tokens) 5485 *Tokens = nullptr; 5486 if (NumTokens) 5487 *NumTokens = 0; 5488 5489 if (isNotUsableTU(TU)) { 5490 LOG_BAD_TU(TU); 5491 return; 5492 } 5493 5494 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 5495 if (!CXXUnit || !Tokens || !NumTokens) 5496 return; 5497 5498 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 5499 5500 SourceRange R = cxloc::translateCXSourceRange(Range); 5501 if (R.isInvalid()) 5502 return; 5503 5504 SmallVector<CXToken, 32> CXTokens; 5505 getTokens(CXXUnit, R, CXTokens); 5506 5507 if (CXTokens.empty()) 5508 return; 5509 5510 *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size()); 5511 memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size()); 5512 *NumTokens = CXTokens.size(); 5513 } 5514 5515 void clang_disposeTokens(CXTranslationUnit TU, 5516 CXToken *Tokens, unsigned NumTokens) { 5517 free(Tokens); 5518 } 5519 5520 } // end: extern "C" 5521 5522 //===----------------------------------------------------------------------===// 5523 // Token annotation APIs. 5524 //===----------------------------------------------------------------------===// 5525 5526 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 5527 CXCursor parent, 5528 CXClientData client_data); 5529 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor, 5530 CXClientData client_data); 5531 5532 namespace { 5533 class AnnotateTokensWorker { 5534 CXToken *Tokens; 5535 CXCursor *Cursors; 5536 unsigned NumTokens; 5537 unsigned TokIdx; 5538 unsigned PreprocessingTokIdx; 5539 CursorVisitor AnnotateVis; 5540 SourceManager &SrcMgr; 5541 bool HasContextSensitiveKeywords; 5542 5543 struct PostChildrenInfo { 5544 CXCursor Cursor; 5545 SourceRange CursorRange; 5546 unsigned BeforeReachingCursorIdx; 5547 unsigned BeforeChildrenTokenIdx; 5548 }; 5549 SmallVector<PostChildrenInfo, 8> PostChildrenInfos; 5550 5551 CXToken &getTok(unsigned Idx) { 5552 assert(Idx < NumTokens); 5553 return Tokens[Idx]; 5554 } 5555 const CXToken &getTok(unsigned Idx) const { 5556 assert(Idx < NumTokens); 5557 return Tokens[Idx]; 5558 } 5559 bool MoreTokens() const { return TokIdx < NumTokens; } 5560 unsigned NextToken() const { return TokIdx; } 5561 void AdvanceToken() { ++TokIdx; } 5562 SourceLocation GetTokenLoc(unsigned tokI) { 5563 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]); 5564 } 5565 bool isFunctionMacroToken(unsigned tokI) const { 5566 return getTok(tokI).int_data[3] != 0; 5567 } 5568 SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const { 5569 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[3]); 5570 } 5571 5572 void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange); 5573 bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult, 5574 SourceRange); 5575 5576 public: 5577 AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens, 5578 CXTranslationUnit TU, SourceRange RegionOfInterest) 5579 : Tokens(tokens), Cursors(cursors), 5580 NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0), 5581 AnnotateVis(TU, 5582 AnnotateTokensVisitor, this, 5583 /*VisitPreprocessorLast=*/true, 5584 /*VisitIncludedEntities=*/false, 5585 RegionOfInterest, 5586 /*VisitDeclsOnly=*/false, 5587 AnnotateTokensPostChildrenVisitor), 5588 SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()), 5589 HasContextSensitiveKeywords(false) { } 5590 5591 void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); } 5592 enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent); 5593 bool postVisitChildren(CXCursor cursor); 5594 void AnnotateTokens(); 5595 5596 /// \brief Determine whether the annotator saw any cursors that have 5597 /// context-sensitive keywords. 5598 bool hasContextSensitiveKeywords() const { 5599 return HasContextSensitiveKeywords; 5600 } 5601 5602 ~AnnotateTokensWorker() { 5603 assert(PostChildrenInfos.empty()); 5604 } 5605 }; 5606 } 5607 5608 void AnnotateTokensWorker::AnnotateTokens() { 5609 // Walk the AST within the region of interest, annotating tokens 5610 // along the way. 5611 AnnotateVis.visitFileRegion(); 5612 } 5613 5614 static inline void updateCursorAnnotation(CXCursor &Cursor, 5615 const CXCursor &updateC) { 5616 if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind)) 5617 return; 5618 Cursor = updateC; 5619 } 5620 5621 /// \brief It annotates and advances tokens with a cursor until the comparison 5622 //// between the cursor location and the source range is the same as 5623 /// \arg compResult. 5624 /// 5625 /// Pass RangeBefore to annotate tokens with a cursor until a range is reached. 5626 /// Pass RangeOverlap to annotate tokens inside a range. 5627 void AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC, 5628 RangeComparisonResult compResult, 5629 SourceRange range) { 5630 while (MoreTokens()) { 5631 const unsigned I = NextToken(); 5632 if (isFunctionMacroToken(I)) 5633 if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range)) 5634 return; 5635 5636 SourceLocation TokLoc = GetTokenLoc(I); 5637 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) { 5638 updateCursorAnnotation(Cursors[I], updateC); 5639 AdvanceToken(); 5640 continue; 5641 } 5642 break; 5643 } 5644 } 5645 5646 /// \brief Special annotation handling for macro argument tokens. 5647 /// \returns true if it advanced beyond all macro tokens, false otherwise. 5648 bool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens( 5649 CXCursor updateC, 5650 RangeComparisonResult compResult, 5651 SourceRange range) { 5652 assert(MoreTokens()); 5653 assert(isFunctionMacroToken(NextToken()) && 5654 "Should be called only for macro arg tokens"); 5655 5656 // This works differently than annotateAndAdvanceTokens; because expanded 5657 // macro arguments can have arbitrary translation-unit source order, we do not 5658 // advance the token index one by one until a token fails the range test. 5659 // We only advance once past all of the macro arg tokens if all of them 5660 // pass the range test. If one of them fails we keep the token index pointing 5661 // at the start of the macro arg tokens so that the failing token will be 5662 // annotated by a subsequent annotation try. 5663 5664 bool atLeastOneCompFail = false; 5665 5666 unsigned I = NextToken(); 5667 for (; I < NumTokens && isFunctionMacroToken(I); ++I) { 5668 SourceLocation TokLoc = getFunctionMacroTokenLoc(I); 5669 if (TokLoc.isFileID()) 5670 continue; // not macro arg token, it's parens or comma. 5671 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) { 5672 if (clang_isInvalid(clang_getCursorKind(Cursors[I]))) 5673 Cursors[I] = updateC; 5674 } else 5675 atLeastOneCompFail = true; 5676 } 5677 5678 if (atLeastOneCompFail) 5679 return false; 5680 5681 TokIdx = I; // All of the tokens were handled, advance beyond all of them. 5682 return true; 5683 } 5684 5685 enum CXChildVisitResult 5686 AnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) { 5687 SourceRange cursorRange = getRawCursorExtent(cursor); 5688 if (cursorRange.isInvalid()) 5689 return CXChildVisit_Recurse; 5690 5691 if (!HasContextSensitiveKeywords) { 5692 // Objective-C properties can have context-sensitive keywords. 5693 if (cursor.kind == CXCursor_ObjCPropertyDecl) { 5694 if (const ObjCPropertyDecl *Property 5695 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor))) 5696 HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0; 5697 } 5698 // Objective-C methods can have context-sensitive keywords. 5699 else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl || 5700 cursor.kind == CXCursor_ObjCClassMethodDecl) { 5701 if (const ObjCMethodDecl *Method 5702 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) { 5703 if (Method->getObjCDeclQualifier()) 5704 HasContextSensitiveKeywords = true; 5705 else { 5706 for (const auto *P : Method->params()) { 5707 if (P->getObjCDeclQualifier()) { 5708 HasContextSensitiveKeywords = true; 5709 break; 5710 } 5711 } 5712 } 5713 } 5714 } 5715 // C++ methods can have context-sensitive keywords. 5716 else if (cursor.kind == CXCursor_CXXMethod) { 5717 if (const CXXMethodDecl *Method 5718 = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) { 5719 if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>()) 5720 HasContextSensitiveKeywords = true; 5721 } 5722 } 5723 // C++ classes can have context-sensitive keywords. 5724 else if (cursor.kind == CXCursor_StructDecl || 5725 cursor.kind == CXCursor_ClassDecl || 5726 cursor.kind == CXCursor_ClassTemplate || 5727 cursor.kind == CXCursor_ClassTemplatePartialSpecialization) { 5728 if (const Decl *D = getCursorDecl(cursor)) 5729 if (D->hasAttr<FinalAttr>()) 5730 HasContextSensitiveKeywords = true; 5731 } 5732 } 5733 5734 // Don't override a property annotation with its getter/setter method. 5735 if (cursor.kind == CXCursor_ObjCInstanceMethodDecl && 5736 parent.kind == CXCursor_ObjCPropertyDecl) 5737 return CXChildVisit_Continue; 5738 5739 if (clang_isPreprocessing(cursor.kind)) { 5740 // Items in the preprocessing record are kept separate from items in 5741 // declarations, so we keep a separate token index. 5742 unsigned SavedTokIdx = TokIdx; 5743 TokIdx = PreprocessingTokIdx; 5744 5745 // Skip tokens up until we catch up to the beginning of the preprocessing 5746 // entry. 5747 while (MoreTokens()) { 5748 const unsigned I = NextToken(); 5749 SourceLocation TokLoc = GetTokenLoc(I); 5750 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 5751 case RangeBefore: 5752 AdvanceToken(); 5753 continue; 5754 case RangeAfter: 5755 case RangeOverlap: 5756 break; 5757 } 5758 break; 5759 } 5760 5761 // Look at all of the tokens within this range. 5762 while (MoreTokens()) { 5763 const unsigned I = NextToken(); 5764 SourceLocation TokLoc = GetTokenLoc(I); 5765 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 5766 case RangeBefore: 5767 llvm_unreachable("Infeasible"); 5768 case RangeAfter: 5769 break; 5770 case RangeOverlap: 5771 // For macro expansions, just note where the beginning of the macro 5772 // expansion occurs. 5773 if (cursor.kind == CXCursor_MacroExpansion) { 5774 if (TokLoc == cursorRange.getBegin()) 5775 Cursors[I] = cursor; 5776 AdvanceToken(); 5777 break; 5778 } 5779 // We may have already annotated macro names inside macro definitions. 5780 if (Cursors[I].kind != CXCursor_MacroExpansion) 5781 Cursors[I] = cursor; 5782 AdvanceToken(); 5783 continue; 5784 } 5785 break; 5786 } 5787 5788 // Save the preprocessing token index; restore the non-preprocessing 5789 // token index. 5790 PreprocessingTokIdx = TokIdx; 5791 TokIdx = SavedTokIdx; 5792 return CXChildVisit_Recurse; 5793 } 5794 5795 if (cursorRange.isInvalid()) 5796 return CXChildVisit_Continue; 5797 5798 unsigned BeforeReachingCursorIdx = NextToken(); 5799 const enum CXCursorKind cursorK = clang_getCursorKind(cursor); 5800 const enum CXCursorKind K = clang_getCursorKind(parent); 5801 const CXCursor updateC = 5802 (clang_isInvalid(K) || K == CXCursor_TranslationUnit || 5803 // Attributes are annotated out-of-order, skip tokens until we reach it. 5804 clang_isAttribute(cursor.kind)) 5805 ? clang_getNullCursor() : parent; 5806 5807 annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange); 5808 5809 // Avoid having the cursor of an expression "overwrite" the annotation of the 5810 // variable declaration that it belongs to. 5811 // This can happen for C++ constructor expressions whose range generally 5812 // include the variable declaration, e.g.: 5813 // MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor. 5814 if (clang_isExpression(cursorK) && MoreTokens()) { 5815 const Expr *E = getCursorExpr(cursor); 5816 if (const Decl *D = getCursorParentDecl(cursor)) { 5817 const unsigned I = NextToken(); 5818 if (E->getLocStart().isValid() && D->getLocation().isValid() && 5819 E->getLocStart() == D->getLocation() && 5820 E->getLocStart() == GetTokenLoc(I)) { 5821 updateCursorAnnotation(Cursors[I], updateC); 5822 AdvanceToken(); 5823 } 5824 } 5825 } 5826 5827 // Before recursing into the children keep some state that we are going 5828 // to use in the AnnotateTokensWorker::postVisitChildren callback to do some 5829 // extra work after the child nodes are visited. 5830 // Note that we don't call VisitChildren here to avoid traversing statements 5831 // code-recursively which can blow the stack. 5832 5833 PostChildrenInfo Info; 5834 Info.Cursor = cursor; 5835 Info.CursorRange = cursorRange; 5836 Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx; 5837 Info.BeforeChildrenTokenIdx = NextToken(); 5838 PostChildrenInfos.push_back(Info); 5839 5840 return CXChildVisit_Recurse; 5841 } 5842 5843 bool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) { 5844 if (PostChildrenInfos.empty()) 5845 return false; 5846 const PostChildrenInfo &Info = PostChildrenInfos.back(); 5847 if (!clang_equalCursors(Info.Cursor, cursor)) 5848 return false; 5849 5850 const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx; 5851 const unsigned AfterChildren = NextToken(); 5852 SourceRange cursorRange = Info.CursorRange; 5853 5854 // Scan the tokens that are at the end of the cursor, but are not captured 5855 // but the child cursors. 5856 annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange); 5857 5858 // Scan the tokens that are at the beginning of the cursor, but are not 5859 // capture by the child cursors. 5860 for (unsigned I = BeforeChildren; I != AfterChildren; ++I) { 5861 if (!clang_isInvalid(clang_getCursorKind(Cursors[I]))) 5862 break; 5863 5864 Cursors[I] = cursor; 5865 } 5866 5867 // Attributes are annotated out-of-order, rewind TokIdx to when we first 5868 // encountered the attribute cursor. 5869 if (clang_isAttribute(cursor.kind)) 5870 TokIdx = Info.BeforeReachingCursorIdx; 5871 5872 PostChildrenInfos.pop_back(); 5873 return false; 5874 } 5875 5876 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 5877 CXCursor parent, 5878 CXClientData client_data) { 5879 return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent); 5880 } 5881 5882 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor, 5883 CXClientData client_data) { 5884 return static_cast<AnnotateTokensWorker*>(client_data)-> 5885 postVisitChildren(cursor); 5886 } 5887 5888 namespace { 5889 5890 /// \brief Uses the macro expansions in the preprocessing record to find 5891 /// and mark tokens that are macro arguments. This info is used by the 5892 /// AnnotateTokensWorker. 5893 class MarkMacroArgTokensVisitor { 5894 SourceManager &SM; 5895 CXToken *Tokens; 5896 unsigned NumTokens; 5897 unsigned CurIdx; 5898 5899 public: 5900 MarkMacroArgTokensVisitor(SourceManager &SM, 5901 CXToken *tokens, unsigned numTokens) 5902 : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { } 5903 5904 CXChildVisitResult visit(CXCursor cursor, CXCursor parent) { 5905 if (cursor.kind != CXCursor_MacroExpansion) 5906 return CXChildVisit_Continue; 5907 5908 SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange(); 5909 if (macroRange.getBegin() == macroRange.getEnd()) 5910 return CXChildVisit_Continue; // it's not a function macro. 5911 5912 for (; CurIdx < NumTokens; ++CurIdx) { 5913 if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx), 5914 macroRange.getBegin())) 5915 break; 5916 } 5917 5918 if (CurIdx == NumTokens) 5919 return CXChildVisit_Break; 5920 5921 for (; CurIdx < NumTokens; ++CurIdx) { 5922 SourceLocation tokLoc = getTokenLoc(CurIdx); 5923 if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd())) 5924 break; 5925 5926 setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc)); 5927 } 5928 5929 if (CurIdx == NumTokens) 5930 return CXChildVisit_Break; 5931 5932 return CXChildVisit_Continue; 5933 } 5934 5935 private: 5936 CXToken &getTok(unsigned Idx) { 5937 assert(Idx < NumTokens); 5938 return Tokens[Idx]; 5939 } 5940 const CXToken &getTok(unsigned Idx) const { 5941 assert(Idx < NumTokens); 5942 return Tokens[Idx]; 5943 } 5944 5945 SourceLocation getTokenLoc(unsigned tokI) { 5946 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]); 5947 } 5948 5949 void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) { 5950 // The third field is reserved and currently not used. Use it here 5951 // to mark macro arg expanded tokens with their expanded locations. 5952 getTok(tokI).int_data[3] = loc.getRawEncoding(); 5953 } 5954 }; 5955 5956 } // end anonymous namespace 5957 5958 static CXChildVisitResult 5959 MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent, 5960 CXClientData client_data) { 5961 return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor, 5962 parent); 5963 } 5964 5965 namespace { 5966 struct clang_annotateTokens_Data { 5967 CXTranslationUnit TU; 5968 ASTUnit *CXXUnit; 5969 CXToken *Tokens; 5970 unsigned NumTokens; 5971 CXCursor *Cursors; 5972 }; 5973 } 5974 5975 /// \brief Used by \c annotatePreprocessorTokens. 5976 /// \returns true if lexing was finished, false otherwise. 5977 static bool lexNext(Lexer &Lex, Token &Tok, 5978 unsigned &NextIdx, unsigned NumTokens) { 5979 if (NextIdx >= NumTokens) 5980 return true; 5981 5982 ++NextIdx; 5983 Lex.LexFromRawLexer(Tok); 5984 if (Tok.is(tok::eof)) 5985 return true; 5986 5987 return false; 5988 } 5989 5990 static void annotatePreprocessorTokens(CXTranslationUnit TU, 5991 SourceRange RegionOfInterest, 5992 CXCursor *Cursors, 5993 CXToken *Tokens, 5994 unsigned NumTokens) { 5995 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 5996 5997 Preprocessor &PP = CXXUnit->getPreprocessor(); 5998 SourceManager &SourceMgr = CXXUnit->getSourceManager(); 5999 std::pair<FileID, unsigned> BeginLocInfo 6000 = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin()); 6001 std::pair<FileID, unsigned> EndLocInfo 6002 = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd()); 6003 6004 if (BeginLocInfo.first != EndLocInfo.first) 6005 return; 6006 6007 StringRef Buffer; 6008 bool Invalid = false; 6009 Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 6010 if (Buffer.empty() || Invalid) 6011 return; 6012 6013 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 6014 CXXUnit->getASTContext().getLangOpts(), 6015 Buffer.begin(), Buffer.data() + BeginLocInfo.second, 6016 Buffer.end()); 6017 Lex.SetCommentRetentionState(true); 6018 6019 unsigned NextIdx = 0; 6020 // Lex tokens in raw mode until we hit the end of the range, to avoid 6021 // entering #includes or expanding macros. 6022 while (true) { 6023 Token Tok; 6024 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 6025 break; 6026 unsigned TokIdx = NextIdx-1; 6027 assert(Tok.getLocation() == 6028 SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1])); 6029 6030 reprocess: 6031 if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) { 6032 // We have found a preprocessing directive. Annotate the tokens 6033 // appropriately. 6034 // 6035 // FIXME: Some simple tests here could identify macro definitions and 6036 // #undefs, to provide specific cursor kinds for those. 6037 6038 SourceLocation BeginLoc = Tok.getLocation(); 6039 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 6040 break; 6041 6042 MacroInfo *MI = nullptr; 6043 if (Tok.is(tok::raw_identifier) && Tok.getRawIdentifier() == "define") { 6044 if (lexNext(Lex, Tok, NextIdx, NumTokens)) 6045 break; 6046 6047 if (Tok.is(tok::raw_identifier)) { 6048 IdentifierInfo &II = 6049 PP.getIdentifierTable().get(Tok.getRawIdentifier()); 6050 SourceLocation MappedTokLoc = 6051 CXXUnit->mapLocationToPreamble(Tok.getLocation()); 6052 MI = getMacroInfo(II, MappedTokLoc, TU); 6053 } 6054 } 6055 6056 bool finished = false; 6057 do { 6058 if (lexNext(Lex, Tok, NextIdx, NumTokens)) { 6059 finished = true; 6060 break; 6061 } 6062 // If we are in a macro definition, check if the token was ever a 6063 // macro name and annotate it if that's the case. 6064 if (MI) { 6065 SourceLocation SaveLoc = Tok.getLocation(); 6066 Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc)); 6067 MacroDefinition *MacroDef = checkForMacroInMacroDefinition(MI,Tok,TU); 6068 Tok.setLocation(SaveLoc); 6069 if (MacroDef) 6070 Cursors[NextIdx-1] = MakeMacroExpansionCursor(MacroDef, 6071 Tok.getLocation(), TU); 6072 } 6073 } while (!Tok.isAtStartOfLine()); 6074 6075 unsigned LastIdx = finished ? NextIdx-1 : NextIdx-2; 6076 assert(TokIdx <= LastIdx); 6077 SourceLocation EndLoc = 6078 SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]); 6079 CXCursor Cursor = 6080 MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU); 6081 6082 for (; TokIdx <= LastIdx; ++TokIdx) 6083 updateCursorAnnotation(Cursors[TokIdx], Cursor); 6084 6085 if (finished) 6086 break; 6087 goto reprocess; 6088 } 6089 } 6090 } 6091 6092 // This gets run a separate thread to avoid stack blowout. 6093 static void clang_annotateTokensImpl(void *UserData) { 6094 CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU; 6095 ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit; 6096 CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens; 6097 const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens; 6098 CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors; 6099 6100 CIndexer *CXXIdx = TU->CIdx; 6101 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) 6102 setThreadBackgroundPriority(); 6103 6104 // Determine the region of interest, which contains all of the tokens. 6105 SourceRange RegionOfInterest; 6106 RegionOfInterest.setBegin( 6107 cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0]))); 6108 RegionOfInterest.setEnd( 6109 cxloc::translateSourceLocation(clang_getTokenLocation(TU, 6110 Tokens[NumTokens-1]))); 6111 6112 // Relex the tokens within the source range to look for preprocessing 6113 // directives. 6114 annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens); 6115 6116 // If begin location points inside a macro argument, set it to the expansion 6117 // location so we can have the full context when annotating semantically. 6118 { 6119 SourceManager &SM = CXXUnit->getSourceManager(); 6120 SourceLocation Loc = 6121 SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin()); 6122 if (Loc.isMacroID()) 6123 RegionOfInterest.setBegin(SM.getExpansionLoc(Loc)); 6124 } 6125 6126 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) { 6127 // Search and mark tokens that are macro argument expansions. 6128 MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(), 6129 Tokens, NumTokens); 6130 CursorVisitor MacroArgMarker(TU, 6131 MarkMacroArgTokensVisitorDelegate, &Visitor, 6132 /*VisitPreprocessorLast=*/true, 6133 /*VisitIncludedEntities=*/false, 6134 RegionOfInterest); 6135 MacroArgMarker.visitPreprocessedEntitiesInRegion(); 6136 } 6137 6138 // Annotate all of the source locations in the region of interest that map to 6139 // a specific cursor. 6140 AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest); 6141 6142 // FIXME: We use a ridiculous stack size here because the data-recursion 6143 // algorithm uses a large stack frame than the non-data recursive version, 6144 // and AnnotationTokensWorker currently transforms the data-recursion 6145 // algorithm back into a traditional recursion by explicitly calling 6146 // VisitChildren(). We will need to remove this explicit recursive call. 6147 W.AnnotateTokens(); 6148 6149 // If we ran into any entities that involve context-sensitive keywords, 6150 // take another pass through the tokens to mark them as such. 6151 if (W.hasContextSensitiveKeywords()) { 6152 for (unsigned I = 0; I != NumTokens; ++I) { 6153 if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier) 6154 continue; 6155 6156 if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) { 6157 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data); 6158 if (const ObjCPropertyDecl *Property 6159 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) { 6160 if (Property->getPropertyAttributesAsWritten() != 0 && 6161 llvm::StringSwitch<bool>(II->getName()) 6162 .Case("readonly", true) 6163 .Case("assign", true) 6164 .Case("unsafe_unretained", true) 6165 .Case("readwrite", true) 6166 .Case("retain", true) 6167 .Case("copy", true) 6168 .Case("nonatomic", true) 6169 .Case("atomic", true) 6170 .Case("getter", true) 6171 .Case("setter", true) 6172 .Case("strong", true) 6173 .Case("weak", true) 6174 .Default(false)) 6175 Tokens[I].int_data[0] = CXToken_Keyword; 6176 } 6177 continue; 6178 } 6179 6180 if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl || 6181 Cursors[I].kind == CXCursor_ObjCClassMethodDecl) { 6182 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data); 6183 if (llvm::StringSwitch<bool>(II->getName()) 6184 .Case("in", true) 6185 .Case("out", true) 6186 .Case("inout", true) 6187 .Case("oneway", true) 6188 .Case("bycopy", true) 6189 .Case("byref", true) 6190 .Default(false)) 6191 Tokens[I].int_data[0] = CXToken_Keyword; 6192 continue; 6193 } 6194 6195 if (Cursors[I].kind == CXCursor_CXXFinalAttr || 6196 Cursors[I].kind == CXCursor_CXXOverrideAttr) { 6197 Tokens[I].int_data[0] = CXToken_Keyword; 6198 continue; 6199 } 6200 } 6201 } 6202 } 6203 6204 extern "C" { 6205 6206 void clang_annotateTokens(CXTranslationUnit TU, 6207 CXToken *Tokens, unsigned NumTokens, 6208 CXCursor *Cursors) { 6209 if (isNotUsableTU(TU)) { 6210 LOG_BAD_TU(TU); 6211 return; 6212 } 6213 if (NumTokens == 0 || !Tokens || !Cursors) { 6214 LOG_FUNC_SECTION { *Log << "<null input>"; } 6215 return; 6216 } 6217 6218 LOG_FUNC_SECTION { 6219 *Log << TU << ' '; 6220 CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]); 6221 CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens-1]); 6222 *Log << clang_getRange(bloc, eloc); 6223 } 6224 6225 // Any token we don't specifically annotate will have a NULL cursor. 6226 CXCursor C = clang_getNullCursor(); 6227 for (unsigned I = 0; I != NumTokens; ++I) 6228 Cursors[I] = C; 6229 6230 ASTUnit *CXXUnit = cxtu::getASTUnit(TU); 6231 if (!CXXUnit) 6232 return; 6233 6234 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 6235 6236 clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors }; 6237 llvm::CrashRecoveryContext CRC; 6238 if (!RunSafely(CRC, clang_annotateTokensImpl, &data, 6239 GetSafetyThreadStackSize() * 2)) { 6240 fprintf(stderr, "libclang: crash detected while annotating tokens\n"); 6241 } 6242 } 6243 6244 } // end: extern "C" 6245 6246 //===----------------------------------------------------------------------===// 6247 // Operations for querying linkage of a cursor. 6248 //===----------------------------------------------------------------------===// 6249 6250 extern "C" { 6251 CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { 6252 if (!clang_isDeclaration(cursor.kind)) 6253 return CXLinkage_Invalid; 6254 6255 const Decl *D = cxcursor::getCursorDecl(cursor); 6256 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D)) 6257 switch (ND->getLinkageInternal()) { 6258 case NoLinkage: 6259 case VisibleNoLinkage: return CXLinkage_NoLinkage; 6260 case InternalLinkage: return CXLinkage_Internal; 6261 case UniqueExternalLinkage: return CXLinkage_UniqueExternal; 6262 case ExternalLinkage: return CXLinkage_External; 6263 }; 6264 6265 return CXLinkage_Invalid; 6266 } 6267 } // end: extern "C" 6268 6269 //===----------------------------------------------------------------------===// 6270 // Operations for querying language of a cursor. 6271 //===----------------------------------------------------------------------===// 6272 6273 static CXLanguageKind getDeclLanguage(const Decl *D) { 6274 if (!D) 6275 return CXLanguage_C; 6276 6277 switch (D->getKind()) { 6278 default: 6279 break; 6280 case Decl::ImplicitParam: 6281 case Decl::ObjCAtDefsField: 6282 case Decl::ObjCCategory: 6283 case Decl::ObjCCategoryImpl: 6284 case Decl::ObjCCompatibleAlias: 6285 case Decl::ObjCImplementation: 6286 case Decl::ObjCInterface: 6287 case Decl::ObjCIvar: 6288 case Decl::ObjCMethod: 6289 case Decl::ObjCProperty: 6290 case Decl::ObjCPropertyImpl: 6291 case Decl::ObjCProtocol: 6292 return CXLanguage_ObjC; 6293 case Decl::CXXConstructor: 6294 case Decl::CXXConversion: 6295 case Decl::CXXDestructor: 6296 case Decl::CXXMethod: 6297 case Decl::CXXRecord: 6298 case Decl::ClassTemplate: 6299 case Decl::ClassTemplatePartialSpecialization: 6300 case Decl::ClassTemplateSpecialization: 6301 case Decl::Friend: 6302 case Decl::FriendTemplate: 6303 case Decl::FunctionTemplate: 6304 case Decl::LinkageSpec: 6305 case Decl::Namespace: 6306 case Decl::NamespaceAlias: 6307 case Decl::NonTypeTemplateParm: 6308 case Decl::StaticAssert: 6309 case Decl::TemplateTemplateParm: 6310 case Decl::TemplateTypeParm: 6311 case Decl::UnresolvedUsingTypename: 6312 case Decl::UnresolvedUsingValue: 6313 case Decl::Using: 6314 case Decl::UsingDirective: 6315 case Decl::UsingShadow: 6316 return CXLanguage_CPlusPlus; 6317 } 6318 6319 return CXLanguage_C; 6320 } 6321 6322 extern "C" { 6323 6324 static CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) { 6325 if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted()) 6326 return CXAvailability_Available; 6327 6328 switch (D->getAvailability()) { 6329 case AR_Available: 6330 case AR_NotYetIntroduced: 6331 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D)) 6332 return getCursorAvailabilityForDecl( 6333 cast<Decl>(EnumConst->getDeclContext())); 6334 return CXAvailability_Available; 6335 6336 case AR_Deprecated: 6337 return CXAvailability_Deprecated; 6338 6339 case AR_Unavailable: 6340 return CXAvailability_NotAvailable; 6341 } 6342 6343 llvm_unreachable("Unknown availability kind!"); 6344 } 6345 6346 enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) { 6347 if (clang_isDeclaration(cursor.kind)) 6348 if (const Decl *D = cxcursor::getCursorDecl(cursor)) 6349 return getCursorAvailabilityForDecl(D); 6350 6351 return CXAvailability_Available; 6352 } 6353 6354 static CXVersion convertVersion(VersionTuple In) { 6355 CXVersion Out = { -1, -1, -1 }; 6356 if (In.empty()) 6357 return Out; 6358 6359 Out.Major = In.getMajor(); 6360 6361 Optional<unsigned> Minor = In.getMinor(); 6362 if (Minor.hasValue()) 6363 Out.Minor = *Minor; 6364 else 6365 return Out; 6366 6367 Optional<unsigned> Subminor = In.getSubminor(); 6368 if (Subminor.hasValue()) 6369 Out.Subminor = *Subminor; 6370 6371 return Out; 6372 } 6373 6374 static int getCursorPlatformAvailabilityForDecl(const Decl *D, 6375 int *always_deprecated, 6376 CXString *deprecated_message, 6377 int *always_unavailable, 6378 CXString *unavailable_message, 6379 CXPlatformAvailability *availability, 6380 int availability_size) { 6381 bool HadAvailAttr = false; 6382 int N = 0; 6383 for (auto A : D->attrs()) { 6384 if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) { 6385 HadAvailAttr = true; 6386 if (always_deprecated) 6387 *always_deprecated = 1; 6388 if (deprecated_message) { 6389 clang_disposeString(*deprecated_message); 6390 *deprecated_message = cxstring::createDup(Deprecated->getMessage()); 6391 } 6392 continue; 6393 } 6394 6395 if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) { 6396 HadAvailAttr = true; 6397 if (always_unavailable) 6398 *always_unavailable = 1; 6399 if (unavailable_message) { 6400 clang_disposeString(*unavailable_message); 6401 *unavailable_message = cxstring::createDup(Unavailable->getMessage()); 6402 } 6403 continue; 6404 } 6405 6406 if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) { 6407 HadAvailAttr = true; 6408 if (N < availability_size) { 6409 availability[N].Platform 6410 = cxstring::createDup(Avail->getPlatform()->getName()); 6411 availability[N].Introduced = convertVersion(Avail->getIntroduced()); 6412 availability[N].Deprecated = convertVersion(Avail->getDeprecated()); 6413 availability[N].Obsoleted = convertVersion(Avail->getObsoleted()); 6414 availability[N].Unavailable = Avail->getUnavailable(); 6415 availability[N].Message = cxstring::createDup(Avail->getMessage()); 6416 } 6417 ++N; 6418 } 6419 } 6420 6421 if (!HadAvailAttr) 6422 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D)) 6423 return getCursorPlatformAvailabilityForDecl( 6424 cast<Decl>(EnumConst->getDeclContext()), 6425 always_deprecated, 6426 deprecated_message, 6427 always_unavailable, 6428 unavailable_message, 6429 availability, 6430 availability_size); 6431 6432 return N; 6433 } 6434 6435 int clang_getCursorPlatformAvailability(CXCursor cursor, 6436 int *always_deprecated, 6437 CXString *deprecated_message, 6438 int *always_unavailable, 6439 CXString *unavailable_message, 6440 CXPlatformAvailability *availability, 6441 int availability_size) { 6442 if (always_deprecated) 6443 *always_deprecated = 0; 6444 if (deprecated_message) 6445 *deprecated_message = cxstring::createEmpty(); 6446 if (always_unavailable) 6447 *always_unavailable = 0; 6448 if (unavailable_message) 6449 *unavailable_message = cxstring::createEmpty(); 6450 6451 if (!clang_isDeclaration(cursor.kind)) 6452 return 0; 6453 6454 const Decl *D = cxcursor::getCursorDecl(cursor); 6455 if (!D) 6456 return 0; 6457 6458 return getCursorPlatformAvailabilityForDecl(D, always_deprecated, 6459 deprecated_message, 6460 always_unavailable, 6461 unavailable_message, 6462 availability, 6463 availability_size); 6464 } 6465 6466 void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) { 6467 clang_disposeString(availability->Platform); 6468 clang_disposeString(availability->Message); 6469 } 6470 6471 CXLanguageKind clang_getCursorLanguage(CXCursor cursor) { 6472 if (clang_isDeclaration(cursor.kind)) 6473 return getDeclLanguage(cxcursor::getCursorDecl(cursor)); 6474 6475 return CXLanguage_Invalid; 6476 } 6477 6478 /// \brief If the given cursor is the "templated" declaration 6479 /// descibing a class or function template, return the class or 6480 /// function template. 6481 static const Decl *maybeGetTemplateCursor(const Decl *D) { 6482 if (!D) 6483 return nullptr; 6484 6485 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 6486 if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate()) 6487 return FunTmpl; 6488 6489 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) 6490 if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate()) 6491 return ClassTmpl; 6492 6493 return D; 6494 } 6495 6496 6497 enum CX_StorageClass clang_Cursor_getStorageClass(CXCursor C) { 6498 StorageClass sc = SC_None; 6499 const Decl *D = getCursorDecl(C); 6500 if (D) { 6501 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 6502 sc = FD->getStorageClass(); 6503 } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { 6504 sc = VD->getStorageClass(); 6505 } else { 6506 return CX_SC_Invalid; 6507 } 6508 } else { 6509 return CX_SC_Invalid; 6510 } 6511 switch (sc) { 6512 case SC_None: 6513 return CX_SC_None; 6514 case SC_Extern: 6515 return CX_SC_Extern; 6516 case SC_Static: 6517 return CX_SC_Static; 6518 case SC_PrivateExtern: 6519 return CX_SC_PrivateExtern; 6520 case SC_OpenCLWorkGroupLocal: 6521 return CX_SC_OpenCLWorkGroupLocal; 6522 case SC_Auto: 6523 return CX_SC_Auto; 6524 case SC_Register: 6525 return CX_SC_Register; 6526 } 6527 llvm_unreachable("Unhandled storage class!"); 6528 } 6529 6530 CXCursor clang_getCursorSemanticParent(CXCursor cursor) { 6531 if (clang_isDeclaration(cursor.kind)) { 6532 if (const Decl *D = getCursorDecl(cursor)) { 6533 const DeclContext *DC = D->getDeclContext(); 6534 if (!DC) 6535 return clang_getNullCursor(); 6536 6537 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)), 6538 getCursorTU(cursor)); 6539 } 6540 } 6541 6542 if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) { 6543 if (const Decl *D = getCursorDecl(cursor)) 6544 return MakeCXCursor(D, getCursorTU(cursor)); 6545 } 6546 6547 return clang_getNullCursor(); 6548 } 6549 6550 CXCursor clang_getCursorLexicalParent(CXCursor cursor) { 6551 if (clang_isDeclaration(cursor.kind)) { 6552 if (const Decl *D = getCursorDecl(cursor)) { 6553 const DeclContext *DC = D->getLexicalDeclContext(); 6554 if (!DC) 6555 return clang_getNullCursor(); 6556 6557 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)), 6558 getCursorTU(cursor)); 6559 } 6560 } 6561 6562 // FIXME: Note that we can't easily compute the lexical context of a 6563 // statement or expression, so we return nothing. 6564 return clang_getNullCursor(); 6565 } 6566 6567 CXFile clang_getIncludedFile(CXCursor cursor) { 6568 if (cursor.kind != CXCursor_InclusionDirective) 6569 return nullptr; 6570 6571 const InclusionDirective *ID = getCursorInclusionDirective(cursor); 6572 return const_cast<FileEntry *>(ID->getFile()); 6573 } 6574 6575 unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) { 6576 if (C.kind != CXCursor_ObjCPropertyDecl) 6577 return CXObjCPropertyAttr_noattr; 6578 6579 unsigned Result = CXObjCPropertyAttr_noattr; 6580 const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C)); 6581 ObjCPropertyDecl::PropertyAttributeKind Attr = 6582 PD->getPropertyAttributesAsWritten(); 6583 6584 #define SET_CXOBJCPROP_ATTR(A) \ 6585 if (Attr & ObjCPropertyDecl::OBJC_PR_##A) \ 6586 Result |= CXObjCPropertyAttr_##A 6587 SET_CXOBJCPROP_ATTR(readonly); 6588 SET_CXOBJCPROP_ATTR(getter); 6589 SET_CXOBJCPROP_ATTR(assign); 6590 SET_CXOBJCPROP_ATTR(readwrite); 6591 SET_CXOBJCPROP_ATTR(retain); 6592 SET_CXOBJCPROP_ATTR(copy); 6593 SET_CXOBJCPROP_ATTR(nonatomic); 6594 SET_CXOBJCPROP_ATTR(setter); 6595 SET_CXOBJCPROP_ATTR(atomic); 6596 SET_CXOBJCPROP_ATTR(weak); 6597 SET_CXOBJCPROP_ATTR(strong); 6598 SET_CXOBJCPROP_ATTR(unsafe_unretained); 6599 #undef SET_CXOBJCPROP_ATTR 6600 6601 return Result; 6602 } 6603 6604 unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) { 6605 if (!clang_isDeclaration(C.kind)) 6606 return CXObjCDeclQualifier_None; 6607 6608 Decl::ObjCDeclQualifier QT = Decl::OBJC_TQ_None; 6609 const Decl *D = getCursorDecl(C); 6610 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 6611 QT = MD->getObjCDeclQualifier(); 6612 else if (const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D)) 6613 QT = PD->getObjCDeclQualifier(); 6614 if (QT == Decl::OBJC_TQ_None) 6615 return CXObjCDeclQualifier_None; 6616 6617 unsigned Result = CXObjCDeclQualifier_None; 6618 if (QT & Decl::OBJC_TQ_In) Result |= CXObjCDeclQualifier_In; 6619 if (QT & Decl::OBJC_TQ_Inout) Result |= CXObjCDeclQualifier_Inout; 6620 if (QT & Decl::OBJC_TQ_Out) Result |= CXObjCDeclQualifier_Out; 6621 if (QT & Decl::OBJC_TQ_Bycopy) Result |= CXObjCDeclQualifier_Bycopy; 6622 if (QT & Decl::OBJC_TQ_Byref) Result |= CXObjCDeclQualifier_Byref; 6623 if (QT & Decl::OBJC_TQ_Oneway) Result |= CXObjCDeclQualifier_Oneway; 6624 6625 return Result; 6626 } 6627 6628 unsigned clang_Cursor_isObjCOptional(CXCursor C) { 6629 if (!clang_isDeclaration(C.kind)) 6630 return 0; 6631 6632 const Decl *D = getCursorDecl(C); 6633 if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D)) 6634 return PD->getPropertyImplementation() == ObjCPropertyDecl::Optional; 6635 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 6636 return MD->getImplementationControl() == ObjCMethodDecl::Optional; 6637 6638 return 0; 6639 } 6640 6641 unsigned clang_Cursor_isVariadic(CXCursor C) { 6642 if (!clang_isDeclaration(C.kind)) 6643 return 0; 6644 6645 const Decl *D = getCursorDecl(C); 6646 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 6647 return FD->isVariadic(); 6648 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 6649 return MD->isVariadic(); 6650 6651 return 0; 6652 } 6653 6654 CXSourceRange clang_Cursor_getCommentRange(CXCursor C) { 6655 if (!clang_isDeclaration(C.kind)) 6656 return clang_getNullRange(); 6657 6658 const Decl *D = getCursorDecl(C); 6659 ASTContext &Context = getCursorContext(C); 6660 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 6661 if (!RC) 6662 return clang_getNullRange(); 6663 6664 return cxloc::translateSourceRange(Context, RC->getSourceRange()); 6665 } 6666 6667 CXString clang_Cursor_getRawCommentText(CXCursor C) { 6668 if (!clang_isDeclaration(C.kind)) 6669 return cxstring::createNull(); 6670 6671 const Decl *D = getCursorDecl(C); 6672 ASTContext &Context = getCursorContext(C); 6673 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 6674 StringRef RawText = RC ? RC->getRawText(Context.getSourceManager()) : 6675 StringRef(); 6676 6677 // Don't duplicate the string because RawText points directly into source 6678 // code. 6679 return cxstring::createRef(RawText); 6680 } 6681 6682 CXString clang_Cursor_getBriefCommentText(CXCursor C) { 6683 if (!clang_isDeclaration(C.kind)) 6684 return cxstring::createNull(); 6685 6686 const Decl *D = getCursorDecl(C); 6687 const ASTContext &Context = getCursorContext(C); 6688 const RawComment *RC = Context.getRawCommentForAnyRedecl(D); 6689 6690 if (RC) { 6691 StringRef BriefText = RC->getBriefText(Context); 6692 6693 // Don't duplicate the string because RawComment ensures that this memory 6694 // will not go away. 6695 return cxstring::createRef(BriefText); 6696 } 6697 6698 return cxstring::createNull(); 6699 } 6700 6701 CXModule clang_Cursor_getModule(CXCursor C) { 6702 if (C.kind == CXCursor_ModuleImportDecl) { 6703 if (const ImportDecl *ImportD = 6704 dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) 6705 return ImportD->getImportedModule(); 6706 } 6707 6708 return nullptr; 6709 } 6710 6711 CXModule clang_getModuleForFile(CXTranslationUnit TU, CXFile File) { 6712 if (isNotUsableTU(TU)) { 6713 LOG_BAD_TU(TU); 6714 return nullptr; 6715 } 6716 if (!File) 6717 return nullptr; 6718 FileEntry *FE = static_cast<FileEntry *>(File); 6719 6720 ASTUnit &Unit = *cxtu::getASTUnit(TU); 6721 HeaderSearch &HS = Unit.getPreprocessor().getHeaderSearchInfo(); 6722 ModuleMap::KnownHeader Header = HS.findModuleForHeader(FE); 6723 6724 return Header.getModule(); 6725 } 6726 6727 CXFile clang_Module_getASTFile(CXModule CXMod) { 6728 if (!CXMod) 6729 return nullptr; 6730 Module *Mod = static_cast<Module*>(CXMod); 6731 return const_cast<FileEntry *>(Mod->getASTFile()); 6732 } 6733 6734 CXModule clang_Module_getParent(CXModule CXMod) { 6735 if (!CXMod) 6736 return nullptr; 6737 Module *Mod = static_cast<Module*>(CXMod); 6738 return Mod->Parent; 6739 } 6740 6741 CXString clang_Module_getName(CXModule CXMod) { 6742 if (!CXMod) 6743 return cxstring::createEmpty(); 6744 Module *Mod = static_cast<Module*>(CXMod); 6745 return cxstring::createDup(Mod->Name); 6746 } 6747 6748 CXString clang_Module_getFullName(CXModule CXMod) { 6749 if (!CXMod) 6750 return cxstring::createEmpty(); 6751 Module *Mod = static_cast<Module*>(CXMod); 6752 return cxstring::createDup(Mod->getFullModuleName()); 6753 } 6754 6755 int clang_Module_isSystem(CXModule CXMod) { 6756 if (!CXMod) 6757 return 0; 6758 Module *Mod = static_cast<Module*>(CXMod); 6759 return Mod->IsSystem; 6760 } 6761 6762 unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU, 6763 CXModule CXMod) { 6764 if (isNotUsableTU(TU)) { 6765 LOG_BAD_TU(TU); 6766 return 0; 6767 } 6768 if (!CXMod) 6769 return 0; 6770 Module *Mod = static_cast<Module*>(CXMod); 6771 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager(); 6772 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr); 6773 return TopHeaders.size(); 6774 } 6775 6776 CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU, 6777 CXModule CXMod, unsigned Index) { 6778 if (isNotUsableTU(TU)) { 6779 LOG_BAD_TU(TU); 6780 return nullptr; 6781 } 6782 if (!CXMod) 6783 return nullptr; 6784 Module *Mod = static_cast<Module*>(CXMod); 6785 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager(); 6786 6787 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr); 6788 if (Index < TopHeaders.size()) 6789 return const_cast<FileEntry *>(TopHeaders[Index]); 6790 6791 return nullptr; 6792 } 6793 6794 } // end: extern "C" 6795 6796 //===----------------------------------------------------------------------===// 6797 // C++ AST instrospection. 6798 //===----------------------------------------------------------------------===// 6799 6800 extern "C" { 6801 unsigned clang_CXXMethod_isPureVirtual(CXCursor C) { 6802 if (!clang_isDeclaration(C.kind)) 6803 return 0; 6804 6805 const Decl *D = cxcursor::getCursorDecl(C); 6806 const CXXMethodDecl *Method = 6807 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 6808 return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0; 6809 } 6810 6811 unsigned clang_CXXMethod_isConst(CXCursor C) { 6812 if (!clang_isDeclaration(C.kind)) 6813 return 0; 6814 6815 const Decl *D = cxcursor::getCursorDecl(C); 6816 const CXXMethodDecl *Method = 6817 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 6818 return (Method && (Method->getTypeQualifiers() & Qualifiers::Const)) ? 1 : 0; 6819 } 6820 6821 unsigned clang_CXXMethod_isStatic(CXCursor C) { 6822 if (!clang_isDeclaration(C.kind)) 6823 return 0; 6824 6825 const Decl *D = cxcursor::getCursorDecl(C); 6826 const CXXMethodDecl *Method = 6827 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 6828 return (Method && Method->isStatic()) ? 1 : 0; 6829 } 6830 6831 unsigned clang_CXXMethod_isVirtual(CXCursor C) { 6832 if (!clang_isDeclaration(C.kind)) 6833 return 0; 6834 6835 const Decl *D = cxcursor::getCursorDecl(C); 6836 const CXXMethodDecl *Method = 6837 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr; 6838 return (Method && Method->isVirtual()) ? 1 : 0; 6839 } 6840 } // end: extern "C" 6841 6842 //===----------------------------------------------------------------------===// 6843 // Attribute introspection. 6844 //===----------------------------------------------------------------------===// 6845 6846 extern "C" { 6847 CXType clang_getIBOutletCollectionType(CXCursor C) { 6848 if (C.kind != CXCursor_IBOutletCollectionAttr) 6849 return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C)); 6850 6851 const IBOutletCollectionAttr *A = 6852 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C)); 6853 6854 return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C)); 6855 } 6856 } // end: extern "C" 6857 6858 //===----------------------------------------------------------------------===// 6859 // Inspecting memory usage. 6860 //===----------------------------------------------------------------------===// 6861 6862 typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries; 6863 6864 static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries, 6865 enum CXTUResourceUsageKind k, 6866 unsigned long amount) { 6867 CXTUResourceUsageEntry entry = { k, amount }; 6868 entries.push_back(entry); 6869 } 6870 6871 extern "C" { 6872 6873 const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) { 6874 const char *str = ""; 6875 switch (kind) { 6876 case CXTUResourceUsage_AST: 6877 str = "ASTContext: expressions, declarations, and types"; 6878 break; 6879 case CXTUResourceUsage_Identifiers: 6880 str = "ASTContext: identifiers"; 6881 break; 6882 case CXTUResourceUsage_Selectors: 6883 str = "ASTContext: selectors"; 6884 break; 6885 case CXTUResourceUsage_GlobalCompletionResults: 6886 str = "Code completion: cached global results"; 6887 break; 6888 case CXTUResourceUsage_SourceManagerContentCache: 6889 str = "SourceManager: content cache allocator"; 6890 break; 6891 case CXTUResourceUsage_AST_SideTables: 6892 str = "ASTContext: side tables"; 6893 break; 6894 case CXTUResourceUsage_SourceManager_Membuffer_Malloc: 6895 str = "SourceManager: malloc'ed memory buffers"; 6896 break; 6897 case CXTUResourceUsage_SourceManager_Membuffer_MMap: 6898 str = "SourceManager: mmap'ed memory buffers"; 6899 break; 6900 case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc: 6901 str = "ExternalASTSource: malloc'ed memory buffers"; 6902 break; 6903 case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap: 6904 str = "ExternalASTSource: mmap'ed memory buffers"; 6905 break; 6906 case CXTUResourceUsage_Preprocessor: 6907 str = "Preprocessor: malloc'ed memory"; 6908 break; 6909 case CXTUResourceUsage_PreprocessingRecord: 6910 str = "Preprocessor: PreprocessingRecord"; 6911 break; 6912 case CXTUResourceUsage_SourceManager_DataStructures: 6913 str = "SourceManager: data structures and tables"; 6914 break; 6915 case CXTUResourceUsage_Preprocessor_HeaderSearch: 6916 str = "Preprocessor: header search tables"; 6917 break; 6918 } 6919 return str; 6920 } 6921 6922 CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) { 6923 if (isNotUsableTU(TU)) { 6924 LOG_BAD_TU(TU); 6925 CXTUResourceUsage usage = { (void*) nullptr, 0, nullptr }; 6926 return usage; 6927 } 6928 6929 ASTUnit *astUnit = cxtu::getASTUnit(TU); 6930 std::unique_ptr<MemUsageEntries> entries(new MemUsageEntries()); 6931 ASTContext &astContext = astUnit->getASTContext(); 6932 6933 // How much memory is used by AST nodes and types? 6934 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST, 6935 (unsigned long) astContext.getASTAllocatedMemory()); 6936 6937 // How much memory is used by identifiers? 6938 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers, 6939 (unsigned long) astContext.Idents.getAllocator().getTotalMemory()); 6940 6941 // How much memory is used for selectors? 6942 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors, 6943 (unsigned long) astContext.Selectors.getTotalMemory()); 6944 6945 // How much memory is used by ASTContext's side tables? 6946 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables, 6947 (unsigned long) astContext.getSideTableAllocatedMemory()); 6948 6949 // How much memory is used for caching global code completion results? 6950 unsigned long completionBytes = 0; 6951 if (GlobalCodeCompletionAllocator *completionAllocator = 6952 astUnit->getCachedCompletionAllocator().get()) { 6953 completionBytes = completionAllocator->getTotalMemory(); 6954 } 6955 createCXTUResourceUsageEntry(*entries, 6956 CXTUResourceUsage_GlobalCompletionResults, 6957 completionBytes); 6958 6959 // How much memory is being used by SourceManager's content cache? 6960 createCXTUResourceUsageEntry(*entries, 6961 CXTUResourceUsage_SourceManagerContentCache, 6962 (unsigned long) astContext.getSourceManager().getContentCacheSize()); 6963 6964 // How much memory is being used by the MemoryBuffer's in SourceManager? 6965 const SourceManager::MemoryBufferSizes &srcBufs = 6966 astUnit->getSourceManager().getMemoryBufferSizes(); 6967 6968 createCXTUResourceUsageEntry(*entries, 6969 CXTUResourceUsage_SourceManager_Membuffer_Malloc, 6970 (unsigned long) srcBufs.malloc_bytes); 6971 createCXTUResourceUsageEntry(*entries, 6972 CXTUResourceUsage_SourceManager_Membuffer_MMap, 6973 (unsigned long) srcBufs.mmap_bytes); 6974 createCXTUResourceUsageEntry(*entries, 6975 CXTUResourceUsage_SourceManager_DataStructures, 6976 (unsigned long) astContext.getSourceManager() 6977 .getDataStructureSizes()); 6978 6979 // How much memory is being used by the ExternalASTSource? 6980 if (ExternalASTSource *esrc = astContext.getExternalSource()) { 6981 const ExternalASTSource::MemoryBufferSizes &sizes = 6982 esrc->getMemoryBufferSizes(); 6983 6984 createCXTUResourceUsageEntry(*entries, 6985 CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc, 6986 (unsigned long) sizes.malloc_bytes); 6987 createCXTUResourceUsageEntry(*entries, 6988 CXTUResourceUsage_ExternalASTSource_Membuffer_MMap, 6989 (unsigned long) sizes.mmap_bytes); 6990 } 6991 6992 // How much memory is being used by the Preprocessor? 6993 Preprocessor &pp = astUnit->getPreprocessor(); 6994 createCXTUResourceUsageEntry(*entries, 6995 CXTUResourceUsage_Preprocessor, 6996 pp.getTotalMemory()); 6997 6998 if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) { 6999 createCXTUResourceUsageEntry(*entries, 7000 CXTUResourceUsage_PreprocessingRecord, 7001 pRec->getTotalMemory()); 7002 } 7003 7004 createCXTUResourceUsageEntry(*entries, 7005 CXTUResourceUsage_Preprocessor_HeaderSearch, 7006 pp.getHeaderSearchInfo().getTotalMemory()); 7007 7008 CXTUResourceUsage usage = { (void*) entries.get(), 7009 (unsigned) entries->size(), 7010 !entries->empty() ? &(*entries)[0] : nullptr }; 7011 entries.release(); 7012 return usage; 7013 } 7014 7015 void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) { 7016 if (usage.data) 7017 delete (MemUsageEntries*) usage.data; 7018 } 7019 7020 CXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) { 7021 CXSourceRangeList *skipped = new CXSourceRangeList; 7022 skipped->count = 0; 7023 skipped->ranges = nullptr; 7024 7025 if (isNotUsableTU(TU)) { 7026 LOG_BAD_TU(TU); 7027 return skipped; 7028 } 7029 7030 if (!file) 7031 return skipped; 7032 7033 ASTUnit *astUnit = cxtu::getASTUnit(TU); 7034 PreprocessingRecord *ppRec = astUnit->getPreprocessor().getPreprocessingRecord(); 7035 if (!ppRec) 7036 return skipped; 7037 7038 ASTContext &Ctx = astUnit->getASTContext(); 7039 SourceManager &sm = Ctx.getSourceManager(); 7040 FileEntry *fileEntry = static_cast<FileEntry *>(file); 7041 FileID wantedFileID = sm.translateFile(fileEntry); 7042 7043 const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges(); 7044 std::vector<SourceRange> wantedRanges; 7045 for (std::vector<SourceRange>::const_iterator i = SkippedRanges.begin(), ei = SkippedRanges.end(); 7046 i != ei; ++i) { 7047 if (sm.getFileID(i->getBegin()) == wantedFileID || sm.getFileID(i->getEnd()) == wantedFileID) 7048 wantedRanges.push_back(*i); 7049 } 7050 7051 skipped->count = wantedRanges.size(); 7052 skipped->ranges = new CXSourceRange[skipped->count]; 7053 for (unsigned i = 0, ei = skipped->count; i != ei; ++i) 7054 skipped->ranges[i] = cxloc::translateSourceRange(Ctx, wantedRanges[i]); 7055 7056 return skipped; 7057 } 7058 7059 void clang_disposeSourceRangeList(CXSourceRangeList *ranges) { 7060 if (ranges) { 7061 delete[] ranges->ranges; 7062 delete ranges; 7063 } 7064 } 7065 7066 } // end extern "C" 7067 7068 void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) { 7069 CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU); 7070 for (unsigned I = 0; I != Usage.numEntries; ++I) 7071 fprintf(stderr, " %s: %lu\n", 7072 clang_getTUResourceUsageName(Usage.entries[I].kind), 7073 Usage.entries[I].amount); 7074 7075 clang_disposeCXTUResourceUsage(Usage); 7076 } 7077 7078 //===----------------------------------------------------------------------===// 7079 // Misc. utility functions. 7080 //===----------------------------------------------------------------------===// 7081 7082 /// Default to using an 8 MB stack size on "safety" threads. 7083 static unsigned SafetyStackThreadSize = 8 << 20; 7084 7085 namespace clang { 7086 7087 bool RunSafely(llvm::CrashRecoveryContext &CRC, 7088 void (*Fn)(void*), void *UserData, 7089 unsigned Size) { 7090 if (!Size) 7091 Size = GetSafetyThreadStackSize(); 7092 if (Size) 7093 return CRC.RunSafelyOnThread(Fn, UserData, Size); 7094 return CRC.RunSafely(Fn, UserData); 7095 } 7096 7097 unsigned GetSafetyThreadStackSize() { 7098 return SafetyStackThreadSize; 7099 } 7100 7101 void SetSafetyThreadStackSize(unsigned Value) { 7102 SafetyStackThreadSize = Value; 7103 } 7104 7105 } 7106 7107 void clang::setThreadBackgroundPriority() { 7108 if (getenv("LIBCLANG_BGPRIO_DISABLE")) 7109 return; 7110 7111 #ifdef USE_DARWIN_THREADS 7112 setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG); 7113 #endif 7114 } 7115 7116 void cxindex::printDiagsToStderr(ASTUnit *Unit) { 7117 if (!Unit) 7118 return; 7119 7120 for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(), 7121 DEnd = Unit->stored_diag_end(); 7122 D != DEnd; ++D) { 7123 CXStoredDiagnostic Diag(*D, Unit->getLangOpts()); 7124 CXString Msg = clang_formatDiagnostic(&Diag, 7125 clang_defaultDiagnosticDisplayOptions()); 7126 fprintf(stderr, "%s\n", clang_getCString(Msg)); 7127 clang_disposeString(Msg); 7128 } 7129 #ifdef LLVM_ON_WIN32 7130 // On Windows, force a flush, since there may be multiple copies of 7131 // stderr and stdout in the file system, all with different buffers 7132 // but writing to the same device. 7133 fflush(stderr); 7134 #endif 7135 } 7136 7137 MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II, 7138 SourceLocation MacroDefLoc, 7139 CXTranslationUnit TU){ 7140 if (MacroDefLoc.isInvalid() || !TU) 7141 return nullptr; 7142 if (!II.hadMacroDefinition()) 7143 return nullptr; 7144 7145 ASTUnit *Unit = cxtu::getASTUnit(TU); 7146 Preprocessor &PP = Unit->getPreprocessor(); 7147 MacroDirective *MD = PP.getMacroDirectiveHistory(&II); 7148 if (MD) { 7149 for (MacroDirective::DefInfo 7150 Def = MD->getDefinition(); Def; Def = Def.getPreviousDefinition()) { 7151 if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc()) 7152 return Def.getMacroInfo(); 7153 } 7154 } 7155 7156 return nullptr; 7157 } 7158 7159 const MacroInfo *cxindex::getMacroInfo(const MacroDefinition *MacroDef, 7160 CXTranslationUnit TU) { 7161 if (!MacroDef || !TU) 7162 return nullptr; 7163 const IdentifierInfo *II = MacroDef->getName(); 7164 if (!II) 7165 return nullptr; 7166 7167 return getMacroInfo(*II, MacroDef->getLocation(), TU); 7168 } 7169 7170 MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, 7171 const Token &Tok, 7172 CXTranslationUnit TU) { 7173 if (!MI || !TU) 7174 return nullptr; 7175 if (Tok.isNot(tok::raw_identifier)) 7176 return nullptr; 7177 7178 if (MI->getNumTokens() == 0) 7179 return nullptr; 7180 SourceRange DefRange(MI->getReplacementToken(0).getLocation(), 7181 MI->getDefinitionEndLoc()); 7182 ASTUnit *Unit = cxtu::getASTUnit(TU); 7183 7184 // Check that the token is inside the definition and not its argument list. 7185 SourceManager &SM = Unit->getSourceManager(); 7186 if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin())) 7187 return nullptr; 7188 if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation())) 7189 return nullptr; 7190 7191 Preprocessor &PP = Unit->getPreprocessor(); 7192 PreprocessingRecord *PPRec = PP.getPreprocessingRecord(); 7193 if (!PPRec) 7194 return nullptr; 7195 7196 IdentifierInfo &II = PP.getIdentifierTable().get(Tok.getRawIdentifier()); 7197 if (!II.hadMacroDefinition()) 7198 return nullptr; 7199 7200 // Check that the identifier is not one of the macro arguments. 7201 if (std::find(MI->arg_begin(), MI->arg_end(), &II) != MI->arg_end()) 7202 return nullptr; 7203 7204 MacroDirective *InnerMD = PP.getMacroDirectiveHistory(&II); 7205 if (!InnerMD) 7206 return nullptr; 7207 7208 return PPRec->findMacroDefinition(InnerMD->getMacroInfo()); 7209 } 7210 7211 MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, 7212 SourceLocation Loc, 7213 CXTranslationUnit TU) { 7214 if (Loc.isInvalid() || !MI || !TU) 7215 return nullptr; 7216 7217 if (MI->getNumTokens() == 0) 7218 return nullptr; 7219 ASTUnit *Unit = cxtu::getASTUnit(TU); 7220 Preprocessor &PP = Unit->getPreprocessor(); 7221 if (!PP.getPreprocessingRecord()) 7222 return nullptr; 7223 Loc = Unit->getSourceManager().getSpellingLoc(Loc); 7224 Token Tok; 7225 if (PP.getRawToken(Loc, Tok)) 7226 return nullptr; 7227 7228 return checkForMacroInMacroDefinition(MI, Tok, TU); 7229 } 7230 7231 extern "C" { 7232 7233 CXString clang_getClangVersion() { 7234 return cxstring::createDup(getClangFullVersion()); 7235 } 7236 7237 } // end: extern "C" 7238 7239 Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) { 7240 if (TU) { 7241 if (ASTUnit *Unit = cxtu::getASTUnit(TU)) { 7242 LogOS << '<' << Unit->getMainFileName() << '>'; 7243 if (Unit->isMainFileAST()) 7244 LogOS << " (" << Unit->getASTFileName() << ')'; 7245 return *this; 7246 } 7247 } else { 7248 LogOS << "<NULL TU>"; 7249 } 7250 return *this; 7251 } 7252 7253 Logger &cxindex::Logger::operator<<(const FileEntry *FE) { 7254 *this << FE->getName(); 7255 return *this; 7256 } 7257 7258 Logger &cxindex::Logger::operator<<(CXCursor cursor) { 7259 CXString cursorName = clang_getCursorDisplayName(cursor); 7260 *this << cursorName << "@" << clang_getCursorLocation(cursor); 7261 clang_disposeString(cursorName); 7262 return *this; 7263 } 7264 7265 Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) { 7266 CXFile File; 7267 unsigned Line, Column; 7268 clang_getFileLocation(Loc, &File, &Line, &Column, nullptr); 7269 CXString FileName = clang_getFileName(File); 7270 *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column); 7271 clang_disposeString(FileName); 7272 return *this; 7273 } 7274 7275 Logger &cxindex::Logger::operator<<(CXSourceRange range) { 7276 CXSourceLocation BLoc = clang_getRangeStart(range); 7277 CXSourceLocation ELoc = clang_getRangeEnd(range); 7278 7279 CXFile BFile; 7280 unsigned BLine, BColumn; 7281 clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, nullptr); 7282 7283 CXFile EFile; 7284 unsigned ELine, EColumn; 7285 clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, nullptr); 7286 7287 CXString BFileName = clang_getFileName(BFile); 7288 if (BFile == EFile) { 7289 *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName), 7290 BLine, BColumn, ELine, EColumn); 7291 } else { 7292 CXString EFileName = clang_getFileName(EFile); 7293 *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName), 7294 BLine, BColumn) 7295 << llvm::format("%s:%d:%d]", clang_getCString(EFileName), 7296 ELine, EColumn); 7297 clang_disposeString(EFileName); 7298 } 7299 clang_disposeString(BFileName); 7300 return *this; 7301 } 7302 7303 Logger &cxindex::Logger::operator<<(CXString Str) { 7304 *this << clang_getCString(Str); 7305 return *this; 7306 } 7307 7308 Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) { 7309 LogOS << Fmt; 7310 return *this; 7311 } 7312 7313 static llvm::ManagedStatic<llvm::sys::Mutex> LoggingMutex; 7314 7315 cxindex::Logger::~Logger() { 7316 LogOS.flush(); 7317 7318 llvm::sys::ScopedLock L(*LoggingMutex); 7319 7320 static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime(); 7321 7322 raw_ostream &OS = llvm::errs(); 7323 OS << "[libclang:" << Name << ':'; 7324 7325 #ifdef USE_DARWIN_THREADS 7326 // TODO: Portability. 7327 mach_port_t tid = pthread_mach_thread_np(pthread_self()); 7328 OS << tid << ':'; 7329 #endif 7330 7331 llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime(); 7332 OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime()); 7333 OS << Msg << '\n'; 7334 7335 if (Trace) { 7336 llvm::sys::PrintStackTrace(OS); 7337 OS << "--------------------------------------------------\n"; 7338 } 7339 } 7340