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