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