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