CIndex.cpp revision 8e7c48a54b4325925f5edda1738a3537ab2c3c5e
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 setBackGroundPriority(); 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 setBackGroundPriority(); 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 setBackGroundPriority(); 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 return PRE->isExplicitProperty() ? PRE->getExplicitProperty() : 0; 2906 if (PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) 2907 return getDeclFromExpr(POE->getSyntacticForm()); 2908 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) 2909 if (Expr *Src = OVE->getSourceExpr()) 2910 return getDeclFromExpr(Src); 2911 2912 if (CallExpr *CE = dyn_cast<CallExpr>(E)) 2913 return getDeclFromExpr(CE->getCallee()); 2914 if (CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E)) 2915 if (!CE->isElidable()) 2916 return CE->getConstructor(); 2917 if (ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E)) 2918 return OME->getMethodDecl(); 2919 2920 if (ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E)) 2921 return PE->getProtocol(); 2922 if (SubstNonTypeTemplateParmPackExpr *NTTP 2923 = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E)) 2924 return NTTP->getParameterPack(); 2925 if (SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E)) 2926 if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) || 2927 isa<ParmVarDecl>(SizeOfPack->getPack())) 2928 return SizeOfPack->getPack(); 2929 2930 return 0; 2931} 2932 2933static SourceLocation getLocationFromExpr(Expr *E) { 2934 if (ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E)) 2935 return getLocationFromExpr(CE->getSubExpr()); 2936 2937 if (ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E)) 2938 return /*FIXME:*/Msg->getLeftLoc(); 2939 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) 2940 return DRE->getLocation(); 2941 if (MemberExpr *Member = dyn_cast<MemberExpr>(E)) 2942 return Member->getMemberLoc(); 2943 if (ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E)) 2944 return Ivar->getLocation(); 2945 if (SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E)) 2946 return SizeOfPack->getPackLoc(); 2947 2948 return E->getLocStart(); 2949} 2950 2951extern "C" { 2952 2953unsigned clang_visitChildren(CXCursor parent, 2954 CXCursorVisitor visitor, 2955 CXClientData client_data) { 2956 CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data, 2957 /*VisitPreprocessorLast=*/false); 2958 return CursorVis.VisitChildren(parent); 2959} 2960 2961#ifndef __has_feature 2962#define __has_feature(x) 0 2963#endif 2964#if __has_feature(blocks) 2965typedef enum CXChildVisitResult 2966 (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent); 2967 2968static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 2969 CXClientData client_data) { 2970 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 2971 return block(cursor, parent); 2972} 2973#else 2974// If we are compiled with a compiler that doesn't have native blocks support, 2975// define and call the block manually, so the 2976typedef struct _CXChildVisitResult 2977{ 2978 void *isa; 2979 int flags; 2980 int reserved; 2981 enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor, 2982 CXCursor); 2983} *CXCursorVisitorBlock; 2984 2985static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent, 2986 CXClientData client_data) { 2987 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data; 2988 return block->invoke(block, cursor, parent); 2989} 2990#endif 2991 2992 2993unsigned clang_visitChildrenWithBlock(CXCursor parent, 2994 CXCursorVisitorBlock block) { 2995 return clang_visitChildren(parent, visitWithBlock, block); 2996} 2997 2998static CXString getDeclSpelling(Decl *D) { 2999 if (!D) 3000 return createCXString(""); 3001 3002 NamedDecl *ND = dyn_cast<NamedDecl>(D); 3003 if (!ND) { 3004 if (ObjCPropertyImplDecl *PropImpl =dyn_cast<ObjCPropertyImplDecl>(D)) 3005 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 3006 return createCXString(Property->getIdentifier()->getName()); 3007 3008 return createCXString(""); 3009 } 3010 3011 if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND)) 3012 return createCXString(OMD->getSelector().getAsString()); 3013 3014 if (ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND)) 3015 // No, this isn't the same as the code below. getIdentifier() is non-virtual 3016 // and returns different names. NamedDecl returns the class name and 3017 // ObjCCategoryImplDecl returns the category name. 3018 return createCXString(CIMP->getIdentifier()->getNameStart()); 3019 3020 if (isa<UsingDirectiveDecl>(D)) 3021 return createCXString(""); 3022 3023 SmallString<1024> S; 3024 llvm::raw_svector_ostream os(S); 3025 ND->printName(os); 3026 3027 return createCXString(os.str()); 3028} 3029 3030CXString clang_getCursorSpelling(CXCursor C) { 3031 if (clang_isTranslationUnit(C.kind)) 3032 return clang_getTranslationUnitSpelling( 3033 static_cast<CXTranslationUnit>(C.data[2])); 3034 3035 if (clang_isReference(C.kind)) { 3036 switch (C.kind) { 3037 case CXCursor_ObjCSuperClassRef: { 3038 ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first; 3039 return createCXString(Super->getIdentifier()->getNameStart()); 3040 } 3041 case CXCursor_ObjCClassRef: { 3042 ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 3043 return createCXString(Class->getIdentifier()->getNameStart()); 3044 } 3045 case CXCursor_ObjCProtocolRef: { 3046 ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first; 3047 assert(OID && "getCursorSpelling(): Missing protocol decl"); 3048 return createCXString(OID->getIdentifier()->getNameStart()); 3049 } 3050 case CXCursor_CXXBaseSpecifier: { 3051 CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C); 3052 return createCXString(B->getType().getAsString()); 3053 } 3054 case CXCursor_TypeRef: { 3055 TypeDecl *Type = getCursorTypeRef(C).first; 3056 assert(Type && "Missing type decl"); 3057 3058 return createCXString(getCursorContext(C).getTypeDeclType(Type). 3059 getAsString()); 3060 } 3061 case CXCursor_TemplateRef: { 3062 TemplateDecl *Template = getCursorTemplateRef(C).first; 3063 assert(Template && "Missing template decl"); 3064 3065 return createCXString(Template->getNameAsString()); 3066 } 3067 3068 case CXCursor_NamespaceRef: { 3069 NamedDecl *NS = getCursorNamespaceRef(C).first; 3070 assert(NS && "Missing namespace decl"); 3071 3072 return createCXString(NS->getNameAsString()); 3073 } 3074 3075 case CXCursor_MemberRef: { 3076 FieldDecl *Field = getCursorMemberRef(C).first; 3077 assert(Field && "Missing member decl"); 3078 3079 return createCXString(Field->getNameAsString()); 3080 } 3081 3082 case CXCursor_LabelRef: { 3083 LabelStmt *Label = getCursorLabelRef(C).first; 3084 assert(Label && "Missing label"); 3085 3086 return createCXString(Label->getName()); 3087 } 3088 3089 case CXCursor_OverloadedDeclRef: { 3090 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 3091 if (Decl *D = Storage.dyn_cast<Decl *>()) { 3092 if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) 3093 return createCXString(ND->getNameAsString()); 3094 return createCXString(""); 3095 } 3096 if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>()) 3097 return createCXString(E->getName().getAsString()); 3098 OverloadedTemplateStorage *Ovl 3099 = Storage.get<OverloadedTemplateStorage*>(); 3100 if (Ovl->size() == 0) 3101 return createCXString(""); 3102 return createCXString((*Ovl->begin())->getNameAsString()); 3103 } 3104 3105 case CXCursor_VariableRef: { 3106 VarDecl *Var = getCursorVariableRef(C).first; 3107 assert(Var && "Missing variable decl"); 3108 3109 return createCXString(Var->getNameAsString()); 3110 } 3111 3112 default: 3113 return createCXString("<not implemented>"); 3114 } 3115 } 3116 3117 if (clang_isExpression(C.kind)) { 3118 Decl *D = getDeclFromExpr(getCursorExpr(C)); 3119 if (D) 3120 return getDeclSpelling(D); 3121 return createCXString(""); 3122 } 3123 3124 if (clang_isStatement(C.kind)) { 3125 Stmt *S = getCursorStmt(C); 3126 if (LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) 3127 return createCXString(Label->getName()); 3128 3129 return createCXString(""); 3130 } 3131 3132 if (C.kind == CXCursor_MacroExpansion) 3133 return createCXString(getCursorMacroExpansion(C)->getName() 3134 ->getNameStart()); 3135 3136 if (C.kind == CXCursor_MacroDefinition) 3137 return createCXString(getCursorMacroDefinition(C)->getName() 3138 ->getNameStart()); 3139 3140 if (C.kind == CXCursor_InclusionDirective) 3141 return createCXString(getCursorInclusionDirective(C)->getFileName()); 3142 3143 if (clang_isDeclaration(C.kind)) 3144 return getDeclSpelling(getCursorDecl(C)); 3145 3146 if (C.kind == CXCursor_AnnotateAttr) { 3147 AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C)); 3148 return createCXString(AA->getAnnotation()); 3149 } 3150 3151 if (C.kind == CXCursor_AsmLabelAttr) { 3152 AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C)); 3153 return createCXString(AA->getLabel()); 3154 } 3155 3156 return createCXString(""); 3157} 3158 3159CXString clang_getCursorDisplayName(CXCursor C) { 3160 if (!clang_isDeclaration(C.kind)) 3161 return clang_getCursorSpelling(C); 3162 3163 Decl *D = getCursorDecl(C); 3164 if (!D) 3165 return createCXString(""); 3166 3167 PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy(); 3168 if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D)) 3169 D = FunTmpl->getTemplatedDecl(); 3170 3171 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 3172 SmallString<64> Str; 3173 llvm::raw_svector_ostream OS(Str); 3174 OS << *Function; 3175 if (Function->getPrimaryTemplate()) 3176 OS << "<>"; 3177 OS << "("; 3178 for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) { 3179 if (I) 3180 OS << ", "; 3181 OS << Function->getParamDecl(I)->getType().getAsString(Policy); 3182 } 3183 3184 if (Function->isVariadic()) { 3185 if (Function->getNumParams()) 3186 OS << ", "; 3187 OS << "..."; 3188 } 3189 OS << ")"; 3190 return createCXString(OS.str()); 3191 } 3192 3193 if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) { 3194 SmallString<64> Str; 3195 llvm::raw_svector_ostream OS(Str); 3196 OS << *ClassTemplate; 3197 OS << "<"; 3198 TemplateParameterList *Params = ClassTemplate->getTemplateParameters(); 3199 for (unsigned I = 0, N = Params->size(); I != N; ++I) { 3200 if (I) 3201 OS << ", "; 3202 3203 NamedDecl *Param = Params->getParam(I); 3204 if (Param->getIdentifier()) { 3205 OS << Param->getIdentifier()->getName(); 3206 continue; 3207 } 3208 3209 // There is no parameter name, which makes this tricky. Try to come up 3210 // with something useful that isn't too long. 3211 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) 3212 OS << (TTP->wasDeclaredWithTypename()? "typename" : "class"); 3213 else if (NonTypeTemplateParmDecl *NTTP 3214 = dyn_cast<NonTypeTemplateParmDecl>(Param)) 3215 OS << NTTP->getType().getAsString(Policy); 3216 else 3217 OS << "template<...> class"; 3218 } 3219 3220 OS << ">"; 3221 return createCXString(OS.str()); 3222 } 3223 3224 if (ClassTemplateSpecializationDecl *ClassSpec 3225 = dyn_cast<ClassTemplateSpecializationDecl>(D)) { 3226 // If the type was explicitly written, use that. 3227 if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten()) 3228 return createCXString(TSInfo->getType().getAsString(Policy)); 3229 3230 SmallString<64> Str; 3231 llvm::raw_svector_ostream OS(Str); 3232 OS << *ClassSpec; 3233 OS << TemplateSpecializationType::PrintTemplateArgumentList( 3234 ClassSpec->getTemplateArgs().data(), 3235 ClassSpec->getTemplateArgs().size(), 3236 Policy); 3237 return createCXString(OS.str()); 3238 } 3239 3240 return clang_getCursorSpelling(C); 3241} 3242 3243CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) { 3244 switch (Kind) { 3245 case CXCursor_FunctionDecl: 3246 return createCXString("FunctionDecl"); 3247 case CXCursor_TypedefDecl: 3248 return createCXString("TypedefDecl"); 3249 case CXCursor_EnumDecl: 3250 return createCXString("EnumDecl"); 3251 case CXCursor_EnumConstantDecl: 3252 return createCXString("EnumConstantDecl"); 3253 case CXCursor_StructDecl: 3254 return createCXString("StructDecl"); 3255 case CXCursor_UnionDecl: 3256 return createCXString("UnionDecl"); 3257 case CXCursor_ClassDecl: 3258 return createCXString("ClassDecl"); 3259 case CXCursor_FieldDecl: 3260 return createCXString("FieldDecl"); 3261 case CXCursor_VarDecl: 3262 return createCXString("VarDecl"); 3263 case CXCursor_ParmDecl: 3264 return createCXString("ParmDecl"); 3265 case CXCursor_ObjCInterfaceDecl: 3266 return createCXString("ObjCInterfaceDecl"); 3267 case CXCursor_ObjCCategoryDecl: 3268 return createCXString("ObjCCategoryDecl"); 3269 case CXCursor_ObjCProtocolDecl: 3270 return createCXString("ObjCProtocolDecl"); 3271 case CXCursor_ObjCPropertyDecl: 3272 return createCXString("ObjCPropertyDecl"); 3273 case CXCursor_ObjCIvarDecl: 3274 return createCXString("ObjCIvarDecl"); 3275 case CXCursor_ObjCInstanceMethodDecl: 3276 return createCXString("ObjCInstanceMethodDecl"); 3277 case CXCursor_ObjCClassMethodDecl: 3278 return createCXString("ObjCClassMethodDecl"); 3279 case CXCursor_ObjCImplementationDecl: 3280 return createCXString("ObjCImplementationDecl"); 3281 case CXCursor_ObjCCategoryImplDecl: 3282 return createCXString("ObjCCategoryImplDecl"); 3283 case CXCursor_CXXMethod: 3284 return createCXString("CXXMethod"); 3285 case CXCursor_UnexposedDecl: 3286 return createCXString("UnexposedDecl"); 3287 case CXCursor_ObjCSuperClassRef: 3288 return createCXString("ObjCSuperClassRef"); 3289 case CXCursor_ObjCProtocolRef: 3290 return createCXString("ObjCProtocolRef"); 3291 case CXCursor_ObjCClassRef: 3292 return createCXString("ObjCClassRef"); 3293 case CXCursor_TypeRef: 3294 return createCXString("TypeRef"); 3295 case CXCursor_TemplateRef: 3296 return createCXString("TemplateRef"); 3297 case CXCursor_NamespaceRef: 3298 return createCXString("NamespaceRef"); 3299 case CXCursor_MemberRef: 3300 return createCXString("MemberRef"); 3301 case CXCursor_LabelRef: 3302 return createCXString("LabelRef"); 3303 case CXCursor_OverloadedDeclRef: 3304 return createCXString("OverloadedDeclRef"); 3305 case CXCursor_VariableRef: 3306 return createCXString("VariableRef"); 3307 case CXCursor_IntegerLiteral: 3308 return createCXString("IntegerLiteral"); 3309 case CXCursor_FloatingLiteral: 3310 return createCXString("FloatingLiteral"); 3311 case CXCursor_ImaginaryLiteral: 3312 return createCXString("ImaginaryLiteral"); 3313 case CXCursor_StringLiteral: 3314 return createCXString("StringLiteral"); 3315 case CXCursor_CharacterLiteral: 3316 return createCXString("CharacterLiteral"); 3317 case CXCursor_ParenExpr: 3318 return createCXString("ParenExpr"); 3319 case CXCursor_UnaryOperator: 3320 return createCXString("UnaryOperator"); 3321 case CXCursor_ArraySubscriptExpr: 3322 return createCXString("ArraySubscriptExpr"); 3323 case CXCursor_BinaryOperator: 3324 return createCXString("BinaryOperator"); 3325 case CXCursor_CompoundAssignOperator: 3326 return createCXString("CompoundAssignOperator"); 3327 case CXCursor_ConditionalOperator: 3328 return createCXString("ConditionalOperator"); 3329 case CXCursor_CStyleCastExpr: 3330 return createCXString("CStyleCastExpr"); 3331 case CXCursor_CompoundLiteralExpr: 3332 return createCXString("CompoundLiteralExpr"); 3333 case CXCursor_InitListExpr: 3334 return createCXString("InitListExpr"); 3335 case CXCursor_AddrLabelExpr: 3336 return createCXString("AddrLabelExpr"); 3337 case CXCursor_StmtExpr: 3338 return createCXString("StmtExpr"); 3339 case CXCursor_GenericSelectionExpr: 3340 return createCXString("GenericSelectionExpr"); 3341 case CXCursor_GNUNullExpr: 3342 return createCXString("GNUNullExpr"); 3343 case CXCursor_CXXStaticCastExpr: 3344 return createCXString("CXXStaticCastExpr"); 3345 case CXCursor_CXXDynamicCastExpr: 3346 return createCXString("CXXDynamicCastExpr"); 3347 case CXCursor_CXXReinterpretCastExpr: 3348 return createCXString("CXXReinterpretCastExpr"); 3349 case CXCursor_CXXConstCastExpr: 3350 return createCXString("CXXConstCastExpr"); 3351 case CXCursor_CXXFunctionalCastExpr: 3352 return createCXString("CXXFunctionalCastExpr"); 3353 case CXCursor_CXXTypeidExpr: 3354 return createCXString("CXXTypeidExpr"); 3355 case CXCursor_CXXBoolLiteralExpr: 3356 return createCXString("CXXBoolLiteralExpr"); 3357 case CXCursor_CXXNullPtrLiteralExpr: 3358 return createCXString("CXXNullPtrLiteralExpr"); 3359 case CXCursor_CXXThisExpr: 3360 return createCXString("CXXThisExpr"); 3361 case CXCursor_CXXThrowExpr: 3362 return createCXString("CXXThrowExpr"); 3363 case CXCursor_CXXNewExpr: 3364 return createCXString("CXXNewExpr"); 3365 case CXCursor_CXXDeleteExpr: 3366 return createCXString("CXXDeleteExpr"); 3367 case CXCursor_UnaryExpr: 3368 return createCXString("UnaryExpr"); 3369 case CXCursor_ObjCStringLiteral: 3370 return createCXString("ObjCStringLiteral"); 3371 case CXCursor_ObjCBoolLiteralExpr: 3372 return createCXString("ObjCBoolLiteralExpr"); 3373 case CXCursor_ObjCEncodeExpr: 3374 return createCXString("ObjCEncodeExpr"); 3375 case CXCursor_ObjCSelectorExpr: 3376 return createCXString("ObjCSelectorExpr"); 3377 case CXCursor_ObjCProtocolExpr: 3378 return createCXString("ObjCProtocolExpr"); 3379 case CXCursor_ObjCBridgedCastExpr: 3380 return createCXString("ObjCBridgedCastExpr"); 3381 case CXCursor_BlockExpr: 3382 return createCXString("BlockExpr"); 3383 case CXCursor_PackExpansionExpr: 3384 return createCXString("PackExpansionExpr"); 3385 case CXCursor_SizeOfPackExpr: 3386 return createCXString("SizeOfPackExpr"); 3387 case CXCursor_LambdaExpr: 3388 return createCXString("LambdaExpr"); 3389 case CXCursor_UnexposedExpr: 3390 return createCXString("UnexposedExpr"); 3391 case CXCursor_DeclRefExpr: 3392 return createCXString("DeclRefExpr"); 3393 case CXCursor_MemberRefExpr: 3394 return createCXString("MemberRefExpr"); 3395 case CXCursor_CallExpr: 3396 return createCXString("CallExpr"); 3397 case CXCursor_ObjCMessageExpr: 3398 return createCXString("ObjCMessageExpr"); 3399 case CXCursor_UnexposedStmt: 3400 return createCXString("UnexposedStmt"); 3401 case CXCursor_DeclStmt: 3402 return createCXString("DeclStmt"); 3403 case CXCursor_LabelStmt: 3404 return createCXString("LabelStmt"); 3405 case CXCursor_CompoundStmt: 3406 return createCXString("CompoundStmt"); 3407 case CXCursor_CaseStmt: 3408 return createCXString("CaseStmt"); 3409 case CXCursor_DefaultStmt: 3410 return createCXString("DefaultStmt"); 3411 case CXCursor_IfStmt: 3412 return createCXString("IfStmt"); 3413 case CXCursor_SwitchStmt: 3414 return createCXString("SwitchStmt"); 3415 case CXCursor_WhileStmt: 3416 return createCXString("WhileStmt"); 3417 case CXCursor_DoStmt: 3418 return createCXString("DoStmt"); 3419 case CXCursor_ForStmt: 3420 return createCXString("ForStmt"); 3421 case CXCursor_GotoStmt: 3422 return createCXString("GotoStmt"); 3423 case CXCursor_IndirectGotoStmt: 3424 return createCXString("IndirectGotoStmt"); 3425 case CXCursor_ContinueStmt: 3426 return createCXString("ContinueStmt"); 3427 case CXCursor_BreakStmt: 3428 return createCXString("BreakStmt"); 3429 case CXCursor_ReturnStmt: 3430 return createCXString("ReturnStmt"); 3431 case CXCursor_AsmStmt: 3432 return createCXString("AsmStmt"); 3433 case CXCursor_ObjCAtTryStmt: 3434 return createCXString("ObjCAtTryStmt"); 3435 case CXCursor_ObjCAtCatchStmt: 3436 return createCXString("ObjCAtCatchStmt"); 3437 case CXCursor_ObjCAtFinallyStmt: 3438 return createCXString("ObjCAtFinallyStmt"); 3439 case CXCursor_ObjCAtThrowStmt: 3440 return createCXString("ObjCAtThrowStmt"); 3441 case CXCursor_ObjCAtSynchronizedStmt: 3442 return createCXString("ObjCAtSynchronizedStmt"); 3443 case CXCursor_ObjCAutoreleasePoolStmt: 3444 return createCXString("ObjCAutoreleasePoolStmt"); 3445 case CXCursor_ObjCForCollectionStmt: 3446 return createCXString("ObjCForCollectionStmt"); 3447 case CXCursor_CXXCatchStmt: 3448 return createCXString("CXXCatchStmt"); 3449 case CXCursor_CXXTryStmt: 3450 return createCXString("CXXTryStmt"); 3451 case CXCursor_CXXForRangeStmt: 3452 return createCXString("CXXForRangeStmt"); 3453 case CXCursor_SEHTryStmt: 3454 return createCXString("SEHTryStmt"); 3455 case CXCursor_SEHExceptStmt: 3456 return createCXString("SEHExceptStmt"); 3457 case CXCursor_SEHFinallyStmt: 3458 return createCXString("SEHFinallyStmt"); 3459 case CXCursor_NullStmt: 3460 return createCXString("NullStmt"); 3461 case CXCursor_InvalidFile: 3462 return createCXString("InvalidFile"); 3463 case CXCursor_InvalidCode: 3464 return createCXString("InvalidCode"); 3465 case CXCursor_NoDeclFound: 3466 return createCXString("NoDeclFound"); 3467 case CXCursor_NotImplemented: 3468 return createCXString("NotImplemented"); 3469 case CXCursor_TranslationUnit: 3470 return createCXString("TranslationUnit"); 3471 case CXCursor_UnexposedAttr: 3472 return createCXString("UnexposedAttr"); 3473 case CXCursor_IBActionAttr: 3474 return createCXString("attribute(ibaction)"); 3475 case CXCursor_IBOutletAttr: 3476 return createCXString("attribute(iboutlet)"); 3477 case CXCursor_IBOutletCollectionAttr: 3478 return createCXString("attribute(iboutletcollection)"); 3479 case CXCursor_CXXFinalAttr: 3480 return createCXString("attribute(final)"); 3481 case CXCursor_CXXOverrideAttr: 3482 return createCXString("attribute(override)"); 3483 case CXCursor_AnnotateAttr: 3484 return createCXString("attribute(annotate)"); 3485 case CXCursor_AsmLabelAttr: 3486 return createCXString("asm label"); 3487 case CXCursor_PreprocessingDirective: 3488 return createCXString("preprocessing directive"); 3489 case CXCursor_MacroDefinition: 3490 return createCXString("macro definition"); 3491 case CXCursor_MacroExpansion: 3492 return createCXString("macro expansion"); 3493 case CXCursor_InclusionDirective: 3494 return createCXString("inclusion directive"); 3495 case CXCursor_Namespace: 3496 return createCXString("Namespace"); 3497 case CXCursor_LinkageSpec: 3498 return createCXString("LinkageSpec"); 3499 case CXCursor_CXXBaseSpecifier: 3500 return createCXString("C++ base class specifier"); 3501 case CXCursor_Constructor: 3502 return createCXString("CXXConstructor"); 3503 case CXCursor_Destructor: 3504 return createCXString("CXXDestructor"); 3505 case CXCursor_ConversionFunction: 3506 return createCXString("CXXConversion"); 3507 case CXCursor_TemplateTypeParameter: 3508 return createCXString("TemplateTypeParameter"); 3509 case CXCursor_NonTypeTemplateParameter: 3510 return createCXString("NonTypeTemplateParameter"); 3511 case CXCursor_TemplateTemplateParameter: 3512 return createCXString("TemplateTemplateParameter"); 3513 case CXCursor_FunctionTemplate: 3514 return createCXString("FunctionTemplate"); 3515 case CXCursor_ClassTemplate: 3516 return createCXString("ClassTemplate"); 3517 case CXCursor_ClassTemplatePartialSpecialization: 3518 return createCXString("ClassTemplatePartialSpecialization"); 3519 case CXCursor_NamespaceAlias: 3520 return createCXString("NamespaceAlias"); 3521 case CXCursor_UsingDirective: 3522 return createCXString("UsingDirective"); 3523 case CXCursor_UsingDeclaration: 3524 return createCXString("UsingDeclaration"); 3525 case CXCursor_TypeAliasDecl: 3526 return createCXString("TypeAliasDecl"); 3527 case CXCursor_ObjCSynthesizeDecl: 3528 return createCXString("ObjCSynthesizeDecl"); 3529 case CXCursor_ObjCDynamicDecl: 3530 return createCXString("ObjCDynamicDecl"); 3531 case CXCursor_CXXAccessSpecifier: 3532 return createCXString("CXXAccessSpecifier"); 3533 } 3534 3535 llvm_unreachable("Unhandled CXCursorKind"); 3536} 3537 3538struct GetCursorData { 3539 SourceLocation TokenBeginLoc; 3540 bool PointsAtMacroArgExpansion; 3541 CXCursor &BestCursor; 3542 3543 GetCursorData(SourceManager &SM, 3544 SourceLocation tokenBegin, CXCursor &outputCursor) 3545 : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) { 3546 PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin); 3547 } 3548}; 3549 3550static enum CXChildVisitResult GetCursorVisitor(CXCursor cursor, 3551 CXCursor parent, 3552 CXClientData client_data) { 3553 GetCursorData *Data = static_cast<GetCursorData *>(client_data); 3554 CXCursor *BestCursor = &Data->BestCursor; 3555 3556 // If we point inside a macro argument we should provide info of what the 3557 // token is so use the actual cursor, don't replace it with a macro expansion 3558 // cursor. 3559 if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion) 3560 return CXChildVisit_Recurse; 3561 3562 if (clang_isDeclaration(cursor.kind)) { 3563 // Avoid having the implicit methods override the property decls. 3564 if (ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) 3565 if (MD->isImplicit()) 3566 return CXChildVisit_Break; 3567 } 3568 3569 if (clang_isExpression(cursor.kind) && 3570 clang_isDeclaration(BestCursor->kind)) { 3571 if (Decl *D = getCursorDecl(*BestCursor)) { 3572 // Avoid having the cursor of an expression replace the declaration cursor 3573 // when the expression source range overlaps the declaration range. 3574 // This can happen for C++ constructor expressions whose range generally 3575 // include the variable declaration, e.g.: 3576 // MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor. 3577 if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() && 3578 D->getLocation() == Data->TokenBeginLoc) 3579 return CXChildVisit_Break; 3580 } 3581 } 3582 3583 // If our current best cursor is the construction of a temporary object, 3584 // don't replace that cursor with a type reference, because we want 3585 // clang_getCursor() to point at the constructor. 3586 if (clang_isExpression(BestCursor->kind) && 3587 isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) && 3588 cursor.kind == CXCursor_TypeRef) { 3589 // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it 3590 // as having the actual point on the type reference. 3591 *BestCursor = getTypeRefedCallExprCursor(*BestCursor); 3592 return CXChildVisit_Recurse; 3593 } 3594 3595 *BestCursor = cursor; 3596 return CXChildVisit_Recurse; 3597} 3598 3599CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) { 3600 if (!TU) 3601 return clang_getNullCursor(); 3602 3603 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 3604 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 3605 3606 SourceLocation SLoc = cxloc::translateSourceLocation(Loc); 3607 CXCursor Result = cxcursor::getCursor(TU, SLoc); 3608 3609 bool Logging = getenv("LIBCLANG_LOGGING"); 3610 if (Logging) { 3611 CXFile SearchFile; 3612 unsigned SearchLine, SearchColumn; 3613 CXFile ResultFile; 3614 unsigned ResultLine, ResultColumn; 3615 CXString SearchFileName, ResultFileName, KindSpelling, USR; 3616 const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : ""; 3617 CXSourceLocation ResultLoc = clang_getCursorLocation(Result); 3618 3619 clang_getExpansionLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 0); 3620 clang_getExpansionLocation(ResultLoc, &ResultFile, &ResultLine, 3621 &ResultColumn, 0); 3622 SearchFileName = clang_getFileName(SearchFile); 3623 ResultFileName = clang_getFileName(ResultFile); 3624 KindSpelling = clang_getCursorKindSpelling(Result.kind); 3625 USR = clang_getCursorUSR(Result); 3626 fprintf(stderr, "clang_getCursor(%s:%d:%d) = %s(%s:%d:%d):%s%s\n", 3627 clang_getCString(SearchFileName), SearchLine, SearchColumn, 3628 clang_getCString(KindSpelling), 3629 clang_getCString(ResultFileName), ResultLine, ResultColumn, 3630 clang_getCString(USR), IsDef); 3631 clang_disposeString(SearchFileName); 3632 clang_disposeString(ResultFileName); 3633 clang_disposeString(KindSpelling); 3634 clang_disposeString(USR); 3635 3636 CXCursor Definition = clang_getCursorDefinition(Result); 3637 if (!clang_equalCursors(Definition, clang_getNullCursor())) { 3638 CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition); 3639 CXString DefinitionKindSpelling 3640 = clang_getCursorKindSpelling(Definition.kind); 3641 CXFile DefinitionFile; 3642 unsigned DefinitionLine, DefinitionColumn; 3643 clang_getExpansionLocation(DefinitionLoc, &DefinitionFile, 3644 &DefinitionLine, &DefinitionColumn, 0); 3645 CXString DefinitionFileName = clang_getFileName(DefinitionFile); 3646 fprintf(stderr, " -> %s(%s:%d:%d)\n", 3647 clang_getCString(DefinitionKindSpelling), 3648 clang_getCString(DefinitionFileName), 3649 DefinitionLine, DefinitionColumn); 3650 clang_disposeString(DefinitionFileName); 3651 clang_disposeString(DefinitionKindSpelling); 3652 } 3653 } 3654 3655 return Result; 3656} 3657 3658CXCursor clang_getNullCursor(void) { 3659 return MakeCXCursorInvalid(CXCursor_InvalidFile); 3660} 3661 3662unsigned clang_equalCursors(CXCursor X, CXCursor Y) { 3663 return X == Y; 3664} 3665 3666unsigned clang_hashCursor(CXCursor C) { 3667 unsigned Index = 0; 3668 if (clang_isExpression(C.kind) || clang_isStatement(C.kind)) 3669 Index = 1; 3670 3671 return llvm::DenseMapInfo<std::pair<unsigned, void*> >::getHashValue( 3672 std::make_pair(C.kind, C.data[Index])); 3673} 3674 3675unsigned clang_isInvalid(enum CXCursorKind K) { 3676 return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid; 3677} 3678 3679unsigned clang_isDeclaration(enum CXCursorKind K) { 3680 return K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl; 3681} 3682 3683unsigned clang_isReference(enum CXCursorKind K) { 3684 return K >= CXCursor_FirstRef && K <= CXCursor_LastRef; 3685} 3686 3687unsigned clang_isExpression(enum CXCursorKind K) { 3688 return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr; 3689} 3690 3691unsigned clang_isStatement(enum CXCursorKind K) { 3692 return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt; 3693} 3694 3695unsigned clang_isAttribute(enum CXCursorKind K) { 3696 return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr; 3697} 3698 3699unsigned clang_isTranslationUnit(enum CXCursorKind K) { 3700 return K == CXCursor_TranslationUnit; 3701} 3702 3703unsigned clang_isPreprocessing(enum CXCursorKind K) { 3704 return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing; 3705} 3706 3707unsigned clang_isUnexposed(enum CXCursorKind K) { 3708 switch (K) { 3709 case CXCursor_UnexposedDecl: 3710 case CXCursor_UnexposedExpr: 3711 case CXCursor_UnexposedStmt: 3712 case CXCursor_UnexposedAttr: 3713 return true; 3714 default: 3715 return false; 3716 } 3717} 3718 3719CXCursorKind clang_getCursorKind(CXCursor C) { 3720 return C.kind; 3721} 3722 3723CXSourceLocation clang_getCursorLocation(CXCursor C) { 3724 if (clang_isReference(C.kind)) { 3725 switch (C.kind) { 3726 case CXCursor_ObjCSuperClassRef: { 3727 std::pair<ObjCInterfaceDecl *, SourceLocation> P 3728 = getCursorObjCSuperClassRef(C); 3729 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3730 } 3731 3732 case CXCursor_ObjCProtocolRef: { 3733 std::pair<ObjCProtocolDecl *, SourceLocation> P 3734 = getCursorObjCProtocolRef(C); 3735 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3736 } 3737 3738 case CXCursor_ObjCClassRef: { 3739 std::pair<ObjCInterfaceDecl *, SourceLocation> P 3740 = getCursorObjCClassRef(C); 3741 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3742 } 3743 3744 case CXCursor_TypeRef: { 3745 std::pair<TypeDecl *, SourceLocation> P = getCursorTypeRef(C); 3746 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3747 } 3748 3749 case CXCursor_TemplateRef: { 3750 std::pair<TemplateDecl *, SourceLocation> P = getCursorTemplateRef(C); 3751 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3752 } 3753 3754 case CXCursor_NamespaceRef: { 3755 std::pair<NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C); 3756 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3757 } 3758 3759 case CXCursor_MemberRef: { 3760 std::pair<FieldDecl *, SourceLocation> P = getCursorMemberRef(C); 3761 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3762 } 3763 3764 case CXCursor_VariableRef: { 3765 std::pair<VarDecl *, SourceLocation> P = getCursorVariableRef(C); 3766 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second); 3767 } 3768 3769 case CXCursor_CXXBaseSpecifier: { 3770 CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C); 3771 if (!BaseSpec) 3772 return clang_getNullLocation(); 3773 3774 if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo()) 3775 return cxloc::translateSourceLocation(getCursorContext(C), 3776 TSInfo->getTypeLoc().getBeginLoc()); 3777 3778 return cxloc::translateSourceLocation(getCursorContext(C), 3779 BaseSpec->getLocStart()); 3780 } 3781 3782 case CXCursor_LabelRef: { 3783 std::pair<LabelStmt *, SourceLocation> P = getCursorLabelRef(C); 3784 return cxloc::translateSourceLocation(getCursorContext(C), P.second); 3785 } 3786 3787 case CXCursor_OverloadedDeclRef: 3788 return cxloc::translateSourceLocation(getCursorContext(C), 3789 getCursorOverloadedDeclRef(C).second); 3790 3791 default: 3792 // FIXME: Need a way to enumerate all non-reference cases. 3793 llvm_unreachable("Missed a reference kind"); 3794 } 3795 } 3796 3797 if (clang_isExpression(C.kind)) 3798 return cxloc::translateSourceLocation(getCursorContext(C), 3799 getLocationFromExpr(getCursorExpr(C))); 3800 3801 if (clang_isStatement(C.kind)) 3802 return cxloc::translateSourceLocation(getCursorContext(C), 3803 getCursorStmt(C)->getLocStart()); 3804 3805 if (C.kind == CXCursor_PreprocessingDirective) { 3806 SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin(); 3807 return cxloc::translateSourceLocation(getCursorContext(C), L); 3808 } 3809 3810 if (C.kind == CXCursor_MacroExpansion) { 3811 SourceLocation L 3812 = cxcursor::getCursorMacroExpansion(C)->getSourceRange().getBegin(); 3813 return cxloc::translateSourceLocation(getCursorContext(C), L); 3814 } 3815 3816 if (C.kind == CXCursor_MacroDefinition) { 3817 SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation(); 3818 return cxloc::translateSourceLocation(getCursorContext(C), L); 3819 } 3820 3821 if (C.kind == CXCursor_InclusionDirective) { 3822 SourceLocation L 3823 = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin(); 3824 return cxloc::translateSourceLocation(getCursorContext(C), L); 3825 } 3826 3827 if (C.kind < CXCursor_FirstDecl || C.kind > CXCursor_LastDecl) 3828 return clang_getNullLocation(); 3829 3830 Decl *D = getCursorDecl(C); 3831 if (!D) 3832 return clang_getNullLocation(); 3833 3834 SourceLocation Loc = D->getLocation(); 3835 // FIXME: Multiple variables declared in a single declaration 3836 // currently lack the information needed to correctly determine their 3837 // ranges when accounting for the type-specifier. We use context 3838 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 3839 // and if so, whether it is the first decl. 3840 if (VarDecl *VD = dyn_cast<VarDecl>(D)) { 3841 if (!cxcursor::isFirstInDeclGroup(C)) 3842 Loc = VD->getLocation(); 3843 } 3844 3845 // For ObjC methods, give the start location of the method name. 3846 if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 3847 Loc = MD->getSelectorStartLoc(); 3848 3849 return cxloc::translateSourceLocation(getCursorContext(C), Loc); 3850} 3851 3852} // end extern "C" 3853 3854CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) { 3855 assert(TU); 3856 3857 // Guard against an invalid SourceLocation, or we may assert in one 3858 // of the following calls. 3859 if (SLoc.isInvalid()) 3860 return clang_getNullCursor(); 3861 3862 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 3863 3864 // Translate the given source location to make it point at the beginning of 3865 // the token under the cursor. 3866 SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(), 3867 CXXUnit->getASTContext().getLangOpts()); 3868 3869 CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound); 3870 if (SLoc.isValid()) { 3871 GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result); 3872 CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData, 3873 /*VisitPreprocessorLast=*/true, 3874 /*VisitIncludedEntities=*/false, 3875 SourceLocation(SLoc)); 3876 CursorVis.visitFileRegion(); 3877 } 3878 3879 return Result; 3880} 3881 3882static SourceRange getRawCursorExtent(CXCursor C) { 3883 if (clang_isReference(C.kind)) { 3884 switch (C.kind) { 3885 case CXCursor_ObjCSuperClassRef: 3886 return getCursorObjCSuperClassRef(C).second; 3887 3888 case CXCursor_ObjCProtocolRef: 3889 return getCursorObjCProtocolRef(C).second; 3890 3891 case CXCursor_ObjCClassRef: 3892 return getCursorObjCClassRef(C).second; 3893 3894 case CXCursor_TypeRef: 3895 return getCursorTypeRef(C).second; 3896 3897 case CXCursor_TemplateRef: 3898 return getCursorTemplateRef(C).second; 3899 3900 case CXCursor_NamespaceRef: 3901 return getCursorNamespaceRef(C).second; 3902 3903 case CXCursor_MemberRef: 3904 return getCursorMemberRef(C).second; 3905 3906 case CXCursor_CXXBaseSpecifier: 3907 return getCursorCXXBaseSpecifier(C)->getSourceRange(); 3908 3909 case CXCursor_LabelRef: 3910 return getCursorLabelRef(C).second; 3911 3912 case CXCursor_OverloadedDeclRef: 3913 return getCursorOverloadedDeclRef(C).second; 3914 3915 case CXCursor_VariableRef: 3916 return getCursorVariableRef(C).second; 3917 3918 default: 3919 // FIXME: Need a way to enumerate all non-reference cases. 3920 llvm_unreachable("Missed a reference kind"); 3921 } 3922 } 3923 3924 if (clang_isExpression(C.kind)) 3925 return getCursorExpr(C)->getSourceRange(); 3926 3927 if (clang_isStatement(C.kind)) 3928 return getCursorStmt(C)->getSourceRange(); 3929 3930 if (clang_isAttribute(C.kind)) 3931 return getCursorAttr(C)->getRange(); 3932 3933 if (C.kind == CXCursor_PreprocessingDirective) 3934 return cxcursor::getCursorPreprocessingDirective(C); 3935 3936 if (C.kind == CXCursor_MacroExpansion) { 3937 ASTUnit *TU = getCursorASTUnit(C); 3938 SourceRange Range = cxcursor::getCursorMacroExpansion(C)->getSourceRange(); 3939 return TU->mapRangeFromPreamble(Range); 3940 } 3941 3942 if (C.kind == CXCursor_MacroDefinition) { 3943 ASTUnit *TU = getCursorASTUnit(C); 3944 SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange(); 3945 return TU->mapRangeFromPreamble(Range); 3946 } 3947 3948 if (C.kind == CXCursor_InclusionDirective) { 3949 ASTUnit *TU = getCursorASTUnit(C); 3950 SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange(); 3951 return TU->mapRangeFromPreamble(Range); 3952 } 3953 3954 if (C.kind == CXCursor_TranslationUnit) { 3955 ASTUnit *TU = getCursorASTUnit(C); 3956 FileID MainID = TU->getSourceManager().getMainFileID(); 3957 SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID); 3958 SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID); 3959 return SourceRange(Start, End); 3960 } 3961 3962 if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) { 3963 Decl *D = cxcursor::getCursorDecl(C); 3964 if (!D) 3965 return SourceRange(); 3966 3967 SourceRange R = D->getSourceRange(); 3968 // FIXME: Multiple variables declared in a single declaration 3969 // currently lack the information needed to correctly determine their 3970 // ranges when accounting for the type-specifier. We use context 3971 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 3972 // and if so, whether it is the first decl. 3973 if (VarDecl *VD = dyn_cast<VarDecl>(D)) { 3974 if (!cxcursor::isFirstInDeclGroup(C)) 3975 R.setBegin(VD->getLocation()); 3976 } 3977 return R; 3978 } 3979 return SourceRange(); 3980} 3981 3982/// \brief Retrieves the "raw" cursor extent, which is then extended to include 3983/// the decl-specifier-seq for declarations. 3984static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) { 3985 if (C.kind >= CXCursor_FirstDecl && C.kind <= CXCursor_LastDecl) { 3986 Decl *D = cxcursor::getCursorDecl(C); 3987 if (!D) 3988 return SourceRange(); 3989 3990 SourceRange R = D->getSourceRange(); 3991 3992 // Adjust the start of the location for declarations preceded by 3993 // declaration specifiers. 3994 SourceLocation StartLoc; 3995 if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) { 3996 if (TypeSourceInfo *TI = DD->getTypeSourceInfo()) 3997 StartLoc = TI->getTypeLoc().getLocStart(); 3998 } else if (TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) { 3999 if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo()) 4000 StartLoc = TI->getTypeLoc().getLocStart(); 4001 } 4002 4003 if (StartLoc.isValid() && R.getBegin().isValid() && 4004 SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin())) 4005 R.setBegin(StartLoc); 4006 4007 // FIXME: Multiple variables declared in a single declaration 4008 // currently lack the information needed to correctly determine their 4009 // ranges when accounting for the type-specifier. We use context 4010 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup, 4011 // and if so, whether it is the first decl. 4012 if (VarDecl *VD = dyn_cast<VarDecl>(D)) { 4013 if (!cxcursor::isFirstInDeclGroup(C)) 4014 R.setBegin(VD->getLocation()); 4015 } 4016 4017 return R; 4018 } 4019 4020 return getRawCursorExtent(C); 4021} 4022 4023extern "C" { 4024 4025CXSourceRange clang_getCursorExtent(CXCursor C) { 4026 SourceRange R = getRawCursorExtent(C); 4027 if (R.isInvalid()) 4028 return clang_getNullRange(); 4029 4030 return cxloc::translateSourceRange(getCursorContext(C), R); 4031} 4032 4033CXCursor clang_getCursorReferenced(CXCursor C) { 4034 if (clang_isInvalid(C.kind)) 4035 return clang_getNullCursor(); 4036 4037 CXTranslationUnit tu = getCursorTU(C); 4038 if (clang_isDeclaration(C.kind)) { 4039 Decl *D = getCursorDecl(C); 4040 if (!D) 4041 return clang_getNullCursor(); 4042 if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) 4043 return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu); 4044 if (ObjCPropertyImplDecl *PropImpl =dyn_cast<ObjCPropertyImplDecl>(D)) 4045 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl()) 4046 return MakeCXCursor(Property, tu); 4047 4048 return C; 4049 } 4050 4051 if (clang_isExpression(C.kind)) { 4052 Expr *E = getCursorExpr(C); 4053 Decl *D = getDeclFromExpr(E); 4054 if (D) { 4055 CXCursor declCursor = MakeCXCursor(D, tu); 4056 declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C), 4057 declCursor); 4058 return declCursor; 4059 } 4060 4061 if (OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E)) 4062 return MakeCursorOverloadedDeclRef(Ovl, tu); 4063 4064 return clang_getNullCursor(); 4065 } 4066 4067 if (clang_isStatement(C.kind)) { 4068 Stmt *S = getCursorStmt(C); 4069 if (GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S)) 4070 if (LabelDecl *label = Goto->getLabel()) 4071 if (LabelStmt *labelS = label->getStmt()) 4072 return MakeCXCursor(labelS, getCursorDecl(C), tu); 4073 4074 return clang_getNullCursor(); 4075 } 4076 4077 if (C.kind == CXCursor_MacroExpansion) { 4078 if (MacroDefinition *Def = getCursorMacroExpansion(C)->getDefinition()) 4079 return MakeMacroDefinitionCursor(Def, tu); 4080 } 4081 4082 if (!clang_isReference(C.kind)) 4083 return clang_getNullCursor(); 4084 4085 switch (C.kind) { 4086 case CXCursor_ObjCSuperClassRef: 4087 return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu); 4088 4089 case CXCursor_ObjCProtocolRef: { 4090 ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first; 4091 if (ObjCProtocolDecl *Def = Prot->getDefinition()) 4092 return MakeCXCursor(Def, tu); 4093 4094 return MakeCXCursor(Prot, tu); 4095 } 4096 4097 case CXCursor_ObjCClassRef: { 4098 ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first; 4099 if (ObjCInterfaceDecl *Def = Class->getDefinition()) 4100 return MakeCXCursor(Def, tu); 4101 4102 return MakeCXCursor(Class, tu); 4103 } 4104 4105 case CXCursor_TypeRef: 4106 return MakeCXCursor(getCursorTypeRef(C).first, tu ); 4107 4108 case CXCursor_TemplateRef: 4109 return MakeCXCursor(getCursorTemplateRef(C).first, tu ); 4110 4111 case CXCursor_NamespaceRef: 4112 return MakeCXCursor(getCursorNamespaceRef(C).first, tu ); 4113 4114 case CXCursor_MemberRef: 4115 return MakeCXCursor(getCursorMemberRef(C).first, tu ); 4116 4117 case CXCursor_CXXBaseSpecifier: { 4118 CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C); 4119 return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(), 4120 tu )); 4121 } 4122 4123 case CXCursor_LabelRef: 4124 // FIXME: We end up faking the "parent" declaration here because we 4125 // don't want to make CXCursor larger. 4126 return MakeCXCursor(getCursorLabelRef(C).first, 4127 static_cast<ASTUnit*>(tu->TUData)->getASTContext() 4128 .getTranslationUnitDecl(), 4129 tu); 4130 4131 case CXCursor_OverloadedDeclRef: 4132 return C; 4133 4134 case CXCursor_VariableRef: 4135 return MakeCXCursor(getCursorVariableRef(C).first, tu); 4136 4137 default: 4138 // We would prefer to enumerate all non-reference cursor kinds here. 4139 llvm_unreachable("Unhandled reference cursor kind"); 4140 } 4141} 4142 4143CXCursor clang_getCursorDefinition(CXCursor C) { 4144 if (clang_isInvalid(C.kind)) 4145 return clang_getNullCursor(); 4146 4147 CXTranslationUnit TU = getCursorTU(C); 4148 4149 bool WasReference = false; 4150 if (clang_isReference(C.kind) || clang_isExpression(C.kind)) { 4151 C = clang_getCursorReferenced(C); 4152 WasReference = true; 4153 } 4154 4155 if (C.kind == CXCursor_MacroExpansion) 4156 return clang_getCursorReferenced(C); 4157 4158 if (!clang_isDeclaration(C.kind)) 4159 return clang_getNullCursor(); 4160 4161 Decl *D = getCursorDecl(C); 4162 if (!D) 4163 return clang_getNullCursor(); 4164 4165 switch (D->getKind()) { 4166 // Declaration kinds that don't really separate the notions of 4167 // declaration and definition. 4168 case Decl::Namespace: 4169 case Decl::Typedef: 4170 case Decl::TypeAlias: 4171 case Decl::TypeAliasTemplate: 4172 case Decl::TemplateTypeParm: 4173 case Decl::EnumConstant: 4174 case Decl::Field: 4175 case Decl::IndirectField: 4176 case Decl::ObjCIvar: 4177 case Decl::ObjCAtDefsField: 4178 case Decl::ImplicitParam: 4179 case Decl::ParmVar: 4180 case Decl::NonTypeTemplateParm: 4181 case Decl::TemplateTemplateParm: 4182 case Decl::ObjCCategoryImpl: 4183 case Decl::ObjCImplementation: 4184 case Decl::AccessSpec: 4185 case Decl::LinkageSpec: 4186 case Decl::ObjCPropertyImpl: 4187 case Decl::FileScopeAsm: 4188 case Decl::StaticAssert: 4189 case Decl::Block: 4190 case Decl::Label: // FIXME: Is this right?? 4191 case Decl::ClassScopeFunctionSpecialization: 4192 case Decl::Import: 4193 return C; 4194 4195 // Declaration kinds that don't make any sense here, but are 4196 // nonetheless harmless. 4197 case Decl::TranslationUnit: 4198 break; 4199 4200 // Declaration kinds for which the definition is not resolvable. 4201 case Decl::UnresolvedUsingTypename: 4202 case Decl::UnresolvedUsingValue: 4203 break; 4204 4205 case Decl::UsingDirective: 4206 return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(), 4207 TU); 4208 4209 case Decl::NamespaceAlias: 4210 return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU); 4211 4212 case Decl::Enum: 4213 case Decl::Record: 4214 case Decl::CXXRecord: 4215 case Decl::ClassTemplateSpecialization: 4216 case Decl::ClassTemplatePartialSpecialization: 4217 if (TagDecl *Def = cast<TagDecl>(D)->getDefinition()) 4218 return MakeCXCursor(Def, TU); 4219 return clang_getNullCursor(); 4220 4221 case Decl::Function: 4222 case Decl::CXXMethod: 4223 case Decl::CXXConstructor: 4224 case Decl::CXXDestructor: 4225 case Decl::CXXConversion: { 4226 const FunctionDecl *Def = 0; 4227 if (cast<FunctionDecl>(D)->getBody(Def)) 4228 return MakeCXCursor(const_cast<FunctionDecl *>(Def), TU); 4229 return clang_getNullCursor(); 4230 } 4231 4232 case Decl::Var: { 4233 // Ask the variable if it has a definition. 4234 if (VarDecl *Def = cast<VarDecl>(D)->getDefinition()) 4235 return MakeCXCursor(Def, TU); 4236 return clang_getNullCursor(); 4237 } 4238 4239 case Decl::FunctionTemplate: { 4240 const FunctionDecl *Def = 0; 4241 if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def)) 4242 return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU); 4243 return clang_getNullCursor(); 4244 } 4245 4246 case Decl::ClassTemplate: { 4247 if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl() 4248 ->getDefinition()) 4249 return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(), 4250 TU); 4251 return clang_getNullCursor(); 4252 } 4253 4254 case Decl::Using: 4255 return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D), 4256 D->getLocation(), TU); 4257 4258 case Decl::UsingShadow: 4259 return clang_getCursorDefinition( 4260 MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(), 4261 TU)); 4262 4263 case Decl::ObjCMethod: { 4264 ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D); 4265 if (Method->isThisDeclarationADefinition()) 4266 return C; 4267 4268 // Dig out the method definition in the associated 4269 // @implementation, if we have it. 4270 // FIXME: The ASTs should make finding the definition easier. 4271 if (ObjCInterfaceDecl *Class 4272 = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext())) 4273 if (ObjCImplementationDecl *ClassImpl = Class->getImplementation()) 4274 if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(), 4275 Method->isInstanceMethod())) 4276 if (Def->isThisDeclarationADefinition()) 4277 return MakeCXCursor(Def, TU); 4278 4279 return clang_getNullCursor(); 4280 } 4281 4282 case Decl::ObjCCategory: 4283 if (ObjCCategoryImplDecl *Impl 4284 = cast<ObjCCategoryDecl>(D)->getImplementation()) 4285 return MakeCXCursor(Impl, TU); 4286 return clang_getNullCursor(); 4287 4288 case Decl::ObjCProtocol: 4289 if (ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition()) 4290 return MakeCXCursor(Def, TU); 4291 return clang_getNullCursor(); 4292 4293 case Decl::ObjCInterface: { 4294 // There are two notions of a "definition" for an Objective-C 4295 // class: the interface and its implementation. When we resolved a 4296 // reference to an Objective-C class, produce the @interface as 4297 // the definition; when we were provided with the interface, 4298 // produce the @implementation as the definition. 4299 ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D); 4300 if (WasReference) { 4301 if (ObjCInterfaceDecl *Def = IFace->getDefinition()) 4302 return MakeCXCursor(Def, TU); 4303 } else if (ObjCImplementationDecl *Impl = IFace->getImplementation()) 4304 return MakeCXCursor(Impl, TU); 4305 return clang_getNullCursor(); 4306 } 4307 4308 case Decl::ObjCProperty: 4309 // FIXME: We don't really know where to find the 4310 // ObjCPropertyImplDecls that implement this property. 4311 return clang_getNullCursor(); 4312 4313 case Decl::ObjCCompatibleAlias: 4314 if (ObjCInterfaceDecl *Class 4315 = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface()) 4316 if (ObjCInterfaceDecl *Def = Class->getDefinition()) 4317 return MakeCXCursor(Def, TU); 4318 4319 return clang_getNullCursor(); 4320 4321 case Decl::Friend: 4322 if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl()) 4323 return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 4324 return clang_getNullCursor(); 4325 4326 case Decl::FriendTemplate: 4327 if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl()) 4328 return clang_getCursorDefinition(MakeCXCursor(Friend, TU)); 4329 return clang_getNullCursor(); 4330 } 4331 4332 return clang_getNullCursor(); 4333} 4334 4335unsigned clang_isCursorDefinition(CXCursor C) { 4336 if (!clang_isDeclaration(C.kind)) 4337 return 0; 4338 4339 return clang_getCursorDefinition(C) == C; 4340} 4341 4342CXCursor clang_getCanonicalCursor(CXCursor C) { 4343 if (!clang_isDeclaration(C.kind)) 4344 return C; 4345 4346 if (Decl *D = getCursorDecl(C)) { 4347 if (ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) 4348 if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl()) 4349 return MakeCXCursor(CatD, getCursorTU(C)); 4350 4351 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 4352 if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface()) 4353 return MakeCXCursor(IFD, getCursorTU(C)); 4354 4355 return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C)); 4356 } 4357 4358 return C; 4359} 4360 4361unsigned clang_getNumOverloadedDecls(CXCursor C) { 4362 if (C.kind != CXCursor_OverloadedDeclRef) 4363 return 0; 4364 4365 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first; 4366 if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>()) 4367 return E->getNumDecls(); 4368 4369 if (OverloadedTemplateStorage *S 4370 = Storage.dyn_cast<OverloadedTemplateStorage*>()) 4371 return S->size(); 4372 4373 Decl *D = Storage.get<Decl*>(); 4374 if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) 4375 return Using->shadow_size(); 4376 4377 return 0; 4378} 4379 4380CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) { 4381 if (cursor.kind != CXCursor_OverloadedDeclRef) 4382 return clang_getNullCursor(); 4383 4384 if (index >= clang_getNumOverloadedDecls(cursor)) 4385 return clang_getNullCursor(); 4386 4387 CXTranslationUnit TU = getCursorTU(cursor); 4388 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first; 4389 if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>()) 4390 return MakeCXCursor(E->decls_begin()[index], TU); 4391 4392 if (OverloadedTemplateStorage *S 4393 = Storage.dyn_cast<OverloadedTemplateStorage*>()) 4394 return MakeCXCursor(S->begin()[index], TU); 4395 4396 Decl *D = Storage.get<Decl*>(); 4397 if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) { 4398 // FIXME: This is, unfortunately, linear time. 4399 UsingDecl::shadow_iterator Pos = Using->shadow_begin(); 4400 std::advance(Pos, index); 4401 return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU); 4402 } 4403 4404 return clang_getNullCursor(); 4405} 4406 4407void clang_getDefinitionSpellingAndExtent(CXCursor C, 4408 const char **startBuf, 4409 const char **endBuf, 4410 unsigned *startLine, 4411 unsigned *startColumn, 4412 unsigned *endLine, 4413 unsigned *endColumn) { 4414 assert(getCursorDecl(C) && "CXCursor has null decl"); 4415 NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C)); 4416 FunctionDecl *FD = dyn_cast<FunctionDecl>(ND); 4417 CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody()); 4418 4419 SourceManager &SM = FD->getASTContext().getSourceManager(); 4420 *startBuf = SM.getCharacterData(Body->getLBracLoc()); 4421 *endBuf = SM.getCharacterData(Body->getRBracLoc()); 4422 *startLine = SM.getSpellingLineNumber(Body->getLBracLoc()); 4423 *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc()); 4424 *endLine = SM.getSpellingLineNumber(Body->getRBracLoc()); 4425 *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc()); 4426} 4427 4428 4429CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags, 4430 unsigned PieceIndex) { 4431 RefNamePieces Pieces; 4432 4433 switch (C.kind) { 4434 case CXCursor_MemberRefExpr: 4435 if (MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C))) 4436 Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(), 4437 E->getQualifierLoc().getSourceRange()); 4438 break; 4439 4440 case CXCursor_DeclRefExpr: 4441 if (DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) 4442 Pieces = buildPieces(NameFlags, false, E->getNameInfo(), 4443 E->getQualifierLoc().getSourceRange(), 4444 E->getOptionalExplicitTemplateArgs()); 4445 break; 4446 4447 case CXCursor_CallExpr: 4448 if (CXXOperatorCallExpr *OCE = 4449 dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) { 4450 Expr *Callee = OCE->getCallee(); 4451 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee)) 4452 Callee = ICE->getSubExpr(); 4453 4454 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) 4455 Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(), 4456 DRE->getQualifierLoc().getSourceRange()); 4457 } 4458 break; 4459 4460 default: 4461 break; 4462 } 4463 4464 if (Pieces.empty()) { 4465 if (PieceIndex == 0) 4466 return clang_getCursorExtent(C); 4467 } else if (PieceIndex < Pieces.size()) { 4468 SourceRange R = Pieces[PieceIndex]; 4469 if (R.isValid()) 4470 return cxloc::translateSourceRange(getCursorContext(C), R); 4471 } 4472 4473 return clang_getNullRange(); 4474} 4475 4476void clang_enableStackTraces(void) { 4477 llvm::sys::PrintStackTraceOnErrorSignal(); 4478} 4479 4480void clang_executeOnThread(void (*fn)(void*), void *user_data, 4481 unsigned stack_size) { 4482 llvm::llvm_execute_on_thread(fn, user_data, stack_size); 4483} 4484 4485} // end: extern "C" 4486 4487//===----------------------------------------------------------------------===// 4488// Token-based Operations. 4489//===----------------------------------------------------------------------===// 4490 4491/* CXToken layout: 4492 * int_data[0]: a CXTokenKind 4493 * int_data[1]: starting token location 4494 * int_data[2]: token length 4495 * int_data[3]: reserved 4496 * ptr_data: for identifiers and keywords, an IdentifierInfo*. 4497 * otherwise unused. 4498 */ 4499extern "C" { 4500 4501CXTokenKind clang_getTokenKind(CXToken CXTok) { 4502 return static_cast<CXTokenKind>(CXTok.int_data[0]); 4503} 4504 4505CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) { 4506 switch (clang_getTokenKind(CXTok)) { 4507 case CXToken_Identifier: 4508 case CXToken_Keyword: 4509 // We know we have an IdentifierInfo*, so use that. 4510 return createCXString(static_cast<IdentifierInfo *>(CXTok.ptr_data) 4511 ->getNameStart()); 4512 4513 case CXToken_Literal: { 4514 // We have stashed the starting pointer in the ptr_data field. Use it. 4515 const char *Text = static_cast<const char *>(CXTok.ptr_data); 4516 return createCXString(StringRef(Text, CXTok.int_data[2])); 4517 } 4518 4519 case CXToken_Punctuation: 4520 case CXToken_Comment: 4521 break; 4522 } 4523 4524 // We have to find the starting buffer pointer the hard way, by 4525 // deconstructing the source location. 4526 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 4527 if (!CXXUnit) 4528 return createCXString(""); 4529 4530 SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]); 4531 std::pair<FileID, unsigned> LocInfo 4532 = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc); 4533 bool Invalid = false; 4534 StringRef Buffer 4535 = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid); 4536 if (Invalid) 4537 return createCXString(""); 4538 4539 return createCXString(Buffer.substr(LocInfo.second, CXTok.int_data[2])); 4540} 4541 4542CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) { 4543 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 4544 if (!CXXUnit) 4545 return clang_getNullLocation(); 4546 4547 return cxloc::translateSourceLocation(CXXUnit->getASTContext(), 4548 SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 4549} 4550 4551CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) { 4552 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 4553 if (!CXXUnit) 4554 return clang_getNullRange(); 4555 4556 return cxloc::translateSourceRange(CXXUnit->getASTContext(), 4557 SourceLocation::getFromRawEncoding(CXTok.int_data[1])); 4558} 4559 4560static void getTokens(ASTUnit *CXXUnit, SourceRange Range, 4561 SmallVectorImpl<CXToken> &CXTokens) { 4562 SourceManager &SourceMgr = CXXUnit->getSourceManager(); 4563 std::pair<FileID, unsigned> BeginLocInfo 4564 = SourceMgr.getDecomposedLoc(Range.getBegin()); 4565 std::pair<FileID, unsigned> EndLocInfo 4566 = SourceMgr.getDecomposedLoc(Range.getEnd()); 4567 4568 // Cannot tokenize across files. 4569 if (BeginLocInfo.first != EndLocInfo.first) 4570 return; 4571 4572 // Create a lexer 4573 bool Invalid = false; 4574 StringRef Buffer 4575 = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 4576 if (Invalid) 4577 return; 4578 4579 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 4580 CXXUnit->getASTContext().getLangOpts(), 4581 Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end()); 4582 Lex.SetCommentRetentionState(true); 4583 4584 // Lex tokens until we hit the end of the range. 4585 const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second; 4586 Token Tok; 4587 bool previousWasAt = false; 4588 do { 4589 // Lex the next token 4590 Lex.LexFromRawLexer(Tok); 4591 if (Tok.is(tok::eof)) 4592 break; 4593 4594 // Initialize the CXToken. 4595 CXToken CXTok; 4596 4597 // - Common fields 4598 CXTok.int_data[1] = Tok.getLocation().getRawEncoding(); 4599 CXTok.int_data[2] = Tok.getLength(); 4600 CXTok.int_data[3] = 0; 4601 4602 // - Kind-specific fields 4603 if (Tok.isLiteral()) { 4604 CXTok.int_data[0] = CXToken_Literal; 4605 CXTok.ptr_data = (void *)Tok.getLiteralData(); 4606 } else if (Tok.is(tok::raw_identifier)) { 4607 // Lookup the identifier to determine whether we have a keyword. 4608 IdentifierInfo *II 4609 = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok); 4610 4611 if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) { 4612 CXTok.int_data[0] = CXToken_Keyword; 4613 } 4614 else { 4615 CXTok.int_data[0] = Tok.is(tok::identifier) 4616 ? CXToken_Identifier 4617 : CXToken_Keyword; 4618 } 4619 CXTok.ptr_data = II; 4620 } else if (Tok.is(tok::comment)) { 4621 CXTok.int_data[0] = CXToken_Comment; 4622 CXTok.ptr_data = 0; 4623 } else { 4624 CXTok.int_data[0] = CXToken_Punctuation; 4625 CXTok.ptr_data = 0; 4626 } 4627 CXTokens.push_back(CXTok); 4628 previousWasAt = Tok.is(tok::at); 4629 } while (Lex.getBufferLocation() <= EffectiveBufferEnd); 4630} 4631 4632void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range, 4633 CXToken **Tokens, unsigned *NumTokens) { 4634 if (Tokens) 4635 *Tokens = 0; 4636 if (NumTokens) 4637 *NumTokens = 0; 4638 4639 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 4640 if (!CXXUnit || !Tokens || !NumTokens) 4641 return; 4642 4643 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 4644 4645 SourceRange R = cxloc::translateCXSourceRange(Range); 4646 if (R.isInvalid()) 4647 return; 4648 4649 SmallVector<CXToken, 32> CXTokens; 4650 getTokens(CXXUnit, R, CXTokens); 4651 4652 if (CXTokens.empty()) 4653 return; 4654 4655 *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size()); 4656 memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size()); 4657 *NumTokens = CXTokens.size(); 4658} 4659 4660void clang_disposeTokens(CXTranslationUnit TU, 4661 CXToken *Tokens, unsigned NumTokens) { 4662 free(Tokens); 4663} 4664 4665} // end: extern "C" 4666 4667//===----------------------------------------------------------------------===// 4668// Token annotation APIs. 4669//===----------------------------------------------------------------------===// 4670 4671typedef llvm::DenseMap<unsigned, CXCursor> AnnotateTokensData; 4672static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 4673 CXCursor parent, 4674 CXClientData client_data); 4675namespace { 4676class AnnotateTokensWorker { 4677 AnnotateTokensData &Annotated; 4678 CXToken *Tokens; 4679 CXCursor *Cursors; 4680 unsigned NumTokens; 4681 unsigned TokIdx; 4682 unsigned PreprocessingTokIdx; 4683 CursorVisitor AnnotateVis; 4684 SourceManager &SrcMgr; 4685 bool HasContextSensitiveKeywords; 4686 4687 bool MoreTokens() const { return TokIdx < NumTokens; } 4688 unsigned NextToken() const { return TokIdx; } 4689 void AdvanceToken() { ++TokIdx; } 4690 SourceLocation GetTokenLoc(unsigned tokI) { 4691 return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]); 4692 } 4693 bool isFunctionMacroToken(unsigned tokI) const { 4694 return Tokens[tokI].int_data[3] != 0; 4695 } 4696 SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const { 4697 return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[3]); 4698 } 4699 4700 void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange); 4701 void annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult, 4702 SourceRange); 4703 4704public: 4705 AnnotateTokensWorker(AnnotateTokensData &annotated, 4706 CXToken *tokens, CXCursor *cursors, unsigned numTokens, 4707 CXTranslationUnit tu, SourceRange RegionOfInterest) 4708 : Annotated(annotated), Tokens(tokens), Cursors(cursors), 4709 NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0), 4710 AnnotateVis(tu, 4711 AnnotateTokensVisitor, this, 4712 /*VisitPreprocessorLast=*/true, 4713 /*VisitIncludedEntities=*/false, 4714 RegionOfInterest), 4715 SrcMgr(static_cast<ASTUnit*>(tu->TUData)->getSourceManager()), 4716 HasContextSensitiveKeywords(false) { } 4717 4718 void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); } 4719 enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent); 4720 void AnnotateTokens(); 4721 4722 /// \brief Determine whether the annotator saw any cursors that have 4723 /// context-sensitive keywords. 4724 bool hasContextSensitiveKeywords() const { 4725 return HasContextSensitiveKeywords; 4726 } 4727}; 4728} 4729 4730void AnnotateTokensWorker::AnnotateTokens() { 4731 // Walk the AST within the region of interest, annotating tokens 4732 // along the way. 4733 AnnotateVis.visitFileRegion(); 4734 4735 for (unsigned I = 0 ; I < TokIdx ; ++I) { 4736 AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]); 4737 if (Pos != Annotated.end() && 4738 (clang_isInvalid(Cursors[I].kind) || 4739 Pos->second.kind != CXCursor_PreprocessingDirective)) 4740 Cursors[I] = Pos->second; 4741 } 4742 4743 // Finish up annotating any tokens left. 4744 if (!MoreTokens()) 4745 return; 4746 4747 const CXCursor &C = clang_getNullCursor(); 4748 for (unsigned I = TokIdx ; I < NumTokens ; ++I) { 4749 if (I < PreprocessingTokIdx && clang_isPreprocessing(Cursors[I].kind)) 4750 continue; 4751 4752 AnnotateTokensData::iterator Pos = Annotated.find(Tokens[I].int_data[1]); 4753 Cursors[I] = (Pos == Annotated.end()) ? C : Pos->second; 4754 } 4755} 4756 4757/// \brief It annotates and advances tokens with a cursor until the comparison 4758//// between the cursor location and the source range is the same as 4759/// \arg compResult. 4760/// 4761/// Pass RangeBefore to annotate tokens with a cursor until a range is reached. 4762/// Pass RangeOverlap to annotate tokens inside a range. 4763void AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC, 4764 RangeComparisonResult compResult, 4765 SourceRange range) { 4766 while (MoreTokens()) { 4767 const unsigned I = NextToken(); 4768 if (isFunctionMacroToken(I)) 4769 return annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range); 4770 4771 SourceLocation TokLoc = GetTokenLoc(I); 4772 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) { 4773 Cursors[I] = updateC; 4774 AdvanceToken(); 4775 continue; 4776 } 4777 break; 4778 } 4779} 4780 4781/// \brief Special annotation handling for macro argument tokens. 4782void AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens( 4783 CXCursor updateC, 4784 RangeComparisonResult compResult, 4785 SourceRange range) { 4786 assert(MoreTokens()); 4787 assert(isFunctionMacroToken(NextToken()) && 4788 "Should be called only for macro arg tokens"); 4789 4790 // This works differently than annotateAndAdvanceTokens; because expanded 4791 // macro arguments can have arbitrary translation-unit source order, we do not 4792 // advance the token index one by one until a token fails the range test. 4793 // We only advance once past all of the macro arg tokens if all of them 4794 // pass the range test. If one of them fails we keep the token index pointing 4795 // at the start of the macro arg tokens so that the failing token will be 4796 // annotated by a subsequent annotation try. 4797 4798 bool atLeastOneCompFail = false; 4799 4800 unsigned I = NextToken(); 4801 for (; I < NumTokens && isFunctionMacroToken(I); ++I) { 4802 SourceLocation TokLoc = getFunctionMacroTokenLoc(I); 4803 if (TokLoc.isFileID()) 4804 continue; // not macro arg token, it's parens or comma. 4805 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) { 4806 if (clang_isInvalid(clang_getCursorKind(Cursors[I]))) 4807 Cursors[I] = updateC; 4808 } else 4809 atLeastOneCompFail = true; 4810 } 4811 4812 if (!atLeastOneCompFail) 4813 TokIdx = I; // All of the tokens were handled, advance beyond all of them. 4814} 4815 4816enum CXChildVisitResult 4817AnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) { 4818 CXSourceLocation Loc = clang_getCursorLocation(cursor); 4819 SourceRange cursorRange = getRawCursorExtent(cursor); 4820 if (cursorRange.isInvalid()) 4821 return CXChildVisit_Recurse; 4822 4823 if (!HasContextSensitiveKeywords) { 4824 // Objective-C properties can have context-sensitive keywords. 4825 if (cursor.kind == CXCursor_ObjCPropertyDecl) { 4826 if (ObjCPropertyDecl *Property 4827 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor))) 4828 HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0; 4829 } 4830 // Objective-C methods can have context-sensitive keywords. 4831 else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl || 4832 cursor.kind == CXCursor_ObjCClassMethodDecl) { 4833 if (ObjCMethodDecl *Method 4834 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) { 4835 if (Method->getObjCDeclQualifier()) 4836 HasContextSensitiveKeywords = true; 4837 else { 4838 for (ObjCMethodDecl::param_iterator P = Method->param_begin(), 4839 PEnd = Method->param_end(); 4840 P != PEnd; ++P) { 4841 if ((*P)->getObjCDeclQualifier()) { 4842 HasContextSensitiveKeywords = true; 4843 break; 4844 } 4845 } 4846 } 4847 } 4848 } 4849 // C++ methods can have context-sensitive keywords. 4850 else if (cursor.kind == CXCursor_CXXMethod) { 4851 if (CXXMethodDecl *Method 4852 = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) { 4853 if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>()) 4854 HasContextSensitiveKeywords = true; 4855 } 4856 } 4857 // C++ classes can have context-sensitive keywords. 4858 else if (cursor.kind == CXCursor_StructDecl || 4859 cursor.kind == CXCursor_ClassDecl || 4860 cursor.kind == CXCursor_ClassTemplate || 4861 cursor.kind == CXCursor_ClassTemplatePartialSpecialization) { 4862 if (Decl *D = getCursorDecl(cursor)) 4863 if (D->hasAttr<FinalAttr>()) 4864 HasContextSensitiveKeywords = true; 4865 } 4866 } 4867 4868 if (clang_isPreprocessing(cursor.kind)) { 4869 // For macro expansions, just note where the beginning of the macro 4870 // expansion occurs. 4871 if (cursor.kind == CXCursor_MacroExpansion) { 4872 Annotated[Loc.int_data] = cursor; 4873 return CXChildVisit_Recurse; 4874 } 4875 4876 // Items in the preprocessing record are kept separate from items in 4877 // declarations, so we keep a separate token index. 4878 unsigned SavedTokIdx = TokIdx; 4879 TokIdx = PreprocessingTokIdx; 4880 4881 // Skip tokens up until we catch up to the beginning of the preprocessing 4882 // entry. 4883 while (MoreTokens()) { 4884 const unsigned I = NextToken(); 4885 SourceLocation TokLoc = GetTokenLoc(I); 4886 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 4887 case RangeBefore: 4888 AdvanceToken(); 4889 continue; 4890 case RangeAfter: 4891 case RangeOverlap: 4892 break; 4893 } 4894 break; 4895 } 4896 4897 // Look at all of the tokens within this range. 4898 while (MoreTokens()) { 4899 const unsigned I = NextToken(); 4900 SourceLocation TokLoc = GetTokenLoc(I); 4901 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) { 4902 case RangeBefore: 4903 llvm_unreachable("Infeasible"); 4904 case RangeAfter: 4905 break; 4906 case RangeOverlap: 4907 Cursors[I] = cursor; 4908 AdvanceToken(); 4909 continue; 4910 } 4911 break; 4912 } 4913 4914 // Save the preprocessing token index; restore the non-preprocessing 4915 // token index. 4916 PreprocessingTokIdx = TokIdx; 4917 TokIdx = SavedTokIdx; 4918 return CXChildVisit_Recurse; 4919 } 4920 4921 if (cursorRange.isInvalid()) 4922 return CXChildVisit_Continue; 4923 4924 SourceLocation L = SourceLocation::getFromRawEncoding(Loc.int_data); 4925 4926 // Adjust the annotated range based specific declarations. 4927 const enum CXCursorKind cursorK = clang_getCursorKind(cursor); 4928 if (cursorK >= CXCursor_FirstDecl && cursorK <= CXCursor_LastDecl) { 4929 Decl *D = cxcursor::getCursorDecl(cursor); 4930 4931 SourceLocation StartLoc; 4932 if (const DeclaratorDecl *DD = dyn_cast_or_null<DeclaratorDecl>(D)) { 4933 if (TypeSourceInfo *TI = DD->getTypeSourceInfo()) 4934 StartLoc = TI->getTypeLoc().getLocStart(); 4935 } else if (TypedefDecl *Typedef = dyn_cast_or_null<TypedefDecl>(D)) { 4936 if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo()) 4937 StartLoc = TI->getTypeLoc().getLocStart(); 4938 } 4939 4940 if (StartLoc.isValid() && L.isValid() && 4941 SrcMgr.isBeforeInTranslationUnit(StartLoc, L)) 4942 cursorRange.setBegin(StartLoc); 4943 } 4944 4945 // If the location of the cursor occurs within a macro instantiation, record 4946 // the spelling location of the cursor in our annotation map. We can then 4947 // paper over the token labelings during a post-processing step to try and 4948 // get cursor mappings for tokens that are the *arguments* of a macro 4949 // instantiation. 4950 if (L.isMacroID()) { 4951 unsigned rawEncoding = SrcMgr.getSpellingLoc(L).getRawEncoding(); 4952 // Only invalidate the old annotation if it isn't part of a preprocessing 4953 // directive. Here we assume that the default construction of CXCursor 4954 // results in CXCursor.kind being an initialized value (i.e., 0). If 4955 // this isn't the case, we can fix by doing lookup + insertion. 4956 4957 CXCursor &oldC = Annotated[rawEncoding]; 4958 if (!clang_isPreprocessing(oldC.kind)) 4959 oldC = cursor; 4960 } 4961 4962 const enum CXCursorKind K = clang_getCursorKind(parent); 4963 const CXCursor updateC = 4964 (clang_isInvalid(K) || K == CXCursor_TranslationUnit) 4965 ? clang_getNullCursor() : parent; 4966 4967 annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange); 4968 4969 // Avoid having the cursor of an expression "overwrite" the annotation of the 4970 // variable declaration that it belongs to. 4971 // This can happen for C++ constructor expressions whose range generally 4972 // include the variable declaration, e.g.: 4973 // MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor. 4974 if (clang_isExpression(cursorK)) { 4975 Expr *E = getCursorExpr(cursor); 4976 if (Decl *D = getCursorParentDecl(cursor)) { 4977 const unsigned I = NextToken(); 4978 if (E->getLocStart().isValid() && D->getLocation().isValid() && 4979 E->getLocStart() == D->getLocation() && 4980 E->getLocStart() == GetTokenLoc(I)) { 4981 Cursors[I] = updateC; 4982 AdvanceToken(); 4983 } 4984 } 4985 } 4986 4987 // Visit children to get their cursor information. 4988 const unsigned BeforeChildren = NextToken(); 4989 VisitChildren(cursor); 4990 const unsigned AfterChildren = NextToken(); 4991 4992 // Scan the tokens that are at the end of the cursor, but are not captured 4993 // but the child cursors. 4994 annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange); 4995 4996 // Scan the tokens that are at the beginning of the cursor, but are not 4997 // capture by the child cursors. 4998 for (unsigned I = BeforeChildren; I != AfterChildren; ++I) { 4999 if (!clang_isInvalid(clang_getCursorKind(Cursors[I]))) 5000 break; 5001 5002 Cursors[I] = cursor; 5003 } 5004 5005 return CXChildVisit_Continue; 5006} 5007 5008static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor, 5009 CXCursor parent, 5010 CXClientData client_data) { 5011 return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent); 5012} 5013 5014namespace { 5015 5016/// \brief Uses the macro expansions in the preprocessing record to find 5017/// and mark tokens that are macro arguments. This info is used by the 5018/// AnnotateTokensWorker. 5019class MarkMacroArgTokensVisitor { 5020 SourceManager &SM; 5021 CXToken *Tokens; 5022 unsigned NumTokens; 5023 unsigned CurIdx; 5024 5025public: 5026 MarkMacroArgTokensVisitor(SourceManager &SM, 5027 CXToken *tokens, unsigned numTokens) 5028 : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { } 5029 5030 CXChildVisitResult visit(CXCursor cursor, CXCursor parent) { 5031 if (cursor.kind != CXCursor_MacroExpansion) 5032 return CXChildVisit_Continue; 5033 5034 SourceRange macroRange = getCursorMacroExpansion(cursor)->getSourceRange(); 5035 if (macroRange.getBegin() == macroRange.getEnd()) 5036 return CXChildVisit_Continue; // it's not a function macro. 5037 5038 for (; CurIdx < NumTokens; ++CurIdx) { 5039 if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx), 5040 macroRange.getBegin())) 5041 break; 5042 } 5043 5044 if (CurIdx == NumTokens) 5045 return CXChildVisit_Break; 5046 5047 for (; CurIdx < NumTokens; ++CurIdx) { 5048 SourceLocation tokLoc = getTokenLoc(CurIdx); 5049 if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd())) 5050 break; 5051 5052 setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc)); 5053 } 5054 5055 if (CurIdx == NumTokens) 5056 return CXChildVisit_Break; 5057 5058 return CXChildVisit_Continue; 5059 } 5060 5061private: 5062 SourceLocation getTokenLoc(unsigned tokI) { 5063 return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]); 5064 } 5065 5066 void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) { 5067 // The third field is reserved and currently not used. Use it here 5068 // to mark macro arg expanded tokens with their expanded locations. 5069 Tokens[tokI].int_data[3] = loc.getRawEncoding(); 5070 } 5071}; 5072 5073} // end anonymous namespace 5074 5075static CXChildVisitResult 5076MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent, 5077 CXClientData client_data) { 5078 return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor, 5079 parent); 5080} 5081 5082namespace { 5083 struct clang_annotateTokens_Data { 5084 CXTranslationUnit TU; 5085 ASTUnit *CXXUnit; 5086 CXToken *Tokens; 5087 unsigned NumTokens; 5088 CXCursor *Cursors; 5089 }; 5090} 5091 5092static void annotatePreprocessorTokens(CXTranslationUnit TU, 5093 SourceRange RegionOfInterest, 5094 AnnotateTokensData &Annotated) { 5095 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 5096 5097 SourceManager &SourceMgr = CXXUnit->getSourceManager(); 5098 std::pair<FileID, unsigned> BeginLocInfo 5099 = SourceMgr.getDecomposedLoc(RegionOfInterest.getBegin()); 5100 std::pair<FileID, unsigned> EndLocInfo 5101 = SourceMgr.getDecomposedLoc(RegionOfInterest.getEnd()); 5102 5103 if (BeginLocInfo.first != EndLocInfo.first) 5104 return; 5105 5106 StringRef Buffer; 5107 bool Invalid = false; 5108 Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid); 5109 if (Buffer.empty() || Invalid) 5110 return; 5111 5112 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first), 5113 CXXUnit->getASTContext().getLangOpts(), 5114 Buffer.begin(), Buffer.data() + BeginLocInfo.second, 5115 Buffer.end()); 5116 Lex.SetCommentRetentionState(true); 5117 5118 // Lex tokens in raw mode until we hit the end of the range, to avoid 5119 // entering #includes or expanding macros. 5120 while (true) { 5121 Token Tok; 5122 Lex.LexFromRawLexer(Tok); 5123 5124 reprocess: 5125 if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) { 5126 // We have found a preprocessing directive. Gobble it up so that we 5127 // don't see it while preprocessing these tokens later, but keep track 5128 // of all of the token locations inside this preprocessing directive so 5129 // that we can annotate them appropriately. 5130 // 5131 // FIXME: Some simple tests here could identify macro definitions and 5132 // #undefs, to provide specific cursor kinds for those. 5133 SmallVector<SourceLocation, 32> Locations; 5134 do { 5135 Locations.push_back(Tok.getLocation()); 5136 Lex.LexFromRawLexer(Tok); 5137 } while (!Tok.isAtStartOfLine() && !Tok.is(tok::eof)); 5138 5139 using namespace cxcursor; 5140 CXCursor Cursor 5141 = MakePreprocessingDirectiveCursor(SourceRange(Locations.front(), 5142 Locations.back()), 5143 TU); 5144 for (unsigned I = 0, N = Locations.size(); I != N; ++I) { 5145 Annotated[Locations[I].getRawEncoding()] = Cursor; 5146 } 5147 5148 if (Tok.isAtStartOfLine()) 5149 goto reprocess; 5150 5151 continue; 5152 } 5153 5154 if (Tok.is(tok::eof)) 5155 break; 5156 } 5157} 5158 5159// This gets run a separate thread to avoid stack blowout. 5160static void clang_annotateTokensImpl(void *UserData) { 5161 CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU; 5162 ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit; 5163 CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens; 5164 const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens; 5165 CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors; 5166 5167 CIndexer *CXXIdx = (CIndexer*)TU->CIdx; 5168 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) 5169 setBackGroundPriority(); 5170 5171 // Determine the region of interest, which contains all of the tokens. 5172 SourceRange RegionOfInterest; 5173 RegionOfInterest.setBegin( 5174 cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0]))); 5175 RegionOfInterest.setEnd( 5176 cxloc::translateSourceLocation(clang_getTokenLocation(TU, 5177 Tokens[NumTokens-1]))); 5178 5179 // A mapping from the source locations found when re-lexing or traversing the 5180 // region of interest to the corresponding cursors. 5181 AnnotateTokensData Annotated; 5182 5183 // Relex the tokens within the source range to look for preprocessing 5184 // directives. 5185 annotatePreprocessorTokens(TU, RegionOfInterest, Annotated); 5186 5187 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) { 5188 // Search and mark tokens that are macro argument expansions. 5189 MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(), 5190 Tokens, NumTokens); 5191 CursorVisitor MacroArgMarker(TU, 5192 MarkMacroArgTokensVisitorDelegate, &Visitor, 5193 /*VisitPreprocessorLast=*/true, 5194 /*VisitIncludedEntities=*/false, 5195 RegionOfInterest); 5196 MacroArgMarker.visitPreprocessedEntitiesInRegion(); 5197 } 5198 5199 // Annotate all of the source locations in the region of interest that map to 5200 // a specific cursor. 5201 AnnotateTokensWorker W(Annotated, Tokens, Cursors, NumTokens, 5202 TU, RegionOfInterest); 5203 5204 // FIXME: We use a ridiculous stack size here because the data-recursion 5205 // algorithm uses a large stack frame than the non-data recursive version, 5206 // and AnnotationTokensWorker currently transforms the data-recursion 5207 // algorithm back into a traditional recursion by explicitly calling 5208 // VisitChildren(). We will need to remove this explicit recursive call. 5209 W.AnnotateTokens(); 5210 5211 // If we ran into any entities that involve context-sensitive keywords, 5212 // take another pass through the tokens to mark them as such. 5213 if (W.hasContextSensitiveKeywords()) { 5214 for (unsigned I = 0; I != NumTokens; ++I) { 5215 if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier) 5216 continue; 5217 5218 if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) { 5219 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data); 5220 if (ObjCPropertyDecl *Property 5221 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) { 5222 if (Property->getPropertyAttributesAsWritten() != 0 && 5223 llvm::StringSwitch<bool>(II->getName()) 5224 .Case("readonly", true) 5225 .Case("assign", true) 5226 .Case("unsafe_unretained", true) 5227 .Case("readwrite", true) 5228 .Case("retain", true) 5229 .Case("copy", true) 5230 .Case("nonatomic", true) 5231 .Case("atomic", true) 5232 .Case("getter", true) 5233 .Case("setter", true) 5234 .Case("strong", true) 5235 .Case("weak", true) 5236 .Default(false)) 5237 Tokens[I].int_data[0] = CXToken_Keyword; 5238 } 5239 continue; 5240 } 5241 5242 if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl || 5243 Cursors[I].kind == CXCursor_ObjCClassMethodDecl) { 5244 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data); 5245 if (llvm::StringSwitch<bool>(II->getName()) 5246 .Case("in", true) 5247 .Case("out", true) 5248 .Case("inout", true) 5249 .Case("oneway", true) 5250 .Case("bycopy", true) 5251 .Case("byref", true) 5252 .Default(false)) 5253 Tokens[I].int_data[0] = CXToken_Keyword; 5254 continue; 5255 } 5256 5257 if (Cursors[I].kind == CXCursor_CXXFinalAttr || 5258 Cursors[I].kind == CXCursor_CXXOverrideAttr) { 5259 Tokens[I].int_data[0] = CXToken_Keyword; 5260 continue; 5261 } 5262 } 5263 } 5264} 5265 5266extern "C" { 5267 5268void clang_annotateTokens(CXTranslationUnit TU, 5269 CXToken *Tokens, unsigned NumTokens, 5270 CXCursor *Cursors) { 5271 5272 if (NumTokens == 0 || !Tokens || !Cursors) 5273 return; 5274 5275 // Any token we don't specifically annotate will have a NULL cursor. 5276 CXCursor C = clang_getNullCursor(); 5277 for (unsigned I = 0; I != NumTokens; ++I) 5278 Cursors[I] = C; 5279 5280 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); 5281 if (!CXXUnit) 5282 return; 5283 5284 ASTUnit::ConcurrencyCheck Check(*CXXUnit); 5285 5286 clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors }; 5287 llvm::CrashRecoveryContext CRC; 5288 if (!RunSafely(CRC, clang_annotateTokensImpl, &data, 5289 GetSafetyThreadStackSize() * 2)) { 5290 fprintf(stderr, "libclang: crash detected while annotating tokens\n"); 5291 } 5292} 5293 5294} // end: extern "C" 5295 5296//===----------------------------------------------------------------------===// 5297// Operations for querying linkage of a cursor. 5298//===----------------------------------------------------------------------===// 5299 5300extern "C" { 5301CXLinkageKind clang_getCursorLinkage(CXCursor cursor) { 5302 if (!clang_isDeclaration(cursor.kind)) 5303 return CXLinkage_Invalid; 5304 5305 Decl *D = cxcursor::getCursorDecl(cursor); 5306 if (NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D)) 5307 switch (ND->getLinkage()) { 5308 case NoLinkage: return CXLinkage_NoLinkage; 5309 case InternalLinkage: return CXLinkage_Internal; 5310 case UniqueExternalLinkage: return CXLinkage_UniqueExternal; 5311 case ExternalLinkage: return CXLinkage_External; 5312 }; 5313 5314 return CXLinkage_Invalid; 5315} 5316} // end: extern "C" 5317 5318//===----------------------------------------------------------------------===// 5319// Operations for querying language of a cursor. 5320//===----------------------------------------------------------------------===// 5321 5322static CXLanguageKind getDeclLanguage(const Decl *D) { 5323 if (!D) 5324 return CXLanguage_C; 5325 5326 switch (D->getKind()) { 5327 default: 5328 break; 5329 case Decl::ImplicitParam: 5330 case Decl::ObjCAtDefsField: 5331 case Decl::ObjCCategory: 5332 case Decl::ObjCCategoryImpl: 5333 case Decl::ObjCCompatibleAlias: 5334 case Decl::ObjCImplementation: 5335 case Decl::ObjCInterface: 5336 case Decl::ObjCIvar: 5337 case Decl::ObjCMethod: 5338 case Decl::ObjCProperty: 5339 case Decl::ObjCPropertyImpl: 5340 case Decl::ObjCProtocol: 5341 return CXLanguage_ObjC; 5342 case Decl::CXXConstructor: 5343 case Decl::CXXConversion: 5344 case Decl::CXXDestructor: 5345 case Decl::CXXMethod: 5346 case Decl::CXXRecord: 5347 case Decl::ClassTemplate: 5348 case Decl::ClassTemplatePartialSpecialization: 5349 case Decl::ClassTemplateSpecialization: 5350 case Decl::Friend: 5351 case Decl::FriendTemplate: 5352 case Decl::FunctionTemplate: 5353 case Decl::LinkageSpec: 5354 case Decl::Namespace: 5355 case Decl::NamespaceAlias: 5356 case Decl::NonTypeTemplateParm: 5357 case Decl::StaticAssert: 5358 case Decl::TemplateTemplateParm: 5359 case Decl::TemplateTypeParm: 5360 case Decl::UnresolvedUsingTypename: 5361 case Decl::UnresolvedUsingValue: 5362 case Decl::Using: 5363 case Decl::UsingDirective: 5364 case Decl::UsingShadow: 5365 return CXLanguage_CPlusPlus; 5366 } 5367 5368 return CXLanguage_C; 5369} 5370 5371extern "C" { 5372 5373enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) { 5374 if (clang_isDeclaration(cursor.kind)) 5375 if (Decl *D = cxcursor::getCursorDecl(cursor)) { 5376 if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted()) 5377 return CXAvailability_Available; 5378 5379 switch (D->getAvailability()) { 5380 case AR_Available: 5381 case AR_NotYetIntroduced: 5382 return CXAvailability_Available; 5383 5384 case AR_Deprecated: 5385 return CXAvailability_Deprecated; 5386 5387 case AR_Unavailable: 5388 return CXAvailability_NotAvailable; 5389 } 5390 } 5391 5392 return CXAvailability_Available; 5393} 5394 5395CXLanguageKind clang_getCursorLanguage(CXCursor cursor) { 5396 if (clang_isDeclaration(cursor.kind)) 5397 return getDeclLanguage(cxcursor::getCursorDecl(cursor)); 5398 5399 return CXLanguage_Invalid; 5400} 5401 5402 /// \brief If the given cursor is the "templated" declaration 5403 /// descibing a class or function template, return the class or 5404 /// function template. 5405static Decl *maybeGetTemplateCursor(Decl *D) { 5406 if (!D) 5407 return 0; 5408 5409 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 5410 if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate()) 5411 return FunTmpl; 5412 5413 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) 5414 if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate()) 5415 return ClassTmpl; 5416 5417 return D; 5418} 5419 5420CXCursor clang_getCursorSemanticParent(CXCursor cursor) { 5421 if (clang_isDeclaration(cursor.kind)) { 5422 if (Decl *D = getCursorDecl(cursor)) { 5423 DeclContext *DC = D->getDeclContext(); 5424 if (!DC) 5425 return clang_getNullCursor(); 5426 5427 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)), 5428 getCursorTU(cursor)); 5429 } 5430 } 5431 5432 if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) { 5433 if (Decl *D = getCursorDecl(cursor)) 5434 return MakeCXCursor(D, getCursorTU(cursor)); 5435 } 5436 5437 return clang_getNullCursor(); 5438} 5439 5440CXCursor clang_getCursorLexicalParent(CXCursor cursor) { 5441 if (clang_isDeclaration(cursor.kind)) { 5442 if (Decl *D = getCursorDecl(cursor)) { 5443 DeclContext *DC = D->getLexicalDeclContext(); 5444 if (!DC) 5445 return clang_getNullCursor(); 5446 5447 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)), 5448 getCursorTU(cursor)); 5449 } 5450 } 5451 5452 // FIXME: Note that we can't easily compute the lexical context of a 5453 // statement or expression, so we return nothing. 5454 return clang_getNullCursor(); 5455} 5456 5457void clang_getOverriddenCursors(CXCursor cursor, 5458 CXCursor **overridden, 5459 unsigned *num_overridden) { 5460 if (overridden) 5461 *overridden = 0; 5462 if (num_overridden) 5463 *num_overridden = 0; 5464 if (!overridden || !num_overridden) 5465 return; 5466 5467 SmallVector<CXCursor, 8> Overridden; 5468 cxcursor::getOverriddenCursors(cursor, Overridden); 5469 5470 // Don't allocate memory if we have no overriden cursors. 5471 if (Overridden.size() == 0) 5472 return; 5473 5474 *num_overridden = Overridden.size(); 5475 *overridden = new CXCursor [Overridden.size()]; 5476 std::copy(Overridden.begin(), Overridden.end(), *overridden); 5477} 5478 5479void clang_disposeOverriddenCursors(CXCursor *overridden) { 5480 delete [] overridden; 5481} 5482 5483CXFile clang_getIncludedFile(CXCursor cursor) { 5484 if (cursor.kind != CXCursor_InclusionDirective) 5485 return 0; 5486 5487 InclusionDirective *ID = getCursorInclusionDirective(cursor); 5488 return (void *)ID->getFile(); 5489} 5490 5491} // end: extern "C" 5492 5493 5494//===----------------------------------------------------------------------===// 5495// C++ AST instrospection. 5496//===----------------------------------------------------------------------===// 5497 5498extern "C" { 5499unsigned clang_CXXMethod_isStatic(CXCursor C) { 5500 if (!clang_isDeclaration(C.kind)) 5501 return 0; 5502 5503 CXXMethodDecl *Method = 0; 5504 Decl *D = cxcursor::getCursorDecl(C); 5505 if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D)) 5506 Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl()); 5507 else 5508 Method = dyn_cast_or_null<CXXMethodDecl>(D); 5509 return (Method && Method->isStatic()) ? 1 : 0; 5510} 5511 5512unsigned clang_CXXMethod_isVirtual(CXCursor C) { 5513 if (!clang_isDeclaration(C.kind)) 5514 return 0; 5515 5516 CXXMethodDecl *Method = 0; 5517 Decl *D = cxcursor::getCursorDecl(C); 5518 if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D)) 5519 Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl()); 5520 else 5521 Method = dyn_cast_or_null<CXXMethodDecl>(D); 5522 return (Method && Method->isVirtual()) ? 1 : 0; 5523} 5524} // end: extern "C" 5525 5526//===----------------------------------------------------------------------===// 5527// Attribute introspection. 5528//===----------------------------------------------------------------------===// 5529 5530extern "C" { 5531CXType clang_getIBOutletCollectionType(CXCursor C) { 5532 if (C.kind != CXCursor_IBOutletCollectionAttr) 5533 return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C)); 5534 5535 IBOutletCollectionAttr *A = 5536 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C)); 5537 5538 return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C)); 5539} 5540} // end: extern "C" 5541 5542//===----------------------------------------------------------------------===// 5543// Inspecting memory usage. 5544//===----------------------------------------------------------------------===// 5545 5546typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries; 5547 5548static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries, 5549 enum CXTUResourceUsageKind k, 5550 unsigned long amount) { 5551 CXTUResourceUsageEntry entry = { k, amount }; 5552 entries.push_back(entry); 5553} 5554 5555extern "C" { 5556 5557const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) { 5558 const char *str = ""; 5559 switch (kind) { 5560 case CXTUResourceUsage_AST: 5561 str = "ASTContext: expressions, declarations, and types"; 5562 break; 5563 case CXTUResourceUsage_Identifiers: 5564 str = "ASTContext: identifiers"; 5565 break; 5566 case CXTUResourceUsage_Selectors: 5567 str = "ASTContext: selectors"; 5568 break; 5569 case CXTUResourceUsage_GlobalCompletionResults: 5570 str = "Code completion: cached global results"; 5571 break; 5572 case CXTUResourceUsage_SourceManagerContentCache: 5573 str = "SourceManager: content cache allocator"; 5574 break; 5575 case CXTUResourceUsage_AST_SideTables: 5576 str = "ASTContext: side tables"; 5577 break; 5578 case CXTUResourceUsage_SourceManager_Membuffer_Malloc: 5579 str = "SourceManager: malloc'ed memory buffers"; 5580 break; 5581 case CXTUResourceUsage_SourceManager_Membuffer_MMap: 5582 str = "SourceManager: mmap'ed memory buffers"; 5583 break; 5584 case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc: 5585 str = "ExternalASTSource: malloc'ed memory buffers"; 5586 break; 5587 case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap: 5588 str = "ExternalASTSource: mmap'ed memory buffers"; 5589 break; 5590 case CXTUResourceUsage_Preprocessor: 5591 str = "Preprocessor: malloc'ed memory"; 5592 break; 5593 case CXTUResourceUsage_PreprocessingRecord: 5594 str = "Preprocessor: PreprocessingRecord"; 5595 break; 5596 case CXTUResourceUsage_SourceManager_DataStructures: 5597 str = "SourceManager: data structures and tables"; 5598 break; 5599 case CXTUResourceUsage_Preprocessor_HeaderSearch: 5600 str = "Preprocessor: header search tables"; 5601 break; 5602 } 5603 return str; 5604} 5605 5606CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) { 5607 if (!TU) { 5608 CXTUResourceUsage usage = { (void*) 0, 0, 0 }; 5609 return usage; 5610 } 5611 5612 ASTUnit *astUnit = static_cast<ASTUnit*>(TU->TUData); 5613 OwningPtr<MemUsageEntries> entries(new MemUsageEntries()); 5614 ASTContext &astContext = astUnit->getASTContext(); 5615 5616 // How much memory is used by AST nodes and types? 5617 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST, 5618 (unsigned long) astContext.getASTAllocatedMemory()); 5619 5620 // How much memory is used by identifiers? 5621 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers, 5622 (unsigned long) astContext.Idents.getAllocator().getTotalMemory()); 5623 5624 // How much memory is used for selectors? 5625 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors, 5626 (unsigned long) astContext.Selectors.getTotalMemory()); 5627 5628 // How much memory is used by ASTContext's side tables? 5629 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables, 5630 (unsigned long) astContext.getSideTableAllocatedMemory()); 5631 5632 // How much memory is used for caching global code completion results? 5633 unsigned long completionBytes = 0; 5634 if (GlobalCodeCompletionAllocator *completionAllocator = 5635 astUnit->getCachedCompletionAllocator().getPtr()) { 5636 completionBytes = completionAllocator->getTotalMemory(); 5637 } 5638 createCXTUResourceUsageEntry(*entries, 5639 CXTUResourceUsage_GlobalCompletionResults, 5640 completionBytes); 5641 5642 // How much memory is being used by SourceManager's content cache? 5643 createCXTUResourceUsageEntry(*entries, 5644 CXTUResourceUsage_SourceManagerContentCache, 5645 (unsigned long) astContext.getSourceManager().getContentCacheSize()); 5646 5647 // How much memory is being used by the MemoryBuffer's in SourceManager? 5648 const SourceManager::MemoryBufferSizes &srcBufs = 5649 astUnit->getSourceManager().getMemoryBufferSizes(); 5650 5651 createCXTUResourceUsageEntry(*entries, 5652 CXTUResourceUsage_SourceManager_Membuffer_Malloc, 5653 (unsigned long) srcBufs.malloc_bytes); 5654 createCXTUResourceUsageEntry(*entries, 5655 CXTUResourceUsage_SourceManager_Membuffer_MMap, 5656 (unsigned long) srcBufs.mmap_bytes); 5657 createCXTUResourceUsageEntry(*entries, 5658 CXTUResourceUsage_SourceManager_DataStructures, 5659 (unsigned long) astContext.getSourceManager() 5660 .getDataStructureSizes()); 5661 5662 // How much memory is being used by the ExternalASTSource? 5663 if (ExternalASTSource *esrc = astContext.getExternalSource()) { 5664 const ExternalASTSource::MemoryBufferSizes &sizes = 5665 esrc->getMemoryBufferSizes(); 5666 5667 createCXTUResourceUsageEntry(*entries, 5668 CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc, 5669 (unsigned long) sizes.malloc_bytes); 5670 createCXTUResourceUsageEntry(*entries, 5671 CXTUResourceUsage_ExternalASTSource_Membuffer_MMap, 5672 (unsigned long) sizes.mmap_bytes); 5673 } 5674 5675 // How much memory is being used by the Preprocessor? 5676 Preprocessor &pp = astUnit->getPreprocessor(); 5677 createCXTUResourceUsageEntry(*entries, 5678 CXTUResourceUsage_Preprocessor, 5679 pp.getTotalMemory()); 5680 5681 if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) { 5682 createCXTUResourceUsageEntry(*entries, 5683 CXTUResourceUsage_PreprocessingRecord, 5684 pRec->getTotalMemory()); 5685 } 5686 5687 createCXTUResourceUsageEntry(*entries, 5688 CXTUResourceUsage_Preprocessor_HeaderSearch, 5689 pp.getHeaderSearchInfo().getTotalMemory()); 5690 5691 CXTUResourceUsage usage = { (void*) entries.get(), 5692 (unsigned) entries->size(), 5693 entries->size() ? &(*entries)[0] : 0 }; 5694 entries.take(); 5695 return usage; 5696} 5697 5698void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) { 5699 if (usage.data) 5700 delete (MemUsageEntries*) usage.data; 5701} 5702 5703} // end extern "C" 5704 5705void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) { 5706 CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU); 5707 for (unsigned I = 0; I != Usage.numEntries; ++I) 5708 fprintf(stderr, " %s: %lu\n", 5709 clang_getTUResourceUsageName(Usage.entries[I].kind), 5710 Usage.entries[I].amount); 5711 5712 clang_disposeCXTUResourceUsage(Usage); 5713} 5714 5715//===----------------------------------------------------------------------===// 5716// Misc. utility functions. 5717//===----------------------------------------------------------------------===// 5718 5719/// Default to using an 8 MB stack size on "safety" threads. 5720static unsigned SafetyStackThreadSize = 8 << 20; 5721 5722namespace clang { 5723 5724bool RunSafely(llvm::CrashRecoveryContext &CRC, 5725 void (*Fn)(void*), void *UserData, 5726 unsigned Size) { 5727 if (!Size) 5728 Size = GetSafetyThreadStackSize(); 5729 if (Size) 5730 return CRC.RunSafelyOnThread(Fn, UserData, Size); 5731 return CRC.RunSafely(Fn, UserData); 5732} 5733 5734unsigned GetSafetyThreadStackSize() { 5735 return SafetyStackThreadSize; 5736} 5737 5738void SetSafetyThreadStackSize(unsigned Value) { 5739 SafetyStackThreadSize = Value; 5740} 5741 5742} 5743 5744void clang::setBackGroundPriority() { 5745 // FIXME: Move to llvm/Support and make it cross-platform. 5746#ifdef __APPLE__ 5747 setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG); 5748#endif 5749} 5750 5751extern "C" { 5752 5753CXString clang_getClangVersion() { 5754 return createCXString(getClangFullVersion()); 5755} 5756 5757} // end: extern "C" 5758 5759