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