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