1 //===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the main API hooks in the Clang-C Source Indexing
13 //===----------------------------------------------------------------------===//
16 #include "CIndexDiagnostic.h"
19 #include "CXSourceLocation.h"
21 #include "CXTranslationUnit.h"
23 #include "CursorVisitor.h"
24 #include "clang/AST/Attr.h"
25 #include "clang/AST/Mangle.h"
26 #include "clang/AST/StmtVisitor.h"
27 #include "clang/AST/VTableBuilder.h"
28 #include "clang/Basic/Diagnostic.h"
29 #include "clang/Basic/DiagnosticCategories.h"
30 #include "clang/Basic/DiagnosticIDs.h"
31 #include "clang/Basic/TargetInfo.h"
32 #include "clang/Basic/Version.h"
33 #include "clang/Frontend/ASTUnit.h"
34 #include "clang/Frontend/CompilerInstance.h"
35 #include "clang/Frontend/FrontendDiagnostic.h"
36 #include "clang/Index/CommentToXML.h"
37 #include "clang/Lex/HeaderSearch.h"
38 #include "clang/Lex/Lexer.h"
39 #include "clang/Lex/PreprocessingRecord.h"
40 #include "clang/Lex/Preprocessor.h"
41 #include "clang/Serialization/SerializationDiagnostic.h"
42 #include "llvm/ADT/Optional.h"
43 #include "llvm/ADT/STLExtras.h"
44 #include "llvm/ADT/StringSwitch.h"
45 #include "llvm/Config/llvm-config.h"
46 #include "llvm/IR/DataLayout.h"
47 #include "llvm/IR/Mangler.h"
48 #include "llvm/Support/Compiler.h"
49 #include "llvm/Support/CrashRecoveryContext.h"
50 #include "llvm/Support/Format.h"
51 #include "llvm/Support/ManagedStatic.h"
52 #include "llvm/Support/MemoryBuffer.h"
53 #include "llvm/Support/Mutex.h"
54 #include "llvm/Support/Program.h"
55 #include "llvm/Support/SaveAndRestore.h"
56 #include "llvm/Support/Signals.h"
57 #include "llvm/Support/TargetSelect.h"
58 #include "llvm/Support/Threading.h"
59 #include "llvm/Support/Timer.h"
60 #include "llvm/Support/raw_ostream.h"
62 #if LLVM_ENABLE_THREADS != 0 && defined(__APPLE__)
63 #define USE_DARWIN_THREADS
66 #ifdef USE_DARWIN_THREADS
70 using namespace clang;
71 using namespace clang::cxcursor;
72 using namespace clang::cxtu;
73 using namespace clang::cxindex;
75 CXTranslationUnit cxtu::MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *AU) {
79 CXTranslationUnit D = new CXTranslationUnitImpl();
82 D->StringPool = new cxstring::CXStringPool();
83 D->Diagnostics = nullptr;
84 D->OverridenCursorsPool = createOverridenCXCursorsPool();
85 D->CommentToXML = nullptr;
89 bool cxtu::isASTReadError(ASTUnit *AU) {
90 for (ASTUnit::stored_diag_iterator D = AU->stored_diag_begin(),
91 DEnd = AU->stored_diag_end();
93 if (D->getLevel() >= DiagnosticsEngine::Error &&
94 DiagnosticIDs::getCategoryNumberForDiag(D->getID()) ==
95 diag::DiagCat_AST_Deserialization_Issue)
101 cxtu::CXTUOwner::~CXTUOwner() {
103 clang_disposeTranslationUnit(TU);
106 /// \brief Compare two source ranges to determine their relative position in
107 /// the translation unit.
108 static RangeComparisonResult RangeCompare(SourceManager &SM,
111 assert(R1.isValid() && "First range is invalid?");
112 assert(R2.isValid() && "Second range is invalid?");
113 if (R1.getEnd() != R2.getBegin() &&
114 SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin()))
116 if (R2.getEnd() != R1.getBegin() &&
117 SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin()))
122 /// \brief Determine if a source location falls within, before, or after a
123 /// a given source range.
124 static RangeComparisonResult LocationCompare(SourceManager &SM,
125 SourceLocation L, SourceRange R) {
126 assert(R.isValid() && "First range is invalid?");
127 assert(L.isValid() && "Second range is invalid?");
128 if (L == R.getBegin() || L == R.getEnd())
130 if (SM.isBeforeInTranslationUnit(L, R.getBegin()))
132 if (SM.isBeforeInTranslationUnit(R.getEnd(), L))
137 /// \brief Translate a Clang source range into a CIndex source range.
139 /// Clang internally represents ranges where the end location points to the
140 /// start of the token at the end. However, for external clients it is more
141 /// useful to have a CXSourceRange be a proper half-open interval. This routine
142 /// does the appropriate translation.
143 CXSourceRange cxloc::translateSourceRange(const SourceManager &SM,
144 const LangOptions &LangOpts,
145 const CharSourceRange &R) {
146 // We want the last character in this location, so we will adjust the
147 // location accordingly.
148 SourceLocation EndLoc = R.getEnd();
149 if (EndLoc.isValid() && EndLoc.isMacroID() && !SM.isMacroArgExpansion(EndLoc))
150 EndLoc = SM.getExpansionRange(EndLoc).second;
151 if (R.isTokenRange() && EndLoc.isValid()) {
152 unsigned Length = Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc),
154 EndLoc = EndLoc.getLocWithOffset(Length);
157 CXSourceRange Result = {
159 R.getBegin().getRawEncoding(),
160 EndLoc.getRawEncoding()
165 //===----------------------------------------------------------------------===//
167 //===----------------------------------------------------------------------===//
169 static SourceRange getRawCursorExtent(CXCursor C);
170 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr);
173 RangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) {
174 return RangeCompare(AU->getSourceManager(), R, RegionOfInterest);
177 /// \brief Visit the given cursor and, if requested by the visitor,
180 /// \param Cursor the cursor to visit.
182 /// \param CheckedRegionOfInterest if true, then the caller already checked
183 /// that this cursor is within the region of interest.
185 /// \returns true if the visitation should be aborted, false if it
187 bool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) {
188 if (clang_isInvalid(Cursor.kind))
191 if (clang_isDeclaration(Cursor.kind)) {
192 const Decl *D = getCursorDecl(Cursor);
194 assert(0 && "Invalid declaration cursor");
195 return true; // abort.
198 // Ignore implicit declarations, unless it's an objc method because
199 // currently we should report implicit methods for properties when indexing.
200 if (D->isImplicit() && !isa<ObjCMethodDecl>(D))
204 // If we have a range of interest, and this cursor doesn't intersect with it,
206 if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) {
207 SourceRange Range = getRawCursorExtent(Cursor);
208 if (Range.isInvalid() || CompareRegionOfInterest(Range))
212 switch (Visitor(Cursor, Parent, ClientData)) {
213 case CXChildVisit_Break:
216 case CXChildVisit_Continue:
219 case CXChildVisit_Recurse: {
220 bool ret = VisitChildren(Cursor);
221 if (PostChildrenVisitor)
222 if (PostChildrenVisitor(Cursor, ClientData))
228 llvm_unreachable("Invalid CXChildVisitResult!");
231 static bool visitPreprocessedEntitiesInRange(SourceRange R,
232 PreprocessingRecord &PPRec,
233 CursorVisitor &Visitor) {
234 SourceManager &SM = Visitor.getASTUnit()->getSourceManager();
237 if (!Visitor.shouldVisitIncludedEntities()) {
238 // If the begin/end of the range lie in the same FileID, do the optimization
239 // where we skip preprocessed entities that do not come from the same FileID.
240 FID = SM.getFileID(SM.getFileLoc(R.getBegin()));
241 if (FID != SM.getFileID(SM.getFileLoc(R.getEnd())))
245 const auto &Entities = PPRec.getPreprocessedEntitiesInRange(R);
246 return Visitor.visitPreprocessedEntities(Entities.begin(), Entities.end(),
250 bool CursorVisitor::visitFileRegion() {
251 if (RegionOfInterest.isInvalid())
254 ASTUnit *Unit = cxtu::getASTUnit(TU);
255 SourceManager &SM = Unit->getSourceManager();
257 std::pair<FileID, unsigned>
258 Begin = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getBegin())),
259 End = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getEnd()));
261 if (End.first != Begin.first) {
262 // If the end does not reside in the same file, try to recover by
263 // picking the end of the file of begin location.
264 End.first = Begin.first;
265 End.second = SM.getFileIDSize(Begin.first);
268 assert(Begin.first == End.first);
269 if (Begin.second > End.second)
272 FileID File = Begin.first;
273 unsigned Offset = Begin.second;
274 unsigned Length = End.second - Begin.second;
276 if (!VisitDeclsOnly && !VisitPreprocessorLast)
277 if (visitPreprocessedEntitiesInRegion())
278 return true; // visitation break.
280 if (visitDeclsFromFileRegion(File, Offset, Length))
281 return true; // visitation break.
283 if (!VisitDeclsOnly && VisitPreprocessorLast)
284 return visitPreprocessedEntitiesInRegion();
289 static bool isInLexicalContext(Decl *D, DeclContext *DC) {
293 for (DeclContext *DeclDC = D->getLexicalDeclContext();
294 DeclDC; DeclDC = DeclDC->getLexicalParent()) {
301 bool CursorVisitor::visitDeclsFromFileRegion(FileID File,
302 unsigned Offset, unsigned Length) {
303 ASTUnit *Unit = cxtu::getASTUnit(TU);
304 SourceManager &SM = Unit->getSourceManager();
305 SourceRange Range = RegionOfInterest;
307 SmallVector<Decl *, 16> Decls;
308 Unit->findFileRegionDecls(File, Offset, Length, Decls);
310 // If we didn't find any file level decls for the file, try looking at the
311 // file that it was included from.
312 while (Decls.empty() || Decls.front()->isTopLevelDeclInObjCContainer()) {
313 bool Invalid = false;
314 const SrcMgr::SLocEntry &SLEntry = SM.getSLocEntry(File, &Invalid);
318 SourceLocation Outer;
319 if (SLEntry.isFile())
320 Outer = SLEntry.getFile().getIncludeLoc();
322 Outer = SLEntry.getExpansion().getExpansionLocStart();
323 if (Outer.isInvalid())
326 std::tie(File, Offset) = SM.getDecomposedExpansionLoc(Outer);
328 Unit->findFileRegionDecls(File, Offset, Length, Decls);
331 assert(!Decls.empty());
333 bool VisitedAtLeastOnce = false;
334 DeclContext *CurDC = nullptr;
335 SmallVectorImpl<Decl *>::iterator DIt = Decls.begin();
336 for (SmallVectorImpl<Decl *>::iterator DE = Decls.end(); DIt != DE; ++DIt) {
338 if (D->getSourceRange().isInvalid())
341 if (isInLexicalContext(D, CurDC))
344 CurDC = dyn_cast<DeclContext>(D);
346 if (TagDecl *TD = dyn_cast<TagDecl>(D))
347 if (!TD->isFreeStanding())
350 RangeComparisonResult CompRes = RangeCompare(SM, D->getSourceRange(),Range);
351 if (CompRes == RangeBefore)
353 if (CompRes == RangeAfter)
356 assert(CompRes == RangeOverlap);
357 VisitedAtLeastOnce = true;
359 if (isa<ObjCContainerDecl>(D)) {
360 FileDI_current = &DIt;
363 FileDI_current = nullptr;
366 if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
367 return true; // visitation break.
370 if (VisitedAtLeastOnce)
373 // No Decls overlapped with the range. Move up the lexical context until there
374 // is a context that contains the range or we reach the translation unit
376 DeclContext *DC = DIt == Decls.begin() ? (*DIt)->getLexicalDeclContext()
377 : (*(DIt-1))->getLexicalDeclContext();
379 while (DC && !DC->isTranslationUnit()) {
380 Decl *D = cast<Decl>(DC);
381 SourceRange CurDeclRange = D->getSourceRange();
382 if (CurDeclRange.isInvalid())
385 if (RangeCompare(SM, CurDeclRange, Range) == RangeOverlap) {
386 if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
387 return true; // visitation break.
390 DC = D->getLexicalDeclContext();
396 bool CursorVisitor::visitPreprocessedEntitiesInRegion() {
397 if (!AU->getPreprocessor().getPreprocessingRecord())
400 PreprocessingRecord &PPRec
401 = *AU->getPreprocessor().getPreprocessingRecord();
402 SourceManager &SM = AU->getSourceManager();
404 if (RegionOfInterest.isValid()) {
405 SourceRange MappedRange = AU->mapRangeToPreamble(RegionOfInterest);
406 SourceLocation B = MappedRange.getBegin();
407 SourceLocation E = MappedRange.getEnd();
409 if (AU->isInPreambleFileID(B)) {
410 if (SM.isLoadedSourceLocation(E))
411 return visitPreprocessedEntitiesInRange(SourceRange(B, E),
414 // Beginning of range lies in the preamble but it also extends beyond
415 // it into the main file. Split the range into 2 parts, one covering
416 // the preamble and another covering the main file. This allows subsequent
417 // calls to visitPreprocessedEntitiesInRange to accept a source range that
418 // lies in the same FileID, allowing it to skip preprocessed entities that
419 // do not come from the same FileID.
421 visitPreprocessedEntitiesInRange(
422 SourceRange(B, AU->getEndOfPreambleFileID()),
424 if (breaked) return true;
425 return visitPreprocessedEntitiesInRange(
426 SourceRange(AU->getStartOfMainFileID(), E),
430 return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec, *this);
434 = !AU->isMainFileAST() && AU->getOnlyLocalDecls();
437 return visitPreprocessedEntities(PPRec.local_begin(), PPRec.local_end(),
440 return visitPreprocessedEntities(PPRec.begin(), PPRec.end(), PPRec);
443 template<typename InputIterator>
444 bool CursorVisitor::visitPreprocessedEntities(InputIterator First,
446 PreprocessingRecord &PPRec,
448 for (; First != Last; ++First) {
449 if (!FID.isInvalid() && !PPRec.isEntityInFileID(First, FID))
452 PreprocessedEntity *PPE = *First;
456 if (MacroExpansion *ME = dyn_cast<MacroExpansion>(PPE)) {
457 if (Visit(MakeMacroExpansionCursor(ME, TU)))
463 if (MacroDefinitionRecord *MD = dyn_cast<MacroDefinitionRecord>(PPE)) {
464 if (Visit(MakeMacroDefinitionCursor(MD, TU)))
470 if (InclusionDirective *ID = dyn_cast<InclusionDirective>(PPE)) {
471 if (Visit(MakeInclusionDirectiveCursor(ID, TU)))
481 /// \brief Visit the children of the given cursor.
483 /// \returns true if the visitation should be aborted, false if it
485 bool CursorVisitor::VisitChildren(CXCursor Cursor) {
486 if (clang_isReference(Cursor.kind) &&
487 Cursor.kind != CXCursor_CXXBaseSpecifier) {
488 // By definition, references have no children.
492 // Set the Parent field to Cursor, then back to its old value once we're
494 SetParentRAII SetParent(Parent, StmtParent, Cursor);
496 if (clang_isDeclaration(Cursor.kind)) {
497 Decl *D = const_cast<Decl *>(getCursorDecl(Cursor));
501 return VisitAttributes(D) || Visit(D);
504 if (clang_isStatement(Cursor.kind)) {
505 if (const Stmt *S = getCursorStmt(Cursor))
511 if (clang_isExpression(Cursor.kind)) {
512 if (const Expr *E = getCursorExpr(Cursor))
518 if (clang_isTranslationUnit(Cursor.kind)) {
519 CXTranslationUnit TU = getCursorTU(Cursor);
520 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
522 int VisitOrder[2] = { VisitPreprocessorLast, !VisitPreprocessorLast };
523 for (unsigned I = 0; I != 2; ++I) {
525 if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() &&
526 RegionOfInterest.isInvalid()) {
527 for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(),
528 TLEnd = CXXUnit->top_level_end();
530 if (Visit(MakeCXCursor(*TL, TU, RegionOfInterest), true))
533 } else if (VisitDeclContext(
534 CXXUnit->getASTContext().getTranslationUnitDecl()))
539 // Walk the preprocessing record.
540 if (CXXUnit->getPreprocessor().getPreprocessingRecord())
541 visitPreprocessedEntitiesInRegion();
547 if (Cursor.kind == CXCursor_CXXBaseSpecifier) {
548 if (const CXXBaseSpecifier *Base = getCursorCXXBaseSpecifier(Cursor)) {
549 if (TypeSourceInfo *BaseTSInfo = Base->getTypeSourceInfo()) {
550 return Visit(BaseTSInfo->getTypeLoc());
555 if (Cursor.kind == CXCursor_IBOutletCollectionAttr) {
556 const IBOutletCollectionAttr *A =
557 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(Cursor));
558 if (const ObjCObjectType *ObjT = A->getInterface()->getAs<ObjCObjectType>())
559 return Visit(cxcursor::MakeCursorObjCClassRef(
560 ObjT->getInterface(),
561 A->getInterfaceLoc()->getTypeLoc().getLocStart(), TU));
564 // If pointing inside a macro definition, check if the token is an identifier
565 // that was ever defined as a macro. In such a case, create a "pseudo" macro
566 // expansion cursor for that token.
567 SourceLocation BeginLoc = RegionOfInterest.getBegin();
568 if (Cursor.kind == CXCursor_MacroDefinition &&
569 BeginLoc == RegionOfInterest.getEnd()) {
570 SourceLocation Loc = AU->mapLocationToPreamble(BeginLoc);
571 const MacroInfo *MI =
572 getMacroInfo(cxcursor::getCursorMacroDefinition(Cursor), TU);
573 if (MacroDefinitionRecord *MacroDef =
574 checkForMacroInMacroDefinition(MI, Loc, TU))
575 return Visit(cxcursor::MakeMacroExpansionCursor(MacroDef, BeginLoc, TU));
578 // Nothing to visit at the moment.
582 bool CursorVisitor::VisitBlockDecl(BlockDecl *B) {
583 if (TypeSourceInfo *TSInfo = B->getSignatureAsWritten())
584 if (Visit(TSInfo->getTypeLoc()))
587 if (Stmt *Body = B->getBody())
588 return Visit(MakeCXCursor(Body, StmtParent, TU, RegionOfInterest));
593 Optional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) {
594 if (RegionOfInterest.isValid()) {
595 SourceRange Range = getFullCursorExtent(Cursor, AU->getSourceManager());
596 if (Range.isInvalid())
599 switch (CompareRegionOfInterest(Range)) {
601 // This declaration comes before the region of interest; skip it.
605 // This declaration comes after the region of interest; we're done.
609 // This declaration overlaps the region of interest; visit it.
616 bool CursorVisitor::VisitDeclContext(DeclContext *DC) {
617 DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
619 // FIXME: Eventually remove. This part of a hack to support proper
620 // iteration over all Decls contained lexically within an ObjC container.
621 SaveAndRestore<DeclContext::decl_iterator*> DI_saved(DI_current, &I);
622 SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E);
624 for ( ; I != E; ++I) {
626 if (D->getLexicalDeclContext() != DC)
628 CXCursor Cursor = MakeCXCursor(D, TU, RegionOfInterest);
630 // Ignore synthesized ivars here, otherwise if we have something like:
631 // @synthesize prop = _prop;
632 // and '_prop' is not declared, we will encounter a '_prop' ivar before
633 // encountering the 'prop' synthesize declaration and we will think that
634 // we passed the region-of-interest.
635 if (ObjCIvarDecl *ivarD = dyn_cast<ObjCIvarDecl>(D)) {
636 if (ivarD->getSynthesize())
640 // FIXME: ObjCClassRef/ObjCProtocolRef for forward class/protocol
641 // declarations is a mismatch with the compiler semantics.
642 if (Cursor.kind == CXCursor_ObjCInterfaceDecl) {
643 ObjCInterfaceDecl *ID = cast<ObjCInterfaceDecl>(D);
644 if (!ID->isThisDeclarationADefinition())
645 Cursor = MakeCursorObjCClassRef(ID, ID->getLocation(), TU);
647 } else if (Cursor.kind == CXCursor_ObjCProtocolDecl) {
648 ObjCProtocolDecl *PD = cast<ObjCProtocolDecl>(D);
649 if (!PD->isThisDeclarationADefinition())
650 Cursor = MakeCursorObjCProtocolRef(PD, PD->getLocation(), TU);
653 const Optional<bool> &V = shouldVisitCursor(Cursor);
658 if (Visit(Cursor, true))
664 bool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
665 llvm_unreachable("Translation units are visited directly by Visit()");
668 bool CursorVisitor::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
669 if (VisitTemplateParameters(D->getTemplateParameters()))
672 return Visit(MakeCXCursor(D->getTemplatedDecl(), TU, RegionOfInterest));
675 bool CursorVisitor::VisitTypeAliasDecl(TypeAliasDecl *D) {
676 if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
677 return Visit(TSInfo->getTypeLoc());
682 bool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) {
683 if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
684 return Visit(TSInfo->getTypeLoc());
689 bool CursorVisitor::VisitTagDecl(TagDecl *D) {
690 return VisitDeclContext(D);
693 bool CursorVisitor::VisitClassTemplateSpecializationDecl(
694 ClassTemplateSpecializationDecl *D) {
695 bool ShouldVisitBody = false;
696 switch (D->getSpecializationKind()) {
698 case TSK_ImplicitInstantiation:
702 case TSK_ExplicitInstantiationDeclaration:
703 case TSK_ExplicitInstantiationDefinition:
706 case TSK_ExplicitSpecialization:
707 ShouldVisitBody = true;
711 // Visit the template arguments used in the specialization.
712 if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) {
713 TypeLoc TL = SpecType->getTypeLoc();
714 if (TemplateSpecializationTypeLoc TSTLoc =
715 TL.getAs<TemplateSpecializationTypeLoc>()) {
716 for (unsigned I = 0, N = TSTLoc.getNumArgs(); I != N; ++I)
717 if (VisitTemplateArgumentLoc(TSTLoc.getArgLoc(I)))
722 return ShouldVisitBody && VisitCXXRecordDecl(D);
725 bool CursorVisitor::VisitClassTemplatePartialSpecializationDecl(
726 ClassTemplatePartialSpecializationDecl *D) {
727 // FIXME: Visit the "outer" template parameter lists on the TagDecl
728 // before visiting these template parameters.
729 if (VisitTemplateParameters(D->getTemplateParameters()))
732 // Visit the partial specialization arguments.
733 const ASTTemplateArgumentListInfo *Info = D->getTemplateArgsAsWritten();
734 const TemplateArgumentLoc *TemplateArgs = Info->getTemplateArgs();
735 for (unsigned I = 0, N = Info->NumTemplateArgs; I != N; ++I)
736 if (VisitTemplateArgumentLoc(TemplateArgs[I]))
739 return VisitCXXRecordDecl(D);
742 bool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
743 // Visit the default argument.
744 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
745 if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo())
746 if (Visit(DefArg->getTypeLoc()))
752 bool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) {
753 if (Expr *Init = D->getInitExpr())
754 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
758 bool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) {
759 unsigned NumParamList = DD->getNumTemplateParameterLists();
760 for (unsigned i = 0; i < NumParamList; i++) {
761 TemplateParameterList* Params = DD->getTemplateParameterList(i);
762 if (VisitTemplateParameters(Params))
766 if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo())
767 if (Visit(TSInfo->getTypeLoc()))
770 // Visit the nested-name-specifier, if present.
771 if (NestedNameSpecifierLoc QualifierLoc = DD->getQualifierLoc())
772 if (VisitNestedNameSpecifierLoc(QualifierLoc))
778 /// \brief Compare two base or member initializers based on their source order.
779 static int CompareCXXCtorInitializers(CXXCtorInitializer *const *X,
780 CXXCtorInitializer *const *Y) {
781 return (*X)->getSourceOrder() - (*Y)->getSourceOrder();
784 bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
785 unsigned NumParamList = ND->getNumTemplateParameterLists();
786 for (unsigned i = 0; i < NumParamList; i++) {
787 TemplateParameterList* Params = ND->getTemplateParameterList(i);
788 if (VisitTemplateParameters(Params))
792 if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) {
793 // Visit the function declaration's syntactic components in the order
794 // written. This requires a bit of work.
795 TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens();
796 FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>();
798 // If we have a function declared directly (without the use of a typedef),
799 // visit just the return type. Otherwise, just visit the function's type
801 if ((FTL && !isa<CXXConversionDecl>(ND) && Visit(FTL.getReturnLoc())) ||
805 // Visit the nested-name-specifier, if present.
806 if (NestedNameSpecifierLoc QualifierLoc = ND->getQualifierLoc())
807 if (VisitNestedNameSpecifierLoc(QualifierLoc))
810 // Visit the declaration name.
811 if (!isa<CXXDestructorDecl>(ND))
812 if (VisitDeclarationNameInfo(ND->getNameInfo()))
815 // FIXME: Visit explicitly-specified template arguments!
817 // Visit the function parameters, if we have a function type.
818 if (FTL && VisitFunctionTypeLoc(FTL, true))
821 // FIXME: Attributes?
824 if (ND->doesThisDeclarationHaveABody() && !ND->isLateTemplateParsed()) {
825 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) {
826 // Find the initializers that were written in the source.
827 SmallVector<CXXCtorInitializer *, 4> WrittenInits;
828 for (auto *I : Constructor->inits()) {
832 WrittenInits.push_back(I);
835 // Sort the initializers in source order
836 llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(),
837 &CompareCXXCtorInitializers);
839 // Visit the initializers in source order
840 for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) {
841 CXXCtorInitializer *Init = WrittenInits[I];
842 if (Init->isAnyMemberInitializer()) {
843 if (Visit(MakeCursorMemberRef(Init->getAnyMember(),
844 Init->getMemberLocation(), TU)))
846 } else if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo()) {
847 if (Visit(TInfo->getTypeLoc()))
851 // Visit the initializer value.
852 if (Expr *Initializer = Init->getInit())
853 if (Visit(MakeCXCursor(Initializer, ND, TU, RegionOfInterest)))
858 if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest)))
865 bool CursorVisitor::VisitFieldDecl(FieldDecl *D) {
866 if (VisitDeclaratorDecl(D))
869 if (Expr *BitWidth = D->getBitWidth())
870 return Visit(MakeCXCursor(BitWidth, StmtParent, TU, RegionOfInterest));
875 bool CursorVisitor::VisitVarDecl(VarDecl *D) {
876 if (VisitDeclaratorDecl(D))
879 if (Expr *Init = D->getInit())
880 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
885 bool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
886 if (VisitDeclaratorDecl(D))
889 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
890 if (Expr *DefArg = D->getDefaultArgument())
891 return Visit(MakeCXCursor(DefArg, StmtParent, TU, RegionOfInterest));
896 bool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
897 // FIXME: Visit the "outer" template parameter lists on the FunctionDecl
898 // before visiting these template parameters.
899 if (VisitTemplateParameters(D->getTemplateParameters()))
902 return VisitFunctionDecl(D->getTemplatedDecl());
905 bool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) {
906 // FIXME: Visit the "outer" template parameter lists on the TagDecl
907 // before visiting these template parameters.
908 if (VisitTemplateParameters(D->getTemplateParameters()))
911 return VisitCXXRecordDecl(D->getTemplatedDecl());
914 bool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
915 if (VisitTemplateParameters(D->getTemplateParameters()))
918 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() &&
919 VisitTemplateArgumentLoc(D->getDefaultArgument()))
925 bool CursorVisitor::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
926 // Visit the bound, if it's explicit.
927 if (D->hasExplicitBound()) {
928 if (auto TInfo = D->getTypeSourceInfo()) {
929 if (Visit(TInfo->getTypeLoc()))
937 bool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) {
938 if (TypeSourceInfo *TSInfo = ND->getReturnTypeSourceInfo())
939 if (Visit(TSInfo->getTypeLoc()))
942 for (const auto *P : ND->params()) {
943 if (Visit(MakeCXCursor(P, TU, RegionOfInterest)))
947 return ND->isThisDeclarationADefinition() &&
948 Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest));
951 template <typename DeclIt>
952 static void addRangedDeclsInContainer(DeclIt *DI_current, DeclIt DE_current,
953 SourceManager &SM, SourceLocation EndLoc,
954 SmallVectorImpl<Decl *> &Decls) {
955 DeclIt next = *DI_current;
956 while (++next != DE_current) {
957 Decl *D_next = *next;
960 SourceLocation L = D_next->getLocStart();
963 if (SM.isBeforeInTranslationUnit(L, EndLoc)) {
965 Decls.push_back(D_next);
972 bool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) {
973 // FIXME: Eventually convert back to just 'VisitDeclContext()'. Essentially
974 // an @implementation can lexically contain Decls that are not properly
975 // nested in the AST. When we identify such cases, we need to retrofit
976 // this nesting here.
977 if (!DI_current && !FileDI_current)
978 return VisitDeclContext(D);
980 // Scan the Decls that immediately come after the container
981 // in the current DeclContext. If any fall within the
982 // container's lexical region, stash them into a vector
983 // for later processing.
984 SmallVector<Decl *, 24> DeclsInContainer;
985 SourceLocation EndLoc = D->getSourceRange().getEnd();
986 SourceManager &SM = AU->getSourceManager();
987 if (EndLoc.isValid()) {
989 addRangedDeclsInContainer(DI_current, DE_current, SM, EndLoc,
992 addRangedDeclsInContainer(FileDI_current, FileDE_current, SM, EndLoc,
998 if (DeclsInContainer.empty())
999 return VisitDeclContext(D);
1001 // Get all the Decls in the DeclContext, and sort them with the
1002 // additional ones we've collected. Then visit them.
1003 for (auto *SubDecl : D->decls()) {
1004 if (!SubDecl || SubDecl->getLexicalDeclContext() != D ||
1005 SubDecl->getLocStart().isInvalid())
1007 DeclsInContainer.push_back(SubDecl);
1010 // Now sort the Decls so that they appear in lexical order.
1011 std::sort(DeclsInContainer.begin(), DeclsInContainer.end(),
1012 [&SM](Decl *A, Decl *B) {
1013 SourceLocation L_A = A->getLocStart();
1014 SourceLocation L_B = B->getLocStart();
1015 assert(L_A.isValid() && L_B.isValid());
1016 return SM.isBeforeInTranslationUnit(L_A, L_B);
1019 // Now visit the decls.
1020 for (SmallVectorImpl<Decl*>::iterator I = DeclsInContainer.begin(),
1021 E = DeclsInContainer.end(); I != E; ++I) {
1022 CXCursor Cursor = MakeCXCursor(*I, TU, RegionOfInterest);
1023 const Optional<bool> &V = shouldVisitCursor(Cursor);
1028 if (Visit(Cursor, true))
1034 bool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) {
1035 if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(),
1039 if (VisitObjCTypeParamList(ND->getTypeParamList()))
1042 ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin();
1043 for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(),
1044 E = ND->protocol_end(); I != E; ++I, ++PL)
1045 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1048 return VisitObjCContainerDecl(ND);
1051 bool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) {
1052 if (!PID->isThisDeclarationADefinition())
1053 return Visit(MakeCursorObjCProtocolRef(PID, PID->getLocation(), TU));
1055 ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin();
1056 for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(),
1057 E = PID->protocol_end(); I != E; ++I, ++PL)
1058 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1061 return VisitObjCContainerDecl(PID);
1064 bool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) {
1065 if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc()))
1068 // FIXME: This implements a workaround with @property declarations also being
1069 // installed in the DeclContext for the @interface. Eventually this code
1070 // should be removed.
1071 ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext());
1072 if (!CDecl || !CDecl->IsClassExtension())
1075 ObjCInterfaceDecl *ID = CDecl->getClassInterface();
1079 IdentifierInfo *PropertyId = PD->getIdentifier();
1080 ObjCPropertyDecl *prevDecl =
1081 ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(ID), PropertyId,
1082 PD->getQueryKind());
1087 // Visit synthesized methods since they will be skipped when visiting
1089 if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl())
1090 if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
1091 if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
1094 if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl())
1095 if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
1096 if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
1102 bool CursorVisitor::VisitObjCTypeParamList(ObjCTypeParamList *typeParamList) {
1106 for (auto *typeParam : *typeParamList) {
1107 // Visit the type parameter.
1108 if (Visit(MakeCXCursor(typeParam, TU, RegionOfInterest)))
1115 bool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
1116 if (!D->isThisDeclarationADefinition()) {
1117 // Forward declaration is treated like a reference.
1118 return Visit(MakeCursorObjCClassRef(D, D->getLocation(), TU));
1121 // Objective-C type parameters.
1122 if (VisitObjCTypeParamList(D->getTypeParamListAsWritten()))
1125 // Issue callbacks for super class.
1126 if (D->getSuperClass() &&
1127 Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
1128 D->getSuperClassLoc(),
1132 if (TypeSourceInfo *SuperClassTInfo = D->getSuperClassTInfo())
1133 if (Visit(SuperClassTInfo->getTypeLoc()))
1136 ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin();
1137 for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
1138 E = D->protocol_end(); I != E; ++I, ++PL)
1139 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1142 return VisitObjCContainerDecl(D);
1145 bool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) {
1146 return VisitObjCContainerDecl(D);
1149 bool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
1150 // 'ID' could be null when dealing with invalid code.
1151 if (ObjCInterfaceDecl *ID = D->getClassInterface())
1152 if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU)))
1155 return VisitObjCImplDecl(D);
1158 bool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
1160 // Issue callbacks for super class.
1161 // FIXME: No source location information!
1162 if (D->getSuperClass() &&
1163 Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
1164 D->getSuperClassLoc(),
1169 return VisitObjCImplDecl(D);
1172 bool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) {
1173 if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl())
1174 if (PD->isIvarNameSpecified())
1175 return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU));
1180 bool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) {
1181 return VisitDeclContext(D);
1184 bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
1185 // Visit nested-name-specifier.
1186 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1187 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1190 return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(),
1191 D->getTargetNameLoc(), TU));
1194 bool CursorVisitor::VisitUsingDecl(UsingDecl *D) {
1195 // Visit nested-name-specifier.
1196 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
1197 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1201 if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU)))
1204 return VisitDeclarationNameInfo(D->getNameInfo());
1207 bool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
1208 // Visit nested-name-specifier.
1209 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1210 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1213 return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(),
1214 D->getIdentLocation(), TU));
1217 bool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
1218 // Visit nested-name-specifier.
1219 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
1220 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1224 return VisitDeclarationNameInfo(D->getNameInfo());
1227 bool CursorVisitor::VisitUnresolvedUsingTypenameDecl(
1228 UnresolvedUsingTypenameDecl *D) {
1229 // Visit nested-name-specifier.
1230 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1231 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1237 bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {
1238 switch (Name.getName().getNameKind()) {
1239 case clang::DeclarationName::Identifier:
1240 case clang::DeclarationName::CXXLiteralOperatorName:
1241 case clang::DeclarationName::CXXOperatorName:
1242 case clang::DeclarationName::CXXUsingDirective:
1245 case clang::DeclarationName::CXXConstructorName:
1246 case clang::DeclarationName::CXXDestructorName:
1247 case clang::DeclarationName::CXXConversionFunctionName:
1248 if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo())
1249 return Visit(TSInfo->getTypeLoc());
1252 case clang::DeclarationName::ObjCZeroArgSelector:
1253 case clang::DeclarationName::ObjCOneArgSelector:
1254 case clang::DeclarationName::ObjCMultiArgSelector:
1255 // FIXME: Per-identifier location info?
1259 llvm_unreachable("Invalid DeclarationName::Kind!");
1262 bool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS,
1263 SourceRange Range) {
1264 // FIXME: This whole routine is a hack to work around the lack of proper
1265 // source information in nested-name-specifiers (PR5791). Since we do have
1266 // a beginning source location, we can visit the first component of the
1267 // nested-name-specifier, if it's a single-token component.
1271 // Get the first component in the nested-name-specifier.
1272 while (NestedNameSpecifier *Prefix = NNS->getPrefix())
1275 switch (NNS->getKind()) {
1276 case NestedNameSpecifier::Namespace:
1277 return Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(),
1280 case NestedNameSpecifier::NamespaceAlias:
1281 return Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
1282 Range.getBegin(), TU));
1284 case NestedNameSpecifier::TypeSpec: {
1285 // If the type has a form where we know that the beginning of the source
1286 // range matches up with a reference cursor. Visit the appropriate reference
1288 const Type *T = NNS->getAsType();
1289 if (const TypedefType *Typedef = dyn_cast<TypedefType>(T))
1290 return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU));
1291 if (const TagType *Tag = dyn_cast<TagType>(T))
1292 return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU));
1293 if (const TemplateSpecializationType *TST
1294 = dyn_cast<TemplateSpecializationType>(T))
1295 return VisitTemplateName(TST->getTemplateName(), Range.getBegin());
1299 case NestedNameSpecifier::TypeSpecWithTemplate:
1300 case NestedNameSpecifier::Global:
1301 case NestedNameSpecifier::Identifier:
1302 case NestedNameSpecifier::Super:
1310 CursorVisitor::VisitNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
1311 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
1312 for (; Qualifier; Qualifier = Qualifier.getPrefix())
1313 Qualifiers.push_back(Qualifier);
1315 while (!Qualifiers.empty()) {
1316 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
1317 NestedNameSpecifier *NNS = Q.getNestedNameSpecifier();
1318 switch (NNS->getKind()) {
1319 case NestedNameSpecifier::Namespace:
1320 if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(),
1321 Q.getLocalBeginLoc(),
1327 case NestedNameSpecifier::NamespaceAlias:
1328 if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
1329 Q.getLocalBeginLoc(),
1335 case NestedNameSpecifier::TypeSpec:
1336 case NestedNameSpecifier::TypeSpecWithTemplate:
1337 if (Visit(Q.getTypeLoc()))
1342 case NestedNameSpecifier::Global:
1343 case NestedNameSpecifier::Identifier:
1344 case NestedNameSpecifier::Super:
1352 bool CursorVisitor::VisitTemplateParameters(
1353 const TemplateParameterList *Params) {
1357 for (TemplateParameterList::const_iterator P = Params->begin(),
1358 PEnd = Params->end();
1360 if (Visit(MakeCXCursor(*P, TU, RegionOfInterest)))
1367 bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) {
1368 switch (Name.getKind()) {
1369 case TemplateName::Template:
1370 return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU));
1372 case TemplateName::OverloadedTemplate:
1373 // Visit the overloaded template set.
1374 if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU)))
1379 case TemplateName::DependentTemplate:
1380 // FIXME: Visit nested-name-specifier.
1383 case TemplateName::QualifiedTemplate:
1384 // FIXME: Visit nested-name-specifier.
1385 return Visit(MakeCursorTemplateRef(
1386 Name.getAsQualifiedTemplateName()->getDecl(),
1389 case TemplateName::SubstTemplateTemplateParm:
1390 return Visit(MakeCursorTemplateRef(
1391 Name.getAsSubstTemplateTemplateParm()->getParameter(),
1394 case TemplateName::SubstTemplateTemplateParmPack:
1395 return Visit(MakeCursorTemplateRef(
1396 Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(),
1400 llvm_unreachable("Invalid TemplateName::Kind!");
1403 bool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) {
1404 switch (TAL.getArgument().getKind()) {
1405 case TemplateArgument::Null:
1406 case TemplateArgument::Integral:
1407 case TemplateArgument::Pack:
1410 case TemplateArgument::Type:
1411 if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo())
1412 return Visit(TSInfo->getTypeLoc());
1415 case TemplateArgument::Declaration:
1416 if (Expr *E = TAL.getSourceDeclExpression())
1417 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1420 case TemplateArgument::NullPtr:
1421 if (Expr *E = TAL.getSourceNullPtrExpression())
1422 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1425 case TemplateArgument::Expression:
1426 if (Expr *E = TAL.getSourceExpression())
1427 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1430 case TemplateArgument::Template:
1431 case TemplateArgument::TemplateExpansion:
1432 if (VisitNestedNameSpecifierLoc(TAL.getTemplateQualifierLoc()))
1435 return VisitTemplateName(TAL.getArgument().getAsTemplateOrTemplatePattern(),
1436 TAL.getTemplateNameLoc());
1439 llvm_unreachable("Invalid TemplateArgument::Kind!");
1442 bool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
1443 return VisitDeclContext(D);
1446 bool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
1447 return Visit(TL.getUnqualifiedLoc());
1450 bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
1451 ASTContext &Context = AU->getASTContext();
1453 // Some builtin types (such as Objective-C's "id", "sel", and
1454 // "Class") have associated declarations. Create cursors for those.
1456 switch (TL.getTypePtr()->getKind()) {
1458 case BuiltinType::Void:
1459 case BuiltinType::NullPtr:
1460 case BuiltinType::Dependent:
1461 case BuiltinType::OCLImage1d:
1462 case BuiltinType::OCLImage1dArray:
1463 case BuiltinType::OCLImage1dBuffer:
1464 case BuiltinType::OCLImage2d:
1465 case BuiltinType::OCLImage2dArray:
1466 case BuiltinType::OCLImage2dDepth:
1467 case BuiltinType::OCLImage2dArrayDepth:
1468 case BuiltinType::OCLImage2dMSAA:
1469 case BuiltinType::OCLImage2dArrayMSAA:
1470 case BuiltinType::OCLImage2dMSAADepth:
1471 case BuiltinType::OCLImage2dArrayMSAADepth:
1472 case BuiltinType::OCLImage3d:
1473 case BuiltinType::OCLSampler:
1474 case BuiltinType::OCLEvent:
1475 case BuiltinType::OCLClkEvent:
1476 case BuiltinType::OCLQueue:
1477 case BuiltinType::OCLNDRange:
1478 case BuiltinType::OCLReserveID:
1479 #define BUILTIN_TYPE(Id, SingletonId)
1480 #define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
1481 #define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
1482 #define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id:
1483 #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
1484 #include "clang/AST/BuiltinTypes.def"
1487 case BuiltinType::ObjCId:
1488 VisitType = Context.getObjCIdType();
1491 case BuiltinType::ObjCClass:
1492 VisitType = Context.getObjCClassType();
1495 case BuiltinType::ObjCSel:
1496 VisitType = Context.getObjCSelType();
1500 if (!VisitType.isNull()) {
1501 if (const TypedefType *Typedef = VisitType->getAs<TypedefType>())
1502 return Visit(MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(),
1509 bool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
1510 return Visit(MakeCursorTypeRef(TL.getTypedefNameDecl(), TL.getNameLoc(), TU));
1513 bool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
1514 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1517 bool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) {
1518 if (TL.isDefinition())
1519 return Visit(MakeCXCursor(TL.getDecl(), TU, RegionOfInterest));
1521 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1524 bool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
1525 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1528 bool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
1529 return Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU));
1532 bool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
1533 if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc()))
1536 for (unsigned I = 0, N = TL.getNumTypeArgs(); I != N; ++I) {
1537 if (Visit(TL.getTypeArgTInfo(I)->getTypeLoc()))
1541 for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1542 if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I),
1550 bool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
1551 return Visit(TL.getPointeeLoc());
1554 bool CursorVisitor::VisitParenTypeLoc(ParenTypeLoc TL) {
1555 return Visit(TL.getInnerLoc());
1558 bool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) {
1559 return Visit(TL.getPointeeLoc());
1562 bool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
1563 return Visit(TL.getPointeeLoc());
1566 bool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
1567 return Visit(TL.getPointeeLoc());
1570 bool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
1571 return Visit(TL.getPointeeLoc());
1574 bool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
1575 return Visit(TL.getPointeeLoc());
1578 bool CursorVisitor::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
1579 return Visit(TL.getModifiedLoc());
1582 bool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL,
1583 bool SkipResultType) {
1584 if (!SkipResultType && Visit(TL.getReturnLoc()))
1587 for (unsigned I = 0, N = TL.getNumParams(); I != N; ++I)
1588 if (Decl *D = TL.getParam(I))
1589 if (Visit(MakeCXCursor(D, TU, RegionOfInterest)))
1595 bool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) {
1596 if (Visit(TL.getElementLoc()))
1599 if (Expr *Size = TL.getSizeExpr())
1600 return Visit(MakeCXCursor(Size, StmtParent, TU, RegionOfInterest));
1605 bool CursorVisitor::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
1606 return Visit(TL.getOriginalLoc());
1609 bool CursorVisitor::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
1610 return Visit(TL.getOriginalLoc());
1613 bool CursorVisitor::VisitTemplateSpecializationTypeLoc(
1614 TemplateSpecializationTypeLoc TL) {
1615 // Visit the template name.
1616 if (VisitTemplateName(TL.getTypePtr()->getTemplateName(),
1617 TL.getTemplateNameLoc()))
1620 // Visit the template arguments.
1621 for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1622 if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1628 bool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
1629 return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU));
1632 bool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
1633 if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1634 return Visit(TSInfo->getTypeLoc());
1639 bool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
1640 if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1641 return Visit(TSInfo->getTypeLoc());
1646 bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
1647 return VisitNestedNameSpecifierLoc(TL.getQualifierLoc());
1650 bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc(
1651 DependentTemplateSpecializationTypeLoc TL) {
1652 // Visit the nested-name-specifier, if there is one.
1653 if (TL.getQualifierLoc() &&
1654 VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1657 // Visit the template arguments.
1658 for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1659 if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1665 bool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
1666 if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1669 return Visit(TL.getNamedTypeLoc());
1672 bool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
1673 return Visit(TL.getPatternLoc());
1676 bool CursorVisitor::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
1677 if (Expr *E = TL.getUnderlyingExpr())
1678 return Visit(MakeCXCursor(E, StmtParent, TU));
1683 bool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
1684 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1687 bool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
1688 return Visit(TL.getValueLoc());
1691 bool CursorVisitor::VisitPipeTypeLoc(PipeTypeLoc TL) {
1692 return Visit(TL.getValueLoc());
1695 #define DEFAULT_TYPELOC_IMPL(CLASS, PARENT) \
1696 bool CursorVisitor::Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
1697 return Visit##PARENT##Loc(TL); \
1700 DEFAULT_TYPELOC_IMPL(Complex, Type)
1701 DEFAULT_TYPELOC_IMPL(ConstantArray, ArrayType)
1702 DEFAULT_TYPELOC_IMPL(IncompleteArray, ArrayType)
1703 DEFAULT_TYPELOC_IMPL(VariableArray, ArrayType)
1704 DEFAULT_TYPELOC_IMPL(DependentSizedArray, ArrayType)
1705 DEFAULT_TYPELOC_IMPL(DependentSizedExtVector, Type)
1706 DEFAULT_TYPELOC_IMPL(Vector, Type)
1707 DEFAULT_TYPELOC_IMPL(ExtVector, VectorType)
1708 DEFAULT_TYPELOC_IMPL(FunctionProto, FunctionType)
1709 DEFAULT_TYPELOC_IMPL(FunctionNoProto, FunctionType)
1710 DEFAULT_TYPELOC_IMPL(Record, TagType)
1711 DEFAULT_TYPELOC_IMPL(Enum, TagType)
1712 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type)
1713 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type)
1714 DEFAULT_TYPELOC_IMPL(Auto, Type)
1716 bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
1717 // Visit the nested-name-specifier, if present.
1718 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1719 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1722 if (D->isCompleteDefinition()) {
1723 for (const auto &I : D->bases()) {
1724 if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(&I, TU)))
1729 return VisitTagDecl(D);
1732 bool CursorVisitor::VisitAttributes(Decl *D) {
1733 for (const auto *I : D->attrs())
1734 if (Visit(MakeCXCursor(I, D, TU)))
1740 //===----------------------------------------------------------------------===//
1741 // Data-recursive visitor methods.
1742 //===----------------------------------------------------------------------===//
1745 #define DEF_JOB(NAME, DATA, KIND)\
1746 class NAME : public VisitorJob {\
1748 NAME(const DATA *d, CXCursor parent) : \
1749 VisitorJob(parent, VisitorJob::KIND, d) {} \
1750 static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
1751 const DATA *get() const { return static_cast<const DATA*>(data[0]); }\
1754 DEF_JOB(StmtVisit, Stmt, StmtVisitKind)
1755 DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
1756 DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
1757 DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
1758 DEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind)
1759 DEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind)
1760 DEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind)
1763 class ExplicitTemplateArgsVisit : public VisitorJob {
1765 ExplicitTemplateArgsVisit(const TemplateArgumentLoc *Begin,
1766 const TemplateArgumentLoc *End, CXCursor parent)
1767 : VisitorJob(parent, VisitorJob::ExplicitTemplateArgsVisitKind, Begin,
1769 static bool classof(const VisitorJob *VJ) {
1770 return VJ->getKind() == ExplicitTemplateArgsVisitKind;
1772 const TemplateArgumentLoc *begin() const {
1773 return static_cast<const TemplateArgumentLoc *>(data[0]);
1775 const TemplateArgumentLoc *end() {
1776 return static_cast<const TemplateArgumentLoc *>(data[1]);
1779 class DeclVisit : public VisitorJob {
1781 DeclVisit(const Decl *D, CXCursor parent, bool isFirst) :
1782 VisitorJob(parent, VisitorJob::DeclVisitKind,
1783 D, isFirst ? (void*) 1 : (void*) nullptr) {}
1784 static bool classof(const VisitorJob *VJ) {
1785 return VJ->getKind() == DeclVisitKind;
1787 const Decl *get() const { return static_cast<const Decl *>(data[0]); }
1788 bool isFirst() const { return data[1] != nullptr; }
1790 class TypeLocVisit : public VisitorJob {
1792 TypeLocVisit(TypeLoc tl, CXCursor parent) :
1793 VisitorJob(parent, VisitorJob::TypeLocVisitKind,
1794 tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {}
1796 static bool classof(const VisitorJob *VJ) {
1797 return VJ->getKind() == TypeLocVisitKind;
1800 TypeLoc get() const {
1801 QualType T = QualType::getFromOpaquePtr(data[0]);
1802 return TypeLoc(T, const_cast<void *>(data[1]));
1806 class LabelRefVisit : public VisitorJob {
1808 LabelRefVisit(LabelDecl *LD, SourceLocation labelLoc, CXCursor parent)
1809 : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LD,
1810 labelLoc.getPtrEncoding()) {}
1812 static bool classof(const VisitorJob *VJ) {
1813 return VJ->getKind() == VisitorJob::LabelRefVisitKind;
1815 const LabelDecl *get() const {
1816 return static_cast<const LabelDecl *>(data[0]);
1818 SourceLocation getLoc() const {
1819 return SourceLocation::getFromPtrEncoding(data[1]); }
1822 class NestedNameSpecifierLocVisit : public VisitorJob {
1824 NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent)
1825 : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind,
1826 Qualifier.getNestedNameSpecifier(),
1827 Qualifier.getOpaqueData()) { }
1829 static bool classof(const VisitorJob *VJ) {
1830 return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind;
1833 NestedNameSpecifierLoc get() const {
1834 return NestedNameSpecifierLoc(
1835 const_cast<NestedNameSpecifier *>(
1836 static_cast<const NestedNameSpecifier *>(data[0])),
1837 const_cast<void *>(data[1]));
1841 class DeclarationNameInfoVisit : public VisitorJob {
1843 DeclarationNameInfoVisit(const Stmt *S, CXCursor parent)
1844 : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {}
1845 static bool classof(const VisitorJob *VJ) {
1846 return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind;
1848 DeclarationNameInfo get() const {
1849 const Stmt *S = static_cast<const Stmt *>(data[0]);
1850 switch (S->getStmtClass()) {
1852 llvm_unreachable("Unhandled Stmt");
1853 case clang::Stmt::MSDependentExistsStmtClass:
1854 return cast<MSDependentExistsStmt>(S)->getNameInfo();
1855 case Stmt::CXXDependentScopeMemberExprClass:
1856 return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo();
1857 case Stmt::DependentScopeDeclRefExprClass:
1858 return cast<DependentScopeDeclRefExpr>(S)->getNameInfo();
1859 case Stmt::OMPCriticalDirectiveClass:
1860 return cast<OMPCriticalDirective>(S)->getDirectiveName();
1864 class MemberRefVisit : public VisitorJob {
1866 MemberRefVisit(const FieldDecl *D, SourceLocation L, CXCursor parent)
1867 : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D,
1868 L.getPtrEncoding()) {}
1869 static bool classof(const VisitorJob *VJ) {
1870 return VJ->getKind() == VisitorJob::MemberRefVisitKind;
1872 const FieldDecl *get() const {
1873 return static_cast<const FieldDecl *>(data[0]);
1875 SourceLocation getLoc() const {
1876 return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]);
1879 class EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void> {
1880 friend class OMPClauseEnqueue;
1881 VisitorWorkList &WL;
1884 EnqueueVisitor(VisitorWorkList &wl, CXCursor parent)
1885 : WL(wl), Parent(parent) {}
1887 void VisitAddrLabelExpr(const AddrLabelExpr *E);
1888 void VisitBlockExpr(const BlockExpr *B);
1889 void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
1890 void VisitCompoundStmt(const CompoundStmt *S);
1891 void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ }
1892 void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S);
1893 void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E);
1894 void VisitCXXNewExpr(const CXXNewExpr *E);
1895 void VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E);
1896 void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *E);
1897 void VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E);
1898 void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E);
1899 void VisitCXXTypeidExpr(const CXXTypeidExpr *E);
1900 void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *E);
1901 void VisitCXXUuidofExpr(const CXXUuidofExpr *E);
1902 void VisitCXXCatchStmt(const CXXCatchStmt *S);
1903 void VisitCXXForRangeStmt(const CXXForRangeStmt *S);
1904 void VisitDeclRefExpr(const DeclRefExpr *D);
1905 void VisitDeclStmt(const DeclStmt *S);
1906 void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *E);
1907 void VisitDesignatedInitExpr(const DesignatedInitExpr *E);
1908 void VisitExplicitCastExpr(const ExplicitCastExpr *E);
1909 void VisitForStmt(const ForStmt *FS);
1910 void VisitGotoStmt(const GotoStmt *GS);
1911 void VisitIfStmt(const IfStmt *If);
1912 void VisitInitListExpr(const InitListExpr *IE);
1913 void VisitMemberExpr(const MemberExpr *M);
1914 void VisitOffsetOfExpr(const OffsetOfExpr *E);
1915 void VisitObjCEncodeExpr(const ObjCEncodeExpr *E);
1916 void VisitObjCMessageExpr(const ObjCMessageExpr *M);
1917 void VisitOverloadExpr(const OverloadExpr *E);
1918 void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
1919 void VisitStmt(const Stmt *S);
1920 void VisitSwitchStmt(const SwitchStmt *S);
1921 void VisitWhileStmt(const WhileStmt *W);
1922 void VisitTypeTraitExpr(const TypeTraitExpr *E);
1923 void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E);
1924 void VisitExpressionTraitExpr(const ExpressionTraitExpr *E);
1925 void VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U);
1926 void VisitVAArgExpr(const VAArgExpr *E);
1927 void VisitSizeOfPackExpr(const SizeOfPackExpr *E);
1928 void VisitPseudoObjectExpr(const PseudoObjectExpr *E);
1929 void VisitOpaqueValueExpr(const OpaqueValueExpr *E);
1930 void VisitLambdaExpr(const LambdaExpr *E);
1931 void VisitOMPExecutableDirective(const OMPExecutableDirective *D);
1932 void VisitOMPLoopDirective(const OMPLoopDirective *D);
1933 void VisitOMPParallelDirective(const OMPParallelDirective *D);
1934 void VisitOMPSimdDirective(const OMPSimdDirective *D);
1935 void VisitOMPForDirective(const OMPForDirective *D);
1936 void VisitOMPForSimdDirective(const OMPForSimdDirective *D);
1937 void VisitOMPSectionsDirective(const OMPSectionsDirective *D);
1938 void VisitOMPSectionDirective(const OMPSectionDirective *D);
1939 void VisitOMPSingleDirective(const OMPSingleDirective *D);
1940 void VisitOMPMasterDirective(const OMPMasterDirective *D);
1941 void VisitOMPCriticalDirective(const OMPCriticalDirective *D);
1942 void VisitOMPParallelForDirective(const OMPParallelForDirective *D);
1943 void VisitOMPParallelForSimdDirective(const OMPParallelForSimdDirective *D);
1944 void VisitOMPParallelSectionsDirective(const OMPParallelSectionsDirective *D);
1945 void VisitOMPTaskDirective(const OMPTaskDirective *D);
1946 void VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D);
1947 void VisitOMPBarrierDirective(const OMPBarrierDirective *D);
1948 void VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D);
1949 void VisitOMPTaskgroupDirective(const OMPTaskgroupDirective *D);
1951 VisitOMPCancellationPointDirective(const OMPCancellationPointDirective *D);
1952 void VisitOMPCancelDirective(const OMPCancelDirective *D);
1953 void VisitOMPFlushDirective(const OMPFlushDirective *D);
1954 void VisitOMPOrderedDirective(const OMPOrderedDirective *D);
1955 void VisitOMPAtomicDirective(const OMPAtomicDirective *D);
1956 void VisitOMPTargetDirective(const OMPTargetDirective *D);
1957 void VisitOMPTargetDataDirective(const OMPTargetDataDirective *D);
1958 void VisitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective *D);
1959 void VisitOMPTargetExitDataDirective(const OMPTargetExitDataDirective *D);
1960 void VisitOMPTargetParallelDirective(const OMPTargetParallelDirective *D);
1962 VisitOMPTargetParallelForDirective(const OMPTargetParallelForDirective *D);
1963 void VisitOMPTeamsDirective(const OMPTeamsDirective *D);
1964 void VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D);
1965 void VisitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective *D);
1966 void VisitOMPDistributeDirective(const OMPDistributeDirective *D);
1969 void AddDeclarationNameInfo(const Stmt *S);
1970 void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier);
1971 void AddExplicitTemplateArgs(const TemplateArgumentLoc *A,
1972 unsigned NumTemplateArgs);
1973 void AddMemberRef(const FieldDecl *D, SourceLocation L);
1974 void AddStmt(const Stmt *S);
1975 void AddDecl(const Decl *D, bool isFirst = true);
1976 void AddTypeLoc(TypeSourceInfo *TI);
1977 void EnqueueChildren(const Stmt *S);
1978 void EnqueueChildren(const OMPClause *S);
1980 } // end anonyous namespace
1982 void EnqueueVisitor::AddDeclarationNameInfo(const Stmt *S) {
1983 // 'S' should always be non-null, since it comes from the
1984 // statement we are visiting.
1985 WL.push_back(DeclarationNameInfoVisit(S, Parent));
1989 EnqueueVisitor::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
1991 WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent));
1994 void EnqueueVisitor::AddStmt(const Stmt *S) {
1996 WL.push_back(StmtVisit(S, Parent));
1998 void EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) {
2000 WL.push_back(DeclVisit(D, Parent, isFirst));
2002 void EnqueueVisitor::AddExplicitTemplateArgs(const TemplateArgumentLoc *A,
2003 unsigned NumTemplateArgs) {
2004 WL.push_back(ExplicitTemplateArgsVisit(A, A + NumTemplateArgs, Parent));
2006 void EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) {
2008 WL.push_back(MemberRefVisit(D, L, Parent));
2010 void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
2012 WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
2014 void EnqueueVisitor::EnqueueChildren(const Stmt *S) {
2015 unsigned size = WL.size();
2016 for (const Stmt *SubStmt : S->children()) {
2019 if (size == WL.size())
2021 // Now reverse the entries we just added. This will match the DFS
2022 // ordering performed by the worklist.
2023 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2027 class OMPClauseEnqueue : public ConstOMPClauseVisitor<OMPClauseEnqueue> {
2028 EnqueueVisitor *Visitor;
2029 /// \brief Process clauses with list of variables.
2030 template <typename T>
2031 void VisitOMPClauseList(T *Node);
2033 OMPClauseEnqueue(EnqueueVisitor *Visitor) : Visitor(Visitor) { }
2034 #define OPENMP_CLAUSE(Name, Class) \
2035 void Visit##Class(const Class *C);
2036 #include "clang/Basic/OpenMPKinds.def"
2039 void OMPClauseEnqueue::VisitOMPIfClause(const OMPIfClause *C) {
2040 Visitor->AddStmt(C->getCondition());
2043 void OMPClauseEnqueue::VisitOMPFinalClause(const OMPFinalClause *C) {
2044 Visitor->AddStmt(C->getCondition());
2047 void OMPClauseEnqueue::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) {
2048 Visitor->AddStmt(C->getNumThreads());
2051 void OMPClauseEnqueue::VisitOMPSafelenClause(const OMPSafelenClause *C) {
2052 Visitor->AddStmt(C->getSafelen());
2055 void OMPClauseEnqueue::VisitOMPSimdlenClause(const OMPSimdlenClause *C) {
2056 Visitor->AddStmt(C->getSimdlen());
2059 void OMPClauseEnqueue::VisitOMPCollapseClause(const OMPCollapseClause *C) {
2060 Visitor->AddStmt(C->getNumForLoops());
2063 void OMPClauseEnqueue::VisitOMPDefaultClause(const OMPDefaultClause *C) { }
2065 void OMPClauseEnqueue::VisitOMPProcBindClause(const OMPProcBindClause *C) { }
2067 void OMPClauseEnqueue::VisitOMPScheduleClause(const OMPScheduleClause *C) {
2068 Visitor->AddStmt(C->getChunkSize());
2069 Visitor->AddStmt(C->getHelperChunkSize());
2072 void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *C) {
2073 Visitor->AddStmt(C->getNumForLoops());
2076 void OMPClauseEnqueue::VisitOMPNowaitClause(const OMPNowaitClause *) {}
2078 void OMPClauseEnqueue::VisitOMPUntiedClause(const OMPUntiedClause *) {}
2080 void OMPClauseEnqueue::VisitOMPMergeableClause(const OMPMergeableClause *) {}
2082 void OMPClauseEnqueue::VisitOMPReadClause(const OMPReadClause *) {}
2084 void OMPClauseEnqueue::VisitOMPWriteClause(const OMPWriteClause *) {}
2086 void OMPClauseEnqueue::VisitOMPUpdateClause(const OMPUpdateClause *) {}
2088 void OMPClauseEnqueue::VisitOMPCaptureClause(const OMPCaptureClause *) {}
2090 void OMPClauseEnqueue::VisitOMPSeqCstClause(const OMPSeqCstClause *) {}
2092 void OMPClauseEnqueue::VisitOMPThreadsClause(const OMPThreadsClause *) {}
2094 void OMPClauseEnqueue::VisitOMPSIMDClause(const OMPSIMDClause *) {}
2096 void OMPClauseEnqueue::VisitOMPNogroupClause(const OMPNogroupClause *) {}
2098 void OMPClauseEnqueue::VisitOMPDeviceClause(const OMPDeviceClause *C) {
2099 Visitor->AddStmt(C->getDevice());
2102 void OMPClauseEnqueue::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) {
2103 Visitor->AddStmt(C->getNumTeams());
2106 void OMPClauseEnqueue::VisitOMPThreadLimitClause(const OMPThreadLimitClause *C) {
2107 Visitor->AddStmt(C->getThreadLimit());
2110 void OMPClauseEnqueue::VisitOMPPriorityClause(const OMPPriorityClause *C) {
2111 Visitor->AddStmt(C->getPriority());
2114 void OMPClauseEnqueue::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) {
2115 Visitor->AddStmt(C->getGrainsize());
2118 void OMPClauseEnqueue::VisitOMPNumTasksClause(const OMPNumTasksClause *C) {
2119 Visitor->AddStmt(C->getNumTasks());
2122 void OMPClauseEnqueue::VisitOMPHintClause(const OMPHintClause *C) {
2123 Visitor->AddStmt(C->getHint());
2126 template<typename T>
2127 void OMPClauseEnqueue::VisitOMPClauseList(T *Node) {
2128 for (const auto *I : Node->varlists()) {
2129 Visitor->AddStmt(I);
2133 void OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) {
2134 VisitOMPClauseList(C);
2135 for (const auto *E : C->private_copies()) {
2136 Visitor->AddStmt(E);
2139 void OMPClauseEnqueue::VisitOMPFirstprivateClause(
2140 const OMPFirstprivateClause *C) {
2141 VisitOMPClauseList(C);
2143 void OMPClauseEnqueue::VisitOMPLastprivateClause(
2144 const OMPLastprivateClause *C) {
2145 VisitOMPClauseList(C);
2146 for (auto *E : C->private_copies()) {
2147 Visitor->AddStmt(E);
2149 for (auto *E : C->source_exprs()) {
2150 Visitor->AddStmt(E);
2152 for (auto *E : C->destination_exprs()) {
2153 Visitor->AddStmt(E);
2155 for (auto *E : C->assignment_ops()) {
2156 Visitor->AddStmt(E);
2159 void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) {
2160 VisitOMPClauseList(C);
2162 void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) {
2163 VisitOMPClauseList(C);
2164 for (auto *E : C->privates()) {
2165 Visitor->AddStmt(E);
2167 for (auto *E : C->lhs_exprs()) {
2168 Visitor->AddStmt(E);
2170 for (auto *E : C->rhs_exprs()) {
2171 Visitor->AddStmt(E);
2173 for (auto *E : C->reduction_ops()) {
2174 Visitor->AddStmt(E);
2177 void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) {
2178 VisitOMPClauseList(C);
2179 for (const auto *E : C->privates()) {
2180 Visitor->AddStmt(E);
2182 for (const auto *E : C->inits()) {
2183 Visitor->AddStmt(E);
2185 for (const auto *E : C->updates()) {
2186 Visitor->AddStmt(E);
2188 for (const auto *E : C->finals()) {
2189 Visitor->AddStmt(E);
2191 Visitor->AddStmt(C->getStep());
2192 Visitor->AddStmt(C->getCalcStep());
2194 void OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) {
2195 VisitOMPClauseList(C);
2196 Visitor->AddStmt(C->getAlignment());
2198 void OMPClauseEnqueue::VisitOMPCopyinClause(const OMPCopyinClause *C) {
2199 VisitOMPClauseList(C);
2200 for (auto *E : C->source_exprs()) {
2201 Visitor->AddStmt(E);
2203 for (auto *E : C->destination_exprs()) {
2204 Visitor->AddStmt(E);
2206 for (auto *E : C->assignment_ops()) {
2207 Visitor->AddStmt(E);
2211 OMPClauseEnqueue::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) {
2212 VisitOMPClauseList(C);
2213 for (auto *E : C->source_exprs()) {
2214 Visitor->AddStmt(E);
2216 for (auto *E : C->destination_exprs()) {
2217 Visitor->AddStmt(E);
2219 for (auto *E : C->assignment_ops()) {
2220 Visitor->AddStmt(E);
2223 void OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) {
2224 VisitOMPClauseList(C);
2226 void OMPClauseEnqueue::VisitOMPDependClause(const OMPDependClause *C) {
2227 VisitOMPClauseList(C);
2229 void OMPClauseEnqueue::VisitOMPMapClause(const OMPMapClause *C) {
2230 VisitOMPClauseList(C);
2232 void OMPClauseEnqueue::VisitOMPDistScheduleClause(
2233 const OMPDistScheduleClause *C) {
2234 Visitor->AddStmt(C->getChunkSize());
2235 Visitor->AddStmt(C->getHelperChunkSize());
2237 void OMPClauseEnqueue::VisitOMPDefaultmapClause(const OMPDefaultmapClause *C) {
2241 void EnqueueVisitor::EnqueueChildren(const OMPClause *S) {
2242 unsigned size = WL.size();
2243 OMPClauseEnqueue Visitor(this);
2245 if (size == WL.size())
2247 // Now reverse the entries we just added. This will match the DFS
2248 // ordering performed by the worklist.
2249 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2252 void EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) {
2253 WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent));
2255 void EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) {
2256 AddDecl(B->getBlockDecl());
2258 void EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
2260 AddTypeLoc(E->getTypeSourceInfo());
2262 void EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) {
2263 for (auto &I : llvm::reverse(S->body()))
2266 void EnqueueVisitor::
2267 VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) {
2268 AddStmt(S->getSubStmt());
2269 AddDeclarationNameInfo(S);
2270 if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc())
2271 AddNestedNameSpecifierLoc(QualifierLoc);
2274 void EnqueueVisitor::
2275 VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E) {
2276 if (E->hasExplicitTemplateArgs())
2277 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2278 AddDeclarationNameInfo(E);
2279 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
2280 AddNestedNameSpecifierLoc(QualifierLoc);
2281 if (!E->isImplicitAccess())
2282 AddStmt(E->getBase());
2284 void EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) {
2285 // Enqueue the initializer , if any.
2286 AddStmt(E->getInitializer());
2287 // Enqueue the array size, if any.
2288 AddStmt(E->getArraySize());
2289 // Enqueue the allocated type.
2290 AddTypeLoc(E->getAllocatedTypeSourceInfo());
2291 // Enqueue the placement arguments.
2292 for (unsigned I = E->getNumPlacementArgs(); I > 0; --I)
2293 AddStmt(E->getPlacementArg(I-1));
2295 void EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) {
2296 for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I)
2297 AddStmt(CE->getArg(I-1));
2298 AddStmt(CE->getCallee());
2299 AddStmt(CE->getArg(0));
2301 void EnqueueVisitor::VisitCXXPseudoDestructorExpr(
2302 const CXXPseudoDestructorExpr *E) {
2303 // Visit the name of the type being destroyed.
2304 AddTypeLoc(E->getDestroyedTypeInfo());
2305 // Visit the scope type that looks disturbingly like the nested-name-specifier
2307 AddTypeLoc(E->getScopeTypeInfo());
2308 // Visit the nested-name-specifier.
2309 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
2310 AddNestedNameSpecifierLoc(QualifierLoc);
2311 // Visit base expression.
2312 AddStmt(E->getBase());
2314 void EnqueueVisitor::VisitCXXScalarValueInitExpr(
2315 const CXXScalarValueInitExpr *E) {
2316 AddTypeLoc(E->getTypeSourceInfo());
2318 void EnqueueVisitor::VisitCXXTemporaryObjectExpr(
2319 const CXXTemporaryObjectExpr *E) {
2321 AddTypeLoc(E->getTypeSourceInfo());
2323 void EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
2325 if (E->isTypeOperand())
2326 AddTypeLoc(E->getTypeOperandSourceInfo());
2329 void EnqueueVisitor::VisitCXXUnresolvedConstructExpr(
2330 const CXXUnresolvedConstructExpr *E) {
2332 AddTypeLoc(E->getTypeSourceInfo());
2334 void EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) {
2336 if (E->isTypeOperand())
2337 AddTypeLoc(E->getTypeOperandSourceInfo());
2340 void EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) {
2342 AddDecl(S->getExceptionDecl());
2345 void EnqueueVisitor::VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
2346 AddStmt(S->getBody());
2347 AddStmt(S->getRangeInit());
2348 AddDecl(S->getLoopVariable());
2351 void EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) {
2352 if (DR->hasExplicitTemplateArgs())
2353 AddExplicitTemplateArgs(DR->getTemplateArgs(), DR->getNumTemplateArgs());
2354 WL.push_back(DeclRefExprParts(DR, Parent));
2356 void EnqueueVisitor::VisitDependentScopeDeclRefExpr(
2357 const DependentScopeDeclRefExpr *E) {
2358 if (E->hasExplicitTemplateArgs())
2359 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2360 AddDeclarationNameInfo(E);
2361 AddNestedNameSpecifierLoc(E->getQualifierLoc());
2363 void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) {
2364 unsigned size = WL.size();
2365 bool isFirst = true;
2366 for (const auto *D : S->decls()) {
2367 AddDecl(D, isFirst);
2370 if (size == WL.size())
2372 // Now reverse the entries we just added. This will match the DFS
2373 // ordering performed by the worklist.
2374 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2377 void EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
2378 AddStmt(E->getInit());
2379 for (DesignatedInitExpr::const_reverse_designators_iterator
2380 D = E->designators_rbegin(), DEnd = E->designators_rend();
2382 if (D->isFieldDesignator()) {
2383 if (FieldDecl *Field = D->getField())
2384 AddMemberRef(Field, D->getFieldLoc());
2387 if (D->isArrayDesignator()) {
2388 AddStmt(E->getArrayIndex(*D));
2391 assert(D->isArrayRangeDesignator() && "Unknown designator kind");
2392 AddStmt(E->getArrayRangeEnd(*D));
2393 AddStmt(E->getArrayRangeStart(*D));
2396 void EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) {
2398 AddTypeLoc(E->getTypeInfoAsWritten());
2400 void EnqueueVisitor::VisitForStmt(const ForStmt *FS) {
2401 AddStmt(FS->getBody());
2402 AddStmt(FS->getInc());
2403 AddStmt(FS->getCond());
2404 AddDecl(FS->getConditionVariable());
2405 AddStmt(FS->getInit());
2407 void EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) {
2408 WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent));
2410 void EnqueueVisitor::VisitIfStmt(const IfStmt *If) {
2411 AddStmt(If->getElse());
2412 AddStmt(If->getThen());
2413 AddStmt(If->getCond());
2414 AddDecl(If->getConditionVariable());
2416 void EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) {
2417 // We care about the syntactic form of the initializer list, only.
2418 if (InitListExpr *Syntactic = IE->getSyntacticForm())
2420 EnqueueChildren(IE);
2422 void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) {
2423 WL.push_back(MemberExprParts(M, Parent));
2425 // If the base of the member access expression is an implicit 'this', don't
2427 // FIXME: If we ever want to show these implicit accesses, this will be
2428 // unfortunate. However, clang_getCursor() relies on this behavior.
2429 if (M->isImplicitAccess())
2432 // Ignore base anonymous struct/union fields, otherwise they will shadow the
2433 // real field that that we are interested in.
2434 if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) {
2435 if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) {
2436 if (FD->isAnonymousStructOrUnion()) {
2437 AddStmt(SubME->getBase());
2443 AddStmt(M->getBase());
2445 void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {
2446 AddTypeLoc(E->getEncodedTypeSourceInfo());
2448 void EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) {
2450 AddTypeLoc(M->getClassReceiverTypeInfo());
2452 void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) {
2453 // Visit the components of the offsetof expression.
2454 for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) {
2455 const OffsetOfNode &Node = E->getComponent(I-1);
2456 switch (Node.getKind()) {
2457 case OffsetOfNode::Array:
2458 AddStmt(E->getIndexExpr(Node.getArrayExprIndex()));
2460 case OffsetOfNode::Field:
2461 AddMemberRef(Node.getField(), Node.getSourceRange().getEnd());
2463 case OffsetOfNode::Identifier:
2464 case OffsetOfNode::Base:
2468 // Visit the type into which we're computing the offset.
2469 AddTypeLoc(E->getTypeSourceInfo());
2471 void EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) {
2472 if (E->hasExplicitTemplateArgs())
2473 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2474 WL.push_back(OverloadExprParts(E, Parent));
2476 void EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr(
2477 const UnaryExprOrTypeTraitExpr *E) {
2479 if (E->isArgumentType())
2480 AddTypeLoc(E->getArgumentTypeInfo());
2482 void EnqueueVisitor::VisitStmt(const Stmt *S) {
2485 void EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) {
2486 AddStmt(S->getBody());
2487 AddStmt(S->getCond());
2488 AddDecl(S->getConditionVariable());
2491 void EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) {
2492 AddStmt(W->getBody());
2493 AddStmt(W->getCond());
2494 AddDecl(W->getConditionVariable());
2497 void EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) {
2498 for (unsigned I = E->getNumArgs(); I > 0; --I)
2499 AddTypeLoc(E->getArg(I-1));
2502 void EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
2503 AddTypeLoc(E->getQueriedTypeSourceInfo());
2506 void EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
2510 void EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) {
2511 VisitOverloadExpr(U);
2512 if (!U->isImplicitAccess())
2513 AddStmt(U->getBase());
2515 void EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) {
2516 AddStmt(E->getSubExpr());
2517 AddTypeLoc(E->getWrittenTypeInfo());
2519 void EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
2520 WL.push_back(SizeOfPackExprParts(E, Parent));
2522 void EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
2523 // If the opaque value has a source expression, just transparently
2524 // visit that. This is useful for (e.g.) pseudo-object expressions.
2525 if (Expr *SourceExpr = E->getSourceExpr())
2526 return Visit(SourceExpr);
2528 void EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) {
2529 AddStmt(E->getBody());
2530 WL.push_back(LambdaExprParts(E, Parent));
2532 void EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) {
2533 // Treat the expression like its syntactic form.
2534 Visit(E->getSyntacticForm());
2537 void EnqueueVisitor::VisitOMPExecutableDirective(
2538 const OMPExecutableDirective *D) {
2540 for (ArrayRef<OMPClause *>::iterator I = D->clauses().begin(),
2541 E = D->clauses().end();
2543 EnqueueChildren(*I);
2546 void EnqueueVisitor::VisitOMPLoopDirective(const OMPLoopDirective *D) {
2547 VisitOMPExecutableDirective(D);
2550 void EnqueueVisitor::VisitOMPParallelDirective(const OMPParallelDirective *D) {
2551 VisitOMPExecutableDirective(D);
2554 void EnqueueVisitor::VisitOMPSimdDirective(const OMPSimdDirective *D) {
2555 VisitOMPLoopDirective(D);
2558 void EnqueueVisitor::VisitOMPForDirective(const OMPForDirective *D) {
2559 VisitOMPLoopDirective(D);
2562 void EnqueueVisitor::VisitOMPForSimdDirective(const OMPForSimdDirective *D) {
2563 VisitOMPLoopDirective(D);
2566 void EnqueueVisitor::VisitOMPSectionsDirective(const OMPSectionsDirective *D) {
2567 VisitOMPExecutableDirective(D);
2570 void EnqueueVisitor::VisitOMPSectionDirective(const OMPSectionDirective *D) {
2571 VisitOMPExecutableDirective(D);
2574 void EnqueueVisitor::VisitOMPSingleDirective(const OMPSingleDirective *D) {
2575 VisitOMPExecutableDirective(D);
2578 void EnqueueVisitor::VisitOMPMasterDirective(const OMPMasterDirective *D) {
2579 VisitOMPExecutableDirective(D);
2582 void EnqueueVisitor::VisitOMPCriticalDirective(const OMPCriticalDirective *D) {
2583 VisitOMPExecutableDirective(D);
2584 AddDeclarationNameInfo(D);
2588 EnqueueVisitor::VisitOMPParallelForDirective(const OMPParallelForDirective *D) {
2589 VisitOMPLoopDirective(D);
2592 void EnqueueVisitor::VisitOMPParallelForSimdDirective(
2593 const OMPParallelForSimdDirective *D) {
2594 VisitOMPLoopDirective(D);
2597 void EnqueueVisitor::VisitOMPParallelSectionsDirective(
2598 const OMPParallelSectionsDirective *D) {
2599 VisitOMPExecutableDirective(D);
2602 void EnqueueVisitor::VisitOMPTaskDirective(const OMPTaskDirective *D) {
2603 VisitOMPExecutableDirective(D);
2607 EnqueueVisitor::VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D) {
2608 VisitOMPExecutableDirective(D);
2611 void EnqueueVisitor::VisitOMPBarrierDirective(const OMPBarrierDirective *D) {
2612 VisitOMPExecutableDirective(D);
2615 void EnqueueVisitor::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D) {
2616 VisitOMPExecutableDirective(D);
2619 void EnqueueVisitor::VisitOMPTaskgroupDirective(
2620 const OMPTaskgroupDirective *D) {
2621 VisitOMPExecutableDirective(D);
2624 void EnqueueVisitor::VisitOMPFlushDirective(const OMPFlushDirective *D) {
2625 VisitOMPExecutableDirective(D);
2628 void EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) {
2629 VisitOMPExecutableDirective(D);
2632 void EnqueueVisitor::VisitOMPAtomicDirective(const OMPAtomicDirective *D) {
2633 VisitOMPExecutableDirective(D);
2636 void EnqueueVisitor::VisitOMPTargetDirective(const OMPTargetDirective *D) {
2637 VisitOMPExecutableDirective(D);
2640 void EnqueueVisitor::VisitOMPTargetDataDirective(const
2641 OMPTargetDataDirective *D) {
2642 VisitOMPExecutableDirective(D);
2645 void EnqueueVisitor::VisitOMPTargetEnterDataDirective(
2646 const OMPTargetEnterDataDirective *D) {
2647 VisitOMPExecutableDirective(D);
2650 void EnqueueVisitor::VisitOMPTargetExitDataDirective(
2651 const OMPTargetExitDataDirective *D) {
2652 VisitOMPExecutableDirective(D);
2655 void EnqueueVisitor::VisitOMPTargetParallelDirective(
2656 const OMPTargetParallelDirective *D) {
2657 VisitOMPExecutableDirective(D);
2660 void EnqueueVisitor::VisitOMPTargetParallelForDirective(
2661 const OMPTargetParallelForDirective *D) {
2662 VisitOMPLoopDirective(D);
2665 void EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) {
2666 VisitOMPExecutableDirective(D);
2669 void EnqueueVisitor::VisitOMPCancellationPointDirective(
2670 const OMPCancellationPointDirective *D) {
2671 VisitOMPExecutableDirective(D);
2674 void EnqueueVisitor::VisitOMPCancelDirective(const OMPCancelDirective *D) {
2675 VisitOMPExecutableDirective(D);
2678 void EnqueueVisitor::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D) {
2679 VisitOMPLoopDirective(D);
2682 void EnqueueVisitor::VisitOMPTaskLoopSimdDirective(
2683 const OMPTaskLoopSimdDirective *D) {
2684 VisitOMPLoopDirective(D);
2687 void EnqueueVisitor::VisitOMPDistributeDirective(
2688 const OMPDistributeDirective *D) {
2689 VisitOMPLoopDirective(D);
2692 void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) {
2693 EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S);
2696 bool CursorVisitor::IsInRegionOfInterest(CXCursor C) {
2697 if (RegionOfInterest.isValid()) {
2698 SourceRange Range = getRawCursorExtent(C);
2699 if (Range.isInvalid() || CompareRegionOfInterest(Range))
2705 bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
2706 while (!WL.empty()) {
2707 // Dequeue the worklist item.
2708 VisitorJob LI = WL.pop_back_val();
2710 // Set the Parent field, then back to its old value once we're done.
2711 SetParentRAII SetParent(Parent, StmtParent, LI.getParent());
2713 switch (LI.getKind()) {
2714 case VisitorJob::DeclVisitKind: {
2715 const Decl *D = cast<DeclVisit>(&LI)->get();
2719 // For now, perform default visitation for Decls.
2720 if (Visit(MakeCXCursor(D, TU, RegionOfInterest,
2721 cast<DeclVisit>(&LI)->isFirst())))
2726 case VisitorJob::ExplicitTemplateArgsVisitKind: {
2727 for (const TemplateArgumentLoc &Arg :
2728 *cast<ExplicitTemplateArgsVisit>(&LI)) {
2729 if (VisitTemplateArgumentLoc(Arg))
2734 case VisitorJob::TypeLocVisitKind: {
2735 // Perform default visitation for TypeLocs.
2736 if (Visit(cast<TypeLocVisit>(&LI)->get()))
2740 case VisitorJob::LabelRefVisitKind: {
2741 const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get();
2742 if (LabelStmt *stmt = LS->getStmt()) {
2743 if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(),
2751 case VisitorJob::NestedNameSpecifierLocVisitKind: {
2752 NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI);
2753 if (VisitNestedNameSpecifierLoc(V->get()))
2758 case VisitorJob::DeclarationNameInfoVisitKind: {
2759 if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)
2764 case VisitorJob::MemberRefVisitKind: {
2765 MemberRefVisit *V = cast<MemberRefVisit>(&LI);
2766 if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU)))
2770 case VisitorJob::StmtVisitKind: {
2771 const Stmt *S = cast<StmtVisit>(&LI)->get();
2775 // Update the current cursor.
2776 CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest);
2777 if (!IsInRegionOfInterest(Cursor))
2779 switch (Visitor(Cursor, Parent, ClientData)) {
2780 case CXChildVisit_Break: return true;
2781 case CXChildVisit_Continue: break;
2782 case CXChildVisit_Recurse:
2783 if (PostChildrenVisitor)
2784 WL.push_back(PostChildrenVisit(nullptr, Cursor));
2785 EnqueueWorkList(WL, S);
2790 case VisitorJob::MemberExprPartsKind: {
2791 // Handle the other pieces in the MemberExpr besides the base.
2792 const MemberExpr *M = cast<MemberExprParts>(&LI)->get();
2794 // Visit the nested-name-specifier
2795 if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc())
2796 if (VisitNestedNameSpecifierLoc(QualifierLoc))
2799 // Visit the declaration name.
2800 if (VisitDeclarationNameInfo(M->getMemberNameInfo()))
2803 // Visit the explicitly-specified template arguments, if any.
2804 if (M->hasExplicitTemplateArgs()) {
2805 for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(),
2806 *ArgEnd = Arg + M->getNumTemplateArgs();
2807 Arg != ArgEnd; ++Arg) {
2808 if (VisitTemplateArgumentLoc(*Arg))
2814 case VisitorJob::DeclRefExprPartsKind: {
2815 const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get();
2816 // Visit nested-name-specifier, if present.
2817 if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc())
2818 if (VisitNestedNameSpecifierLoc(QualifierLoc))
2820 // Visit declaration name.
2821 if (VisitDeclarationNameInfo(DR->getNameInfo()))
2825 case VisitorJob::OverloadExprPartsKind: {
2826 const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get();
2827 // Visit the nested-name-specifier.
2828 if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc())
2829 if (VisitNestedNameSpecifierLoc(QualifierLoc))
2831 // Visit the declaration name.
2832 if (VisitDeclarationNameInfo(O->getNameInfo()))
2834 // Visit the overloaded declaration reference.
2835 if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
2839 case VisitorJob::SizeOfPackExprPartsKind: {
2840 const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get();
2841 NamedDecl *Pack = E->getPack();
2842 if (isa<TemplateTypeParmDecl>(Pack)) {
2843 if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack),
2844 E->getPackLoc(), TU)))
2850 if (isa<TemplateTemplateParmDecl>(Pack)) {
2851 if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack),
2852 E->getPackLoc(), TU)))
2858 // Non-type template parameter packs and function parameter packs are
2859 // treated like DeclRefExpr cursors.
2863 case VisitorJob::LambdaExprPartsKind: {
2865 const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get();
2866 for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(),
2867 CEnd = E->explicit_capture_end();
2869 // FIXME: Lambda init-captures.
2870 if (!C->capturesVariable())
2873 if (Visit(MakeCursorVariableRef(C->getCapturedVar(),
2879 // Visit parameters and return type, if present.
2880 if (E->hasExplicitParameters() || E->hasExplicitResultType()) {
2881 TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2882 if (E->hasExplicitParameters() && E->hasExplicitResultType()) {
2883 // Visit the whole type.
2886 } else if (FunctionProtoTypeLoc Proto =
2887 TL.getAs<FunctionProtoTypeLoc>()) {
2888 if (E->hasExplicitParameters()) {
2889 // Visit parameters.
2890 for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
2891 if (Visit(MakeCXCursor(Proto.getParam(I), TU)))
2894 // Visit result type.
2895 if (Visit(Proto.getReturnLoc()))
2903 case VisitorJob::PostChildrenVisitKind:
2904 if (PostChildrenVisitor(Parent, ClientData))
2912 bool CursorVisitor::Visit(const Stmt *S) {
2913 VisitorWorkList *WL = nullptr;
2914 if (!WorkListFreeList.empty()) {
2915 WL = WorkListFreeList.back();
2917 WorkListFreeList.pop_back();
2920 WL = new VisitorWorkList();
2921 WorkListCache.push_back(WL);
2923 EnqueueWorkList(*WL, S);
2924 bool result = RunVisitorWorkList(*WL);
2925 WorkListFreeList.push_back(WL);
2930 typedef SmallVector<SourceRange, 4> RefNamePieces;
2931 RefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr,
2932 const DeclarationNameInfo &NI, SourceRange QLoc,
2933 const SourceRange *TemplateArgsLoc = nullptr) {
2934 const bool WantQualifier = NameFlags & CXNameRange_WantQualifier;
2935 const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs;
2936 const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece;
2938 const DeclarationName::NameKind Kind = NI.getName().getNameKind();
2940 RefNamePieces Pieces;
2942 if (WantQualifier && QLoc.isValid())
2943 Pieces.push_back(QLoc);
2945 if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr)
2946 Pieces.push_back(NI.getLoc());
2948 if (WantTemplateArgs && TemplateArgsLoc && TemplateArgsLoc->isValid())
2949 Pieces.push_back(*TemplateArgsLoc);
2951 if (Kind == DeclarationName::CXXOperatorName) {
2952 Pieces.push_back(SourceLocation::getFromRawEncoding(
2953 NI.getInfo().CXXOperatorName.BeginOpNameLoc));
2954 Pieces.push_back(SourceLocation::getFromRawEncoding(
2955 NI.getInfo().CXXOperatorName.EndOpNameLoc));
2958 if (WantSinglePiece) {
2959 SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd());
2961 Pieces.push_back(R);
2968 //===----------------------------------------------------------------------===//
2970 //===----------------------------------------------------------------------===//
2972 static void fatal_error_handler(void *user_data, const std::string& reason,
2973 bool gen_crash_diag) {
2974 // Write the result out to stderr avoiding errs() because raw_ostreams can
2975 // call report_fatal_error.
2976 fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str());
2981 struct RegisterFatalErrorHandler {
2982 RegisterFatalErrorHandler() {
2983 llvm::install_fatal_error_handler(fatal_error_handler, nullptr);
2988 static llvm::ManagedStatic<RegisterFatalErrorHandler> RegisterFatalErrorHandlerOnce;
2991 CXIndex clang_createIndex(int excludeDeclarationsFromPCH,
2992 int displayDiagnostics) {
2993 // We use crash recovery to make some of our APIs more reliable, implicitly
2995 if (!getenv("LIBCLANG_DISABLE_CRASH_RECOVERY"))
2996 llvm::CrashRecoveryContext::Enable();
2998 // Look through the managed static to trigger construction of the managed
2999 // static which registers our fatal error handler. This ensures it is only
3001 (void)*RegisterFatalErrorHandlerOnce;
3003 // Initialize targets for clang module support.
3004 llvm::InitializeAllTargets();
3005 llvm::InitializeAllTargetMCs();
3006 llvm::InitializeAllAsmPrinters();
3007 llvm::InitializeAllAsmParsers();
3009 CIndexer *CIdxr = new CIndexer();
3011 if (excludeDeclarationsFromPCH)
3012 CIdxr->setOnlyLocalDecls();
3013 if (displayDiagnostics)
3014 CIdxr->setDisplayDiagnostics();
3016 if (getenv("LIBCLANG_BGPRIO_INDEX"))
3017 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
3018 CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
3019 if (getenv("LIBCLANG_BGPRIO_EDIT"))
3020 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
3021 CXGlobalOpt_ThreadBackgroundPriorityForEditing);
3026 void clang_disposeIndex(CXIndex CIdx) {
3028 delete static_cast<CIndexer *>(CIdx);
3031 void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) {
3033 static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options);
3036 unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) {
3038 return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags();
3042 void clang_toggleCrashRecovery(unsigned isEnabled) {
3044 llvm::CrashRecoveryContext::Enable();
3046 llvm::CrashRecoveryContext::Disable();
3049 CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx,
3050 const char *ast_filename) {
3051 CXTranslationUnit TU;
3052 enum CXErrorCode Result =
3053 clang_createTranslationUnit2(CIdx, ast_filename, &TU);
3055 assert((TU && Result == CXError_Success) ||
3056 (!TU && Result != CXError_Success));
3060 enum CXErrorCode clang_createTranslationUnit2(CXIndex CIdx,
3061 const char *ast_filename,
3062 CXTranslationUnit *out_TU) {
3066 if (!CIdx || !ast_filename || !out_TU)
3067 return CXError_InvalidArguments;
3070 *Log << ast_filename;
3073 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
3074 FileSystemOptions FileSystemOpts;
3076 IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
3077 CompilerInstance::createDiagnostics(new DiagnosticOptions());
3078 std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile(
3079 ast_filename, CXXIdx->getPCHContainerOperations()->getRawReader(), Diags,
3080 FileSystemOpts, /*UseDebugInfo=*/false,
3081 CXXIdx->getOnlyLocalDecls(), None,
3082 /*CaptureDiagnostics=*/true,
3083 /*AllowPCHWithCompilerErrors=*/true,
3084 /*UserFilesAreVolatile=*/true);
3085 *out_TU = MakeCXTranslationUnit(CXXIdx, AU.release());
3086 return *out_TU ? CXError_Success : CXError_Failure;
3089 unsigned clang_defaultEditingTranslationUnitOptions() {
3090 return CXTranslationUnit_PrecompiledPreamble |
3091 CXTranslationUnit_CacheCompletionResults;
3095 clang_createTranslationUnitFromSourceFile(CXIndex CIdx,
3096 const char *source_filename,
3097 int num_command_line_args,
3098 const char * const *command_line_args,
3099 unsigned num_unsaved_files,
3100 struct CXUnsavedFile *unsaved_files) {
3101 unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord;
3102 return clang_parseTranslationUnit(CIdx, source_filename,
3103 command_line_args, num_command_line_args,
3104 unsaved_files, num_unsaved_files,
3109 clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename,
3110 const char *const *command_line_args,
3111 int num_command_line_args,
3112 ArrayRef<CXUnsavedFile> unsaved_files,
3113 unsigned options, CXTranslationUnit *out_TU) {
3114 // Set up the initial return values.
3119 if (!CIdx || !out_TU)
3120 return CXError_InvalidArguments;
3122 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
3124 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
3125 setThreadBackgroundPriority();
3127 bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble;
3128 bool CreatePreambleOnFirstParse =
3129 options & CXTranslationUnit_CreatePreambleOnFirstParse;
3130 // FIXME: Add a flag for modules.
3131 TranslationUnitKind TUKind
3132 = (options & CXTranslationUnit_Incomplete)? TU_Prefix : TU_Complete;
3133 bool CacheCodeCompletionResults
3134 = options & CXTranslationUnit_CacheCompletionResults;
3135 bool IncludeBriefCommentsInCodeCompletion
3136 = options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
3137 bool SkipFunctionBodies = options & CXTranslationUnit_SkipFunctionBodies;
3138 bool ForSerialization = options & CXTranslationUnit_ForSerialization;
3140 // Configure the diagnostics.
3141 IntrusiveRefCntPtr<DiagnosticsEngine>
3142 Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions));
3144 // Recover resources if we crash before exiting this function.
3145 llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
3146 llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
3147 DiagCleanup(Diags.get());
3149 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles(
3150 new std::vector<ASTUnit::RemappedFile>());
3152 // Recover resources if we crash before exiting this function.
3153 llvm::CrashRecoveryContextCleanupRegistrar<
3154 std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
3156 for (auto &UF : unsaved_files) {
3157 std::unique_ptr<llvm::MemoryBuffer> MB =
3158 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
3159 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
3162 std::unique_ptr<std::vector<const char *>> Args(
3163 new std::vector<const char *>());
3165 // Recover resources if we crash before exiting this method.
3166 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char*> >
3167 ArgsCleanup(Args.get());
3169 // Since the Clang C library is primarily used by batch tools dealing with
3170 // (often very broken) source code, where spell-checking can have a
3171 // significant negative impact on performance (particularly when
3172 // precompiled headers are involved), we disable it by default.
3173 // Only do this if we haven't found a spell-checking-related argument.
3174 bool FoundSpellCheckingArgument = false;
3175 for (int I = 0; I != num_command_line_args; ++I) {
3176 if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 ||
3177 strcmp(command_line_args[I], "-fspell-checking") == 0) {
3178 FoundSpellCheckingArgument = true;
3182 Args->insert(Args->end(), command_line_args,
3183 command_line_args + num_command_line_args);
3185 if (!FoundSpellCheckingArgument)
3186 Args->insert(Args->begin() + 1, "-fno-spell-checking");
3188 // The 'source_filename' argument is optional. If the caller does not
3189 // specify it then it is assumed that the source file is specified
3190 // in the actual argument list.
3191 // Put the source file after command_line_args otherwise if '-x' flag is
3192 // present it will be unused.
3193 if (source_filename)
3194 Args->push_back(source_filename);
3196 // Do we need the detailed preprocessing record?
3197 if (options & CXTranslationUnit_DetailedPreprocessingRecord) {
3198 Args->push_back("-Xclang");
3199 Args->push_back("-detailed-preprocessing-record");
3202 unsigned NumErrors = Diags->getClient()->getNumErrors();
3203 std::unique_ptr<ASTUnit> ErrUnit;
3204 // Unless the user specified that they want the preamble on the first parse
3205 // set it up to be created on the first reparse. This makes the first parse
3206 // faster, trading for a slower (first) reparse.
3207 unsigned PrecompilePreambleAfterNParses =
3208 !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse;
3209 std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine(
3210 Args->data(), Args->data() + Args->size(),
3211 CXXIdx->getPCHContainerOperations(), Diags,
3212 CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(),
3213 /*CaptureDiagnostics=*/true, *RemappedFiles.get(),
3214 /*RemappedFilesKeepOriginalName=*/true, PrecompilePreambleAfterNParses,
3215 TUKind, CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion,
3216 /*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies,
3217 /*UserFilesAreVolatile=*/true, ForSerialization,
3218 CXXIdx->getPCHContainerOperations()->getRawReader().getFormat(),
3221 // Early failures in LoadFromCommandLine may return with ErrUnit unset.
3222 if (!Unit && !ErrUnit)
3223 return CXError_ASTReadError;
3225 if (NumErrors != Diags->getClient()->getNumErrors()) {
3226 // Make sure to check that 'Unit' is non-NULL.
3227 if (CXXIdx->getDisplayDiagnostics())
3228 printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get());
3231 if (isASTReadError(Unit ? Unit.get() : ErrUnit.get()))
3232 return CXError_ASTReadError;
3234 *out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release());
3235 return *out_TU ? CXError_Success : CXError_Failure;
3239 clang_parseTranslationUnit(CXIndex CIdx,
3240 const char *source_filename,
3241 const char *const *command_line_args,
3242 int num_command_line_args,
3243 struct CXUnsavedFile *unsaved_files,
3244 unsigned num_unsaved_files,
3246 CXTranslationUnit TU;
3247 enum CXErrorCode Result = clang_parseTranslationUnit2(
3248 CIdx, source_filename, command_line_args, num_command_line_args,
3249 unsaved_files, num_unsaved_files, options, &TU);
3251 assert((TU && Result == CXError_Success) ||
3252 (!TU && Result != CXError_Success));
3256 enum CXErrorCode clang_parseTranslationUnit2(
3257 CXIndex CIdx, const char *source_filename,
3258 const char *const *command_line_args, int num_command_line_args,
3259 struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files,
3260 unsigned options, CXTranslationUnit *out_TU) {
3261 SmallVector<const char *, 4> Args;
3262 Args.push_back("clang");
3263 Args.append(command_line_args, command_line_args + num_command_line_args);
3264 return clang_parseTranslationUnit2FullArgv(
3265 CIdx, source_filename, Args.data(), Args.size(), unsaved_files,
3266 num_unsaved_files, options, out_TU);
3269 enum CXErrorCode clang_parseTranslationUnit2FullArgv(
3270 CXIndex CIdx, const char *source_filename,
3271 const char *const *command_line_args, int num_command_line_args,
3272 struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files,
3273 unsigned options, CXTranslationUnit *out_TU) {
3275 *Log << source_filename << ": ";
3276 for (int i = 0; i != num_command_line_args; ++i)
3277 *Log << command_line_args[i] << " ";
3280 if (num_unsaved_files && !unsaved_files)
3281 return CXError_InvalidArguments;
3283 CXErrorCode result = CXError_Failure;
3284 auto ParseTranslationUnitImpl = [=, &result] {
3285 result = clang_parseTranslationUnit_Impl(
3286 CIdx, source_filename, command_line_args, num_command_line_args,
3287 llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU);
3289 llvm::CrashRecoveryContext CRC;
3291 if (!RunSafely(CRC, ParseTranslationUnitImpl)) {
3292 fprintf(stderr, "libclang: crash detected during parsing: {\n");
3293 fprintf(stderr, " 'source_filename' : '%s'\n", source_filename);
3294 fprintf(stderr, " 'command_line_args' : [");
3295 for (int i = 0; i != num_command_line_args; ++i) {
3297 fprintf(stderr, ", ");
3298 fprintf(stderr, "'%s'", command_line_args[i]);
3300 fprintf(stderr, "],\n");
3301 fprintf(stderr, " 'unsaved_files' : [");
3302 for (unsigned i = 0; i != num_unsaved_files; ++i) {
3304 fprintf(stderr, ", ");
3305 fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename,
3306 unsaved_files[i].Length);
3308 fprintf(stderr, "],\n");
3309 fprintf(stderr, " 'options' : %d,\n", options);
3310 fprintf(stderr, "}\n");
3312 return CXError_Crashed;
3313 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
3314 if (CXTranslationUnit *TU = out_TU)
3315 PrintLibclangResourceUsage(*TU);
3321 CXString clang_Type_getObjCEncoding(CXType CT) {
3322 CXTranslationUnit tu = static_cast<CXTranslationUnit>(CT.data[1]);
3323 ASTContext &Ctx = getASTUnit(tu)->getASTContext();
3324 std::string encoding;
3325 Ctx.getObjCEncodingForType(QualType::getFromOpaquePtr(CT.data[0]),
3328 return cxstring::createDup(encoding);
3331 static const IdentifierInfo *getMacroIdentifier(CXCursor C) {
3332 if (C.kind == CXCursor_MacroDefinition) {
3333 if (const MacroDefinitionRecord *MDR = getCursorMacroDefinition(C))
3334 return MDR->getName();
3335 } else if (C.kind == CXCursor_MacroExpansion) {
3336 MacroExpansionCursor ME = getCursorMacroExpansion(C);
3337 return ME.getName();
3342 unsigned clang_Cursor_isMacroFunctionLike(CXCursor C) {
3343 const IdentifierInfo *II = getMacroIdentifier(C);
3347 ASTUnit *ASTU = getCursorASTUnit(C);
3348 Preprocessor &PP = ASTU->getPreprocessor();
3349 if (const MacroInfo *MI = PP.getMacroInfo(II))
3350 return MI->isFunctionLike();
3354 unsigned clang_Cursor_isMacroBuiltin(CXCursor C) {
3355 const IdentifierInfo *II = getMacroIdentifier(C);
3359 ASTUnit *ASTU = getCursorASTUnit(C);
3360 Preprocessor &PP = ASTU->getPreprocessor();
3361 if (const MacroInfo *MI = PP.getMacroInfo(II))
3362 return MI->isBuiltinMacro();
3366 unsigned clang_Cursor_isFunctionInlined(CXCursor C) {
3367 const Decl *D = getCursorDecl(C);
3368 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
3372 return FD->isInlined();
3375 static StringLiteral* getCFSTR_value(CallExpr *callExpr) {
3376 if (callExpr->getNumArgs() != 1) {
3380 StringLiteral *S = nullptr;
3381 auto *arg = callExpr->getArg(0);
3382 if (arg->getStmtClass() == Stmt::ImplicitCastExprClass) {
3383 ImplicitCastExpr *I = static_cast<ImplicitCastExpr *>(arg);
3384 auto *subExpr = I->getSubExprAsWritten();
3386 if(subExpr->getStmtClass() != Stmt::StringLiteralClass){
3390 S = static_cast<StringLiteral *>(I->getSubExprAsWritten());
3391 } else if (arg->getStmtClass() == Stmt::StringLiteralClass) {
3392 S = static_cast<StringLiteral *>(callExpr->getArg(0));
3400 CXEvalResultKind EvalType;
3408 void clang_EvalResult_dispose(CXEvalResult E) {
3409 ExprEvalResult *ER = (ExprEvalResult *)E;
3411 CXEvalResultKind evalType = ER->EvalType;
3413 if (evalType != CXEval_UnExposed && evalType != CXEval_Float &&
3414 evalType != CXEval_Int && ER->EvalData.stringVal) {
3415 free((void *) ER->EvalData.stringVal);
3421 CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) {
3423 return CXEval_UnExposed;
3425 return ((ExprEvalResult *)E)->EvalType;
3428 int clang_EvalResult_getAsInt(CXEvalResult E) {
3432 return ((ExprEvalResult *)E)->EvalData.intVal;
3435 double clang_EvalResult_getAsDouble(CXEvalResult E) {
3439 return ((ExprEvalResult *)E)->EvalData.floatVal;
3442 const char* clang_EvalResult_getAsStr(CXEvalResult E) {
3446 return ((ExprEvalResult *)E)->EvalData.stringVal;
3449 static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
3450 Expr::EvalResult ER;
3451 ASTContext &ctx = getCursorContext(C);
3455 expr = expr->IgnoreParens();
3456 bool res = expr->EvaluateAsRValue(ER, ctx);
3459 ExprEvalResult *result = (ExprEvalResult *) malloc(sizeof(ExprEvalResult));
3463 result->EvalType = CXEval_UnExposed;
3467 if (ER.Val.isInt()) {
3468 result->EvalType = CXEval_Int;
3469 result->EvalData.intVal = ER.Val.getInt().getExtValue();
3471 } else if (ER.Val.isFloat()) {
3473 llvm::SmallVector<char, 100> Buffer;
3474 ER.Val.getFloat().toString(Buffer);
3475 std::string floatStr(Buffer.data(), Buffer.size());
3476 result->EvalType = CXEval_Float;
3478 llvm::APFloat apFloat = ER.Val.getFloat();
3479 apFloat.convert(llvm::APFloat::IEEEdouble,
3480 llvm::APFloat::rmNearestTiesToEven, &ignored);
3481 result->EvalData.floatVal = apFloat.convertToDouble();
3484 } else if (expr->getStmtClass() == Stmt::ImplicitCastExprClass) {
3486 const ImplicitCastExpr *I = dyn_cast<ImplicitCastExpr>(expr);
3487 auto *subExpr = I->getSubExprAsWritten();
3488 if (subExpr->getStmtClass() == Stmt::StringLiteralClass ||
3489 subExpr->getStmtClass() == Stmt::ObjCStringLiteralClass) {
3491 const StringLiteral *StrE = nullptr;
3492 const ObjCStringLiteral *ObjCExpr;
3493 ObjCExpr = dyn_cast<ObjCStringLiteral>(subExpr);
3496 StrE = ObjCExpr->getString();
3497 result->EvalType = CXEval_ObjCStrLiteral;
3499 StrE = cast<StringLiteral>(I->getSubExprAsWritten());
3500 result->EvalType = CXEval_StrLiteral;
3503 std::string strRef(StrE->getString().str());
3504 result->EvalData.stringVal = (char *)malloc(strRef.size()+1);
3505 strncpy((char*)result->EvalData.stringVal, strRef.c_str(),
3507 result->EvalData.stringVal[strRef.size()] = '\0';
3511 } else if (expr->getStmtClass() == Stmt::ObjCStringLiteralClass ||
3512 expr->getStmtClass() == Stmt::StringLiteralClass) {
3514 const StringLiteral *StrE = nullptr;
3515 const ObjCStringLiteral *ObjCExpr;
3516 ObjCExpr = dyn_cast<ObjCStringLiteral>(expr);
3519 StrE = ObjCExpr->getString();
3520 result->EvalType = CXEval_ObjCStrLiteral;
3522 StrE = cast<StringLiteral>(expr);
3523 result->EvalType = CXEval_StrLiteral;
3526 std::string strRef(StrE->getString().str());
3527 result->EvalData.stringVal = (char *)malloc(strRef.size()+1);
3528 strncpy((char*)result->EvalData.stringVal, strRef.c_str(),
3530 result->EvalData.stringVal[strRef.size()] = '\0';
3533 } else if (expr->getStmtClass() == Stmt::CStyleCastExprClass) {
3535 CStyleCastExpr *CC = static_cast<CStyleCastExpr *>(expr);
3537 rettype = CC->getType();
3538 if (rettype.getAsString() == "CFStringRef" &&
3539 CC->getSubExpr()->getStmtClass() == Stmt::CallExprClass) {
3541 callExpr = static_cast<CallExpr *>(CC->getSubExpr());
3542 StringLiteral* S = getCFSTR_value(callExpr);
3544 std::string strLiteral(S->getString().str());
3545 result->EvalType = CXEval_CFStr;
3547 result->EvalData.stringVal = (char *)malloc(strLiteral.size()+1);
3548 strncpy((char*)result->EvalData.stringVal, strLiteral.c_str(),
3550 result->EvalData.stringVal[strLiteral.size()] = '\0';
3555 } else if (expr->getStmtClass() == Stmt::CallExprClass) {
3557 callExpr = static_cast<CallExpr *>(expr);
3558 rettype = callExpr->getCallReturnType(ctx);
3560 if (rettype->isVectorType() || callExpr->getNumArgs() > 1) {
3563 if (rettype->isIntegralType(ctx) || rettype->isRealFloatingType()) {
3564 if(callExpr->getNumArgs() == 1 &&
3565 !callExpr->getArg(0)->getType()->isIntegralType(ctx)){
3569 } else if(rettype.getAsString() == "CFStringRef") {
3571 StringLiteral* S = getCFSTR_value(callExpr);
3573 std::string strLiteral(S->getString().str());
3574 result->EvalType = CXEval_CFStr;
3575 result->EvalData.stringVal = (char *)malloc(strLiteral.size()+1);
3576 strncpy((char*)result->EvalData.stringVal, strLiteral.c_str(),
3578 result->EvalData.stringVal[strLiteral.size()] = '\0';
3583 } else if (expr->getStmtClass() == Stmt::DeclRefExprClass) {
3585 DeclRefExpr *D = static_cast<DeclRefExpr *>(expr);
3586 ValueDecl *V = D->getDecl();
3587 if (V->getKind() == Decl::Function) {
3588 std::string strName(V->getNameAsString());
3589 result->EvalType = CXEval_Other;
3590 result->EvalData.stringVal = (char *)malloc(strName.size()+1);
3591 strncpy((char*)result->EvalData.stringVal, strName.c_str(),
3593 result->EvalData.stringVal[strName.size()] = '\0';
3600 clang_EvalResult_dispose((CXEvalResult *)result);
3604 CXEvalResult clang_Cursor_Evaluate(CXCursor C) {
3605 const Decl *D = getCursorDecl(C);
3607 const Expr *expr = nullptr;
3608 if (auto *Var = dyn_cast<VarDecl>(D)) {
3609 expr = Var->getInit();
3610 } else if (auto *Field = dyn_cast<FieldDecl>(D)) {
3611 expr = Field->getInClassInitializer();
3614 return const_cast<CXEvalResult>(reinterpret_cast<const void *>(
3615 evaluateExpr(const_cast<Expr *>(expr), C)));
3619 const CompoundStmt *compoundStmt = dyn_cast_or_null<CompoundStmt>(getCursorStmt(C));
3621 Expr *expr = nullptr;
3622 for (auto *bodyIterator : compoundStmt->body()) {
3623 if ((expr = dyn_cast<Expr>(bodyIterator))) {
3628 return const_cast<CXEvalResult>(
3629 reinterpret_cast<const void *>(evaluateExpr(expr, C)));
3634 unsigned clang_Cursor_hasAttrs(CXCursor C) {
3635 const Decl *D = getCursorDecl(C);
3640 if (D->hasAttrs()) {
3646 unsigned clang_defaultSaveOptions(CXTranslationUnit TU) {
3647 return CXSaveTranslationUnit_None;
3650 static CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU,
3651 const char *FileName,
3653 CIndexer *CXXIdx = TU->CIdx;
3654 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
3655 setThreadBackgroundPriority();
3657 bool hadError = cxtu::getASTUnit(TU)->Save(FileName);
3658 return hadError ? CXSaveError_Unknown : CXSaveError_None;
3661 int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
3664 *Log << TU << ' ' << FileName;
3667 if (isNotUsableTU(TU)) {
3669 return CXSaveError_InvalidTU;
3672 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3673 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3674 if (!CXXUnit->hasSema())
3675 return CXSaveError_InvalidTU;
3678 auto SaveTranslationUnitImpl = [=, &result]() {
3679 result = clang_saveTranslationUnit_Impl(TU, FileName, options);
3682 if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() ||
3683 getenv("LIBCLANG_NOTHREADS")) {
3684 SaveTranslationUnitImpl();
3686 if (getenv("LIBCLANG_RESOURCE_USAGE"))
3687 PrintLibclangResourceUsage(TU);
3692 // We have an AST that has invalid nodes due to compiler errors.
3693 // Use a crash recovery thread for protection.
3695 llvm::CrashRecoveryContext CRC;
3697 if (!RunSafely(CRC, SaveTranslationUnitImpl)) {
3698 fprintf(stderr, "libclang: crash detected during AST saving: {\n");
3699 fprintf(stderr, " 'filename' : '%s'\n", FileName);
3700 fprintf(stderr, " 'options' : %d,\n", options);
3701 fprintf(stderr, "}\n");
3703 return CXSaveError_Unknown;
3705 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
3706 PrintLibclangResourceUsage(TU);
3712 void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
3714 // If the translation unit has been marked as unsafe to free, just discard
3716 ASTUnit *Unit = cxtu::getASTUnit(CTUnit);
3717 if (Unit && Unit->isUnsafeToFree())
3720 delete cxtu::getASTUnit(CTUnit);
3721 delete CTUnit->StringPool;
3722 delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics);
3723 disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool);
3724 delete CTUnit->CommentToXML;
3729 unsigned clang_defaultReparseOptions(CXTranslationUnit TU) {
3730 return CXReparse_None;
3734 clang_reparseTranslationUnit_Impl(CXTranslationUnit TU,
3735 ArrayRef<CXUnsavedFile> unsaved_files,
3738 if (isNotUsableTU(TU)) {
3740 return CXError_InvalidArguments;
3743 // Reset the associated diagnostics.
3744 delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics);
3745 TU->Diagnostics = nullptr;
3747 CIndexer *CXXIdx = TU->CIdx;
3748 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
3749 setThreadBackgroundPriority();
3751 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3752 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3754 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles(
3755 new std::vector<ASTUnit::RemappedFile>());
3757 // Recover resources if we crash before exiting this function.
3758 llvm::CrashRecoveryContextCleanupRegistrar<
3759 std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
3761 for (auto &UF : unsaved_files) {
3762 std::unique_ptr<llvm::MemoryBuffer> MB =
3763 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
3764 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
3767 if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(),
3768 *RemappedFiles.get()))
3769 return CXError_Success;
3770 if (isASTReadError(CXXUnit))
3771 return CXError_ASTReadError;
3772 return CXError_Failure;
3775 int clang_reparseTranslationUnit(CXTranslationUnit TU,
3776 unsigned num_unsaved_files,
3777 struct CXUnsavedFile *unsaved_files,
3783 if (num_unsaved_files && !unsaved_files)
3784 return CXError_InvalidArguments;
3787 auto ReparseTranslationUnitImpl = [=, &result]() {
3788 result = clang_reparseTranslationUnit_Impl(
3789 TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options);
3792 if (getenv("LIBCLANG_NOTHREADS")) {
3793 ReparseTranslationUnitImpl();
3797 llvm::CrashRecoveryContext CRC;
3799 if (!RunSafely(CRC, ReparseTranslationUnitImpl)) {
3800 fprintf(stderr, "libclang: crash detected during reparsing\n");
3801 cxtu::getASTUnit(TU)->setUnsafeToFree(true);
3802 return CXError_Crashed;
3803 } else if (getenv("LIBCLANG_RESOURCE_USAGE"))
3804 PrintLibclangResourceUsage(TU);
3810 CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
3811 if (isNotUsableTU(CTUnit)) {
3813 return cxstring::createEmpty();
3816 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit);
3817 return cxstring::createDup(CXXUnit->getOriginalSourceFileName());
3820 CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
3821 if (isNotUsableTU(TU)) {
3823 return clang_getNullCursor();
3826 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3827 return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU);
3830 } // end: extern "C"
3832 //===----------------------------------------------------------------------===//
3833 // CXFile Operations.
3834 //===----------------------------------------------------------------------===//
3837 CXString clang_getFileName(CXFile SFile) {
3839 return cxstring::createNull();
3841 FileEntry *FEnt = static_cast<FileEntry *>(SFile);
3842 return cxstring::createRef(FEnt->getName());
3845 time_t clang_getFileTime(CXFile SFile) {
3849 FileEntry *FEnt = static_cast<FileEntry *>(SFile);
3850 return FEnt->getModificationTime();
3853 CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) {
3854 if (isNotUsableTU(TU)) {
3859 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3861 FileManager &FMgr = CXXUnit->getFileManager();
3862 return const_cast<FileEntry *>(FMgr.getFile(file_name));
3865 unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU,
3867 if (isNotUsableTU(TU)) {
3875 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3876 FileEntry *FEnt = static_cast<FileEntry *>(file);
3877 return CXXUnit->getPreprocessor().getHeaderSearchInfo()
3878 .isFileMultipleIncludeGuarded(FEnt);
3881 int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) {
3882 if (!file || !outID)
3885 FileEntry *FEnt = static_cast<FileEntry *>(file);
3886 const llvm::sys::fs::UniqueID &ID = FEnt->getUniqueID();
3887 outID->data[0] = ID.getDevice();
3888 outID->data[1] = ID.getFile();
3889 outID->data[2] = FEnt->getModificationTime();
3893 int clang_File_isEqual(CXFile file1, CXFile file2) {
3897 if (!file1 || !file2)
3900 FileEntry *FEnt1 = static_cast<FileEntry *>(file1);
3901 FileEntry *FEnt2 = static_cast<FileEntry *>(file2);
3902 return FEnt1->getUniqueID() == FEnt2->getUniqueID();
3905 } // end: extern "C"
3907 //===----------------------------------------------------------------------===//
3908 // CXCursor Operations.
3909 //===----------------------------------------------------------------------===//
3911 static const Decl *getDeclFromExpr(const Stmt *E) {
3912 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
3913 return getDeclFromExpr(CE->getSubExpr());
3915 if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
3916 return RefExpr->getDecl();
3917 if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
3918 return ME->getMemberDecl();
3919 if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
3920 return RE->getDecl();
3921 if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) {
3922 if (PRE->isExplicitProperty())
3923 return PRE->getExplicitProperty();
3924 // It could be messaging both getter and setter as in:
3926 // in which case prefer to associate the setter since it is less obvious
3927 // from inspecting the source that the setter is going to get called.
3928 if (PRE->isMessagingSetter())
3929 return PRE->getImplicitPropertySetter();
3930 return PRE->getImplicitPropertyGetter();
3932 if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
3933 return getDeclFromExpr(POE->getSyntacticForm());
3934 if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
3935 if (Expr *Src = OVE->getSourceExpr())
3936 return getDeclFromExpr(Src);
3938 if (const CallExpr *CE = dyn_cast<CallExpr>(E))
3939 return getDeclFromExpr(CE->getCallee());
3940 if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
3941 if (!CE->isElidable())
3942 return CE->getConstructor();
3943 if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
3944 return OME->getMethodDecl();
3946 if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
3947 return PE->getProtocol();
3948 if (const SubstNonTypeTemplateParmPackExpr *NTTP
3949 = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E))
3950 return NTTP->getParameterPack();
3951 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
3952 if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) ||
3953 isa<ParmVarDecl>(SizeOfPack->getPack()))
3954 return SizeOfPack->getPack();
3959 static SourceLocation getLocationFromExpr(const Expr *E) {
3960 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
3961 return getLocationFromExpr(CE->getSubExpr());
3963 if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
3964 return /*FIXME:*/Msg->getLeftLoc();
3965 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
3966 return DRE->getLocation();
3967 if (const MemberExpr *Member = dyn_cast<MemberExpr>(E))
3968 return Member->getMemberLoc();
3969 if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
3970 return Ivar->getLocation();
3971 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
3972 return SizeOfPack->getPackLoc();
3973 if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E))
3974 return PropRef->getLocation();
3976 return E->getLocStart();
3979 static std::string getMangledStructor(std::unique_ptr<MangleContext> &M,
3980 std::unique_ptr<llvm::DataLayout> &DL,
3981 const NamedDecl *ND,
3982 unsigned StructorType) {
3983 std::string FrontendBuf;
3984 llvm::raw_string_ostream FOS(FrontendBuf);
3986 if (const auto *CD = dyn_cast_or_null<CXXConstructorDecl>(ND))
3987 M->mangleCXXCtor(CD, static_cast<CXXCtorType>(StructorType), FOS);
3988 else if (const auto *DD = dyn_cast_or_null<CXXDestructorDecl>(ND))
3989 M->mangleCXXDtor(DD, static_cast<CXXDtorType>(StructorType), FOS);
3991 std::string BackendBuf;
3992 llvm::raw_string_ostream BOS(BackendBuf);
3994 llvm::Mangler::getNameWithPrefix(BOS, llvm::Twine(FOS.str()), *DL);
4001 unsigned clang_visitChildren(CXCursor parent,
4002 CXCursorVisitor visitor,
4003 CXClientData client_data) {
4004 CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data,
4005 /*VisitPreprocessorLast=*/false);
4006 return CursorVis.VisitChildren(parent);
4009 #ifndef __has_feature
4010 #define __has_feature(x) 0
4012 #if __has_feature(blocks)
4013 typedef enum CXChildVisitResult
4014 (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent);
4016 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
4017 CXClientData client_data) {
4018 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
4019 return block(cursor, parent);
4022 // If we are compiled with a compiler that doesn't have native blocks support,
4023 // define and call the block manually, so the
4024 typedef struct _CXChildVisitResult
4029 enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor,
4031 } *CXCursorVisitorBlock;
4033 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
4034 CXClientData client_data) {
4035 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
4036 return block->invoke(block, cursor, parent);
4041 unsigned clang_visitChildrenWithBlock(CXCursor parent,
4042 CXCursorVisitorBlock block) {
4043 return clang_visitChildren(parent, visitWithBlock, block);
4046 static CXString getDeclSpelling(const Decl *D) {
4048 return cxstring::createEmpty();
4050 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
4052 if (const ObjCPropertyImplDecl *PropImpl =
4053 dyn_cast<ObjCPropertyImplDecl>(D))
4054 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
4055 return cxstring::createDup(Property->getIdentifier()->getName());
4057 if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D))
4058 if (Module *Mod = ImportD->getImportedModule())
4059 return cxstring::createDup(Mod->getFullModuleName());
4061 return cxstring::createEmpty();
4064 if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
4065 return cxstring::createDup(OMD->getSelector().getAsString());
4067 if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
4068 // No, this isn't the same as the code below. getIdentifier() is non-virtual
4069 // and returns different names. NamedDecl returns the class name and
4070 // ObjCCategoryImplDecl returns the category name.
4071 return cxstring::createRef(CIMP->getIdentifier()->getNameStart());
4073 if (isa<UsingDirectiveDecl>(D))
4074 return cxstring::createEmpty();
4076 SmallString<1024> S;
4077 llvm::raw_svector_ostream os(S);
4080 return cxstring::createDup(os.str());
4083 CXString clang_getCursorSpelling(CXCursor C) {
4084 if (clang_isTranslationUnit(C.kind))
4085 return clang_getTranslationUnitSpelling(getCursorTU(C));
4087 if (clang_isReference(C.kind)) {
4089 case CXCursor_ObjCSuperClassRef: {
4090 const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
4091 return cxstring::createRef(Super->getIdentifier()->getNameStart());
4093 case CXCursor_ObjCClassRef: {
4094 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
4095 return cxstring::createRef(Class->getIdentifier()->getNameStart());
4097 case CXCursor_ObjCProtocolRef: {
4098 const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
4099 assert(OID && "getCursorSpelling(): Missing protocol decl");
4100 return cxstring::createRef(OID->getIdentifier()->getNameStart());
4102 case CXCursor_CXXBaseSpecifier: {
4103 const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
4104 return cxstring::createDup(B->getType().getAsString());
4106 case CXCursor_TypeRef: {
4107 const TypeDecl *Type = getCursorTypeRef(C).first;
4108 assert(Type && "Missing type decl");
4110 return cxstring::createDup(getCursorContext(C).getTypeDeclType(Type).
4113 case CXCursor_TemplateRef: {
4114 const TemplateDecl *Template = getCursorTemplateRef(C).first;
4115 assert(Template && "Missing template decl");
4117 return cxstring::createDup(Template->getNameAsString());
4120 case CXCursor_NamespaceRef: {
4121 const NamedDecl *NS = getCursorNamespaceRef(C).first;
4122 assert(NS && "Missing namespace decl");
4124 return cxstring::createDup(NS->getNameAsString());
4127 case CXCursor_MemberRef: {
4128 const FieldDecl *Field = getCursorMemberRef(C).first;
4129 assert(Field && "Missing member decl");
4131 return cxstring::createDup(Field->getNameAsString());
4134 case CXCursor_LabelRef: {
4135 const LabelStmt *Label = getCursorLabelRef(C).first;
4136 assert(Label && "Missing label");
4138 return cxstring::createRef(Label->getName());
4141 case CXCursor_OverloadedDeclRef: {
4142 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
4143 if (const Decl *D = Storage.dyn_cast<const Decl *>()) {
4144 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
4145 return cxstring::createDup(ND->getNameAsString());
4146 return cxstring::createEmpty();
4148 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
4149 return cxstring::createDup(E->getName().getAsString());
4150 OverloadedTemplateStorage *Ovl
4151 = Storage.get<OverloadedTemplateStorage*>();
4152 if (Ovl->size() == 0)
4153 return cxstring::createEmpty();
4154 return cxstring::createDup((*Ovl->begin())->getNameAsString());
4157 case CXCursor_VariableRef: {
4158 const VarDecl *Var = getCursorVariableRef(C).first;
4159 assert(Var && "Missing variable decl");
4161 return cxstring::createDup(Var->getNameAsString());
4165 return cxstring::createRef("<not implemented>");
4169 if (clang_isExpression(C.kind)) {
4170 const Expr *E = getCursorExpr(C);
4172 if (C.kind == CXCursor_ObjCStringLiteral ||
4173 C.kind == CXCursor_StringLiteral) {
4174 const StringLiteral *SLit;
4175 if (const ObjCStringLiteral *OSL = dyn_cast<ObjCStringLiteral>(E)) {
4176 SLit = OSL->getString();
4178 SLit = cast<StringLiteral>(E);
4180 SmallString<256> Buf;
4181 llvm::raw_svector_ostream OS(Buf);
4182 SLit->outputString(OS);
4183 return cxstring::createDup(OS.str());
4186 const Decl *D = getDeclFromExpr(getCursorExpr(C));
4188 return getDeclSpelling(D);
4189 return cxstring::createEmpty();
4192 if (clang_isStatement(C.kind)) {
4193 const Stmt *S = getCursorStmt(C);
4194 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
4195 return cxstring::createRef(Label->getName());
4197 return cxstring::createEmpty();
4200 if (C.kind == CXCursor_MacroExpansion)
4201 return cxstring::createRef(getCursorMacroExpansion(C).getName()
4204 if (C.kind == CXCursor_MacroDefinition)
4205 return cxstring::createRef(getCursorMacroDefinition(C)->getName()
4208 if (C.kind == CXCursor_InclusionDirective)
4209 return cxstring::createDup(getCursorInclusionDirective(C)->getFileName());
4211 if (clang_isDeclaration(C.kind))
4212 return getDeclSpelling(getCursorDecl(C));
4214 if (C.kind == CXCursor_AnnotateAttr) {
4215 const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C));
4216 return cxstring::createDup(AA->getAnnotation());
4219 if (C.kind == CXCursor_AsmLabelAttr) {
4220 const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C));
4221 return cxstring::createDup(AA->getLabel());
4224 if (C.kind == CXCursor_PackedAttr) {
4225 return cxstring::createRef("packed");
4228 if (C.kind == CXCursor_VisibilityAttr) {
4229 const VisibilityAttr *AA = cast<VisibilityAttr>(cxcursor::getCursorAttr(C));
4230 switch (AA->getVisibility()) {
4231 case VisibilityAttr::VisibilityType::Default:
4232 return cxstring::createRef("default");
4233 case VisibilityAttr::VisibilityType::Hidden:
4234 return cxstring::createRef("hidden");
4235 case VisibilityAttr::VisibilityType::Protected:
4236 return cxstring::createRef("protected");
4238 llvm_unreachable("unknown visibility type");
4241 return cxstring::createEmpty();
4244 CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C,
4245 unsigned pieceIndex,
4247 if (clang_Cursor_isNull(C))
4248 return clang_getNullRange();
4250 ASTContext &Ctx = getCursorContext(C);
4252 if (clang_isStatement(C.kind)) {
4253 const Stmt *S = getCursorStmt(C);
4254 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) {
4256 return clang_getNullRange();
4257 return cxloc::translateSourceRange(Ctx, Label->getIdentLoc());
4260 return clang_getNullRange();
4263 if (C.kind == CXCursor_ObjCMessageExpr) {
4264 if (const ObjCMessageExpr *
4265 ME = dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) {
4266 if (pieceIndex >= ME->getNumSelectorLocs())
4267 return clang_getNullRange();
4268 return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex));
4272 if (C.kind == CXCursor_ObjCInstanceMethodDecl ||
4273 C.kind == CXCursor_ObjCClassMethodDecl) {
4274 if (const ObjCMethodDecl *
4275 MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) {
4276 if (pieceIndex >= MD->getNumSelectorLocs())
4277 return clang_getNullRange();
4278 return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex));
4282 if (C.kind == CXCursor_ObjCCategoryDecl ||
4283 C.kind == CXCursor_ObjCCategoryImplDecl) {
4285 return clang_getNullRange();
4286 if (const ObjCCategoryDecl *
4287 CD = dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C)))
4288 return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc());
4289 if (const ObjCCategoryImplDecl *
4290 CID = dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C)))
4291 return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc());
4294 if (C.kind == CXCursor_ModuleImportDecl) {
4296 return clang_getNullRange();
4297 if (const ImportDecl *ImportD =
4298 dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) {
4299 ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs();
4301 return cxloc::translateSourceRange(Ctx,
4302 SourceRange(Locs.front(), Locs.back()));
4304 return clang_getNullRange();
4307 if (C.kind == CXCursor_CXXMethod || C.kind == CXCursor_Destructor ||
4308 C.kind == CXCursor_ConversionFunction) {
4310 return clang_getNullRange();
4311 if (const FunctionDecl *FD =
4312 dyn_cast_or_null<FunctionDecl>(getCursorDecl(C))) {
4313 DeclarationNameInfo FunctionName = FD->getNameInfo();
4314 return cxloc::translateSourceRange(Ctx, FunctionName.getSourceRange());
4316 return clang_getNullRange();
4319 // FIXME: A CXCursor_InclusionDirective should give the location of the
4320 // filename, but we don't keep track of this.
4322 // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation
4323 // but we don't keep track of this.
4325 // FIXME: A CXCursor_AsmLabelAttr should give the location of the label
4326 // but we don't keep track of this.
4328 // Default handling, give the location of the cursor.
4331 return clang_getNullRange();
4333 CXSourceLocation CXLoc = clang_getCursorLocation(C);
4334 SourceLocation Loc = cxloc::translateSourceLocation(CXLoc);
4335 return cxloc::translateSourceRange(Ctx, Loc);
4338 CXString clang_Cursor_getMangling(CXCursor C) {
4339 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
4340 return cxstring::createEmpty();
4342 // Mangling only works for functions and variables.
4343 const Decl *D = getCursorDecl(C);
4344 if (!D || !(isa<FunctionDecl>(D) || isa<VarDecl>(D)))
4345 return cxstring::createEmpty();
4347 // First apply frontend mangling.
4348 const NamedDecl *ND = cast<NamedDecl>(D);
4349 ASTContext &Ctx = ND->getASTContext();
4350 std::unique_ptr<MangleContext> MC(Ctx.createMangleContext());
4352 std::string FrontendBuf;
4353 llvm::raw_string_ostream FrontendBufOS(FrontendBuf);
4354 if (MC->shouldMangleDeclName(ND)) {
4355 MC->mangleName(ND, FrontendBufOS);
4357 ND->printName(FrontendBufOS);
4360 // Now apply backend mangling.
4361 std::unique_ptr<llvm::DataLayout> DL(
4362 new llvm::DataLayout(Ctx.getTargetInfo().getDataLayoutString()));
4364 std::string FinalBuf;
4365 llvm::raw_string_ostream FinalBufOS(FinalBuf);
4366 llvm::Mangler::getNameWithPrefix(FinalBufOS, llvm::Twine(FrontendBufOS.str()),
4369 return cxstring::createDup(FinalBufOS.str());
4372 static std::string getMangledName(std::unique_ptr<MangleContext> &M,
4373 std::unique_ptr<llvm::DataLayout> &DL,
4374 const NamedDecl *ND) {
4375 std::string FrontendBuf;
4376 llvm::raw_string_ostream FOS(FrontendBuf);
4378 M->mangleName(ND, FOS);
4380 std::string BackendBuf;
4381 llvm::raw_string_ostream BOS(BackendBuf);
4383 llvm::Mangler::getNameWithPrefix(BOS, llvm::Twine(FOS.str()), *DL);
4388 static std::string getMangledThunk(std::unique_ptr<MangleContext> &M,
4389 std::unique_ptr<llvm::DataLayout> &DL,
4390 const CXXMethodDecl *MD, const ThunkInfo &T) {
4391 std::string FrontendBuf;
4392 llvm::raw_string_ostream FOS(FrontendBuf);
4394 M->mangleThunk(MD, T, FOS);
4396 std::string BackendBuf;
4397 llvm::raw_string_ostream BOS(BackendBuf);
4399 llvm::Mangler::getNameWithPrefix(BOS, llvm::Twine(FOS.str()), *DL);
4404 CXStringSet *clang_Cursor_getCXXManglings(CXCursor C) {
4405 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
4408 const Decl *D = getCursorDecl(C);
4409 if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D)))
4412 const NamedDecl *ND = cast<NamedDecl>(D);
4414 ASTContext &Ctx = ND->getASTContext();
4415 std::unique_ptr<MangleContext> M(Ctx.createMangleContext());
4416 std::unique_ptr<llvm::DataLayout> DL(
4417 new llvm::DataLayout(Ctx.getTargetInfo().getDataLayoutString()));
4419 std::vector<std::string> Manglings;
4421 auto hasDefaultCXXMethodCC = [](ASTContext &C, const CXXMethodDecl *MD) {
4422 auto DefaultCC = C.getDefaultCallingConvention(/*IsVariadic=*/false,
4423 /*IsCSSMethod=*/true);
4424 auto CC = MD->getType()->getAs<FunctionProtoType>()->getCallConv();
4425 return CC == DefaultCC;
4428 if (const auto *CD = dyn_cast_or_null<CXXConstructorDecl>(ND)) {
4429 Manglings.emplace_back(getMangledStructor(M, DL, CD, Ctor_Base));
4431 if (Ctx.getTargetInfo().getCXXABI().isItaniumFamily())
4432 if (!CD->getParent()->isAbstract())
4433 Manglings.emplace_back(getMangledStructor(M, DL, CD, Ctor_Complete));
4435 if (Ctx.getTargetInfo().getCXXABI().isMicrosoft())
4436 if (CD->hasAttr<DLLExportAttr>() && CD->isDefaultConstructor())
4437 if (!(hasDefaultCXXMethodCC(Ctx, CD) && CD->getNumParams() == 0))
4438 Manglings.emplace_back(getMangledStructor(M, DL, CD,
4439 Ctor_DefaultClosure));
4440 } else if (const auto *DD = dyn_cast_or_null<CXXDestructorDecl>(ND)) {
4441 Manglings.emplace_back(getMangledStructor(M, DL, DD, Dtor_Base));
4442 if (Ctx.getTargetInfo().getCXXABI().isItaniumFamily()) {
4443 Manglings.emplace_back(getMangledStructor(M, DL, DD, Dtor_Complete));
4444 if (DD->isVirtual())
4445 Manglings.emplace_back(getMangledStructor(M, DL, DD, Dtor_Deleting));
4447 } else if (const auto *MD = dyn_cast_or_null<CXXMethodDecl>(ND)) {
4448 Manglings.emplace_back(getMangledName(M, DL, ND));
4449 if (MD->isVirtual())
4450 if (const auto *TIV = Ctx.getVTableContext()->getThunkInfo(MD))
4451 for (const auto &T : *TIV)
4452 Manglings.emplace_back(getMangledThunk(M, DL, MD, T));
4455 return cxstring::createSet(Manglings);
4458 CXString clang_getCursorDisplayName(CXCursor C) {
4459 if (!clang_isDeclaration(C.kind))
4460 return clang_getCursorSpelling(C);
4462 const Decl *D = getCursorDecl(C);
4464 return cxstring::createEmpty();
4466 PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy();
4467 if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
4468 D = FunTmpl->getTemplatedDecl();
4470 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
4471 SmallString<64> Str;
4472 llvm::raw_svector_ostream OS(Str);
4474 if (Function->getPrimaryTemplate())
4477 for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
4480 OS << Function->getParamDecl(I)->getType().getAsString(Policy);
4483 if (Function->isVariadic()) {
4484 if (Function->getNumParams())
4489 return cxstring::createDup(OS.str());
4492 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
4493 SmallString<64> Str;
4494 llvm::raw_svector_ostream OS(Str);
4495 OS << *ClassTemplate;
4497 TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
4498 for (unsigned I = 0, N = Params->size(); I != N; ++I) {
4502 NamedDecl *Param = Params->getParam(I);
4503 if (Param->getIdentifier()) {
4504 OS << Param->getIdentifier()->getName();
4508 // There is no parameter name, which makes this tricky. Try to come up
4509 // with something useful that isn't too long.
4510 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
4511 OS << (TTP->wasDeclaredWithTypename()? "typename" : "class");
4512 else if (NonTypeTemplateParmDecl *NTTP
4513 = dyn_cast<NonTypeTemplateParmDecl>(Param))
4514 OS << NTTP->getType().getAsString(Policy);
4516 OS << "template<...> class";
4520 return cxstring::createDup(OS.str());
4523 if (const ClassTemplateSpecializationDecl *ClassSpec
4524 = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
4525 // If the type was explicitly written, use that.
4526 if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
4527 return cxstring::createDup(TSInfo->getType().getAsString(Policy));
4529 SmallString<128> Str;
4530 llvm::raw_svector_ostream OS(Str);
4532 TemplateSpecializationType::PrintTemplateArgumentList(OS,
4533 ClassSpec->getTemplateArgs().data(),
4534 ClassSpec->getTemplateArgs().size(),
4536 return cxstring::createDup(OS.str());
4539 return clang_getCursorSpelling(C);
4542 CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
4544 case CXCursor_FunctionDecl:
4545 return cxstring::createRef("FunctionDecl");
4546 case CXCursor_TypedefDecl:
4547 return cxstring::createRef("TypedefDecl");
4548 case CXCursor_EnumDecl:
4549 return cxstring::createRef("EnumDecl");
4550 case CXCursor_EnumConstantDecl:
4551 return cxstring::createRef("EnumConstantDecl");
4552 case CXCursor_StructDecl:
4553 return cxstring::createRef("StructDecl");
4554 case CXCursor_UnionDecl:
4555 return cxstring::createRef("UnionDecl");
4556 case CXCursor_ClassDecl:
4557 return cxstring::createRef("ClassDecl");
4558 case CXCursor_FieldDecl:
4559 return cxstring::createRef("FieldDecl");
4560 case CXCursor_VarDecl:
4561 return cxstring::createRef("VarDecl");
4562 case CXCursor_ParmDecl:
4563 return cxstring::createRef("ParmDecl");
4564 case CXCursor_ObjCInterfaceDecl:
4565 return cxstring::createRef("ObjCInterfaceDecl");
4566 case CXCursor_ObjCCategoryDecl:
4567 return cxstring::createRef("ObjCCategoryDecl");
4568 case CXCursor_ObjCProtocolDecl:
4569 return cxstring::createRef("ObjCProtocolDecl");
4570 case CXCursor_ObjCPropertyDecl:
4571 return cxstring::createRef("ObjCPropertyDecl");
4572 case CXCursor_ObjCIvarDecl:
4573 return cxstring::createRef("ObjCIvarDecl");
4574 case CXCursor_ObjCInstanceMethodDecl:
4575 return cxstring::createRef("ObjCInstanceMethodDecl");
4576 case CXCursor_ObjCClassMethodDecl:
4577 return cxstring::createRef("ObjCClassMethodDecl");
4578 case CXCursor_ObjCImplementationDecl:
4579 return cxstring::createRef("ObjCImplementationDecl");
4580 case CXCursor_ObjCCategoryImplDecl:
4581 return cxstring::createRef("ObjCCategoryImplDecl");
4582 case CXCursor_CXXMethod:
4583 return cxstring::createRef("CXXMethod");
4584 case CXCursor_UnexposedDecl:
4585 return cxstring::createRef("UnexposedDecl");
4586 case CXCursor_ObjCSuperClassRef:
4587 return cxstring::createRef("ObjCSuperClassRef");
4588 case CXCursor_ObjCProtocolRef:
4589 return cxstring::createRef("ObjCProtocolRef");
4590 case CXCursor_ObjCClassRef:
4591 return cxstring::createRef("ObjCClassRef");
4592 case CXCursor_TypeRef:
4593 return cxstring::createRef("TypeRef");
4594 case CXCursor_TemplateRef:
4595 return cxstring::createRef("TemplateRef");
4596 case CXCursor_NamespaceRef:
4597 return cxstring::createRef("NamespaceRef");
4598 case CXCursor_MemberRef:
4599 return cxstring::createRef("MemberRef");
4600 case CXCursor_LabelRef:
4601 return cxstring::createRef("LabelRef");
4602 case CXCursor_OverloadedDeclRef:
4603 return cxstring::createRef("OverloadedDeclRef");
4604 case CXCursor_VariableRef:
4605 return cxstring::createRef("VariableRef");
4606 case CXCursor_IntegerLiteral:
4607 return cxstring::createRef("IntegerLiteral");
4608 case CXCursor_FloatingLiteral:
4609 return cxstring::createRef("FloatingLiteral");
4610 case CXCursor_ImaginaryLiteral:
4611 return cxstring::createRef("ImaginaryLiteral");
4612 case CXCursor_StringLiteral:
4613 return cxstring::createRef("StringLiteral");
4614 case CXCursor_CharacterLiteral:
4615 return cxstring::createRef("CharacterLiteral");
4616 case CXCursor_ParenExpr:
4617 return cxstring::createRef("ParenExpr");
4618 case CXCursor_UnaryOperator:
4619 return cxstring::createRef("UnaryOperator");
4620 case CXCursor_ArraySubscriptExpr:
4621 return cxstring::createRef("ArraySubscriptExpr");
4622 case CXCursor_OMPArraySectionExpr:
4623 return cxstring::createRef("OMPArraySectionExpr");
4624 case CXCursor_BinaryOperator:
4625 return cxstring::createRef("BinaryOperator");
4626 case CXCursor_CompoundAssignOperator:
4627 return cxstring::createRef("CompoundAssignOperator");
4628 case CXCursor_ConditionalOperator:
4629 return cxstring::createRef("ConditionalOperator");
4630 case CXCursor_CStyleCastExpr:
4631 return cxstring::createRef("CStyleCastExpr");
4632 case CXCursor_CompoundLiteralExpr:
4633 return cxstring::createRef("CompoundLiteralExpr");
4634 case CXCursor_InitListExpr:
4635 return cxstring::createRef("InitListExpr");
4636 case CXCursor_AddrLabelExpr:
4637 return cxstring::createRef("AddrLabelExpr");
4638 case CXCursor_StmtExpr:
4639 return cxstring::createRef("StmtExpr");
4640 case CXCursor_GenericSelectionExpr:
4641 return cxstring::createRef("GenericSelectionExpr");
4642 case CXCursor_GNUNullExpr:
4643 return cxstring::createRef("GNUNullExpr");
4644 case CXCursor_CXXStaticCastExpr:
4645 return cxstring::createRef("CXXStaticCastExpr");
4646 case CXCursor_CXXDynamicCastExpr:
4647 return cxstring::createRef("CXXDynamicCastExpr");
4648 case CXCursor_CXXReinterpretCastExpr:
4649 return cxstring::createRef("CXXReinterpretCastExpr");
4650 case CXCursor_CXXConstCastExpr:
4651 return cxstring::createRef("CXXConstCastExpr");
4652 case CXCursor_CXXFunctionalCastExpr:
4653 return cxstring::createRef("CXXFunctionalCastExpr");
4654 case CXCursor_CXXTypeidExpr:
4655 return cxstring::createRef("CXXTypeidExpr");
4656 case CXCursor_CXXBoolLiteralExpr:
4657 return cxstring::createRef("CXXBoolLiteralExpr");
4658 case CXCursor_CXXNullPtrLiteralExpr:
4659 return cxstring::createRef("CXXNullPtrLiteralExpr");
4660 case CXCursor_CXXThisExpr:
4661 return cxstring::createRef("CXXThisExpr");
4662 case CXCursor_CXXThrowExpr:
4663 return cxstring::createRef("CXXThrowExpr");
4664 case CXCursor_CXXNewExpr:
4665 return cxstring::createRef("CXXNewExpr");
4666 case CXCursor_CXXDeleteExpr:
4667 return cxstring::createRef("CXXDeleteExpr");
4668 case CXCursor_UnaryExpr:
4669 return cxstring::createRef("UnaryExpr");
4670 case CXCursor_ObjCStringLiteral:
4671 return cxstring::createRef("ObjCStringLiteral");
4672 case CXCursor_ObjCBoolLiteralExpr:
4673 return cxstring::createRef("ObjCBoolLiteralExpr");
4674 case CXCursor_ObjCSelfExpr:
4675 return cxstring::createRef("ObjCSelfExpr");
4676 case CXCursor_ObjCEncodeExpr:
4677 return cxstring::createRef("ObjCEncodeExpr");
4678 case CXCursor_ObjCSelectorExpr:
4679 return cxstring::createRef("ObjCSelectorExpr");
4680 case CXCursor_ObjCProtocolExpr:
4681 return cxstring::createRef("ObjCProtocolExpr");
4682 case CXCursor_ObjCBridgedCastExpr:
4683 return cxstring::createRef("ObjCBridgedCastExpr");
4684 case CXCursor_BlockExpr:
4685 return cxstring::createRef("BlockExpr");
4686 case CXCursor_PackExpansionExpr:
4687 return cxstring::createRef("PackExpansionExpr");
4688 case CXCursor_SizeOfPackExpr:
4689 return cxstring::createRef("SizeOfPackExpr");
4690 case CXCursor_LambdaExpr:
4691 return cxstring::createRef("LambdaExpr");
4692 case CXCursor_UnexposedExpr:
4693 return cxstring::createRef("UnexposedExpr");
4694 case CXCursor_DeclRefExpr:
4695 return cxstring::createRef("DeclRefExpr");
4696 case CXCursor_MemberRefExpr:
4697 return cxstring::createRef("MemberRefExpr");
4698 case CXCursor_CallExpr:
4699 return cxstring::createRef("CallExpr");
4700 case CXCursor_ObjCMessageExpr:
4701 return cxstring::createRef("ObjCMessageExpr");
4702 case CXCursor_UnexposedStmt:
4703 return cxstring::createRef("UnexposedStmt");
4704 case CXCursor_DeclStmt:
4705 return cxstring::createRef("DeclStmt");
4706 case CXCursor_LabelStmt:
4707 return cxstring::createRef("LabelStmt");
4708 case CXCursor_CompoundStmt:
4709 return cxstring::createRef("CompoundStmt");
4710 case CXCursor_CaseStmt:
4711 return cxstring::createRef("CaseStmt");
4712 case CXCursor_DefaultStmt:
4713 return cxstring::createRef("DefaultStmt");
4714 case CXCursor_IfStmt:
4715 return cxstring::createRef("IfStmt");
4716 case CXCursor_SwitchStmt:
4717 return cxstring::createRef("SwitchStmt");
4718 case CXCursor_WhileStmt:
4719 return cxstring::createRef("WhileStmt");
4720 case CXCursor_DoStmt:
4721 return cxstring::createRef("DoStmt");
4722 case CXCursor_ForStmt:
4723 return cxstring::createRef("ForStmt");
4724 case CXCursor_GotoStmt:
4725 return cxstring::createRef("GotoStmt");
4726 case CXCursor_IndirectGotoStmt:
4727 return cxstring::createRef("IndirectGotoStmt");
4728 case CXCursor_ContinueStmt:
4729 return cxstring::createRef("ContinueStmt");
4730 case CXCursor_BreakStmt:
4731 return cxstring::createRef("BreakStmt");
4732 case CXCursor_ReturnStmt:
4733 return cxstring::createRef("ReturnStmt");
4734 case CXCursor_GCCAsmStmt:
4735 return cxstring::createRef("GCCAsmStmt");
4736 case CXCursor_MSAsmStmt:
4737 return cxstring::createRef("MSAsmStmt");
4738 case CXCursor_ObjCAtTryStmt:
4739 return cxstring::createRef("ObjCAtTryStmt");
4740 case CXCursor_ObjCAtCatchStmt:
4741 return cxstring::createRef("ObjCAtCatchStmt");
4742 case CXCursor_ObjCAtFinallyStmt:
4743 return cxstring::createRef("ObjCAtFinallyStmt");
4744 case CXCursor_ObjCAtThrowStmt:
4745 return cxstring::createRef("ObjCAtThrowStmt");
4746 case CXCursor_ObjCAtSynchronizedStmt:
4747 return cxstring::createRef("ObjCAtSynchronizedStmt");
4748 case CXCursor_ObjCAutoreleasePoolStmt:
4749 return cxstring::createRef("ObjCAutoreleasePoolStmt");
4750 case CXCursor_ObjCForCollectionStmt:
4751 return cxstring::createRef("ObjCForCollectionStmt");
4752 case CXCursor_CXXCatchStmt:
4753 return cxstring::createRef("CXXCatchStmt");
4754 case CXCursor_CXXTryStmt:
4755 return cxstring::createRef("CXXTryStmt");
4756 case CXCursor_CXXForRangeStmt:
4757 return cxstring::createRef("CXXForRangeStmt");
4758 case CXCursor_SEHTryStmt:
4759 return cxstring::createRef("SEHTryStmt");
4760 case CXCursor_SEHExceptStmt:
4761 return cxstring::createRef("SEHExceptStmt");
4762 case CXCursor_SEHFinallyStmt:
4763 return cxstring::createRef("SEHFinallyStmt");
4764 case CXCursor_SEHLeaveStmt:
4765 return cxstring::createRef("SEHLeaveStmt");
4766 case CXCursor_NullStmt:
4767 return cxstring::createRef("NullStmt");
4768 case CXCursor_InvalidFile:
4769 return cxstring::createRef("InvalidFile");
4770 case CXCursor_InvalidCode:
4771 return cxstring::createRef("InvalidCode");
4772 case CXCursor_NoDeclFound:
4773 return cxstring::createRef("NoDeclFound");
4774 case CXCursor_NotImplemented:
4775 return cxstring::createRef("NotImplemented");
4776 case CXCursor_TranslationUnit:
4777 return cxstring::createRef("TranslationUnit");
4778 case CXCursor_UnexposedAttr:
4779 return cxstring::createRef("UnexposedAttr");
4780 case CXCursor_IBActionAttr:
4781 return cxstring::createRef("attribute(ibaction)");
4782 case CXCursor_IBOutletAttr:
4783 return cxstring::createRef("attribute(iboutlet)");
4784 case CXCursor_IBOutletCollectionAttr:
4785 return cxstring::createRef("attribute(iboutletcollection)");
4786 case CXCursor_CXXFinalAttr:
4787 return cxstring::createRef("attribute(final)");
4788 case CXCursor_CXXOverrideAttr:
4789 return cxstring::createRef("attribute(override)");
4790 case CXCursor_AnnotateAttr:
4791 return cxstring::createRef("attribute(annotate)");
4792 case CXCursor_AsmLabelAttr:
4793 return cxstring::createRef("asm label");
4794 case CXCursor_PackedAttr:
4795 return cxstring::createRef("attribute(packed)");
4796 case CXCursor_PureAttr:
4797 return cxstring::createRef("attribute(pure)");
4798 case CXCursor_ConstAttr:
4799 return cxstring::createRef("attribute(const)");
4800 case CXCursor_NoDuplicateAttr:
4801 return cxstring::createRef("attribute(noduplicate)");
4802 case CXCursor_CUDAConstantAttr:
4803 return cxstring::createRef("attribute(constant)");
4804 case CXCursor_CUDADeviceAttr:
4805 return cxstring::createRef("attribute(device)");
4806 case CXCursor_CUDAGlobalAttr:
4807 return cxstring::createRef("attribute(global)");
4808 case CXCursor_CUDAHostAttr:
4809 return cxstring::createRef("attribute(host)");
4810 case CXCursor_CUDASharedAttr:
4811 return cxstring::createRef("attribute(shared)");
4812 case CXCursor_VisibilityAttr:
4813 return cxstring::createRef("attribute(visibility)");
4814 case CXCursor_DLLExport:
4815 return cxstring::createRef("attribute(dllexport)");
4816 case CXCursor_DLLImport:
4817 return cxstring::createRef("attribute(dllimport)");
4818 case CXCursor_PreprocessingDirective:
4819 return cxstring::createRef("preprocessing directive");
4820 case CXCursor_MacroDefinition:
4821 return cxstring::createRef("macro definition");
4822 case CXCursor_MacroExpansion:
4823 return cxstring::createRef("macro expansion");
4824 case CXCursor_InclusionDirective:
4825 return cxstring::createRef("inclusion directive");
4826 case CXCursor_Namespace:
4827 return cxstring::createRef("Namespace");
4828 case CXCursor_LinkageSpec:
4829 return cxstring::createRef("LinkageSpec");
4830 case CXCursor_CXXBaseSpecifier:
4831 return cxstring::createRef("C++ base class specifier");
4832 case CXCursor_Constructor:
4833 return cxstring::createRef("CXXConstructor");
4834 case CXCursor_Destructor:
4835 return cxstring::createRef("CXXDestructor");
4836 case CXCursor_ConversionFunction:
4837 return cxstring::createRef("CXXConversion");
4838 case CXCursor_TemplateTypeParameter:
4839 return cxstring::createRef("TemplateTypeParameter");
4840 case CXCursor_NonTypeTemplateParameter:
4841 return cxstring::createRef("NonTypeTemplateParameter");
4842 case CXCursor_TemplateTemplateParameter:
4843 return cxstring::createRef("TemplateTemplateParameter");
4844 case CXCursor_FunctionTemplate:
4845 return cxstring::createRef("FunctionTemplate");
4846 case CXCursor_ClassTemplate:
4847 return cxstring::createRef("ClassTemplate");
4848 case CXCursor_ClassTemplatePartialSpecialization:
4849 return cxstring::createRef("ClassTemplatePartialSpecialization");
4850 case CXCursor_NamespaceAlias:
4851 return cxstring::createRef("NamespaceAlias");
4852 case CXCursor_UsingDirective:
4853 return cxstring::createRef("UsingDirective");
4854 case CXCursor_UsingDeclaration:
4855 return cxstring::createRef("UsingDeclaration");
4856 case CXCursor_TypeAliasDecl:
4857 return cxstring::createRef("TypeAliasDecl");
4858 case CXCursor_ObjCSynthesizeDecl:
4859 return cxstring::createRef("ObjCSynthesizeDecl");
4860 case CXCursor_ObjCDynamicDecl:
4861 return cxstring::createRef("ObjCDynamicDecl");
4862 case CXCursor_CXXAccessSpecifier:
4863 return cxstring::createRef("CXXAccessSpecifier");
4864 case CXCursor_ModuleImportDecl:
4865 return cxstring::createRef("ModuleImport");
4866 case CXCursor_OMPParallelDirective:
4867 return cxstring::createRef("OMPParallelDirective");
4868 case CXCursor_OMPSimdDirective:
4869 return cxstring::createRef("OMPSimdDirective");
4870 case CXCursor_OMPForDirective:
4871 return cxstring::createRef("OMPForDirective");
4872 case CXCursor_OMPForSimdDirective:
4873 return cxstring::createRef("OMPForSimdDirective");
4874 case CXCursor_OMPSectionsDirective:
4875 return cxstring::createRef("OMPSectionsDirective");
4876 case CXCursor_OMPSectionDirective:
4877 return cxstring::createRef("OMPSectionDirective");
4878 case CXCursor_OMPSingleDirective:
4879 return cxstring::createRef("OMPSingleDirective");
4880 case CXCursor_OMPMasterDirective:
4881 return cxstring::createRef("OMPMasterDirective");
4882 case CXCursor_OMPCriticalDirective:
4883 return cxstring::createRef("OMPCriticalDirective");
4884 case CXCursor_OMPParallelForDirective:
4885 return cxstring::createRef("OMPParallelForDirective");
4886 case CXCursor_OMPParallelForSimdDirective:
4887 return cxstring::createRef("OMPParallelForSimdDirective");
4888 case CXCursor_OMPParallelSectionsDirective:
4889 return cxstring::createRef("OMPParallelSectionsDirective");
4890 case CXCursor_OMPTaskDirective:
4891 return cxstring::createRef("OMPTaskDirective");
4892 case CXCursor_OMPTaskyieldDirective:
4893 return cxstring::createRef("OMPTaskyieldDirective");
4894 case CXCursor_OMPBarrierDirective:
4895 return cxstring::createRef("OMPBarrierDirective");
4896 case CXCursor_OMPTaskwaitDirective:
4897 return cxstring::createRef("OMPTaskwaitDirective");
4898 case CXCursor_OMPTaskgroupDirective:
4899 return cxstring::createRef("OMPTaskgroupDirective");
4900 case CXCursor_OMPFlushDirective:
4901 return cxstring::createRef("OMPFlushDirective");
4902 case CXCursor_OMPOrderedDirective:
4903 return cxstring::createRef("OMPOrderedDirective");
4904 case CXCursor_OMPAtomicDirective:
4905 return cxstring::createRef("OMPAtomicDirective");
4906 case CXCursor_OMPTargetDirective:
4907 return cxstring::createRef("OMPTargetDirective");
4908 case CXCursor_OMPTargetDataDirective:
4909 return cxstring::createRef("OMPTargetDataDirective");
4910 case CXCursor_OMPTargetEnterDataDirective:
4911 return cxstring::createRef("OMPTargetEnterDataDirective");
4912 case CXCursor_OMPTargetExitDataDirective:
4913 return cxstring::createRef("OMPTargetExitDataDirective");
4914 case CXCursor_OMPTargetParallelDirective:
4915 return cxstring::createRef("OMPTargetParallelDirective");
4916 case CXCursor_OMPTargetParallelForDirective:
4917 return cxstring::createRef("OMPTargetParallelForDirective");
4918 case CXCursor_OMPTeamsDirective:
4919 return cxstring::createRef("OMPTeamsDirective");
4920 case CXCursor_OMPCancellationPointDirective:
4921 return cxstring::createRef("OMPCancellationPointDirective");
4922 case CXCursor_OMPCancelDirective:
4923 return cxstring::createRef("OMPCancelDirective");
4924 case CXCursor_OMPTaskLoopDirective:
4925 return cxstring::createRef("OMPTaskLoopDirective");
4926 case CXCursor_OMPTaskLoopSimdDirective:
4927 return cxstring::createRef("OMPTaskLoopSimdDirective");
4928 case CXCursor_OMPDistributeDirective:
4929 return cxstring::createRef("OMPDistributeDirective");
4930 case CXCursor_OverloadCandidate:
4931 return cxstring::createRef("OverloadCandidate");
4932 case CXCursor_TypeAliasTemplateDecl:
4933 return cxstring::createRef("TypeAliasTemplateDecl");
4936 llvm_unreachable("Unhandled CXCursorKind");
4939 struct GetCursorData {
4940 SourceLocation TokenBeginLoc;
4941 bool PointsAtMacroArgExpansion;
4942 bool VisitedObjCPropertyImplDecl;
4943 SourceLocation VisitedDeclaratorDeclStartLoc;
4944 CXCursor &BestCursor;
4946 GetCursorData(SourceManager &SM,
4947 SourceLocation tokenBegin, CXCursor &outputCursor)
4948 : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) {
4949 PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin);
4950 VisitedObjCPropertyImplDecl = false;
4954 static enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
4956 CXClientData client_data) {
4957 GetCursorData *Data = static_cast<GetCursorData *>(client_data);
4958 CXCursor *BestCursor = &Data->BestCursor;
4960 // If we point inside a macro argument we should provide info of what the
4961 // token is so use the actual cursor, don't replace it with a macro expansion
4963 if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion)
4964 return CXChildVisit_Recurse;
4966 if (clang_isDeclaration(cursor.kind)) {
4967 // Avoid having the implicit methods override the property decls.
4968 if (const ObjCMethodDecl *MD
4969 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
4970 if (MD->isImplicit())
4971 return CXChildVisit_Break;
4973 } else if (const ObjCInterfaceDecl *ID
4974 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) {
4975 // Check that when we have multiple @class references in the same line,
4976 // that later ones do not override the previous ones.
4979 // source ranges for both start at '@', so 'Bar' will end up overriding
4980 // 'Foo' even though the cursor location was at 'Foo'.
4981 if (BestCursor->kind == CXCursor_ObjCInterfaceDecl ||
4982 BestCursor->kind == CXCursor_ObjCClassRef)
4983 if (const ObjCInterfaceDecl *PrevID
4984 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(*BestCursor))){
4986 !PrevID->isThisDeclarationADefinition() &&
4987 !ID->isThisDeclarationADefinition())
4988 return CXChildVisit_Break;
4991 } else if (const DeclaratorDecl *DD
4992 = dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) {
4993 SourceLocation StartLoc = DD->getSourceRange().getBegin();
4994 // Check that when we have multiple declarators in the same line,
4995 // that later ones do not override the previous ones.
4998 // source ranges for both start at 'int', so 'Bar' will end up overriding
4999 // 'Foo' even though the cursor location was at 'Foo'.
5000 if (Data->VisitedDeclaratorDeclStartLoc == StartLoc)
5001 return CXChildVisit_Break;
5002 Data->VisitedDeclaratorDeclStartLoc = StartLoc;
5004 } else if (const ObjCPropertyImplDecl *PropImp
5005 = dyn_cast_or_null<ObjCPropertyImplDecl>(getCursorDecl(cursor))) {
5007 // Check that when we have multiple @synthesize in the same line,
5008 // that later ones do not override the previous ones.
5010 // @synthesize Foo, Bar;
5011 // source ranges for both start at '@', so 'Bar' will end up overriding
5012 // 'Foo' even though the cursor location was at 'Foo'.
5013 if (Data->VisitedObjCPropertyImplDecl)
5014 return CXChildVisit_Break;
5015 Data->VisitedObjCPropertyImplDecl = true;
5019 if (clang_isExpression(cursor.kind) &&
5020 clang_isDeclaration(BestCursor->kind)) {
5021 if (const Decl *D = getCursorDecl(*BestCursor)) {
5022 // Avoid having the cursor of an expression replace the declaration cursor
5023 // when the expression source range overlaps the declaration range.
5024 // This can happen for C++ constructor expressions whose range generally
5025 // include the variable declaration, e.g.:
5026 // MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor.
5027 if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() &&
5028 D->getLocation() == Data->TokenBeginLoc)
5029 return CXChildVisit_Break;
5033 // If our current best cursor is the construction of a temporary object,
5034 // don't replace that cursor with a type reference, because we want
5035 // clang_getCursor() to point at the constructor.
5036 if (clang_isExpression(BestCursor->kind) &&
5037 isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
5038 cursor.kind == CXCursor_TypeRef) {
5039 // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it
5040 // as having the actual point on the type reference.
5041 *BestCursor = getTypeRefedCallExprCursor(*BestCursor);
5042 return CXChildVisit_Recurse;
5045 // If we already have an Objective-C superclass reference, don't
5046 // update it further.
5047 if (BestCursor->kind == CXCursor_ObjCSuperClassRef)
5048 return CXChildVisit_Break;
5050 *BestCursor = cursor;
5051 return CXChildVisit_Recurse;
5054 CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
5055 if (isNotUsableTU(TU)) {
5057 return clang_getNullCursor();
5060 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5061 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
5063 SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
5064 CXCursor Result = cxcursor::getCursor(TU, SLoc);
5068 unsigned SearchLine, SearchColumn;
5070 unsigned ResultLine, ResultColumn;
5071 CXString SearchFileName, ResultFileName, KindSpelling, USR;
5072 const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : "";
5073 CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
5075 clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn,
5077 clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine,
5078 &ResultColumn, nullptr);
5079 SearchFileName = clang_getFileName(SearchFile);
5080 ResultFileName = clang_getFileName(ResultFile);
5081 KindSpelling = clang_getCursorKindSpelling(Result.kind);
5082 USR = clang_getCursorUSR(Result);
5083 *Log << llvm::format("(%s:%d:%d) = %s",
5084 clang_getCString(SearchFileName), SearchLine, SearchColumn,
5085 clang_getCString(KindSpelling))
5086 << llvm::format("(%s:%d:%d):%s%s",
5087 clang_getCString(ResultFileName), ResultLine, ResultColumn,
5088 clang_getCString(USR), IsDef);
5089 clang_disposeString(SearchFileName);
5090 clang_disposeString(ResultFileName);
5091 clang_disposeString(KindSpelling);
5092 clang_disposeString(USR);
5094 CXCursor Definition = clang_getCursorDefinition(Result);
5095 if (!clang_equalCursors(Definition, clang_getNullCursor())) {
5096 CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition);
5097 CXString DefinitionKindSpelling
5098 = clang_getCursorKindSpelling(Definition.kind);
5099 CXFile DefinitionFile;
5100 unsigned DefinitionLine, DefinitionColumn;
5101 clang_getFileLocation(DefinitionLoc, &DefinitionFile,
5102 &DefinitionLine, &DefinitionColumn, nullptr);
5103 CXString DefinitionFileName = clang_getFileName(DefinitionFile);
5104 *Log << llvm::format(" -> %s(%s:%d:%d)",
5105 clang_getCString(DefinitionKindSpelling),
5106 clang_getCString(DefinitionFileName),
5107 DefinitionLine, DefinitionColumn);
5108 clang_disposeString(DefinitionFileName);
5109 clang_disposeString(DefinitionKindSpelling);
5116 CXCursor clang_getNullCursor(void) {
5117 return MakeCXCursorInvalid(CXCursor_InvalidFile);
5120 unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
5121 // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we
5122 // can't set consistently. For example, when visiting a DeclStmt we will set
5123 // it but we don't set it on the result of clang_getCursorDefinition for
5124 // a reference of the same declaration.
5125 // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works
5126 // when visiting a DeclStmt currently, the AST should be enhanced to be able
5127 // to provide that kind of info.
5128 if (clang_isDeclaration(X.kind))
5129 X.data[1] = nullptr;
5130 if (clang_isDeclaration(Y.kind))
5131 Y.data[1] = nullptr;
5136 unsigned clang_hashCursor(CXCursor C) {
5138 if (clang_isExpression(C.kind) || clang_isStatement(C.kind))
5141 return llvm::DenseMapInfo<std::pair<unsigned, const void*> >::getHashValue(
5142 std::make_pair(C.kind, C.data[Index]));
5145 unsigned clang_isInvalid(enum CXCursorKind K) {
5146 return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
5149 unsigned clang_isDeclaration(enum CXCursorKind K) {
5150 return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) ||
5151 (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl);
5154 unsigned clang_isReference(enum CXCursorKind K) {
5155 return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
5158 unsigned clang_isExpression(enum CXCursorKind K) {
5159 return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
5162 unsigned clang_isStatement(enum CXCursorKind K) {
5163 return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
5166 unsigned clang_isAttribute(enum CXCursorKind K) {
5167 return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr;
5170 unsigned clang_isTranslationUnit(enum CXCursorKind K) {
5171 return K == CXCursor_TranslationUnit;
5174 unsigned clang_isPreprocessing(enum CXCursorKind K) {
5175 return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
5178 unsigned clang_isUnexposed(enum CXCursorKind K) {
5180 case CXCursor_UnexposedDecl:
5181 case CXCursor_UnexposedExpr:
5182 case CXCursor_UnexposedStmt:
5183 case CXCursor_UnexposedAttr:
5190 CXCursorKind clang_getCursorKind(CXCursor C) {
5194 CXSourceLocation clang_getCursorLocation(CXCursor C) {
5195 if (clang_isReference(C.kind)) {
5197 case CXCursor_ObjCSuperClassRef: {
5198 std::pair<const ObjCInterfaceDecl *, SourceLocation> P
5199 = getCursorObjCSuperClassRef(C);
5200 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5203 case CXCursor_ObjCProtocolRef: {
5204 std::pair<const ObjCProtocolDecl *, SourceLocation> P
5205 = getCursorObjCProtocolRef(C);
5206 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5209 case CXCursor_ObjCClassRef: {
5210 std::pair<const ObjCInterfaceDecl *, SourceLocation> P
5211 = getCursorObjCClassRef(C);
5212 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5215 case CXCursor_TypeRef: {
5216 std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
5217 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5220 case CXCursor_TemplateRef: {
5221 std::pair<const TemplateDecl *, SourceLocation> P =
5222 getCursorTemplateRef(C);
5223 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5226 case CXCursor_NamespaceRef: {
5227 std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
5228 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5231 case CXCursor_MemberRef: {
5232 std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
5233 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5236 case CXCursor_VariableRef: {
5237 std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C);
5238 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5241 case CXCursor_CXXBaseSpecifier: {
5242 const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
5244 return clang_getNullLocation();
5246 if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
5247 return cxloc::translateSourceLocation(getCursorContext(C),
5248 TSInfo->getTypeLoc().getBeginLoc());
5250 return cxloc::translateSourceLocation(getCursorContext(C),
5251 BaseSpec->getLocStart());
5254 case CXCursor_LabelRef: {
5255 std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
5256 return cxloc::translateSourceLocation(getCursorContext(C), P.second);
5259 case CXCursor_OverloadedDeclRef:
5260 return cxloc::translateSourceLocation(getCursorContext(C),
5261 getCursorOverloadedDeclRef(C).second);
5264 // FIXME: Need a way to enumerate all non-reference cases.
5265 llvm_unreachable("Missed a reference kind");
5269 if (clang_isExpression(C.kind))
5270 return cxloc::translateSourceLocation(getCursorContext(C),
5271 getLocationFromExpr(getCursorExpr(C)));
5273 if (clang_isStatement(C.kind))
5274 return cxloc::translateSourceLocation(getCursorContext(C),
5275 getCursorStmt(C)->getLocStart());
5277 if (C.kind == CXCursor_PreprocessingDirective) {
5278 SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
5279 return cxloc::translateSourceLocation(getCursorContext(C), L);
5282 if (C.kind == CXCursor_MacroExpansion) {
5284 = cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin();
5285 return cxloc::translateSourceLocation(getCursorContext(C), L);
5288 if (C.kind == CXCursor_MacroDefinition) {
5289 SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
5290 return cxloc::translateSourceLocation(getCursorContext(C), L);
5293 if (C.kind == CXCursor_InclusionDirective) {
5295 = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
5296 return cxloc::translateSourceLocation(getCursorContext(C), L);
5299 if (clang_isAttribute(C.kind)) {
5301 = cxcursor::getCursorAttr(C)->getLocation();
5302 return cxloc::translateSourceLocation(getCursorContext(C), L);
5305 if (!clang_isDeclaration(C.kind))
5306 return clang_getNullLocation();
5308 const Decl *D = getCursorDecl(C);
5310 return clang_getNullLocation();
5312 SourceLocation Loc = D->getLocation();
5313 // FIXME: Multiple variables declared in a single declaration
5314 // currently lack the information needed to correctly determine their
5315 // ranges when accounting for the type-specifier. We use context
5316 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
5317 // and if so, whether it is the first decl.
5318 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
5319 if (!cxcursor::isFirstInDeclGroup(C))
5320 Loc = VD->getLocation();
5323 // For ObjC methods, give the start location of the method name.
5324 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
5325 Loc = MD->getSelectorStartLoc();
5327 return cxloc::translateSourceLocation(getCursorContext(C), Loc);
5332 CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
5335 // Guard against an invalid SourceLocation, or we may assert in one
5336 // of the following calls.
5337 if (SLoc.isInvalid())
5338 return clang_getNullCursor();
5340 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5342 // Translate the given source location to make it point at the beginning of
5343 // the token under the cursor.
5344 SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
5345 CXXUnit->getASTContext().getLangOpts());
5347 CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
5348 if (SLoc.isValid()) {
5349 GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
5350 CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
5351 /*VisitPreprocessorLast=*/true,
5352 /*VisitIncludedEntities=*/false,
5353 SourceLocation(SLoc));
5354 CursorVis.visitFileRegion();
5360 static SourceRange getRawCursorExtent(CXCursor C) {
5361 if (clang_isReference(C.kind)) {
5363 case CXCursor_ObjCSuperClassRef:
5364 return getCursorObjCSuperClassRef(C).second;
5366 case CXCursor_ObjCProtocolRef:
5367 return getCursorObjCProtocolRef(C).second;
5369 case CXCursor_ObjCClassRef:
5370 return getCursorObjCClassRef(C).second;
5372 case CXCursor_TypeRef:
5373 return getCursorTypeRef(C).second;
5375 case CXCursor_TemplateRef:
5376 return getCursorTemplateRef(C).second;
5378 case CXCursor_NamespaceRef:
5379 return getCursorNamespaceRef(C).second;
5381 case CXCursor_MemberRef:
5382 return getCursorMemberRef(C).second;
5384 case CXCursor_CXXBaseSpecifier:
5385 return getCursorCXXBaseSpecifier(C)->getSourceRange();
5387 case CXCursor_LabelRef:
5388 return getCursorLabelRef(C).second;
5390 case CXCursor_OverloadedDeclRef:
5391 return getCursorOverloadedDeclRef(C).second;
5393 case CXCursor_VariableRef:
5394 return getCursorVariableRef(C).second;
5397 // FIXME: Need a way to enumerate all non-reference cases.
5398 llvm_unreachable("Missed a reference kind");
5402 if (clang_isExpression(C.kind))
5403 return getCursorExpr(C)->getSourceRange();
5405 if (clang_isStatement(C.kind))
5406 return getCursorStmt(C)->getSourceRange();
5408 if (clang_isAttribute(C.kind))
5409 return getCursorAttr(C)->getRange();
5411 if (C.kind == CXCursor_PreprocessingDirective)
5412 return cxcursor::getCursorPreprocessingDirective(C);
5414 if (C.kind == CXCursor_MacroExpansion) {
5415 ASTUnit *TU = getCursorASTUnit(C);
5416 SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange();
5417 return TU->mapRangeFromPreamble(Range);
5420 if (C.kind == CXCursor_MacroDefinition) {
5421 ASTUnit *TU = getCursorASTUnit(C);
5422 SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange();
5423 return TU->mapRangeFromPreamble(Range);
5426 if (C.kind == CXCursor_InclusionDirective) {
5427 ASTUnit *TU = getCursorASTUnit(C);
5428 SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange();
5429 return TU->mapRangeFromPreamble(Range);
5432 if (C.kind == CXCursor_TranslationUnit) {
5433 ASTUnit *TU = getCursorASTUnit(C);
5434 FileID MainID = TU->getSourceManager().getMainFileID();
5435 SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID);
5436 SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID);
5437 return SourceRange(Start, End);
5440 if (clang_isDeclaration(C.kind)) {
5441 const Decl *D = cxcursor::getCursorDecl(C);
5443 return SourceRange();
5445 SourceRange R = D->getSourceRange();
5446 // FIXME: Multiple variables declared in a single declaration
5447 // currently lack the information needed to correctly determine their
5448 // ranges when accounting for the type-specifier. We use context
5449 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
5450 // and if so, whether it is the first decl.
5451 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
5452 if (!cxcursor::isFirstInDeclGroup(C))
5453 R.setBegin(VD->getLocation());
5457 return SourceRange();
5460 /// \brief Retrieves the "raw" cursor extent, which is then extended to include
5461 /// the decl-specifier-seq for declarations.
5462 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) {
5463 if (clang_isDeclaration(C.kind)) {
5464 const Decl *D = cxcursor::getCursorDecl(C);
5466 return SourceRange();
5468 SourceRange R = D->getSourceRange();
5470 // Adjust the start of the location for declarations preceded by
5471 // declaration specifiers.
5472 SourceLocation StartLoc;
5473 if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
5474 if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
5475 StartLoc = TI->getTypeLoc().getLocStart();
5476 } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) {
5477 if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
5478 StartLoc = TI->getTypeLoc().getLocStart();
5481 if (StartLoc.isValid() && R.getBegin().isValid() &&
5482 SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin()))
5483 R.setBegin(StartLoc);
5485 // FIXME: Multiple variables declared in a single declaration
5486 // currently lack the information needed to correctly determine their
5487 // ranges when accounting for the type-specifier. We use context
5488 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
5489 // and if so, whether it is the first decl.
5490 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
5491 if (!cxcursor::isFirstInDeclGroup(C))
5492 R.setBegin(VD->getLocation());
5498 return getRawCursorExtent(C);
5503 CXSourceRange clang_getCursorExtent(CXCursor C) {
5504 SourceRange R = getRawCursorExtent(C);
5506 return clang_getNullRange();
5508 return cxloc::translateSourceRange(getCursorContext(C), R);
5511 CXCursor clang_getCursorReferenced(CXCursor C) {
5512 if (clang_isInvalid(C.kind))
5513 return clang_getNullCursor();
5515 CXTranslationUnit tu = getCursorTU(C);
5516 if (clang_isDeclaration(C.kind)) {
5517 const Decl *D = getCursorDecl(C);
5519 return clang_getNullCursor();
5520 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
5521 return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu);
5522 if (const ObjCPropertyImplDecl *PropImpl =
5523 dyn_cast<ObjCPropertyImplDecl>(D))
5524 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
5525 return MakeCXCursor(Property, tu);
5530 if (clang_isExpression(C.kind)) {
5531 const Expr *E = getCursorExpr(C);
5532 const Decl *D = getDeclFromExpr(E);
5534 CXCursor declCursor = MakeCXCursor(D, tu);
5535 declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C),
5540 if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
5541 return MakeCursorOverloadedDeclRef(Ovl, tu);
5543 return clang_getNullCursor();
5546 if (clang_isStatement(C.kind)) {
5547 const Stmt *S = getCursorStmt(C);
5548 if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
5549 if (LabelDecl *label = Goto->getLabel())
5550 if (LabelStmt *labelS = label->getStmt())
5551 return MakeCXCursor(labelS, getCursorDecl(C), tu);
5553 return clang_getNullCursor();
5556 if (C.kind == CXCursor_MacroExpansion) {
5557 if (const MacroDefinitionRecord *Def =
5558 getCursorMacroExpansion(C).getDefinition())
5559 return MakeMacroDefinitionCursor(Def, tu);
5562 if (!clang_isReference(C.kind))
5563 return clang_getNullCursor();
5566 case CXCursor_ObjCSuperClassRef:
5567 return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu);
5569 case CXCursor_ObjCProtocolRef: {
5570 const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first;
5571 if (const ObjCProtocolDecl *Def = Prot->getDefinition())
5572 return MakeCXCursor(Def, tu);
5574 return MakeCXCursor(Prot, tu);
5577 case CXCursor_ObjCClassRef: {
5578 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
5579 if (const ObjCInterfaceDecl *Def = Class->getDefinition())
5580 return MakeCXCursor(Def, tu);
5582 return MakeCXCursor(Class, tu);
5585 case CXCursor_TypeRef:
5586 return MakeCXCursor(getCursorTypeRef(C).first, tu );
5588 case CXCursor_TemplateRef:
5589 return MakeCXCursor(getCursorTemplateRef(C).first, tu );
5591 case CXCursor_NamespaceRef:
5592 return MakeCXCursor(getCursorNamespaceRef(C).first, tu );
5594 case CXCursor_MemberRef:
5595 return MakeCXCursor(getCursorMemberRef(C).first, tu );
5597 case CXCursor_CXXBaseSpecifier: {
5598 const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
5599 return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
5603 case CXCursor_LabelRef:
5604 // FIXME: We end up faking the "parent" declaration here because we
5605 // don't want to make CXCursor larger.
5606 return MakeCXCursor(getCursorLabelRef(C).first,
5607 cxtu::getASTUnit(tu)->getASTContext()
5608 .getTranslationUnitDecl(),
5611 case CXCursor_OverloadedDeclRef:
5614 case CXCursor_VariableRef:
5615 return MakeCXCursor(getCursorVariableRef(C).first, tu);
5618 // We would prefer to enumerate all non-reference cursor kinds here.
5619 llvm_unreachable("Unhandled reference cursor kind");
5623 CXCursor clang_getCursorDefinition(CXCursor C) {
5624 if (clang_isInvalid(C.kind))
5625 return clang_getNullCursor();
5627 CXTranslationUnit TU = getCursorTU(C);
5629 bool WasReference = false;
5630 if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
5631 C = clang_getCursorReferenced(C);
5632 WasReference = true;
5635 if (C.kind == CXCursor_MacroExpansion)
5636 return clang_getCursorReferenced(C);
5638 if (!clang_isDeclaration(C.kind))
5639 return clang_getNullCursor();
5641 const Decl *D = getCursorDecl(C);
5643 return clang_getNullCursor();
5645 switch (D->getKind()) {
5646 // Declaration kinds that don't really separate the notions of
5647 // declaration and definition.
5648 case Decl::Namespace:
5650 case Decl::TypeAlias:
5651 case Decl::TypeAliasTemplate:
5652 case Decl::TemplateTypeParm:
5653 case Decl::EnumConstant:
5655 case Decl::MSProperty:
5656 case Decl::IndirectField:
5657 case Decl::ObjCIvar:
5658 case Decl::ObjCAtDefsField:
5659 case Decl::ImplicitParam:
5661 case Decl::NonTypeTemplateParm:
5662 case Decl::TemplateTemplateParm:
5663 case Decl::ObjCCategoryImpl:
5664 case Decl::ObjCImplementation:
5665 case Decl::AccessSpec:
5666 case Decl::LinkageSpec:
5667 case Decl::ObjCPropertyImpl:
5668 case Decl::FileScopeAsm:
5669 case Decl::StaticAssert:
5671 case Decl::Captured:
5672 case Decl::Label: // FIXME: Is this right??
5673 case Decl::ClassScopeFunctionSpecialization:
5675 case Decl::OMPThreadPrivate:
5676 case Decl::ObjCTypeParam:
5677 case Decl::BuiltinTemplate:
5680 // Declaration kinds that don't make any sense here, but are
5681 // nonetheless harmless.
5683 case Decl::TranslationUnit:
5684 case Decl::ExternCContext:
5687 // Declaration kinds for which the definition is not resolvable.
5688 case Decl::UnresolvedUsingTypename:
5689 case Decl::UnresolvedUsingValue:
5692 case Decl::UsingDirective:
5693 return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
5696 case Decl::NamespaceAlias:
5697 return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU);
5701 case Decl::CXXRecord:
5702 case Decl::ClassTemplateSpecialization:
5703 case Decl::ClassTemplatePartialSpecialization:
5704 if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
5705 return MakeCXCursor(Def, TU);
5706 return clang_getNullCursor();
5708 case Decl::Function:
5709 case Decl::CXXMethod:
5710 case Decl::CXXConstructor:
5711 case Decl::CXXDestructor:
5712 case Decl::CXXConversion: {
5713 const FunctionDecl *Def = nullptr;
5714 if (cast<FunctionDecl>(D)->getBody(Def))
5715 return MakeCXCursor(Def, TU);
5716 return clang_getNullCursor();
5720 case Decl::VarTemplateSpecialization:
5721 case Decl::VarTemplatePartialSpecialization: {
5722 // Ask the variable if it has a definition.
5723 if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition())
5724 return MakeCXCursor(Def, TU);
5725 return clang_getNullCursor();
5728 case Decl::FunctionTemplate: {
5729 const FunctionDecl *Def = nullptr;
5730 if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
5731 return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU);
5732 return clang_getNullCursor();
5735 case Decl::ClassTemplate: {
5736 if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
5738 return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
5740 return clang_getNullCursor();
5743 case Decl::VarTemplate: {
5745 cast<VarTemplateDecl>(D)->getTemplatedDecl()->getDefinition())
5746 return MakeCXCursor(cast<VarDecl>(Def)->getDescribedVarTemplate(), TU);
5747 return clang_getNullCursor();
5751 return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D),
5752 D->getLocation(), TU);
5754 case Decl::UsingShadow:
5755 return clang_getCursorDefinition(
5756 MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
5759 case Decl::ObjCMethod: {
5760 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
5761 if (Method->isThisDeclarationADefinition())
5764 // Dig out the method definition in the associated
5765 // @implementation, if we have it.
5766 // FIXME: The ASTs should make finding the definition easier.
5767 if (const ObjCInterfaceDecl *Class
5768 = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
5769 if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
5770 if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
5771 Method->isInstanceMethod()))
5772 if (Def->isThisDeclarationADefinition())
5773 return MakeCXCursor(Def, TU);
5775 return clang_getNullCursor();
5778 case Decl::ObjCCategory:
5779 if (ObjCCategoryImplDecl *Impl
5780 = cast<ObjCCategoryDecl>(D)->getImplementation())
5781 return MakeCXCursor(Impl, TU);
5782 return clang_getNullCursor();
5784 case Decl::ObjCProtocol:
5785 if (const ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition())
5786 return MakeCXCursor(Def, TU);
5787 return clang_getNullCursor();
5789 case Decl::ObjCInterface: {
5790 // There are two notions of a "definition" for an Objective-C
5791 // class: the interface and its implementation. When we resolved a
5792 // reference to an Objective-C class, produce the @interface as
5793 // the definition; when we were provided with the interface,
5794 // produce the @implementation as the definition.
5795 const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D);
5797 if (const ObjCInterfaceDecl *Def = IFace->getDefinition())
5798 return MakeCXCursor(Def, TU);
5799 } else if (ObjCImplementationDecl *Impl = IFace->getImplementation())
5800 return MakeCXCursor(Impl, TU);
5801 return clang_getNullCursor();
5804 case Decl::ObjCProperty:
5805 // FIXME: We don't really know where to find the
5806 // ObjCPropertyImplDecls that implement this property.
5807 return clang_getNullCursor();
5809 case Decl::ObjCCompatibleAlias:
5810 if (const ObjCInterfaceDecl *Class
5811 = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
5812 if (const ObjCInterfaceDecl *Def = Class->getDefinition())
5813 return MakeCXCursor(Def, TU);
5815 return clang_getNullCursor();
5818 if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
5819 return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
5820 return clang_getNullCursor();
5822 case Decl::FriendTemplate:
5823 if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
5824 return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
5825 return clang_getNullCursor();
5828 return clang_getNullCursor();
5831 unsigned clang_isCursorDefinition(CXCursor C) {
5832 if (!clang_isDeclaration(C.kind))
5835 return clang_getCursorDefinition(C) == C;
5838 CXCursor clang_getCanonicalCursor(CXCursor C) {
5839 if (!clang_isDeclaration(C.kind))
5842 if (const Decl *D = getCursorDecl(C)) {
5843 if (const ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D))
5844 if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl())
5845 return MakeCXCursor(CatD, getCursorTU(C));
5847 if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
5848 if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
5849 return MakeCXCursor(IFD, getCursorTU(C));
5851 return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
5857 int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
5858 return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
5861 unsigned clang_getNumOverloadedDecls(CXCursor C) {
5862 if (C.kind != CXCursor_OverloadedDeclRef)
5865 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
5866 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
5867 return E->getNumDecls();
5869 if (OverloadedTemplateStorage *S
5870 = Storage.dyn_cast<OverloadedTemplateStorage*>())
5873 const Decl *D = Storage.get<const Decl *>();
5874 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
5875 return Using->shadow_size();
5880 CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
5881 if (cursor.kind != CXCursor_OverloadedDeclRef)
5882 return clang_getNullCursor();
5884 if (index >= clang_getNumOverloadedDecls(cursor))
5885 return clang_getNullCursor();
5887 CXTranslationUnit TU = getCursorTU(cursor);
5888 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
5889 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
5890 return MakeCXCursor(E->decls_begin()[index], TU);
5892 if (OverloadedTemplateStorage *S
5893 = Storage.dyn_cast<OverloadedTemplateStorage*>())
5894 return MakeCXCursor(S->begin()[index], TU);
5896 const Decl *D = Storage.get<const Decl *>();
5897 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
5898 // FIXME: This is, unfortunately, linear time.
5899 UsingDecl::shadow_iterator Pos = Using->shadow_begin();
5900 std::advance(Pos, index);
5901 return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
5904 return clang_getNullCursor();
5907 void clang_getDefinitionSpellingAndExtent(CXCursor C,
5908 const char **startBuf,
5909 const char **endBuf,
5910 unsigned *startLine,
5911 unsigned *startColumn,
5913 unsigned *endColumn) {
5914 assert(getCursorDecl(C) && "CXCursor has null decl");
5915 const FunctionDecl *FD = dyn_cast<FunctionDecl>(getCursorDecl(C));
5916 CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
5918 SourceManager &SM = FD->getASTContext().getSourceManager();
5919 *startBuf = SM.getCharacterData(Body->getLBracLoc());
5920 *endBuf = SM.getCharacterData(Body->getRBracLoc());
5921 *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
5922 *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
5923 *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
5924 *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
5928 CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags,
5929 unsigned PieceIndex) {
5930 RefNamePieces Pieces;
5933 case CXCursor_MemberRefExpr:
5934 if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C)))
5935 Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(),
5936 E->getQualifierLoc().getSourceRange());
5939 case CXCursor_DeclRefExpr:
5940 if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) {
5941 SourceRange TemplateArgLoc(E->getLAngleLoc(), E->getRAngleLoc());
5943 buildPieces(NameFlags, false, E->getNameInfo(),
5944 E->getQualifierLoc().getSourceRange(), &TemplateArgLoc);
5948 case CXCursor_CallExpr:
5949 if (const CXXOperatorCallExpr *OCE =
5950 dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) {
5951 const Expr *Callee = OCE->getCallee();
5952 if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
5953 Callee = ICE->getSubExpr();
5955 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee))
5956 Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(),
5957 DRE->getQualifierLoc().getSourceRange());
5965 if (Pieces.empty()) {
5966 if (PieceIndex == 0)
5967 return clang_getCursorExtent(C);
5968 } else if (PieceIndex < Pieces.size()) {
5969 SourceRange R = Pieces[PieceIndex];
5971 return cxloc::translateSourceRange(getCursorContext(C), R);
5974 return clang_getNullRange();
5977 void clang_enableStackTraces(void) {
5978 llvm::sys::PrintStackTraceOnErrorSignal();
5981 void clang_executeOnThread(void (*fn)(void*), void *user_data,
5982 unsigned stack_size) {
5983 llvm::llvm_execute_on_thread(fn, user_data, stack_size);
5986 } // end: extern "C"
5988 //===----------------------------------------------------------------------===//
5989 // Token-based Operations.
5990 //===----------------------------------------------------------------------===//
5993 * int_data[0]: a CXTokenKind
5994 * int_data[1]: starting token location
5995 * int_data[2]: token length
5996 * int_data[3]: reserved
5997 * ptr_data: for identifiers and keywords, an IdentifierInfo*.
6002 CXTokenKind clang_getTokenKind(CXToken CXTok) {
6003 return static_cast<CXTokenKind>(CXTok.int_data[0]);
6006 CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
6007 switch (clang_getTokenKind(CXTok)) {
6008 case CXToken_Identifier:
6009 case CXToken_Keyword:
6010 // We know we have an IdentifierInfo*, so use that.
6011 return cxstring::createRef(static_cast<IdentifierInfo *>(CXTok.ptr_data)
6014 case CXToken_Literal: {
6015 // We have stashed the starting pointer in the ptr_data field. Use it.
6016 const char *Text = static_cast<const char *>(CXTok.ptr_data);
6017 return cxstring::createDup(StringRef(Text, CXTok.int_data[2]));
6020 case CXToken_Punctuation:
6021 case CXToken_Comment:
6025 if (isNotUsableTU(TU)) {
6027 return cxstring::createEmpty();
6030 // We have to find the starting buffer pointer the hard way, by
6031 // deconstructing the source location.
6032 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6034 return cxstring::createEmpty();
6036 SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
6037 std::pair<FileID, unsigned> LocInfo
6038 = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc);
6039 bool Invalid = false;
6041 = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
6043 return cxstring::createEmpty();
6045 return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
6048 CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
6049 if (isNotUsableTU(TU)) {
6051 return clang_getNullLocation();
6054 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6056 return clang_getNullLocation();
6058 return cxloc::translateSourceLocation(CXXUnit->getASTContext(),
6059 SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
6062 CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
6063 if (isNotUsableTU(TU)) {
6065 return clang_getNullRange();
6068 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6070 return clang_getNullRange();
6072 return cxloc::translateSourceRange(CXXUnit->getASTContext(),
6073 SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
6076 static void getTokens(ASTUnit *CXXUnit, SourceRange Range,
6077 SmallVectorImpl<CXToken> &CXTokens) {
6078 SourceManager &SourceMgr = CXXUnit->getSourceManager();
6079 std::pair<FileID, unsigned> BeginLocInfo
6080 = SourceMgr.getDecomposedSpellingLoc(Range.getBegin());
6081 std::pair<FileID, unsigned> EndLocInfo
6082 = SourceMgr.getDecomposedSpellingLoc(Range.getEnd());
6084 // Cannot tokenize across files.
6085 if (BeginLocInfo.first != EndLocInfo.first)
6089 bool Invalid = false;
6091 = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
6095 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
6096 CXXUnit->getASTContext().getLangOpts(),
6097 Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end());
6098 Lex.SetCommentRetentionState(true);
6100 // Lex tokens until we hit the end of the range.
6101 const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
6103 bool previousWasAt = false;
6105 // Lex the next token
6106 Lex.LexFromRawLexer(Tok);
6107 if (Tok.is(tok::eof))
6110 // Initialize the CXToken.
6114 CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
6115 CXTok.int_data[2] = Tok.getLength();
6116 CXTok.int_data[3] = 0;
6118 // - Kind-specific fields
6119 if (Tok.isLiteral()) {
6120 CXTok.int_data[0] = CXToken_Literal;
6121 CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData());
6122 } else if (Tok.is(tok::raw_identifier)) {
6123 // Lookup the identifier to determine whether we have a keyword.
6125 = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok);
6127 if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
6128 CXTok.int_data[0] = CXToken_Keyword;
6131 CXTok.int_data[0] = Tok.is(tok::identifier)
6132 ? CXToken_Identifier
6135 CXTok.ptr_data = II;
6136 } else if (Tok.is(tok::comment)) {
6137 CXTok.int_data[0] = CXToken_Comment;
6138 CXTok.ptr_data = nullptr;
6140 CXTok.int_data[0] = CXToken_Punctuation;
6141 CXTok.ptr_data = nullptr;
6143 CXTokens.push_back(CXTok);
6144 previousWasAt = Tok.is(tok::at);
6145 } while (Lex.getBufferLocation() <= EffectiveBufferEnd);
6148 void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,
6149 CXToken **Tokens, unsigned *NumTokens) {
6151 *Log << TU << ' ' << Range;
6159 if (isNotUsableTU(TU)) {
6164 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6165 if (!CXXUnit || !Tokens || !NumTokens)
6168 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
6170 SourceRange R = cxloc::translateCXSourceRange(Range);
6174 SmallVector<CXToken, 32> CXTokens;
6175 getTokens(CXXUnit, R, CXTokens);
6177 if (CXTokens.empty())
6180 *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());
6181 memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
6182 *NumTokens = CXTokens.size();
6185 void clang_disposeTokens(CXTranslationUnit TU,
6186 CXToken *Tokens, unsigned NumTokens) {
6190 } // end: extern "C"
6192 //===----------------------------------------------------------------------===//
6193 // Token annotation APIs.
6194 //===----------------------------------------------------------------------===//
6196 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
6198 CXClientData client_data);
6199 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
6200 CXClientData client_data);
6203 class AnnotateTokensWorker {
6208 unsigned PreprocessingTokIdx;
6209 CursorVisitor AnnotateVis;
6210 SourceManager &SrcMgr;
6211 bool HasContextSensitiveKeywords;
6213 struct PostChildrenInfo {
6215 SourceRange CursorRange;
6216 unsigned BeforeReachingCursorIdx;
6217 unsigned BeforeChildrenTokenIdx;
6219 SmallVector<PostChildrenInfo, 8> PostChildrenInfos;
6221 CXToken &getTok(unsigned Idx) {
6222 assert(Idx < NumTokens);
6225 const CXToken &getTok(unsigned Idx) const {
6226 assert(Idx < NumTokens);
6229 bool MoreTokens() const { return TokIdx < NumTokens; }
6230 unsigned NextToken() const { return TokIdx; }
6231 void AdvanceToken() { ++TokIdx; }
6232 SourceLocation GetTokenLoc(unsigned tokI) {
6233 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]);
6235 bool isFunctionMacroToken(unsigned tokI) const {
6236 return getTok(tokI).int_data[3] != 0;
6238 SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const {
6239 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[3]);
6242 void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange);
6243 bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult,
6247 AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens,
6248 CXTranslationUnit TU, SourceRange RegionOfInterest)
6249 : Tokens(tokens), Cursors(cursors),
6250 NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0),
6252 AnnotateTokensVisitor, this,
6253 /*VisitPreprocessorLast=*/true,
6254 /*VisitIncludedEntities=*/false,
6256 /*VisitDeclsOnly=*/false,
6257 AnnotateTokensPostChildrenVisitor),
6258 SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()),
6259 HasContextSensitiveKeywords(false) { }
6261 void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
6262 enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
6263 bool postVisitChildren(CXCursor cursor);
6264 void AnnotateTokens();
6266 /// \brief Determine whether the annotator saw any cursors that have
6267 /// context-sensitive keywords.
6268 bool hasContextSensitiveKeywords() const {
6269 return HasContextSensitiveKeywords;
6272 ~AnnotateTokensWorker() {
6273 assert(PostChildrenInfos.empty());
6278 void AnnotateTokensWorker::AnnotateTokens() {
6279 // Walk the AST within the region of interest, annotating tokens
6281 AnnotateVis.visitFileRegion();
6284 static inline void updateCursorAnnotation(CXCursor &Cursor,
6285 const CXCursor &updateC) {
6286 if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind))
6291 /// \brief It annotates and advances tokens with a cursor until the comparison
6292 //// between the cursor location and the source range is the same as
6293 /// \arg compResult.
6295 /// Pass RangeBefore to annotate tokens with a cursor until a range is reached.
6296 /// Pass RangeOverlap to annotate tokens inside a range.
6297 void AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC,
6298 RangeComparisonResult compResult,
6299 SourceRange range) {
6300 while (MoreTokens()) {
6301 const unsigned I = NextToken();
6302 if (isFunctionMacroToken(I))
6303 if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range))
6306 SourceLocation TokLoc = GetTokenLoc(I);
6307 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
6308 updateCursorAnnotation(Cursors[I], updateC);
6316 /// \brief Special annotation handling for macro argument tokens.
6317 /// \returns true if it advanced beyond all macro tokens, false otherwise.
6318 bool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens(
6320 RangeComparisonResult compResult,
6321 SourceRange range) {
6322 assert(MoreTokens());
6323 assert(isFunctionMacroToken(NextToken()) &&
6324 "Should be called only for macro arg tokens");
6326 // This works differently than annotateAndAdvanceTokens; because expanded
6327 // macro arguments can have arbitrary translation-unit source order, we do not
6328 // advance the token index one by one until a token fails the range test.
6329 // We only advance once past all of the macro arg tokens if all of them
6330 // pass the range test. If one of them fails we keep the token index pointing
6331 // at the start of the macro arg tokens so that the failing token will be
6332 // annotated by a subsequent annotation try.
6334 bool atLeastOneCompFail = false;
6336 unsigned I = NextToken();
6337 for (; I < NumTokens && isFunctionMacroToken(I); ++I) {
6338 SourceLocation TokLoc = getFunctionMacroTokenLoc(I);
6339 if (TokLoc.isFileID())
6340 continue; // not macro arg token, it's parens or comma.
6341 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
6342 if (clang_isInvalid(clang_getCursorKind(Cursors[I])))
6343 Cursors[I] = updateC;
6345 atLeastOneCompFail = true;
6348 if (atLeastOneCompFail)
6351 TokIdx = I; // All of the tokens were handled, advance beyond all of them.
6355 enum CXChildVisitResult
6356 AnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) {
6357 SourceRange cursorRange = getRawCursorExtent(cursor);
6358 if (cursorRange.isInvalid())
6359 return CXChildVisit_Recurse;
6361 if (!HasContextSensitiveKeywords) {
6362 // Objective-C properties can have context-sensitive keywords.
6363 if (cursor.kind == CXCursor_ObjCPropertyDecl) {
6364 if (const ObjCPropertyDecl *Property
6365 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor)))
6366 HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0;
6368 // Objective-C methods can have context-sensitive keywords.
6369 else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl ||
6370 cursor.kind == CXCursor_ObjCClassMethodDecl) {
6371 if (const ObjCMethodDecl *Method
6372 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
6373 if (Method->getObjCDeclQualifier())
6374 HasContextSensitiveKeywords = true;
6376 for (const auto *P : Method->params()) {
6377 if (P->getObjCDeclQualifier()) {
6378 HasContextSensitiveKeywords = true;
6385 // C++ methods can have context-sensitive keywords.
6386 else if (cursor.kind == CXCursor_CXXMethod) {
6387 if (const CXXMethodDecl *Method
6388 = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) {
6389 if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>())
6390 HasContextSensitiveKeywords = true;
6393 // C++ classes can have context-sensitive keywords.
6394 else if (cursor.kind == CXCursor_StructDecl ||
6395 cursor.kind == CXCursor_ClassDecl ||
6396 cursor.kind == CXCursor_ClassTemplate ||
6397 cursor.kind == CXCursor_ClassTemplatePartialSpecialization) {
6398 if (const Decl *D = getCursorDecl(cursor))
6399 if (D->hasAttr<FinalAttr>())
6400 HasContextSensitiveKeywords = true;
6404 // Don't override a property annotation with its getter/setter method.
6405 if (cursor.kind == CXCursor_ObjCInstanceMethodDecl &&
6406 parent.kind == CXCursor_ObjCPropertyDecl)
6407 return CXChildVisit_Continue;
6409 if (clang_isPreprocessing(cursor.kind)) {
6410 // Items in the preprocessing record are kept separate from items in
6411 // declarations, so we keep a separate token index.
6412 unsigned SavedTokIdx = TokIdx;
6413 TokIdx = PreprocessingTokIdx;
6415 // Skip tokens up until we catch up to the beginning of the preprocessing
6417 while (MoreTokens()) {
6418 const unsigned I = NextToken();
6419 SourceLocation TokLoc = GetTokenLoc(I);
6420 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
6431 // Look at all of the tokens within this range.
6432 while (MoreTokens()) {
6433 const unsigned I = NextToken();
6434 SourceLocation TokLoc = GetTokenLoc(I);
6435 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
6437 llvm_unreachable("Infeasible");
6441 // For macro expansions, just note where the beginning of the macro
6442 // expansion occurs.
6443 if (cursor.kind == CXCursor_MacroExpansion) {
6444 if (TokLoc == cursorRange.getBegin())
6445 Cursors[I] = cursor;
6449 // We may have already annotated macro names inside macro definitions.
6450 if (Cursors[I].kind != CXCursor_MacroExpansion)
6451 Cursors[I] = cursor;
6458 // Save the preprocessing token index; restore the non-preprocessing
6460 PreprocessingTokIdx = TokIdx;
6461 TokIdx = SavedTokIdx;
6462 return CXChildVisit_Recurse;
6465 if (cursorRange.isInvalid())
6466 return CXChildVisit_Continue;
6468 unsigned BeforeReachingCursorIdx = NextToken();
6469 const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
6470 const enum CXCursorKind K = clang_getCursorKind(parent);
6471 const CXCursor updateC =
6472 (clang_isInvalid(K) || K == CXCursor_TranslationUnit ||
6473 // Attributes are annotated out-of-order, skip tokens until we reach it.
6474 clang_isAttribute(cursor.kind))
6475 ? clang_getNullCursor() : parent;
6477 annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange);
6479 // Avoid having the cursor of an expression "overwrite" the annotation of the
6480 // variable declaration that it belongs to.
6481 // This can happen for C++ constructor expressions whose range generally
6482 // include the variable declaration, e.g.:
6483 // MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
6484 if (clang_isExpression(cursorK) && MoreTokens()) {
6485 const Expr *E = getCursorExpr(cursor);
6486 if (const Decl *D = getCursorParentDecl(cursor)) {
6487 const unsigned I = NextToken();
6488 if (E->getLocStart().isValid() && D->getLocation().isValid() &&
6489 E->getLocStart() == D->getLocation() &&
6490 E->getLocStart() == GetTokenLoc(I)) {
6491 updateCursorAnnotation(Cursors[I], updateC);
6497 // Before recursing into the children keep some state that we are going
6498 // to use in the AnnotateTokensWorker::postVisitChildren callback to do some
6499 // extra work after the child nodes are visited.
6500 // Note that we don't call VisitChildren here to avoid traversing statements
6501 // code-recursively which can blow the stack.
6503 PostChildrenInfo Info;
6504 Info.Cursor = cursor;
6505 Info.CursorRange = cursorRange;
6506 Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx;
6507 Info.BeforeChildrenTokenIdx = NextToken();
6508 PostChildrenInfos.push_back(Info);
6510 return CXChildVisit_Recurse;
6513 bool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) {
6514 if (PostChildrenInfos.empty())
6516 const PostChildrenInfo &Info = PostChildrenInfos.back();
6517 if (!clang_equalCursors(Info.Cursor, cursor))
6520 const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx;
6521 const unsigned AfterChildren = NextToken();
6522 SourceRange cursorRange = Info.CursorRange;
6524 // Scan the tokens that are at the end of the cursor, but are not captured
6525 // but the child cursors.
6526 annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange);
6528 // Scan the tokens that are at the beginning of the cursor, but are not
6529 // capture by the child cursors.
6530 for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
6531 if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
6534 Cursors[I] = cursor;
6537 // Attributes are annotated out-of-order, rewind TokIdx to when we first
6538 // encountered the attribute cursor.
6539 if (clang_isAttribute(cursor.kind))
6540 TokIdx = Info.BeforeReachingCursorIdx;
6542 PostChildrenInfos.pop_back();
6546 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
6548 CXClientData client_data) {
6549 return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent);
6552 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
6553 CXClientData client_data) {
6554 return static_cast<AnnotateTokensWorker*>(client_data)->
6555 postVisitChildren(cursor);
6560 /// \brief Uses the macro expansions in the preprocessing record to find
6561 /// and mark tokens that are macro arguments. This info is used by the
6562 /// AnnotateTokensWorker.
6563 class MarkMacroArgTokensVisitor {
6570 MarkMacroArgTokensVisitor(SourceManager &SM,
6571 CXToken *tokens, unsigned numTokens)
6572 : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { }
6574 CXChildVisitResult visit(CXCursor cursor, CXCursor parent) {
6575 if (cursor.kind != CXCursor_MacroExpansion)
6576 return CXChildVisit_Continue;
6578 SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange();
6579 if (macroRange.getBegin() == macroRange.getEnd())
6580 return CXChildVisit_Continue; // it's not a function macro.
6582 for (; CurIdx < NumTokens; ++CurIdx) {
6583 if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx),
6584 macroRange.getBegin()))
6588 if (CurIdx == NumTokens)
6589 return CXChildVisit_Break;
6591 for (; CurIdx < NumTokens; ++CurIdx) {
6592 SourceLocation tokLoc = getTokenLoc(CurIdx);
6593 if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd()))
6596 setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc));
6599 if (CurIdx == NumTokens)
6600 return CXChildVisit_Break;
6602 return CXChildVisit_Continue;
6606 CXToken &getTok(unsigned Idx) {
6607 assert(Idx < NumTokens);
6610 const CXToken &getTok(unsigned Idx) const {
6611 assert(Idx < NumTokens);
6615 SourceLocation getTokenLoc(unsigned tokI) {
6616 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]);
6619 void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) {
6620 // The third field is reserved and currently not used. Use it here
6621 // to mark macro arg expanded tokens with their expanded locations.
6622 getTok(tokI).int_data[3] = loc.getRawEncoding();
6626 } // end anonymous namespace
6628 static CXChildVisitResult
6629 MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent,
6630 CXClientData client_data) {
6631 return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor,
6635 /// \brief Used by \c annotatePreprocessorTokens.
6636 /// \returns true if lexing was finished, false otherwise.
6637 static bool lexNext(Lexer &Lex, Token &Tok,
6638 unsigned &NextIdx, unsigned NumTokens) {
6639 if (NextIdx >= NumTokens)
6643 Lex.LexFromRawLexer(Tok);
6644 return Tok.is(tok::eof);
6647 static void annotatePreprocessorTokens(CXTranslationUnit TU,
6648 SourceRange RegionOfInterest,
6651 unsigned NumTokens) {
6652 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6654 Preprocessor &PP = CXXUnit->getPreprocessor();
6655 SourceManager &SourceMgr = CXXUnit->getSourceManager();
6656 std::pair<FileID, unsigned> BeginLocInfo
6657 = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin());
6658 std::pair<FileID, unsigned> EndLocInfo
6659 = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd());
6661 if (BeginLocInfo.first != EndLocInfo.first)
6665 bool Invalid = false;
6666 Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
6667 if (Buffer.empty() || Invalid)
6670 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
6671 CXXUnit->getASTContext().getLangOpts(),
6672 Buffer.begin(), Buffer.data() + BeginLocInfo.second,
6674 Lex.SetCommentRetentionState(true);
6676 unsigned NextIdx = 0;
6677 // Lex tokens in raw mode until we hit the end of the range, to avoid
6678 // entering #includes or expanding macros.
6681 if (lexNext(Lex, Tok, NextIdx, NumTokens))
6683 unsigned TokIdx = NextIdx-1;
6684 assert(Tok.getLocation() ==
6685 SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1]));
6688 if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
6689 // We have found a preprocessing directive. Annotate the tokens
6692 // FIXME: Some simple tests here could identify macro definitions and
6693 // #undefs, to provide specific cursor kinds for those.
6695 SourceLocation BeginLoc = Tok.getLocation();
6696 if (lexNext(Lex, Tok, NextIdx, NumTokens))
6699 MacroInfo *MI = nullptr;
6700 if (Tok.is(tok::raw_identifier) && Tok.getRawIdentifier() == "define") {
6701 if (lexNext(Lex, Tok, NextIdx, NumTokens))
6704 if (Tok.is(tok::raw_identifier)) {
6705 IdentifierInfo &II =
6706 PP.getIdentifierTable().get(Tok.getRawIdentifier());
6707 SourceLocation MappedTokLoc =
6708 CXXUnit->mapLocationToPreamble(Tok.getLocation());
6709 MI = getMacroInfo(II, MappedTokLoc, TU);
6713 bool finished = false;
6715 if (lexNext(Lex, Tok, NextIdx, NumTokens)) {
6719 // If we are in a macro definition, check if the token was ever a
6720 // macro name and annotate it if that's the case.
6722 SourceLocation SaveLoc = Tok.getLocation();
6723 Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc));
6724 MacroDefinitionRecord *MacroDef =
6725 checkForMacroInMacroDefinition(MI, Tok, TU);
6726 Tok.setLocation(SaveLoc);
6728 Cursors[NextIdx - 1] =
6729 MakeMacroExpansionCursor(MacroDef, Tok.getLocation(), TU);
6731 } while (!Tok.isAtStartOfLine());
6733 unsigned LastIdx = finished ? NextIdx-1 : NextIdx-2;
6734 assert(TokIdx <= LastIdx);
6735 SourceLocation EndLoc =
6736 SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]);
6738 MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU);
6740 for (; TokIdx <= LastIdx; ++TokIdx)
6741 updateCursorAnnotation(Cursors[TokIdx], Cursor);
6750 // This gets run a separate thread to avoid stack blowout.
6751 static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit,
6752 CXToken *Tokens, unsigned NumTokens,
6753 CXCursor *Cursors) {
6754 CIndexer *CXXIdx = TU->CIdx;
6755 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
6756 setThreadBackgroundPriority();
6758 // Determine the region of interest, which contains all of the tokens.
6759 SourceRange RegionOfInterest;
6760 RegionOfInterest.setBegin(
6761 cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
6762 RegionOfInterest.setEnd(
6763 cxloc::translateSourceLocation(clang_getTokenLocation(TU,
6764 Tokens[NumTokens-1])));
6766 // Relex the tokens within the source range to look for preprocessing
6768 annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens);
6770 // If begin location points inside a macro argument, set it to the expansion
6771 // location so we can have the full context when annotating semantically.
6773 SourceManager &SM = CXXUnit->getSourceManager();
6774 SourceLocation Loc =
6775 SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin());
6776 if (Loc.isMacroID())
6777 RegionOfInterest.setBegin(SM.getExpansionLoc(Loc));
6780 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
6781 // Search and mark tokens that are macro argument expansions.
6782 MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(),
6784 CursorVisitor MacroArgMarker(TU,
6785 MarkMacroArgTokensVisitorDelegate, &Visitor,
6786 /*VisitPreprocessorLast=*/true,
6787 /*VisitIncludedEntities=*/false,
6789 MacroArgMarker.visitPreprocessedEntitiesInRegion();
6792 // Annotate all of the source locations in the region of interest that map to
6793 // a specific cursor.
6794 AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest);
6796 // FIXME: We use a ridiculous stack size here because the data-recursion
6797 // algorithm uses a large stack frame than the non-data recursive version,
6798 // and AnnotationTokensWorker currently transforms the data-recursion
6799 // algorithm back into a traditional recursion by explicitly calling
6800 // VisitChildren(). We will need to remove this explicit recursive call.
6803 // If we ran into any entities that involve context-sensitive keywords,
6804 // take another pass through the tokens to mark them as such.
6805 if (W.hasContextSensitiveKeywords()) {
6806 for (unsigned I = 0; I != NumTokens; ++I) {
6807 if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier)
6810 if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) {
6811 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
6812 if (const ObjCPropertyDecl *Property
6813 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) {
6814 if (Property->getPropertyAttributesAsWritten() != 0 &&
6815 llvm::StringSwitch<bool>(II->getName())
6816 .Case("readonly", true)
6817 .Case("assign", true)
6818 .Case("unsafe_unretained", true)
6819 .Case("readwrite", true)
6820 .Case("retain", true)
6822 .Case("nonatomic", true)
6823 .Case("atomic", true)
6824 .Case("getter", true)
6825 .Case("setter", true)
6826 .Case("strong", true)
6829 Tokens[I].int_data[0] = CXToken_Keyword;
6834 if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl ||
6835 Cursors[I].kind == CXCursor_ObjCClassMethodDecl) {
6836 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
6837 if (llvm::StringSwitch<bool>(II->getName())
6840 .Case("inout", true)
6841 .Case("oneway", true)
6842 .Case("bycopy", true)
6843 .Case("byref", true)
6845 Tokens[I].int_data[0] = CXToken_Keyword;
6849 if (Cursors[I].kind == CXCursor_CXXFinalAttr ||
6850 Cursors[I].kind == CXCursor_CXXOverrideAttr) {
6851 Tokens[I].int_data[0] = CXToken_Keyword;
6860 void clang_annotateTokens(CXTranslationUnit TU,
6861 CXToken *Tokens, unsigned NumTokens,
6862 CXCursor *Cursors) {
6863 if (isNotUsableTU(TU)) {
6867 if (NumTokens == 0 || !Tokens || !Cursors) {
6868 LOG_FUNC_SECTION { *Log << "<null input>"; }
6874 CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]);
6875 CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens-1]);
6876 *Log << clang_getRange(bloc, eloc);
6879 // Any token we don't specifically annotate will have a NULL cursor.
6880 CXCursor C = clang_getNullCursor();
6881 for (unsigned I = 0; I != NumTokens; ++I)
6884 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6888 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
6890 auto AnnotateTokensImpl = [=]() {
6891 clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors);
6893 llvm::CrashRecoveryContext CRC;
6894 if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) {
6895 fprintf(stderr, "libclang: crash detected while annotating tokens\n");
6899 } // end: extern "C"
6901 //===----------------------------------------------------------------------===//
6902 // Operations for querying linkage of a cursor.
6903 //===----------------------------------------------------------------------===//
6906 CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
6907 if (!clang_isDeclaration(cursor.kind))
6908 return CXLinkage_Invalid;
6910 const Decl *D = cxcursor::getCursorDecl(cursor);
6911 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
6912 switch (ND->getLinkageInternal()) {
6914 case VisibleNoLinkage: return CXLinkage_NoLinkage;
6915 case InternalLinkage: return CXLinkage_Internal;
6916 case UniqueExternalLinkage: return CXLinkage_UniqueExternal;
6917 case ExternalLinkage: return CXLinkage_External;
6920 return CXLinkage_Invalid;
6922 } // end: extern "C"
6924 //===----------------------------------------------------------------------===//
6925 // Operations for querying visibility of a cursor.
6926 //===----------------------------------------------------------------------===//
6929 CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) {
6930 if (!clang_isDeclaration(cursor.kind))
6931 return CXVisibility_Invalid;
6933 const Decl *D = cxcursor::getCursorDecl(cursor);
6934 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
6935 switch (ND->getVisibility()) {
6936 case HiddenVisibility: return CXVisibility_Hidden;
6937 case ProtectedVisibility: return CXVisibility_Protected;
6938 case DefaultVisibility: return CXVisibility_Default;
6941 return CXVisibility_Invalid;
6943 } // end: extern "C"
6945 //===----------------------------------------------------------------------===//
6946 // Operations for querying language of a cursor.
6947 //===----------------------------------------------------------------------===//
6949 static CXLanguageKind getDeclLanguage(const Decl *D) {
6951 return CXLanguage_C;
6953 switch (D->getKind()) {
6956 case Decl::ImplicitParam:
6957 case Decl::ObjCAtDefsField:
6958 case Decl::ObjCCategory:
6959 case Decl::ObjCCategoryImpl:
6960 case Decl::ObjCCompatibleAlias:
6961 case Decl::ObjCImplementation:
6962 case Decl::ObjCInterface:
6963 case Decl::ObjCIvar:
6964 case Decl::ObjCMethod:
6965 case Decl::ObjCProperty:
6966 case Decl::ObjCPropertyImpl:
6967 case Decl::ObjCProtocol:
6968 case Decl::ObjCTypeParam:
6969 return CXLanguage_ObjC;
6970 case Decl::CXXConstructor:
6971 case Decl::CXXConversion:
6972 case Decl::CXXDestructor:
6973 case Decl::CXXMethod:
6974 case Decl::CXXRecord:
6975 case Decl::ClassTemplate:
6976 case Decl::ClassTemplatePartialSpecialization:
6977 case Decl::ClassTemplateSpecialization:
6979 case Decl::FriendTemplate:
6980 case Decl::FunctionTemplate:
6981 case Decl::LinkageSpec:
6982 case Decl::Namespace:
6983 case Decl::NamespaceAlias:
6984 case Decl::NonTypeTemplateParm:
6985 case Decl::StaticAssert:
6986 case Decl::TemplateTemplateParm:
6987 case Decl::TemplateTypeParm:
6988 case Decl::UnresolvedUsingTypename:
6989 case Decl::UnresolvedUsingValue:
6991 case Decl::UsingDirective:
6992 case Decl::UsingShadow:
6993 return CXLanguage_CPlusPlus;
6996 return CXLanguage_C;
7001 static CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) {
7002 if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())
7003 return CXAvailability_NotAvailable;
7005 switch (D->getAvailability()) {
7007 case AR_NotYetIntroduced:
7008 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D))
7009 return getCursorAvailabilityForDecl(
7010 cast<Decl>(EnumConst->getDeclContext()));
7011 return CXAvailability_Available;
7014 return CXAvailability_Deprecated;
7016 case AR_Unavailable:
7017 return CXAvailability_NotAvailable;
7020 llvm_unreachable("Unknown availability kind!");
7023 enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
7024 if (clang_isDeclaration(cursor.kind))
7025 if (const Decl *D = cxcursor::getCursorDecl(cursor))
7026 return getCursorAvailabilityForDecl(D);
7028 return CXAvailability_Available;
7031 static CXVersion convertVersion(VersionTuple In) {
7032 CXVersion Out = { -1, -1, -1 };
7036 Out.Major = In.getMajor();
7038 Optional<unsigned> Minor = In.getMinor();
7039 if (Minor.hasValue())
7044 Optional<unsigned> Subminor = In.getSubminor();
7045 if (Subminor.hasValue())
7046 Out.Subminor = *Subminor;
7051 static int getCursorPlatformAvailabilityForDecl(const Decl *D,
7052 int *always_deprecated,
7053 CXString *deprecated_message,
7054 int *always_unavailable,
7055 CXString *unavailable_message,
7056 CXPlatformAvailability *availability,
7057 int availability_size) {
7058 bool HadAvailAttr = false;
7060 for (auto A : D->attrs()) {
7061 if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
7062 HadAvailAttr = true;
7063 if (always_deprecated)
7064 *always_deprecated = 1;
7065 if (deprecated_message) {
7066 clang_disposeString(*deprecated_message);
7067 *deprecated_message = cxstring::createDup(Deprecated->getMessage());
7072 if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) {
7073 HadAvailAttr = true;
7074 if (always_unavailable)
7075 *always_unavailable = 1;
7076 if (unavailable_message) {
7077 clang_disposeString(*unavailable_message);
7078 *unavailable_message = cxstring::createDup(Unavailable->getMessage());
7083 if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) {
7084 HadAvailAttr = true;
7085 if (N < availability_size) {
7086 availability[N].Platform
7087 = cxstring::createDup(Avail->getPlatform()->getName());
7088 availability[N].Introduced = convertVersion(Avail->getIntroduced());
7089 availability[N].Deprecated = convertVersion(Avail->getDeprecated());
7090 availability[N].Obsoleted = convertVersion(Avail->getObsoleted());
7091 availability[N].Unavailable = Avail->getUnavailable();
7092 availability[N].Message = cxstring::createDup(Avail->getMessage());
7099 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D))
7100 return getCursorPlatformAvailabilityForDecl(
7101 cast<Decl>(EnumConst->getDeclContext()),
7105 unavailable_message,
7112 int clang_getCursorPlatformAvailability(CXCursor cursor,
7113 int *always_deprecated,
7114 CXString *deprecated_message,
7115 int *always_unavailable,
7116 CXString *unavailable_message,
7117 CXPlatformAvailability *availability,
7118 int availability_size) {
7119 if (always_deprecated)
7120 *always_deprecated = 0;
7121 if (deprecated_message)
7122 *deprecated_message = cxstring::createEmpty();
7123 if (always_unavailable)
7124 *always_unavailable = 0;
7125 if (unavailable_message)
7126 *unavailable_message = cxstring::createEmpty();
7128 if (!clang_isDeclaration(cursor.kind))
7131 const Decl *D = cxcursor::getCursorDecl(cursor);
7135 return getCursorPlatformAvailabilityForDecl(D, always_deprecated,
7138 unavailable_message,
7143 void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) {
7144 clang_disposeString(availability->Platform);
7145 clang_disposeString(availability->Message);
7148 CXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
7149 if (clang_isDeclaration(cursor.kind))
7150 return getDeclLanguage(cxcursor::getCursorDecl(cursor));
7152 return CXLanguage_Invalid;
7155 /// \brief If the given cursor is the "templated" declaration
7156 /// descibing a class or function template, return the class or
7157 /// function template.
7158 static const Decl *maybeGetTemplateCursor(const Decl *D) {
7162 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
7163 if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate())
7166 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
7167 if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate())
7174 enum CX_StorageClass clang_Cursor_getStorageClass(CXCursor C) {
7175 StorageClass sc = SC_None;
7176 const Decl *D = getCursorDecl(C);
7178 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
7179 sc = FD->getStorageClass();
7180 } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
7181 sc = VD->getStorageClass();
7183 return CX_SC_Invalid;
7186 return CX_SC_Invalid;
7192 return CX_SC_Extern;
7194 return CX_SC_Static;
7195 case SC_PrivateExtern:
7196 return CX_SC_PrivateExtern;
7200 return CX_SC_Register;
7202 llvm_unreachable("Unhandled storage class!");
7205 CXCursor clang_getCursorSemanticParent(CXCursor cursor) {
7206 if (clang_isDeclaration(cursor.kind)) {
7207 if (const Decl *D = getCursorDecl(cursor)) {
7208 const DeclContext *DC = D->getDeclContext();
7210 return clang_getNullCursor();
7212 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
7213 getCursorTU(cursor));
7217 if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
7218 if (const Decl *D = getCursorDecl(cursor))
7219 return MakeCXCursor(D, getCursorTU(cursor));
7222 return clang_getNullCursor();
7225 CXCursor clang_getCursorLexicalParent(CXCursor cursor) {
7226 if (clang_isDeclaration(cursor.kind)) {
7227 if (const Decl *D = getCursorDecl(cursor)) {
7228 const DeclContext *DC = D->getLexicalDeclContext();
7230 return clang_getNullCursor();
7232 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
7233 getCursorTU(cursor));
7237 // FIXME: Note that we can't easily compute the lexical context of a
7238 // statement or expression, so we return nothing.
7239 return clang_getNullCursor();
7242 CXFile clang_getIncludedFile(CXCursor cursor) {
7243 if (cursor.kind != CXCursor_InclusionDirective)
7246 const InclusionDirective *ID = getCursorInclusionDirective(cursor);
7247 return const_cast<FileEntry *>(ID->getFile());
7250 unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) {
7251 if (C.kind != CXCursor_ObjCPropertyDecl)
7252 return CXObjCPropertyAttr_noattr;
7254 unsigned Result = CXObjCPropertyAttr_noattr;
7255 const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
7256 ObjCPropertyDecl::PropertyAttributeKind Attr =
7257 PD->getPropertyAttributesAsWritten();
7259 #define SET_CXOBJCPROP_ATTR(A) \
7260 if (Attr & ObjCPropertyDecl::OBJC_PR_##A) \
7261 Result |= CXObjCPropertyAttr_##A
7262 SET_CXOBJCPROP_ATTR(readonly);
7263 SET_CXOBJCPROP_ATTR(getter);
7264 SET_CXOBJCPROP_ATTR(assign);
7265 SET_CXOBJCPROP_ATTR(readwrite);
7266 SET_CXOBJCPROP_ATTR(retain);
7267 SET_CXOBJCPROP_ATTR(copy);
7268 SET_CXOBJCPROP_ATTR(nonatomic);
7269 SET_CXOBJCPROP_ATTR(setter);
7270 SET_CXOBJCPROP_ATTR(atomic);
7271 SET_CXOBJCPROP_ATTR(weak);
7272 SET_CXOBJCPROP_ATTR(strong);
7273 SET_CXOBJCPROP_ATTR(unsafe_unretained);
7274 #undef SET_CXOBJCPROP_ATTR
7279 unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) {
7280 if (!clang_isDeclaration(C.kind))
7281 return CXObjCDeclQualifier_None;
7283 Decl::ObjCDeclQualifier QT = Decl::OBJC_TQ_None;
7284 const Decl *D = getCursorDecl(C);
7285 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
7286 QT = MD->getObjCDeclQualifier();
7287 else if (const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D))
7288 QT = PD->getObjCDeclQualifier();
7289 if (QT == Decl::OBJC_TQ_None)
7290 return CXObjCDeclQualifier_None;
7292 unsigned Result = CXObjCDeclQualifier_None;
7293 if (QT & Decl::OBJC_TQ_In) Result |= CXObjCDeclQualifier_In;
7294 if (QT & Decl::OBJC_TQ_Inout) Result |= CXObjCDeclQualifier_Inout;
7295 if (QT & Decl::OBJC_TQ_Out) Result |= CXObjCDeclQualifier_Out;
7296 if (QT & Decl::OBJC_TQ_Bycopy) Result |= CXObjCDeclQualifier_Bycopy;
7297 if (QT & Decl::OBJC_TQ_Byref) Result |= CXObjCDeclQualifier_Byref;
7298 if (QT & Decl::OBJC_TQ_Oneway) Result |= CXObjCDeclQualifier_Oneway;
7303 unsigned clang_Cursor_isObjCOptional(CXCursor C) {
7304 if (!clang_isDeclaration(C.kind))
7307 const Decl *D = getCursorDecl(C);
7308 if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
7309 return PD->getPropertyImplementation() == ObjCPropertyDecl::Optional;
7310 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
7311 return MD->getImplementationControl() == ObjCMethodDecl::Optional;
7316 unsigned clang_Cursor_isVariadic(CXCursor C) {
7317 if (!clang_isDeclaration(C.kind))
7320 const Decl *D = getCursorDecl(C);
7321 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
7322 return FD->isVariadic();
7323 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
7324 return MD->isVariadic();
7329 CXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
7330 if (!clang_isDeclaration(C.kind))
7331 return clang_getNullRange();
7333 const Decl *D = getCursorDecl(C);
7334 ASTContext &Context = getCursorContext(C);
7335 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
7337 return clang_getNullRange();
7339 return cxloc::translateSourceRange(Context, RC->getSourceRange());
7342 CXString clang_Cursor_getRawCommentText(CXCursor C) {
7343 if (!clang_isDeclaration(C.kind))
7344 return cxstring::createNull();
7346 const Decl *D = getCursorDecl(C);
7347 ASTContext &Context = getCursorContext(C);
7348 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
7349 StringRef RawText = RC ? RC->getRawText(Context.getSourceManager()) :
7352 // Don't duplicate the string because RawText points directly into source
7354 return cxstring::createRef(RawText);
7357 CXString clang_Cursor_getBriefCommentText(CXCursor C) {
7358 if (!clang_isDeclaration(C.kind))
7359 return cxstring::createNull();
7361 const Decl *D = getCursorDecl(C);
7362 const ASTContext &Context = getCursorContext(C);
7363 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
7366 StringRef BriefText = RC->getBriefText(Context);
7368 // Don't duplicate the string because RawComment ensures that this memory
7369 // will not go away.
7370 return cxstring::createRef(BriefText);
7373 return cxstring::createNull();
7376 CXModule clang_Cursor_getModule(CXCursor C) {
7377 if (C.kind == CXCursor_ModuleImportDecl) {
7378 if (const ImportDecl *ImportD =
7379 dyn_cast_or_null<ImportDecl>(getCursorDecl(C)))
7380 return ImportD->getImportedModule();
7386 CXModule clang_getModuleForFile(CXTranslationUnit TU, CXFile File) {
7387 if (isNotUsableTU(TU)) {
7393 FileEntry *FE = static_cast<FileEntry *>(File);
7395 ASTUnit &Unit = *cxtu::getASTUnit(TU);
7396 HeaderSearch &HS = Unit.getPreprocessor().getHeaderSearchInfo();
7397 ModuleMap::KnownHeader Header = HS.findModuleForHeader(FE);
7399 return Header.getModule();
7402 CXFile clang_Module_getASTFile(CXModule CXMod) {
7405 Module *Mod = static_cast<Module*>(CXMod);
7406 return const_cast<FileEntry *>(Mod->getASTFile());
7409 CXModule clang_Module_getParent(CXModule CXMod) {
7412 Module *Mod = static_cast<Module*>(CXMod);
7416 CXString clang_Module_getName(CXModule CXMod) {
7418 return cxstring::createEmpty();
7419 Module *Mod = static_cast<Module*>(CXMod);
7420 return cxstring::createDup(Mod->Name);
7423 CXString clang_Module_getFullName(CXModule CXMod) {
7425 return cxstring::createEmpty();
7426 Module *Mod = static_cast<Module*>(CXMod);
7427 return cxstring::createDup(Mod->getFullModuleName());
7430 int clang_Module_isSystem(CXModule CXMod) {
7433 Module *Mod = static_cast<Module*>(CXMod);
7434 return Mod->IsSystem;
7437 unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU,
7439 if (isNotUsableTU(TU)) {
7445 Module *Mod = static_cast<Module*>(CXMod);
7446 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
7447 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
7448 return TopHeaders.size();
7451 CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU,
7452 CXModule CXMod, unsigned Index) {
7453 if (isNotUsableTU(TU)) {
7459 Module *Mod = static_cast<Module*>(CXMod);
7460 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
7462 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
7463 if (Index < TopHeaders.size())
7464 return const_cast<FileEntry *>(TopHeaders[Index]);
7469 } // end: extern "C"
7471 //===----------------------------------------------------------------------===//
7472 // C++ AST instrospection.
7473 //===----------------------------------------------------------------------===//
7476 unsigned clang_CXXField_isMutable(CXCursor C) {
7477 if (!clang_isDeclaration(C.kind))
7480 if (const auto D = cxcursor::getCursorDecl(C))
7481 if (const auto FD = dyn_cast_or_null<FieldDecl>(D))
7482 return FD->isMutable() ? 1 : 0;
7486 unsigned clang_CXXMethod_isPureVirtual(CXCursor C) {
7487 if (!clang_isDeclaration(C.kind))
7490 const Decl *D = cxcursor::getCursorDecl(C);
7491 const CXXMethodDecl *Method =
7492 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7493 return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0;
7496 unsigned clang_CXXMethod_isConst(CXCursor C) {
7497 if (!clang_isDeclaration(C.kind))
7500 const Decl *D = cxcursor::getCursorDecl(C);
7501 const CXXMethodDecl *Method =
7502 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7503 return (Method && (Method->getTypeQualifiers() & Qualifiers::Const)) ? 1 : 0;
7506 unsigned clang_CXXMethod_isStatic(CXCursor C) {
7507 if (!clang_isDeclaration(C.kind))
7510 const Decl *D = cxcursor::getCursorDecl(C);
7511 const CXXMethodDecl *Method =
7512 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7513 return (Method && Method->isStatic()) ? 1 : 0;
7516 unsigned clang_CXXMethod_isVirtual(CXCursor C) {
7517 if (!clang_isDeclaration(C.kind))
7520 const Decl *D = cxcursor::getCursorDecl(C);
7521 const CXXMethodDecl *Method =
7522 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7523 return (Method && Method->isVirtual()) ? 1 : 0;
7525 } // end: extern "C"
7527 //===----------------------------------------------------------------------===//
7528 // Attribute introspection.
7529 //===----------------------------------------------------------------------===//
7532 CXType clang_getIBOutletCollectionType(CXCursor C) {
7533 if (C.kind != CXCursor_IBOutletCollectionAttr)
7534 return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C));
7536 const IBOutletCollectionAttr *A =
7537 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
7539 return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C));
7541 } // end: extern "C"
7543 //===----------------------------------------------------------------------===//
7544 // Inspecting memory usage.
7545 //===----------------------------------------------------------------------===//
7547 typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries;
7549 static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,
7550 enum CXTUResourceUsageKind k,
7551 unsigned long amount) {
7552 CXTUResourceUsageEntry entry = { k, amount };
7553 entries.push_back(entry);
7558 const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
7559 const char *str = "";
7561 case CXTUResourceUsage_AST:
7562 str = "ASTContext: expressions, declarations, and types";
7564 case CXTUResourceUsage_Identifiers:
7565 str = "ASTContext: identifiers";
7567 case CXTUResourceUsage_Selectors:
7568 str = "ASTContext: selectors";
7570 case CXTUResourceUsage_GlobalCompletionResults:
7571 str = "Code completion: cached global results";
7573 case CXTUResourceUsage_SourceManagerContentCache:
7574 str = "SourceManager: content cache allocator";
7576 case CXTUResourceUsage_AST_SideTables:
7577 str = "ASTContext: side tables";
7579 case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
7580 str = "SourceManager: malloc'ed memory buffers";
7582 case CXTUResourceUsage_SourceManager_Membuffer_MMap:
7583 str = "SourceManager: mmap'ed memory buffers";
7585 case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:
7586 str = "ExternalASTSource: malloc'ed memory buffers";
7588 case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:
7589 str = "ExternalASTSource: mmap'ed memory buffers";
7591 case CXTUResourceUsage_Preprocessor:
7592 str = "Preprocessor: malloc'ed memory";
7594 case CXTUResourceUsage_PreprocessingRecord:
7595 str = "Preprocessor: PreprocessingRecord";
7597 case CXTUResourceUsage_SourceManager_DataStructures:
7598 str = "SourceManager: data structures and tables";
7600 case CXTUResourceUsage_Preprocessor_HeaderSearch:
7601 str = "Preprocessor: header search tables";
7607 CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
7608 if (isNotUsableTU(TU)) {
7610 CXTUResourceUsage usage = { (void*) nullptr, 0, nullptr };
7614 ASTUnit *astUnit = cxtu::getASTUnit(TU);
7615 std::unique_ptr<MemUsageEntries> entries(new MemUsageEntries());
7616 ASTContext &astContext = astUnit->getASTContext();
7618 // How much memory is used by AST nodes and types?
7619 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST,
7620 (unsigned long) astContext.getASTAllocatedMemory());
7622 // How much memory is used by identifiers?
7623 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers,
7624 (unsigned long) astContext.Idents.getAllocator().getTotalMemory());
7626 // How much memory is used for selectors?
7627 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors,
7628 (unsigned long) astContext.Selectors.getTotalMemory());
7630 // How much memory is used by ASTContext's side tables?
7631 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables,
7632 (unsigned long) astContext.getSideTableAllocatedMemory());
7634 // How much memory is used for caching global code completion results?
7635 unsigned long completionBytes = 0;
7636 if (GlobalCodeCompletionAllocator *completionAllocator =
7637 astUnit->getCachedCompletionAllocator().get()) {
7638 completionBytes = completionAllocator->getTotalMemory();
7640 createCXTUResourceUsageEntry(*entries,
7641 CXTUResourceUsage_GlobalCompletionResults,
7644 // How much memory is being used by SourceManager's content cache?
7645 createCXTUResourceUsageEntry(*entries,
7646 CXTUResourceUsage_SourceManagerContentCache,
7647 (unsigned long) astContext.getSourceManager().getContentCacheSize());
7649 // How much memory is being used by the MemoryBuffer's in SourceManager?
7650 const SourceManager::MemoryBufferSizes &srcBufs =
7651 astUnit->getSourceManager().getMemoryBufferSizes();
7653 createCXTUResourceUsageEntry(*entries,
7654 CXTUResourceUsage_SourceManager_Membuffer_Malloc,
7655 (unsigned long) srcBufs.malloc_bytes);
7656 createCXTUResourceUsageEntry(*entries,
7657 CXTUResourceUsage_SourceManager_Membuffer_MMap,
7658 (unsigned long) srcBufs.mmap_bytes);
7659 createCXTUResourceUsageEntry(*entries,
7660 CXTUResourceUsage_SourceManager_DataStructures,
7661 (unsigned long) astContext.getSourceManager()
7662 .getDataStructureSizes());
7664 // How much memory is being used by the ExternalASTSource?
7665 if (ExternalASTSource *esrc = astContext.getExternalSource()) {
7666 const ExternalASTSource::MemoryBufferSizes &sizes =
7667 esrc->getMemoryBufferSizes();
7669 createCXTUResourceUsageEntry(*entries,
7670 CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc,
7671 (unsigned long) sizes.malloc_bytes);
7672 createCXTUResourceUsageEntry(*entries,
7673 CXTUResourceUsage_ExternalASTSource_Membuffer_MMap,
7674 (unsigned long) sizes.mmap_bytes);
7677 // How much memory is being used by the Preprocessor?
7678 Preprocessor &pp = astUnit->getPreprocessor();
7679 createCXTUResourceUsageEntry(*entries,
7680 CXTUResourceUsage_Preprocessor,
7681 pp.getTotalMemory());
7683 if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) {
7684 createCXTUResourceUsageEntry(*entries,
7685 CXTUResourceUsage_PreprocessingRecord,
7686 pRec->getTotalMemory());
7689 createCXTUResourceUsageEntry(*entries,
7690 CXTUResourceUsage_Preprocessor_HeaderSearch,
7691 pp.getHeaderSearchInfo().getTotalMemory());
7693 CXTUResourceUsage usage = { (void*) entries.get(),
7694 (unsigned) entries->size(),
7695 !entries->empty() ? &(*entries)[0] : nullptr };
7700 void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) {
7702 delete (MemUsageEntries*) usage.data;
7705 CXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) {
7706 CXSourceRangeList *skipped = new CXSourceRangeList;
7708 skipped->ranges = nullptr;
7710 if (isNotUsableTU(TU)) {
7718 ASTUnit *astUnit = cxtu::getASTUnit(TU);
7719 PreprocessingRecord *ppRec = astUnit->getPreprocessor().getPreprocessingRecord();
7723 ASTContext &Ctx = astUnit->getASTContext();
7724 SourceManager &sm = Ctx.getSourceManager();
7725 FileEntry *fileEntry = static_cast<FileEntry *>(file);
7726 FileID wantedFileID = sm.translateFile(fileEntry);
7728 const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges();
7729 std::vector<SourceRange> wantedRanges;
7730 for (std::vector<SourceRange>::const_iterator i = SkippedRanges.begin(), ei = SkippedRanges.end();
7732 if (sm.getFileID(i->getBegin()) == wantedFileID || sm.getFileID(i->getEnd()) == wantedFileID)
7733 wantedRanges.push_back(*i);
7736 skipped->count = wantedRanges.size();
7737 skipped->ranges = new CXSourceRange[skipped->count];
7738 for (unsigned i = 0, ei = skipped->count; i != ei; ++i)
7739 skipped->ranges[i] = cxloc::translateSourceRange(Ctx, wantedRanges[i]);
7744 void clang_disposeSourceRangeList(CXSourceRangeList *ranges) {
7746 delete[] ranges->ranges;
7753 void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) {
7754 CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU);
7755 for (unsigned I = 0; I != Usage.numEntries; ++I)
7756 fprintf(stderr, " %s: %lu\n",
7757 clang_getTUResourceUsageName(Usage.entries[I].kind),
7758 Usage.entries[I].amount);
7760 clang_disposeCXTUResourceUsage(Usage);
7763 //===----------------------------------------------------------------------===//
7764 // Misc. utility functions.
7765 //===----------------------------------------------------------------------===//
7767 /// Default to using an 8 MB stack size on "safety" threads.
7768 static unsigned SafetyStackThreadSize = 8 << 20;
7772 bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn,
7775 Size = GetSafetyThreadStackSize();
7777 return CRC.RunSafelyOnThread(Fn, Size);
7778 return CRC.RunSafely(Fn);
7781 unsigned GetSafetyThreadStackSize() {
7782 return SafetyStackThreadSize;
7785 void SetSafetyThreadStackSize(unsigned Value) {
7786 SafetyStackThreadSize = Value;
7791 void clang::setThreadBackgroundPriority() {
7792 if (getenv("LIBCLANG_BGPRIO_DISABLE"))
7795 #ifdef USE_DARWIN_THREADS
7796 setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG);
7800 void cxindex::printDiagsToStderr(ASTUnit *Unit) {
7804 for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
7805 DEnd = Unit->stored_diag_end();
7807 CXStoredDiagnostic Diag(*D, Unit->getLangOpts());
7808 CXString Msg = clang_formatDiagnostic(&Diag,
7809 clang_defaultDiagnosticDisplayOptions());
7810 fprintf(stderr, "%s\n", clang_getCString(Msg));
7811 clang_disposeString(Msg);
7813 #ifdef LLVM_ON_WIN32
7814 // On Windows, force a flush, since there may be multiple copies of
7815 // stderr and stdout in the file system, all with different buffers
7816 // but writing to the same device.
7821 MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II,
7822 SourceLocation MacroDefLoc,
7823 CXTranslationUnit TU){
7824 if (MacroDefLoc.isInvalid() || !TU)
7826 if (!II.hadMacroDefinition())
7829 ASTUnit *Unit = cxtu::getASTUnit(TU);
7830 Preprocessor &PP = Unit->getPreprocessor();
7831 MacroDirective *MD = PP.getLocalMacroDirectiveHistory(&II);
7833 for (MacroDirective::DefInfo
7834 Def = MD->getDefinition(); Def; Def = Def.getPreviousDefinition()) {
7835 if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc())
7836 return Def.getMacroInfo();
7843 const MacroInfo *cxindex::getMacroInfo(const MacroDefinitionRecord *MacroDef,
7844 CXTranslationUnit TU) {
7845 if (!MacroDef || !TU)
7847 const IdentifierInfo *II = MacroDef->getName();
7851 return getMacroInfo(*II, MacroDef->getLocation(), TU);
7854 MacroDefinitionRecord *
7855 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, const Token &Tok,
7856 CXTranslationUnit TU) {
7859 if (Tok.isNot(tok::raw_identifier))
7862 if (MI->getNumTokens() == 0)
7864 SourceRange DefRange(MI->getReplacementToken(0).getLocation(),
7865 MI->getDefinitionEndLoc());
7866 ASTUnit *Unit = cxtu::getASTUnit(TU);
7868 // Check that the token is inside the definition and not its argument list.
7869 SourceManager &SM = Unit->getSourceManager();
7870 if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin()))
7872 if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation()))
7875 Preprocessor &PP = Unit->getPreprocessor();
7876 PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
7880 IdentifierInfo &II = PP.getIdentifierTable().get(Tok.getRawIdentifier());
7881 if (!II.hadMacroDefinition())
7884 // Check that the identifier is not one of the macro arguments.
7885 if (std::find(MI->arg_begin(), MI->arg_end(), &II) != MI->arg_end())
7888 MacroDirective *InnerMD = PP.getLocalMacroDirectiveHistory(&II);
7892 return PPRec->findMacroDefinition(InnerMD->getMacroInfo());
7895 MacroDefinitionRecord *
7896 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, SourceLocation Loc,
7897 CXTranslationUnit TU) {
7898 if (Loc.isInvalid() || !MI || !TU)
7901 if (MI->getNumTokens() == 0)
7903 ASTUnit *Unit = cxtu::getASTUnit(TU);
7904 Preprocessor &PP = Unit->getPreprocessor();
7905 if (!PP.getPreprocessingRecord())
7907 Loc = Unit->getSourceManager().getSpellingLoc(Loc);
7909 if (PP.getRawToken(Loc, Tok))
7912 return checkForMacroInMacroDefinition(MI, Tok, TU);
7917 CXString clang_getClangVersion() {
7918 return cxstring::createDup(getClangFullVersion());
7921 } // end: extern "C"
7923 Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) {
7925 if (ASTUnit *Unit = cxtu::getASTUnit(TU)) {
7926 LogOS << '<' << Unit->getMainFileName() << '>';
7927 if (Unit->isMainFileAST())
7928 LogOS << " (" << Unit->getASTFileName() << ')';
7932 LogOS << "<NULL TU>";
7937 Logger &cxindex::Logger::operator<<(const FileEntry *FE) {
7938 *this << FE->getName();
7942 Logger &cxindex::Logger::operator<<(CXCursor cursor) {
7943 CXString cursorName = clang_getCursorDisplayName(cursor);
7944 *this << cursorName << "@" << clang_getCursorLocation(cursor);
7945 clang_disposeString(cursorName);
7949 Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) {
7951 unsigned Line, Column;
7952 clang_getFileLocation(Loc, &File, &Line, &Column, nullptr);
7953 CXString FileName = clang_getFileName(File);
7954 *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column);
7955 clang_disposeString(FileName);
7959 Logger &cxindex::Logger::operator<<(CXSourceRange range) {
7960 CXSourceLocation BLoc = clang_getRangeStart(range);
7961 CXSourceLocation ELoc = clang_getRangeEnd(range);
7964 unsigned BLine, BColumn;
7965 clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, nullptr);
7968 unsigned ELine, EColumn;
7969 clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, nullptr);
7971 CXString BFileName = clang_getFileName(BFile);
7972 if (BFile == EFile) {
7973 *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName),
7974 BLine, BColumn, ELine, EColumn);
7976 CXString EFileName = clang_getFileName(EFile);
7977 *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName),
7979 << llvm::format("%s:%d:%d]", clang_getCString(EFileName),
7981 clang_disposeString(EFileName);
7983 clang_disposeString(BFileName);
7987 Logger &cxindex::Logger::operator<<(CXString Str) {
7988 *this << clang_getCString(Str);
7992 Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) {
7997 static llvm::ManagedStatic<llvm::sys::Mutex> LoggingMutex;
7999 cxindex::Logger::~Logger() {
8000 llvm::sys::ScopedLock L(*LoggingMutex);
8002 static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime();
8004 raw_ostream &OS = llvm::errs();
8005 OS << "[libclang:" << Name << ':';
8007 #ifdef USE_DARWIN_THREADS
8008 // TODO: Portability.
8009 mach_port_t tid = pthread_mach_thread_np(pthread_self());
8013 llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime();
8014 OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime());
8018 llvm::sys::PrintStackTrace(OS);
8019 OS << "--------------------------------------------------\n";