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