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