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