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