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