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