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