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