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