1 //===- CIndex.cpp - Clang-C Source Indexing Library -----------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the main API hooks in the Clang-C Source Indexing
11 // library.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "CIndexer.h"
16 #include "CIndexDiagnostic.h"
17 #include "CLog.h"
18 #include "CXCursor.h"
19 #include "CXSourceLocation.h"
20 #include "CXString.h"
21 #include "CXTranslationUnit.h"
22 #include "CXType.h"
23 #include "CursorVisitor.h"
24 #include "clang/AST/Attr.h"
25 #include "clang/AST/StmtVisitor.h"
26 #include "clang/Basic/Diagnostic.h"
27 #include "clang/Basic/DiagnosticCategories.h"
28 #include "clang/Basic/DiagnosticIDs.h"
29 #include "clang/Basic/Version.h"
30 #include "clang/Frontend/ASTUnit.h"
31 #include "clang/Frontend/CompilerInstance.h"
32 #include "clang/Frontend/FrontendDiagnostic.h"
33 #include "clang/Index/CodegenNameGenerator.h"
34 #include "clang/Index/CommentToXML.h"
35 #include "clang/Lex/HeaderSearch.h"
36 #include "clang/Lex/Lexer.h"
37 #include "clang/Lex/PreprocessingRecord.h"
38 #include "clang/Lex/Preprocessor.h"
39 #include "clang/Serialization/SerializationDiagnostic.h"
40 #include "llvm/ADT/Optional.h"
41 #include "llvm/ADT/STLExtras.h"
42 #include "llvm/ADT/StringSwitch.h"
43 #include "llvm/Config/llvm-config.h"
44 #include "llvm/Support/Compiler.h"
45 #include "llvm/Support/CrashRecoveryContext.h"
46 #include "llvm/Support/Format.h"
47 #include "llvm/Support/ManagedStatic.h"
48 #include "llvm/Support/MemoryBuffer.h"
49 #include "llvm/Support/Mutex.h"
50 #include "llvm/Support/Program.h"
51 #include "llvm/Support/SaveAndRestore.h"
52 #include "llvm/Support/Signals.h"
53 #include "llvm/Support/TargetSelect.h"
54 #include "llvm/Support/Threading.h"
55 #include "llvm/Support/Timer.h"
56 #include "llvm/Support/raw_ostream.h"
57
58 #if LLVM_ENABLE_THREADS != 0 && defined(__APPLE__)
59 #define USE_DARWIN_THREADS
60 #endif
61
62 #ifdef USE_DARWIN_THREADS
63 #include <pthread.h>
64 #endif
65
66 using namespace clang;
67 using namespace clang::cxcursor;
68 using namespace clang::cxtu;
69 using namespace clang::cxindex;
70
MakeCXTranslationUnit(CIndexer * CIdx,ASTUnit * AU)71 CXTranslationUnit cxtu::MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *AU) {
72 if (!AU)
73 return nullptr;
74 assert(CIdx);
75 CXTranslationUnit D = new CXTranslationUnitImpl();
76 D->CIdx = CIdx;
77 D->TheASTUnit = AU;
78 D->StringPool = new cxstring::CXStringPool();
79 D->Diagnostics = nullptr;
80 D->OverridenCursorsPool = createOverridenCXCursorsPool();
81 D->CommentToXML = nullptr;
82 return D;
83 }
84
isASTReadError(ASTUnit * AU)85 bool cxtu::isASTReadError(ASTUnit *AU) {
86 for (ASTUnit::stored_diag_iterator D = AU->stored_diag_begin(),
87 DEnd = AU->stored_diag_end();
88 D != DEnd; ++D) {
89 if (D->getLevel() >= DiagnosticsEngine::Error &&
90 DiagnosticIDs::getCategoryNumberForDiag(D->getID()) ==
91 diag::DiagCat_AST_Deserialization_Issue)
92 return true;
93 }
94 return false;
95 }
96
~CXTUOwner()97 cxtu::CXTUOwner::~CXTUOwner() {
98 if (TU)
99 clang_disposeTranslationUnit(TU);
100 }
101
102 /// \brief Compare two source ranges to determine their relative position in
103 /// the translation unit.
RangeCompare(SourceManager & SM,SourceRange R1,SourceRange R2)104 static RangeComparisonResult RangeCompare(SourceManager &SM,
105 SourceRange R1,
106 SourceRange R2) {
107 assert(R1.isValid() && "First range is invalid?");
108 assert(R2.isValid() && "Second range is invalid?");
109 if (R1.getEnd() != R2.getBegin() &&
110 SM.isBeforeInTranslationUnit(R1.getEnd(), R2.getBegin()))
111 return RangeBefore;
112 if (R2.getEnd() != R1.getBegin() &&
113 SM.isBeforeInTranslationUnit(R2.getEnd(), R1.getBegin()))
114 return RangeAfter;
115 return RangeOverlap;
116 }
117
118 /// \brief Determine if a source location falls within, before, or after a
119 /// a given source range.
LocationCompare(SourceManager & SM,SourceLocation L,SourceRange R)120 static RangeComparisonResult LocationCompare(SourceManager &SM,
121 SourceLocation L, SourceRange R) {
122 assert(R.isValid() && "First range is invalid?");
123 assert(L.isValid() && "Second range is invalid?");
124 if (L == R.getBegin() || L == R.getEnd())
125 return RangeOverlap;
126 if (SM.isBeforeInTranslationUnit(L, R.getBegin()))
127 return RangeBefore;
128 if (SM.isBeforeInTranslationUnit(R.getEnd(), L))
129 return RangeAfter;
130 return RangeOverlap;
131 }
132
133 /// \brief Translate a Clang source range into a CIndex source range.
134 ///
135 /// Clang internally represents ranges where the end location points to the
136 /// start of the token at the end. However, for external clients it is more
137 /// useful to have a CXSourceRange be a proper half-open interval. This routine
138 /// does the appropriate translation.
translateSourceRange(const SourceManager & SM,const LangOptions & LangOpts,const CharSourceRange & R)139 CXSourceRange cxloc::translateSourceRange(const SourceManager &SM,
140 const LangOptions &LangOpts,
141 const CharSourceRange &R) {
142 // We want the last character in this location, so we will adjust the
143 // location accordingly.
144 SourceLocation EndLoc = R.getEnd();
145 if (EndLoc.isValid() && EndLoc.isMacroID() && !SM.isMacroArgExpansion(EndLoc))
146 EndLoc = SM.getExpansionRange(EndLoc).second;
147 if (R.isTokenRange() && EndLoc.isValid()) {
148 unsigned Length = Lexer::MeasureTokenLength(SM.getSpellingLoc(EndLoc),
149 SM, LangOpts);
150 EndLoc = EndLoc.getLocWithOffset(Length);
151 }
152
153 CXSourceRange Result = {
154 { &SM, &LangOpts },
155 R.getBegin().getRawEncoding(),
156 EndLoc.getRawEncoding()
157 };
158 return Result;
159 }
160
161 //===----------------------------------------------------------------------===//
162 // Cursor visitor.
163 //===----------------------------------------------------------------------===//
164
165 static SourceRange getRawCursorExtent(CXCursor C);
166 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr);
167
168
CompareRegionOfInterest(SourceRange R)169 RangeComparisonResult CursorVisitor::CompareRegionOfInterest(SourceRange R) {
170 return RangeCompare(AU->getSourceManager(), R, RegionOfInterest);
171 }
172
173 /// \brief Visit the given cursor and, if requested by the visitor,
174 /// its children.
175 ///
176 /// \param Cursor the cursor to visit.
177 ///
178 /// \param CheckedRegionOfInterest if true, then the caller already checked
179 /// that this cursor is within the region of interest.
180 ///
181 /// \returns true if the visitation should be aborted, false if it
182 /// should continue.
Visit(CXCursor Cursor,bool CheckedRegionOfInterest)183 bool CursorVisitor::Visit(CXCursor Cursor, bool CheckedRegionOfInterest) {
184 if (clang_isInvalid(Cursor.kind))
185 return false;
186
187 if (clang_isDeclaration(Cursor.kind)) {
188 const Decl *D = getCursorDecl(Cursor);
189 if (!D) {
190 assert(0 && "Invalid declaration cursor");
191 return true; // abort.
192 }
193
194 // Ignore implicit declarations, unless it's an objc method because
195 // currently we should report implicit methods for properties when indexing.
196 if (D->isImplicit() && !isa<ObjCMethodDecl>(D))
197 return false;
198 }
199
200 // If we have a range of interest, and this cursor doesn't intersect with it,
201 // we're done.
202 if (RegionOfInterest.isValid() && !CheckedRegionOfInterest) {
203 SourceRange Range = getRawCursorExtent(Cursor);
204 if (Range.isInvalid() || CompareRegionOfInterest(Range))
205 return false;
206 }
207
208 switch (Visitor(Cursor, Parent, ClientData)) {
209 case CXChildVisit_Break:
210 return true;
211
212 case CXChildVisit_Continue:
213 return false;
214
215 case CXChildVisit_Recurse: {
216 bool ret = VisitChildren(Cursor);
217 if (PostChildrenVisitor)
218 if (PostChildrenVisitor(Cursor, ClientData))
219 return true;
220 return ret;
221 }
222 }
223
224 llvm_unreachable("Invalid CXChildVisitResult!");
225 }
226
visitPreprocessedEntitiesInRange(SourceRange R,PreprocessingRecord & PPRec,CursorVisitor & Visitor)227 static bool visitPreprocessedEntitiesInRange(SourceRange R,
228 PreprocessingRecord &PPRec,
229 CursorVisitor &Visitor) {
230 SourceManager &SM = Visitor.getASTUnit()->getSourceManager();
231 FileID FID;
232
233 if (!Visitor.shouldVisitIncludedEntities()) {
234 // If the begin/end of the range lie in the same FileID, do the optimization
235 // where we skip preprocessed entities that do not come from the same FileID.
236 FID = SM.getFileID(SM.getFileLoc(R.getBegin()));
237 if (FID != SM.getFileID(SM.getFileLoc(R.getEnd())))
238 FID = FileID();
239 }
240
241 const auto &Entities = PPRec.getPreprocessedEntitiesInRange(R);
242 return Visitor.visitPreprocessedEntities(Entities.begin(), Entities.end(),
243 PPRec, FID);
244 }
245
visitFileRegion()246 bool CursorVisitor::visitFileRegion() {
247 if (RegionOfInterest.isInvalid())
248 return false;
249
250 ASTUnit *Unit = cxtu::getASTUnit(TU);
251 SourceManager &SM = Unit->getSourceManager();
252
253 std::pair<FileID, unsigned>
254 Begin = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getBegin())),
255 End = SM.getDecomposedLoc(SM.getFileLoc(RegionOfInterest.getEnd()));
256
257 if (End.first != Begin.first) {
258 // If the end does not reside in the same file, try to recover by
259 // picking the end of the file of begin location.
260 End.first = Begin.first;
261 End.second = SM.getFileIDSize(Begin.first);
262 }
263
264 assert(Begin.first == End.first);
265 if (Begin.second > End.second)
266 return false;
267
268 FileID File = Begin.first;
269 unsigned Offset = Begin.second;
270 unsigned Length = End.second - Begin.second;
271
272 if (!VisitDeclsOnly && !VisitPreprocessorLast)
273 if (visitPreprocessedEntitiesInRegion())
274 return true; // visitation break.
275
276 if (visitDeclsFromFileRegion(File, Offset, Length))
277 return true; // visitation break.
278
279 if (!VisitDeclsOnly && VisitPreprocessorLast)
280 return visitPreprocessedEntitiesInRegion();
281
282 return false;
283 }
284
isInLexicalContext(Decl * D,DeclContext * DC)285 static bool isInLexicalContext(Decl *D, DeclContext *DC) {
286 if (!DC)
287 return false;
288
289 for (DeclContext *DeclDC = D->getLexicalDeclContext();
290 DeclDC; DeclDC = DeclDC->getLexicalParent()) {
291 if (DeclDC == DC)
292 return true;
293 }
294 return false;
295 }
296
visitDeclsFromFileRegion(FileID File,unsigned Offset,unsigned Length)297 bool CursorVisitor::visitDeclsFromFileRegion(FileID File,
298 unsigned Offset, unsigned Length) {
299 ASTUnit *Unit = cxtu::getASTUnit(TU);
300 SourceManager &SM = Unit->getSourceManager();
301 SourceRange Range = RegionOfInterest;
302
303 SmallVector<Decl *, 16> Decls;
304 Unit->findFileRegionDecls(File, Offset, Length, Decls);
305
306 // If we didn't find any file level decls for the file, try looking at the
307 // file that it was included from.
308 while (Decls.empty() || Decls.front()->isTopLevelDeclInObjCContainer()) {
309 bool Invalid = false;
310 const SrcMgr::SLocEntry &SLEntry = SM.getSLocEntry(File, &Invalid);
311 if (Invalid)
312 return false;
313
314 SourceLocation Outer;
315 if (SLEntry.isFile())
316 Outer = SLEntry.getFile().getIncludeLoc();
317 else
318 Outer = SLEntry.getExpansion().getExpansionLocStart();
319 if (Outer.isInvalid())
320 return false;
321
322 std::tie(File, Offset) = SM.getDecomposedExpansionLoc(Outer);
323 Length = 0;
324 Unit->findFileRegionDecls(File, Offset, Length, Decls);
325 }
326
327 assert(!Decls.empty());
328
329 bool VisitedAtLeastOnce = false;
330 DeclContext *CurDC = nullptr;
331 SmallVectorImpl<Decl *>::iterator DIt = Decls.begin();
332 for (SmallVectorImpl<Decl *>::iterator DE = Decls.end(); DIt != DE; ++DIt) {
333 Decl *D = *DIt;
334 if (D->getSourceRange().isInvalid())
335 continue;
336
337 if (isInLexicalContext(D, CurDC))
338 continue;
339
340 CurDC = dyn_cast<DeclContext>(D);
341
342 if (TagDecl *TD = dyn_cast<TagDecl>(D))
343 if (!TD->isFreeStanding())
344 continue;
345
346 RangeComparisonResult CompRes = RangeCompare(SM, D->getSourceRange(),Range);
347 if (CompRes == RangeBefore)
348 continue;
349 if (CompRes == RangeAfter)
350 break;
351
352 assert(CompRes == RangeOverlap);
353 VisitedAtLeastOnce = true;
354
355 if (isa<ObjCContainerDecl>(D)) {
356 FileDI_current = &DIt;
357 FileDE_current = DE;
358 } else {
359 FileDI_current = nullptr;
360 }
361
362 if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
363 return true; // visitation break.
364 }
365
366 if (VisitedAtLeastOnce)
367 return false;
368
369 // No Decls overlapped with the range. Move up the lexical context until there
370 // is a context that contains the range or we reach the translation unit
371 // level.
372 DeclContext *DC = DIt == Decls.begin() ? (*DIt)->getLexicalDeclContext()
373 : (*(DIt-1))->getLexicalDeclContext();
374
375 while (DC && !DC->isTranslationUnit()) {
376 Decl *D = cast<Decl>(DC);
377 SourceRange CurDeclRange = D->getSourceRange();
378 if (CurDeclRange.isInvalid())
379 break;
380
381 if (RangeCompare(SM, CurDeclRange, Range) == RangeOverlap) {
382 if (Visit(MakeCXCursor(D, TU, Range), /*CheckedRegionOfInterest=*/true))
383 return true; // visitation break.
384 }
385
386 DC = D->getLexicalDeclContext();
387 }
388
389 return false;
390 }
391
visitPreprocessedEntitiesInRegion()392 bool CursorVisitor::visitPreprocessedEntitiesInRegion() {
393 if (!AU->getPreprocessor().getPreprocessingRecord())
394 return false;
395
396 PreprocessingRecord &PPRec
397 = *AU->getPreprocessor().getPreprocessingRecord();
398 SourceManager &SM = AU->getSourceManager();
399
400 if (RegionOfInterest.isValid()) {
401 SourceRange MappedRange = AU->mapRangeToPreamble(RegionOfInterest);
402 SourceLocation B = MappedRange.getBegin();
403 SourceLocation E = MappedRange.getEnd();
404
405 if (AU->isInPreambleFileID(B)) {
406 if (SM.isLoadedSourceLocation(E))
407 return visitPreprocessedEntitiesInRange(SourceRange(B, E),
408 PPRec, *this);
409
410 // Beginning of range lies in the preamble but it also extends beyond
411 // it into the main file. Split the range into 2 parts, one covering
412 // the preamble and another covering the main file. This allows subsequent
413 // calls to visitPreprocessedEntitiesInRange to accept a source range that
414 // lies in the same FileID, allowing it to skip preprocessed entities that
415 // do not come from the same FileID.
416 bool breaked =
417 visitPreprocessedEntitiesInRange(
418 SourceRange(B, AU->getEndOfPreambleFileID()),
419 PPRec, *this);
420 if (breaked) return true;
421 return visitPreprocessedEntitiesInRange(
422 SourceRange(AU->getStartOfMainFileID(), E),
423 PPRec, *this);
424 }
425
426 return visitPreprocessedEntitiesInRange(SourceRange(B, E), PPRec, *this);
427 }
428
429 bool OnlyLocalDecls
430 = !AU->isMainFileAST() && AU->getOnlyLocalDecls();
431
432 if (OnlyLocalDecls)
433 return visitPreprocessedEntities(PPRec.local_begin(), PPRec.local_end(),
434 PPRec);
435
436 return visitPreprocessedEntities(PPRec.begin(), PPRec.end(), PPRec);
437 }
438
439 template<typename InputIterator>
visitPreprocessedEntities(InputIterator First,InputIterator Last,PreprocessingRecord & PPRec,FileID FID)440 bool CursorVisitor::visitPreprocessedEntities(InputIterator First,
441 InputIterator Last,
442 PreprocessingRecord &PPRec,
443 FileID FID) {
444 for (; First != Last; ++First) {
445 if (!FID.isInvalid() && !PPRec.isEntityInFileID(First, FID))
446 continue;
447
448 PreprocessedEntity *PPE = *First;
449 if (!PPE)
450 continue;
451
452 if (MacroExpansion *ME = dyn_cast<MacroExpansion>(PPE)) {
453 if (Visit(MakeMacroExpansionCursor(ME, TU)))
454 return true;
455
456 continue;
457 }
458
459 if (MacroDefinitionRecord *MD = dyn_cast<MacroDefinitionRecord>(PPE)) {
460 if (Visit(MakeMacroDefinitionCursor(MD, TU)))
461 return true;
462
463 continue;
464 }
465
466 if (InclusionDirective *ID = dyn_cast<InclusionDirective>(PPE)) {
467 if (Visit(MakeInclusionDirectiveCursor(ID, TU)))
468 return true;
469
470 continue;
471 }
472 }
473
474 return false;
475 }
476
477 /// \brief Visit the children of the given cursor.
478 ///
479 /// \returns true if the visitation should be aborted, false if it
480 /// should continue.
VisitChildren(CXCursor Cursor)481 bool CursorVisitor::VisitChildren(CXCursor Cursor) {
482 if (clang_isReference(Cursor.kind) &&
483 Cursor.kind != CXCursor_CXXBaseSpecifier) {
484 // By definition, references have no children.
485 return false;
486 }
487
488 // Set the Parent field to Cursor, then back to its old value once we're
489 // done.
490 SetParentRAII SetParent(Parent, StmtParent, Cursor);
491
492 if (clang_isDeclaration(Cursor.kind)) {
493 Decl *D = const_cast<Decl *>(getCursorDecl(Cursor));
494 if (!D)
495 return false;
496
497 return VisitAttributes(D) || Visit(D);
498 }
499
500 if (clang_isStatement(Cursor.kind)) {
501 if (const Stmt *S = getCursorStmt(Cursor))
502 return Visit(S);
503
504 return false;
505 }
506
507 if (clang_isExpression(Cursor.kind)) {
508 if (const Expr *E = getCursorExpr(Cursor))
509 return Visit(E);
510
511 return false;
512 }
513
514 if (clang_isTranslationUnit(Cursor.kind)) {
515 CXTranslationUnit TU = getCursorTU(Cursor);
516 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
517
518 int VisitOrder[2] = { VisitPreprocessorLast, !VisitPreprocessorLast };
519 for (unsigned I = 0; I != 2; ++I) {
520 if (VisitOrder[I]) {
521 if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls() &&
522 RegionOfInterest.isInvalid()) {
523 for (ASTUnit::top_level_iterator TL = CXXUnit->top_level_begin(),
524 TLEnd = CXXUnit->top_level_end();
525 TL != TLEnd; ++TL) {
526 const Optional<bool> V = handleDeclForVisitation(*TL);
527 if (!V.hasValue())
528 continue;
529 return V.getValue();
530 }
531 } else if (VisitDeclContext(
532 CXXUnit->getASTContext().getTranslationUnitDecl()))
533 return true;
534 continue;
535 }
536
537 // Walk the preprocessing record.
538 if (CXXUnit->getPreprocessor().getPreprocessingRecord())
539 visitPreprocessedEntitiesInRegion();
540 }
541
542 return false;
543 }
544
545 if (Cursor.kind == CXCursor_CXXBaseSpecifier) {
546 if (const CXXBaseSpecifier *Base = getCursorCXXBaseSpecifier(Cursor)) {
547 if (TypeSourceInfo *BaseTSInfo = Base->getTypeSourceInfo()) {
548 return Visit(BaseTSInfo->getTypeLoc());
549 }
550 }
551 }
552
553 if (Cursor.kind == CXCursor_IBOutletCollectionAttr) {
554 const IBOutletCollectionAttr *A =
555 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(Cursor));
556 if (const ObjCObjectType *ObjT = A->getInterface()->getAs<ObjCObjectType>())
557 return Visit(cxcursor::MakeCursorObjCClassRef(
558 ObjT->getInterface(),
559 A->getInterfaceLoc()->getTypeLoc().getLocStart(), TU));
560 }
561
562 // If pointing inside a macro definition, check if the token is an identifier
563 // that was ever defined as a macro. In such a case, create a "pseudo" macro
564 // expansion cursor for that token.
565 SourceLocation BeginLoc = RegionOfInterest.getBegin();
566 if (Cursor.kind == CXCursor_MacroDefinition &&
567 BeginLoc == RegionOfInterest.getEnd()) {
568 SourceLocation Loc = AU->mapLocationToPreamble(BeginLoc);
569 const MacroInfo *MI =
570 getMacroInfo(cxcursor::getCursorMacroDefinition(Cursor), TU);
571 if (MacroDefinitionRecord *MacroDef =
572 checkForMacroInMacroDefinition(MI, Loc, TU))
573 return Visit(cxcursor::MakeMacroExpansionCursor(MacroDef, BeginLoc, TU));
574 }
575
576 // Nothing to visit at the moment.
577 return false;
578 }
579
VisitBlockDecl(BlockDecl * B)580 bool CursorVisitor::VisitBlockDecl(BlockDecl *B) {
581 if (TypeSourceInfo *TSInfo = B->getSignatureAsWritten())
582 if (Visit(TSInfo->getTypeLoc()))
583 return true;
584
585 if (Stmt *Body = B->getBody())
586 return Visit(MakeCXCursor(Body, StmtParent, TU, RegionOfInterest));
587
588 return false;
589 }
590
shouldVisitCursor(CXCursor Cursor)591 Optional<bool> CursorVisitor::shouldVisitCursor(CXCursor Cursor) {
592 if (RegionOfInterest.isValid()) {
593 SourceRange Range = getFullCursorExtent(Cursor, AU->getSourceManager());
594 if (Range.isInvalid())
595 return None;
596
597 switch (CompareRegionOfInterest(Range)) {
598 case RangeBefore:
599 // This declaration comes before the region of interest; skip it.
600 return None;
601
602 case RangeAfter:
603 // This declaration comes after the region of interest; we're done.
604 return false;
605
606 case RangeOverlap:
607 // This declaration overlaps the region of interest; visit it.
608 break;
609 }
610 }
611 return true;
612 }
613
VisitDeclContext(DeclContext * DC)614 bool CursorVisitor::VisitDeclContext(DeclContext *DC) {
615 DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
616
617 // FIXME: Eventually remove. This part of a hack to support proper
618 // iteration over all Decls contained lexically within an ObjC container.
619 SaveAndRestore<DeclContext::decl_iterator*> DI_saved(DI_current, &I);
620 SaveAndRestore<DeclContext::decl_iterator> DE_saved(DE_current, E);
621
622 for ( ; I != E; ++I) {
623 Decl *D = *I;
624 if (D->getLexicalDeclContext() != DC)
625 continue;
626 const Optional<bool> V = handleDeclForVisitation(D);
627 if (!V.hasValue())
628 continue;
629 return V.getValue();
630 }
631 return false;
632 }
633
handleDeclForVisitation(const Decl * D)634 Optional<bool> CursorVisitor::handleDeclForVisitation(const Decl *D) {
635 CXCursor Cursor = MakeCXCursor(D, TU, RegionOfInterest);
636
637 // Ignore synthesized ivars here, otherwise if we have something like:
638 // @synthesize prop = _prop;
639 // and '_prop' is not declared, we will encounter a '_prop' ivar before
640 // encountering the 'prop' synthesize declaration and we will think that
641 // we passed the region-of-interest.
642 if (auto *ivarD = dyn_cast<ObjCIvarDecl>(D)) {
643 if (ivarD->getSynthesize())
644 return None;
645 }
646
647 // FIXME: ObjCClassRef/ObjCProtocolRef for forward class/protocol
648 // declarations is a mismatch with the compiler semantics.
649 if (Cursor.kind == CXCursor_ObjCInterfaceDecl) {
650 auto *ID = cast<ObjCInterfaceDecl>(D);
651 if (!ID->isThisDeclarationADefinition())
652 Cursor = MakeCursorObjCClassRef(ID, ID->getLocation(), TU);
653
654 } else if (Cursor.kind == CXCursor_ObjCProtocolDecl) {
655 auto *PD = cast<ObjCProtocolDecl>(D);
656 if (!PD->isThisDeclarationADefinition())
657 Cursor = MakeCursorObjCProtocolRef(PD, PD->getLocation(), TU);
658 }
659
660 const Optional<bool> V = shouldVisitCursor(Cursor);
661 if (!V.hasValue())
662 return None;
663 if (!V.getValue())
664 return false;
665 if (Visit(Cursor, true))
666 return true;
667 return None;
668 }
669
VisitTranslationUnitDecl(TranslationUnitDecl * D)670 bool CursorVisitor::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
671 llvm_unreachable("Translation units are visited directly by Visit()");
672 }
673
VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl * D)674 bool CursorVisitor::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
675 if (VisitTemplateParameters(D->getTemplateParameters()))
676 return true;
677
678 return Visit(MakeCXCursor(D->getTemplatedDecl(), TU, RegionOfInterest));
679 }
680
VisitTypeAliasDecl(TypeAliasDecl * D)681 bool CursorVisitor::VisitTypeAliasDecl(TypeAliasDecl *D) {
682 if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
683 return Visit(TSInfo->getTypeLoc());
684
685 return false;
686 }
687
VisitTypedefDecl(TypedefDecl * D)688 bool CursorVisitor::VisitTypedefDecl(TypedefDecl *D) {
689 if (TypeSourceInfo *TSInfo = D->getTypeSourceInfo())
690 return Visit(TSInfo->getTypeLoc());
691
692 return false;
693 }
694
VisitTagDecl(TagDecl * D)695 bool CursorVisitor::VisitTagDecl(TagDecl *D) {
696 return VisitDeclContext(D);
697 }
698
VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl * D)699 bool CursorVisitor::VisitClassTemplateSpecializationDecl(
700 ClassTemplateSpecializationDecl *D) {
701 bool ShouldVisitBody = false;
702 switch (D->getSpecializationKind()) {
703 case TSK_Undeclared:
704 case TSK_ImplicitInstantiation:
705 // Nothing to visit
706 return false;
707
708 case TSK_ExplicitInstantiationDeclaration:
709 case TSK_ExplicitInstantiationDefinition:
710 break;
711
712 case TSK_ExplicitSpecialization:
713 ShouldVisitBody = true;
714 break;
715 }
716
717 // Visit the template arguments used in the specialization.
718 if (TypeSourceInfo *SpecType = D->getTypeAsWritten()) {
719 TypeLoc TL = SpecType->getTypeLoc();
720 if (TemplateSpecializationTypeLoc TSTLoc =
721 TL.getAs<TemplateSpecializationTypeLoc>()) {
722 for (unsigned I = 0, N = TSTLoc.getNumArgs(); I != N; ++I)
723 if (VisitTemplateArgumentLoc(TSTLoc.getArgLoc(I)))
724 return true;
725 }
726 }
727
728 return ShouldVisitBody && VisitCXXRecordDecl(D);
729 }
730
VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl * D)731 bool CursorVisitor::VisitClassTemplatePartialSpecializationDecl(
732 ClassTemplatePartialSpecializationDecl *D) {
733 // FIXME: Visit the "outer" template parameter lists on the TagDecl
734 // before visiting these template parameters.
735 if (VisitTemplateParameters(D->getTemplateParameters()))
736 return true;
737
738 // Visit the partial specialization arguments.
739 const ASTTemplateArgumentListInfo *Info = D->getTemplateArgsAsWritten();
740 const TemplateArgumentLoc *TemplateArgs = Info->getTemplateArgs();
741 for (unsigned I = 0, N = Info->NumTemplateArgs; I != N; ++I)
742 if (VisitTemplateArgumentLoc(TemplateArgs[I]))
743 return true;
744
745 return VisitCXXRecordDecl(D);
746 }
747
VisitTemplateTypeParmDecl(TemplateTypeParmDecl * D)748 bool CursorVisitor::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
749 // Visit the default argument.
750 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
751 if (TypeSourceInfo *DefArg = D->getDefaultArgumentInfo())
752 if (Visit(DefArg->getTypeLoc()))
753 return true;
754
755 return false;
756 }
757
VisitEnumConstantDecl(EnumConstantDecl * D)758 bool CursorVisitor::VisitEnumConstantDecl(EnumConstantDecl *D) {
759 if (Expr *Init = D->getInitExpr())
760 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
761 return false;
762 }
763
VisitDeclaratorDecl(DeclaratorDecl * DD)764 bool CursorVisitor::VisitDeclaratorDecl(DeclaratorDecl *DD) {
765 unsigned NumParamList = DD->getNumTemplateParameterLists();
766 for (unsigned i = 0; i < NumParamList; i++) {
767 TemplateParameterList* Params = DD->getTemplateParameterList(i);
768 if (VisitTemplateParameters(Params))
769 return true;
770 }
771
772 if (TypeSourceInfo *TSInfo = DD->getTypeSourceInfo())
773 if (Visit(TSInfo->getTypeLoc()))
774 return true;
775
776 // Visit the nested-name-specifier, if present.
777 if (NestedNameSpecifierLoc QualifierLoc = DD->getQualifierLoc())
778 if (VisitNestedNameSpecifierLoc(QualifierLoc))
779 return true;
780
781 return false;
782 }
783
784 /// \brief Compare two base or member initializers based on their source order.
CompareCXXCtorInitializers(CXXCtorInitializer * const * X,CXXCtorInitializer * const * Y)785 static int CompareCXXCtorInitializers(CXXCtorInitializer *const *X,
786 CXXCtorInitializer *const *Y) {
787 return (*X)->getSourceOrder() - (*Y)->getSourceOrder();
788 }
789
VisitFunctionDecl(FunctionDecl * ND)790 bool CursorVisitor::VisitFunctionDecl(FunctionDecl *ND) {
791 unsigned NumParamList = ND->getNumTemplateParameterLists();
792 for (unsigned i = 0; i < NumParamList; i++) {
793 TemplateParameterList* Params = ND->getTemplateParameterList(i);
794 if (VisitTemplateParameters(Params))
795 return true;
796 }
797
798 if (TypeSourceInfo *TSInfo = ND->getTypeSourceInfo()) {
799 // Visit the function declaration's syntactic components in the order
800 // written. This requires a bit of work.
801 TypeLoc TL = TSInfo->getTypeLoc().IgnoreParens();
802 FunctionTypeLoc FTL = TL.getAs<FunctionTypeLoc>();
803
804 // If we have a function declared directly (without the use of a typedef),
805 // visit just the return type. Otherwise, just visit the function's type
806 // now.
807 if ((FTL && !isa<CXXConversionDecl>(ND) && Visit(FTL.getReturnLoc())) ||
808 (!FTL && Visit(TL)))
809 return true;
810
811 // Visit the nested-name-specifier, if present.
812 if (NestedNameSpecifierLoc QualifierLoc = ND->getQualifierLoc())
813 if (VisitNestedNameSpecifierLoc(QualifierLoc))
814 return true;
815
816 // Visit the declaration name.
817 if (!isa<CXXDestructorDecl>(ND))
818 if (VisitDeclarationNameInfo(ND->getNameInfo()))
819 return true;
820
821 // FIXME: Visit explicitly-specified template arguments!
822
823 // Visit the function parameters, if we have a function type.
824 if (FTL && VisitFunctionTypeLoc(FTL, true))
825 return true;
826
827 // FIXME: Attributes?
828 }
829
830 if (ND->doesThisDeclarationHaveABody() && !ND->isLateTemplateParsed()) {
831 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(ND)) {
832 // Find the initializers that were written in the source.
833 SmallVector<CXXCtorInitializer *, 4> WrittenInits;
834 for (auto *I : Constructor->inits()) {
835 if (!I->isWritten())
836 continue;
837
838 WrittenInits.push_back(I);
839 }
840
841 // Sort the initializers in source order
842 llvm::array_pod_sort(WrittenInits.begin(), WrittenInits.end(),
843 &CompareCXXCtorInitializers);
844
845 // Visit the initializers in source order
846 for (unsigned I = 0, N = WrittenInits.size(); I != N; ++I) {
847 CXXCtorInitializer *Init = WrittenInits[I];
848 if (Init->isAnyMemberInitializer()) {
849 if (Visit(MakeCursorMemberRef(Init->getAnyMember(),
850 Init->getMemberLocation(), TU)))
851 return true;
852 } else if (TypeSourceInfo *TInfo = Init->getTypeSourceInfo()) {
853 if (Visit(TInfo->getTypeLoc()))
854 return true;
855 }
856
857 // Visit the initializer value.
858 if (Expr *Initializer = Init->getInit())
859 if (Visit(MakeCXCursor(Initializer, ND, TU, RegionOfInterest)))
860 return true;
861 }
862 }
863
864 if (Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest)))
865 return true;
866 }
867
868 return false;
869 }
870
VisitFieldDecl(FieldDecl * D)871 bool CursorVisitor::VisitFieldDecl(FieldDecl *D) {
872 if (VisitDeclaratorDecl(D))
873 return true;
874
875 if (Expr *BitWidth = D->getBitWidth())
876 return Visit(MakeCXCursor(BitWidth, StmtParent, TU, RegionOfInterest));
877
878 return false;
879 }
880
VisitVarDecl(VarDecl * D)881 bool CursorVisitor::VisitVarDecl(VarDecl *D) {
882 if (VisitDeclaratorDecl(D))
883 return true;
884
885 if (Expr *Init = D->getInit())
886 return Visit(MakeCXCursor(Init, StmtParent, TU, RegionOfInterest));
887
888 return false;
889 }
890
VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl * D)891 bool CursorVisitor::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
892 if (VisitDeclaratorDecl(D))
893 return true;
894
895 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
896 if (Expr *DefArg = D->getDefaultArgument())
897 return Visit(MakeCXCursor(DefArg, StmtParent, TU, RegionOfInterest));
898
899 return false;
900 }
901
VisitFunctionTemplateDecl(FunctionTemplateDecl * D)902 bool CursorVisitor::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
903 // FIXME: Visit the "outer" template parameter lists on the FunctionDecl
904 // before visiting these template parameters.
905 if (VisitTemplateParameters(D->getTemplateParameters()))
906 return true;
907
908 return VisitFunctionDecl(D->getTemplatedDecl());
909 }
910
VisitClassTemplateDecl(ClassTemplateDecl * D)911 bool CursorVisitor::VisitClassTemplateDecl(ClassTemplateDecl *D) {
912 // FIXME: Visit the "outer" template parameter lists on the TagDecl
913 // before visiting these template parameters.
914 if (VisitTemplateParameters(D->getTemplateParameters()))
915 return true;
916
917 return VisitCXXRecordDecl(D->getTemplatedDecl());
918 }
919
VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl * D)920 bool CursorVisitor::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
921 if (VisitTemplateParameters(D->getTemplateParameters()))
922 return true;
923
924 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited() &&
925 VisitTemplateArgumentLoc(D->getDefaultArgument()))
926 return true;
927
928 return false;
929 }
930
VisitObjCTypeParamDecl(ObjCTypeParamDecl * D)931 bool CursorVisitor::VisitObjCTypeParamDecl(ObjCTypeParamDecl *D) {
932 // Visit the bound, if it's explicit.
933 if (D->hasExplicitBound()) {
934 if (auto TInfo = D->getTypeSourceInfo()) {
935 if (Visit(TInfo->getTypeLoc()))
936 return true;
937 }
938 }
939
940 return false;
941 }
942
VisitObjCMethodDecl(ObjCMethodDecl * ND)943 bool CursorVisitor::VisitObjCMethodDecl(ObjCMethodDecl *ND) {
944 if (TypeSourceInfo *TSInfo = ND->getReturnTypeSourceInfo())
945 if (Visit(TSInfo->getTypeLoc()))
946 return true;
947
948 for (const auto *P : ND->parameters()) {
949 if (Visit(MakeCXCursor(P, TU, RegionOfInterest)))
950 return true;
951 }
952
953 return ND->isThisDeclarationADefinition() &&
954 Visit(MakeCXCursor(ND->getBody(), StmtParent, TU, RegionOfInterest));
955 }
956
957 template <typename DeclIt>
addRangedDeclsInContainer(DeclIt * DI_current,DeclIt DE_current,SourceManager & SM,SourceLocation EndLoc,SmallVectorImpl<Decl * > & Decls)958 static void addRangedDeclsInContainer(DeclIt *DI_current, DeclIt DE_current,
959 SourceManager &SM, SourceLocation EndLoc,
960 SmallVectorImpl<Decl *> &Decls) {
961 DeclIt next = *DI_current;
962 while (++next != DE_current) {
963 Decl *D_next = *next;
964 if (!D_next)
965 break;
966 SourceLocation L = D_next->getLocStart();
967 if (!L.isValid())
968 break;
969 if (SM.isBeforeInTranslationUnit(L, EndLoc)) {
970 *DI_current = next;
971 Decls.push_back(D_next);
972 continue;
973 }
974 break;
975 }
976 }
977
VisitObjCContainerDecl(ObjCContainerDecl * D)978 bool CursorVisitor::VisitObjCContainerDecl(ObjCContainerDecl *D) {
979 // FIXME: Eventually convert back to just 'VisitDeclContext()'. Essentially
980 // an @implementation can lexically contain Decls that are not properly
981 // nested in the AST. When we identify such cases, we need to retrofit
982 // this nesting here.
983 if (!DI_current && !FileDI_current)
984 return VisitDeclContext(D);
985
986 // Scan the Decls that immediately come after the container
987 // in the current DeclContext. If any fall within the
988 // container's lexical region, stash them into a vector
989 // for later processing.
990 SmallVector<Decl *, 24> DeclsInContainer;
991 SourceLocation EndLoc = D->getSourceRange().getEnd();
992 SourceManager &SM = AU->getSourceManager();
993 if (EndLoc.isValid()) {
994 if (DI_current) {
995 addRangedDeclsInContainer(DI_current, DE_current, SM, EndLoc,
996 DeclsInContainer);
997 } else {
998 addRangedDeclsInContainer(FileDI_current, FileDE_current, SM, EndLoc,
999 DeclsInContainer);
1000 }
1001 }
1002
1003 // The common case.
1004 if (DeclsInContainer.empty())
1005 return VisitDeclContext(D);
1006
1007 // Get all the Decls in the DeclContext, and sort them with the
1008 // additional ones we've collected. Then visit them.
1009 for (auto *SubDecl : D->decls()) {
1010 if (!SubDecl || SubDecl->getLexicalDeclContext() != D ||
1011 SubDecl->getLocStart().isInvalid())
1012 continue;
1013 DeclsInContainer.push_back(SubDecl);
1014 }
1015
1016 // Now sort the Decls so that they appear in lexical order.
1017 std::sort(DeclsInContainer.begin(), DeclsInContainer.end(),
1018 [&SM](Decl *A, Decl *B) {
1019 SourceLocation L_A = A->getLocStart();
1020 SourceLocation L_B = B->getLocStart();
1021 assert(L_A.isValid() && L_B.isValid());
1022 return SM.isBeforeInTranslationUnit(L_A, L_B);
1023 });
1024
1025 // Now visit the decls.
1026 for (SmallVectorImpl<Decl*>::iterator I = DeclsInContainer.begin(),
1027 E = DeclsInContainer.end(); I != E; ++I) {
1028 CXCursor Cursor = MakeCXCursor(*I, TU, RegionOfInterest);
1029 const Optional<bool> &V = shouldVisitCursor(Cursor);
1030 if (!V.hasValue())
1031 continue;
1032 if (!V.getValue())
1033 return false;
1034 if (Visit(Cursor, true))
1035 return true;
1036 }
1037 return false;
1038 }
1039
VisitObjCCategoryDecl(ObjCCategoryDecl * ND)1040 bool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) {
1041 if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(),
1042 TU)))
1043 return true;
1044
1045 if (VisitObjCTypeParamList(ND->getTypeParamList()))
1046 return true;
1047
1048 ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin();
1049 for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(),
1050 E = ND->protocol_end(); I != E; ++I, ++PL)
1051 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1052 return true;
1053
1054 return VisitObjCContainerDecl(ND);
1055 }
1056
VisitObjCProtocolDecl(ObjCProtocolDecl * PID)1057 bool CursorVisitor::VisitObjCProtocolDecl(ObjCProtocolDecl *PID) {
1058 if (!PID->isThisDeclarationADefinition())
1059 return Visit(MakeCursorObjCProtocolRef(PID, PID->getLocation(), TU));
1060
1061 ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin();
1062 for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(),
1063 E = PID->protocol_end(); I != E; ++I, ++PL)
1064 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1065 return true;
1066
1067 return VisitObjCContainerDecl(PID);
1068 }
1069
VisitObjCPropertyDecl(ObjCPropertyDecl * PD)1070 bool CursorVisitor::VisitObjCPropertyDecl(ObjCPropertyDecl *PD) {
1071 if (PD->getTypeSourceInfo() && Visit(PD->getTypeSourceInfo()->getTypeLoc()))
1072 return true;
1073
1074 // FIXME: This implements a workaround with @property declarations also being
1075 // installed in the DeclContext for the @interface. Eventually this code
1076 // should be removed.
1077 ObjCCategoryDecl *CDecl = dyn_cast<ObjCCategoryDecl>(PD->getDeclContext());
1078 if (!CDecl || !CDecl->IsClassExtension())
1079 return false;
1080
1081 ObjCInterfaceDecl *ID = CDecl->getClassInterface();
1082 if (!ID)
1083 return false;
1084
1085 IdentifierInfo *PropertyId = PD->getIdentifier();
1086 ObjCPropertyDecl *prevDecl =
1087 ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(ID), PropertyId,
1088 PD->getQueryKind());
1089
1090 if (!prevDecl)
1091 return false;
1092
1093 // Visit synthesized methods since they will be skipped when visiting
1094 // the @interface.
1095 if (ObjCMethodDecl *MD = prevDecl->getGetterMethodDecl())
1096 if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
1097 if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
1098 return true;
1099
1100 if (ObjCMethodDecl *MD = prevDecl->getSetterMethodDecl())
1101 if (MD->isPropertyAccessor() && MD->getLexicalDeclContext() == CDecl)
1102 if (Visit(MakeCXCursor(MD, TU, RegionOfInterest)))
1103 return true;
1104
1105 return false;
1106 }
1107
VisitObjCTypeParamList(ObjCTypeParamList * typeParamList)1108 bool CursorVisitor::VisitObjCTypeParamList(ObjCTypeParamList *typeParamList) {
1109 if (!typeParamList)
1110 return false;
1111
1112 for (auto *typeParam : *typeParamList) {
1113 // Visit the type parameter.
1114 if (Visit(MakeCXCursor(typeParam, TU, RegionOfInterest)))
1115 return true;
1116 }
1117
1118 return false;
1119 }
1120
VisitObjCInterfaceDecl(ObjCInterfaceDecl * D)1121 bool CursorVisitor::VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
1122 if (!D->isThisDeclarationADefinition()) {
1123 // Forward declaration is treated like a reference.
1124 return Visit(MakeCursorObjCClassRef(D, D->getLocation(), TU));
1125 }
1126
1127 // Objective-C type parameters.
1128 if (VisitObjCTypeParamList(D->getTypeParamListAsWritten()))
1129 return true;
1130
1131 // Issue callbacks for super class.
1132 if (D->getSuperClass() &&
1133 Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
1134 D->getSuperClassLoc(),
1135 TU)))
1136 return true;
1137
1138 if (TypeSourceInfo *SuperClassTInfo = D->getSuperClassTInfo())
1139 if (Visit(SuperClassTInfo->getTypeLoc()))
1140 return true;
1141
1142 ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin();
1143 for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
1144 E = D->protocol_end(); I != E; ++I, ++PL)
1145 if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
1146 return true;
1147
1148 return VisitObjCContainerDecl(D);
1149 }
1150
VisitObjCImplDecl(ObjCImplDecl * D)1151 bool CursorVisitor::VisitObjCImplDecl(ObjCImplDecl *D) {
1152 return VisitObjCContainerDecl(D);
1153 }
1154
VisitObjCCategoryImplDecl(ObjCCategoryImplDecl * D)1155 bool CursorVisitor::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
1156 // 'ID' could be null when dealing with invalid code.
1157 if (ObjCInterfaceDecl *ID = D->getClassInterface())
1158 if (Visit(MakeCursorObjCClassRef(ID, D->getLocation(), TU)))
1159 return true;
1160
1161 return VisitObjCImplDecl(D);
1162 }
1163
VisitObjCImplementationDecl(ObjCImplementationDecl * D)1164 bool CursorVisitor::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
1165 #if 0
1166 // Issue callbacks for super class.
1167 // FIXME: No source location information!
1168 if (D->getSuperClass() &&
1169 Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
1170 D->getSuperClassLoc(),
1171 TU)))
1172 return true;
1173 #endif
1174
1175 return VisitObjCImplDecl(D);
1176 }
1177
VisitObjCPropertyImplDecl(ObjCPropertyImplDecl * PD)1178 bool CursorVisitor::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *PD) {
1179 if (ObjCIvarDecl *Ivar = PD->getPropertyIvarDecl())
1180 if (PD->isIvarNameSpecified())
1181 return Visit(MakeCursorMemberRef(Ivar, PD->getPropertyIvarDeclLoc(), TU));
1182
1183 return false;
1184 }
1185
VisitNamespaceDecl(NamespaceDecl * D)1186 bool CursorVisitor::VisitNamespaceDecl(NamespaceDecl *D) {
1187 return VisitDeclContext(D);
1188 }
1189
VisitNamespaceAliasDecl(NamespaceAliasDecl * D)1190 bool CursorVisitor::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
1191 // Visit nested-name-specifier.
1192 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1193 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1194 return true;
1195
1196 return Visit(MakeCursorNamespaceRef(D->getAliasedNamespace(),
1197 D->getTargetNameLoc(), TU));
1198 }
1199
VisitUsingDecl(UsingDecl * D)1200 bool CursorVisitor::VisitUsingDecl(UsingDecl *D) {
1201 // Visit nested-name-specifier.
1202 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
1203 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1204 return true;
1205 }
1206
1207 if (Visit(MakeCursorOverloadedDeclRef(D, D->getLocation(), TU)))
1208 return true;
1209
1210 return VisitDeclarationNameInfo(D->getNameInfo());
1211 }
1212
VisitUsingDirectiveDecl(UsingDirectiveDecl * D)1213 bool CursorVisitor::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
1214 // Visit nested-name-specifier.
1215 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1216 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1217 return true;
1218
1219 return Visit(MakeCursorNamespaceRef(D->getNominatedNamespaceAsWritten(),
1220 D->getIdentLocation(), TU));
1221 }
1222
VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl * D)1223 bool CursorVisitor::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
1224 // Visit nested-name-specifier.
1225 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc()) {
1226 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1227 return true;
1228 }
1229
1230 return VisitDeclarationNameInfo(D->getNameInfo());
1231 }
1232
VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl * D)1233 bool CursorVisitor::VisitUnresolvedUsingTypenameDecl(
1234 UnresolvedUsingTypenameDecl *D) {
1235 // Visit nested-name-specifier.
1236 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1237 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1238 return true;
1239
1240 return false;
1241 }
1242
VisitStaticAssertDecl(StaticAssertDecl * D)1243 bool CursorVisitor::VisitStaticAssertDecl(StaticAssertDecl *D) {
1244 if (Visit(MakeCXCursor(D->getAssertExpr(), StmtParent, TU, RegionOfInterest)))
1245 return true;
1246 if (Visit(MakeCXCursor(D->getMessage(), StmtParent, TU, RegionOfInterest)))
1247 return true;
1248 return false;
1249 }
1250
VisitDeclarationNameInfo(DeclarationNameInfo Name)1251 bool CursorVisitor::VisitDeclarationNameInfo(DeclarationNameInfo Name) {
1252 switch (Name.getName().getNameKind()) {
1253 case clang::DeclarationName::Identifier:
1254 case clang::DeclarationName::CXXLiteralOperatorName:
1255 case clang::DeclarationName::CXXOperatorName:
1256 case clang::DeclarationName::CXXUsingDirective:
1257 return false;
1258
1259 case clang::DeclarationName::CXXConstructorName:
1260 case clang::DeclarationName::CXXDestructorName:
1261 case clang::DeclarationName::CXXConversionFunctionName:
1262 if (TypeSourceInfo *TSInfo = Name.getNamedTypeInfo())
1263 return Visit(TSInfo->getTypeLoc());
1264 return false;
1265
1266 case clang::DeclarationName::ObjCZeroArgSelector:
1267 case clang::DeclarationName::ObjCOneArgSelector:
1268 case clang::DeclarationName::ObjCMultiArgSelector:
1269 // FIXME: Per-identifier location info?
1270 return false;
1271 }
1272
1273 llvm_unreachable("Invalid DeclarationName::Kind!");
1274 }
1275
VisitNestedNameSpecifier(NestedNameSpecifier * NNS,SourceRange Range)1276 bool CursorVisitor::VisitNestedNameSpecifier(NestedNameSpecifier *NNS,
1277 SourceRange Range) {
1278 // FIXME: This whole routine is a hack to work around the lack of proper
1279 // source information in nested-name-specifiers (PR5791). Since we do have
1280 // a beginning source location, we can visit the first component of the
1281 // nested-name-specifier, if it's a single-token component.
1282 if (!NNS)
1283 return false;
1284
1285 // Get the first component in the nested-name-specifier.
1286 while (NestedNameSpecifier *Prefix = NNS->getPrefix())
1287 NNS = Prefix;
1288
1289 switch (NNS->getKind()) {
1290 case NestedNameSpecifier::Namespace:
1291 return Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(), Range.getBegin(),
1292 TU));
1293
1294 case NestedNameSpecifier::NamespaceAlias:
1295 return Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
1296 Range.getBegin(), TU));
1297
1298 case NestedNameSpecifier::TypeSpec: {
1299 // If the type has a form where we know that the beginning of the source
1300 // range matches up with a reference cursor. Visit the appropriate reference
1301 // cursor.
1302 const Type *T = NNS->getAsType();
1303 if (const TypedefType *Typedef = dyn_cast<TypedefType>(T))
1304 return Visit(MakeCursorTypeRef(Typedef->getDecl(), Range.getBegin(), TU));
1305 if (const TagType *Tag = dyn_cast<TagType>(T))
1306 return Visit(MakeCursorTypeRef(Tag->getDecl(), Range.getBegin(), TU));
1307 if (const TemplateSpecializationType *TST
1308 = dyn_cast<TemplateSpecializationType>(T))
1309 return VisitTemplateName(TST->getTemplateName(), Range.getBegin());
1310 break;
1311 }
1312
1313 case NestedNameSpecifier::TypeSpecWithTemplate:
1314 case NestedNameSpecifier::Global:
1315 case NestedNameSpecifier::Identifier:
1316 case NestedNameSpecifier::Super:
1317 break;
1318 }
1319
1320 return false;
1321 }
1322
1323 bool
VisitNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier)1324 CursorVisitor::VisitNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
1325 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
1326 for (; Qualifier; Qualifier = Qualifier.getPrefix())
1327 Qualifiers.push_back(Qualifier);
1328
1329 while (!Qualifiers.empty()) {
1330 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
1331 NestedNameSpecifier *NNS = Q.getNestedNameSpecifier();
1332 switch (NNS->getKind()) {
1333 case NestedNameSpecifier::Namespace:
1334 if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespace(),
1335 Q.getLocalBeginLoc(),
1336 TU)))
1337 return true;
1338
1339 break;
1340
1341 case NestedNameSpecifier::NamespaceAlias:
1342 if (Visit(MakeCursorNamespaceRef(NNS->getAsNamespaceAlias(),
1343 Q.getLocalBeginLoc(),
1344 TU)))
1345 return true;
1346
1347 break;
1348
1349 case NestedNameSpecifier::TypeSpec:
1350 case NestedNameSpecifier::TypeSpecWithTemplate:
1351 if (Visit(Q.getTypeLoc()))
1352 return true;
1353
1354 break;
1355
1356 case NestedNameSpecifier::Global:
1357 case NestedNameSpecifier::Identifier:
1358 case NestedNameSpecifier::Super:
1359 break;
1360 }
1361 }
1362
1363 return false;
1364 }
1365
VisitTemplateParameters(const TemplateParameterList * Params)1366 bool CursorVisitor::VisitTemplateParameters(
1367 const TemplateParameterList *Params) {
1368 if (!Params)
1369 return false;
1370
1371 for (TemplateParameterList::const_iterator P = Params->begin(),
1372 PEnd = Params->end();
1373 P != PEnd; ++P) {
1374 if (Visit(MakeCXCursor(*P, TU, RegionOfInterest)))
1375 return true;
1376 }
1377
1378 return false;
1379 }
1380
VisitTemplateName(TemplateName Name,SourceLocation Loc)1381 bool CursorVisitor::VisitTemplateName(TemplateName Name, SourceLocation Loc) {
1382 switch (Name.getKind()) {
1383 case TemplateName::Template:
1384 return Visit(MakeCursorTemplateRef(Name.getAsTemplateDecl(), Loc, TU));
1385
1386 case TemplateName::OverloadedTemplate:
1387 // Visit the overloaded template set.
1388 if (Visit(MakeCursorOverloadedDeclRef(Name, Loc, TU)))
1389 return true;
1390
1391 return false;
1392
1393 case TemplateName::DependentTemplate:
1394 // FIXME: Visit nested-name-specifier.
1395 return false;
1396
1397 case TemplateName::QualifiedTemplate:
1398 // FIXME: Visit nested-name-specifier.
1399 return Visit(MakeCursorTemplateRef(
1400 Name.getAsQualifiedTemplateName()->getDecl(),
1401 Loc, TU));
1402
1403 case TemplateName::SubstTemplateTemplateParm:
1404 return Visit(MakeCursorTemplateRef(
1405 Name.getAsSubstTemplateTemplateParm()->getParameter(),
1406 Loc, TU));
1407
1408 case TemplateName::SubstTemplateTemplateParmPack:
1409 return Visit(MakeCursorTemplateRef(
1410 Name.getAsSubstTemplateTemplateParmPack()->getParameterPack(),
1411 Loc, TU));
1412 }
1413
1414 llvm_unreachable("Invalid TemplateName::Kind!");
1415 }
1416
VisitTemplateArgumentLoc(const TemplateArgumentLoc & TAL)1417 bool CursorVisitor::VisitTemplateArgumentLoc(const TemplateArgumentLoc &TAL) {
1418 switch (TAL.getArgument().getKind()) {
1419 case TemplateArgument::Null:
1420 case TemplateArgument::Integral:
1421 case TemplateArgument::Pack:
1422 return false;
1423
1424 case TemplateArgument::Type:
1425 if (TypeSourceInfo *TSInfo = TAL.getTypeSourceInfo())
1426 return Visit(TSInfo->getTypeLoc());
1427 return false;
1428
1429 case TemplateArgument::Declaration:
1430 if (Expr *E = TAL.getSourceDeclExpression())
1431 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1432 return false;
1433
1434 case TemplateArgument::NullPtr:
1435 if (Expr *E = TAL.getSourceNullPtrExpression())
1436 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1437 return false;
1438
1439 case TemplateArgument::Expression:
1440 if (Expr *E = TAL.getSourceExpression())
1441 return Visit(MakeCXCursor(E, StmtParent, TU, RegionOfInterest));
1442 return false;
1443
1444 case TemplateArgument::Template:
1445 case TemplateArgument::TemplateExpansion:
1446 if (VisitNestedNameSpecifierLoc(TAL.getTemplateQualifierLoc()))
1447 return true;
1448
1449 return VisitTemplateName(TAL.getArgument().getAsTemplateOrTemplatePattern(),
1450 TAL.getTemplateNameLoc());
1451 }
1452
1453 llvm_unreachable("Invalid TemplateArgument::Kind!");
1454 }
1455
VisitLinkageSpecDecl(LinkageSpecDecl * D)1456 bool CursorVisitor::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
1457 return VisitDeclContext(D);
1458 }
1459
VisitQualifiedTypeLoc(QualifiedTypeLoc TL)1460 bool CursorVisitor::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) {
1461 return Visit(TL.getUnqualifiedLoc());
1462 }
1463
VisitBuiltinTypeLoc(BuiltinTypeLoc TL)1464 bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
1465 ASTContext &Context = AU->getASTContext();
1466
1467 // Some builtin types (such as Objective-C's "id", "sel", and
1468 // "Class") have associated declarations. Create cursors for those.
1469 QualType VisitType;
1470 switch (TL.getTypePtr()->getKind()) {
1471
1472 case BuiltinType::Void:
1473 case BuiltinType::NullPtr:
1474 case BuiltinType::Dependent:
1475 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
1476 case BuiltinType::Id:
1477 #include "clang/Basic/OpenCLImageTypes.def"
1478 case BuiltinType::OCLSampler:
1479 case BuiltinType::OCLEvent:
1480 case BuiltinType::OCLClkEvent:
1481 case BuiltinType::OCLQueue:
1482 case BuiltinType::OCLNDRange:
1483 case BuiltinType::OCLReserveID:
1484 #define BUILTIN_TYPE(Id, SingletonId)
1485 #define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
1486 #define UNSIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
1487 #define FLOATING_TYPE(Id, SingletonId) case BuiltinType::Id:
1488 #define PLACEHOLDER_TYPE(Id, SingletonId) case BuiltinType::Id:
1489 #include "clang/AST/BuiltinTypes.def"
1490 break;
1491
1492 case BuiltinType::ObjCId:
1493 VisitType = Context.getObjCIdType();
1494 break;
1495
1496 case BuiltinType::ObjCClass:
1497 VisitType = Context.getObjCClassType();
1498 break;
1499
1500 case BuiltinType::ObjCSel:
1501 VisitType = Context.getObjCSelType();
1502 break;
1503 }
1504
1505 if (!VisitType.isNull()) {
1506 if (const TypedefType *Typedef = VisitType->getAs<TypedefType>())
1507 return Visit(MakeCursorTypeRef(Typedef->getDecl(), TL.getBuiltinLoc(),
1508 TU));
1509 }
1510
1511 return false;
1512 }
1513
VisitTypedefTypeLoc(TypedefTypeLoc TL)1514 bool CursorVisitor::VisitTypedefTypeLoc(TypedefTypeLoc TL) {
1515 return Visit(MakeCursorTypeRef(TL.getTypedefNameDecl(), TL.getNameLoc(), TU));
1516 }
1517
VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL)1518 bool CursorVisitor::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) {
1519 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1520 }
1521
VisitTagTypeLoc(TagTypeLoc TL)1522 bool CursorVisitor::VisitTagTypeLoc(TagTypeLoc TL) {
1523 if (TL.isDefinition())
1524 return Visit(MakeCXCursor(TL.getDecl(), TU, RegionOfInterest));
1525
1526 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1527 }
1528
VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL)1529 bool CursorVisitor::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
1530 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1531 }
1532
VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL)1533 bool CursorVisitor::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) {
1534 return Visit(MakeCursorObjCClassRef(TL.getIFaceDecl(), TL.getNameLoc(), TU));
1535 }
1536
VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL)1537 bool CursorVisitor::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) {
1538 if (TL.hasBaseTypeAsWritten() && Visit(TL.getBaseLoc()))
1539 return true;
1540
1541 for (unsigned I = 0, N = TL.getNumTypeArgs(); I != N; ++I) {
1542 if (Visit(TL.getTypeArgTInfo(I)->getTypeLoc()))
1543 return true;
1544 }
1545
1546 for (unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1547 if (Visit(MakeCursorObjCProtocolRef(TL.getProtocol(I), TL.getProtocolLoc(I),
1548 TU)))
1549 return true;
1550 }
1551
1552 return false;
1553 }
1554
VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL)1555 bool CursorVisitor::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) {
1556 return Visit(TL.getPointeeLoc());
1557 }
1558
VisitParenTypeLoc(ParenTypeLoc TL)1559 bool CursorVisitor::VisitParenTypeLoc(ParenTypeLoc TL) {
1560 return Visit(TL.getInnerLoc());
1561 }
1562
VisitPointerTypeLoc(PointerTypeLoc TL)1563 bool CursorVisitor::VisitPointerTypeLoc(PointerTypeLoc TL) {
1564 return Visit(TL.getPointeeLoc());
1565 }
1566
VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL)1567 bool CursorVisitor::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) {
1568 return Visit(TL.getPointeeLoc());
1569 }
1570
VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL)1571 bool CursorVisitor::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) {
1572 return Visit(TL.getPointeeLoc());
1573 }
1574
VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL)1575 bool CursorVisitor::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) {
1576 return Visit(TL.getPointeeLoc());
1577 }
1578
VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL)1579 bool CursorVisitor::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) {
1580 return Visit(TL.getPointeeLoc());
1581 }
1582
VisitAttributedTypeLoc(AttributedTypeLoc TL)1583 bool CursorVisitor::VisitAttributedTypeLoc(AttributedTypeLoc TL) {
1584 return Visit(TL.getModifiedLoc());
1585 }
1586
VisitFunctionTypeLoc(FunctionTypeLoc TL,bool SkipResultType)1587 bool CursorVisitor::VisitFunctionTypeLoc(FunctionTypeLoc TL,
1588 bool SkipResultType) {
1589 if (!SkipResultType && Visit(TL.getReturnLoc()))
1590 return true;
1591
1592 for (unsigned I = 0, N = TL.getNumParams(); I != N; ++I)
1593 if (Decl *D = TL.getParam(I))
1594 if (Visit(MakeCXCursor(D, TU, RegionOfInterest)))
1595 return true;
1596
1597 return false;
1598 }
1599
VisitArrayTypeLoc(ArrayTypeLoc TL)1600 bool CursorVisitor::VisitArrayTypeLoc(ArrayTypeLoc TL) {
1601 if (Visit(TL.getElementLoc()))
1602 return true;
1603
1604 if (Expr *Size = TL.getSizeExpr())
1605 return Visit(MakeCXCursor(Size, StmtParent, TU, RegionOfInterest));
1606
1607 return false;
1608 }
1609
VisitDecayedTypeLoc(DecayedTypeLoc TL)1610 bool CursorVisitor::VisitDecayedTypeLoc(DecayedTypeLoc TL) {
1611 return Visit(TL.getOriginalLoc());
1612 }
1613
VisitAdjustedTypeLoc(AdjustedTypeLoc TL)1614 bool CursorVisitor::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) {
1615 return Visit(TL.getOriginalLoc());
1616 }
1617
VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL)1618 bool CursorVisitor::VisitTemplateSpecializationTypeLoc(
1619 TemplateSpecializationTypeLoc TL) {
1620 // Visit the template name.
1621 if (VisitTemplateName(TL.getTypePtr()->getTemplateName(),
1622 TL.getTemplateNameLoc()))
1623 return true;
1624
1625 // Visit the template arguments.
1626 for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1627 if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1628 return true;
1629
1630 return false;
1631 }
1632
VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL)1633 bool CursorVisitor::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) {
1634 return Visit(MakeCXCursor(TL.getUnderlyingExpr(), StmtParent, TU));
1635 }
1636
VisitTypeOfTypeLoc(TypeOfTypeLoc TL)1637 bool CursorVisitor::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) {
1638 if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1639 return Visit(TSInfo->getTypeLoc());
1640
1641 return false;
1642 }
1643
VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL)1644 bool CursorVisitor::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) {
1645 if (TypeSourceInfo *TSInfo = TL.getUnderlyingTInfo())
1646 return Visit(TSInfo->getTypeLoc());
1647
1648 return false;
1649 }
1650
VisitDependentNameTypeLoc(DependentNameTypeLoc TL)1651 bool CursorVisitor::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) {
1652 return VisitNestedNameSpecifierLoc(TL.getQualifierLoc());
1653 }
1654
VisitDependentTemplateSpecializationTypeLoc(DependentTemplateSpecializationTypeLoc TL)1655 bool CursorVisitor::VisitDependentTemplateSpecializationTypeLoc(
1656 DependentTemplateSpecializationTypeLoc TL) {
1657 // Visit the nested-name-specifier, if there is one.
1658 if (TL.getQualifierLoc() &&
1659 VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1660 return true;
1661
1662 // Visit the template arguments.
1663 for (unsigned I = 0, N = TL.getNumArgs(); I != N; ++I)
1664 if (VisitTemplateArgumentLoc(TL.getArgLoc(I)))
1665 return true;
1666
1667 return false;
1668 }
1669
VisitElaboratedTypeLoc(ElaboratedTypeLoc TL)1670 bool CursorVisitor::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) {
1671 if (VisitNestedNameSpecifierLoc(TL.getQualifierLoc()))
1672 return true;
1673
1674 return Visit(TL.getNamedTypeLoc());
1675 }
1676
VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL)1677 bool CursorVisitor::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) {
1678 return Visit(TL.getPatternLoc());
1679 }
1680
VisitDecltypeTypeLoc(DecltypeTypeLoc TL)1681 bool CursorVisitor::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) {
1682 if (Expr *E = TL.getUnderlyingExpr())
1683 return Visit(MakeCXCursor(E, StmtParent, TU));
1684
1685 return false;
1686 }
1687
VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL)1688 bool CursorVisitor::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) {
1689 return Visit(MakeCursorTypeRef(TL.getDecl(), TL.getNameLoc(), TU));
1690 }
1691
VisitAtomicTypeLoc(AtomicTypeLoc TL)1692 bool CursorVisitor::VisitAtomicTypeLoc(AtomicTypeLoc TL) {
1693 return Visit(TL.getValueLoc());
1694 }
1695
VisitPipeTypeLoc(PipeTypeLoc TL)1696 bool CursorVisitor::VisitPipeTypeLoc(PipeTypeLoc TL) {
1697 return Visit(TL.getValueLoc());
1698 }
1699
1700 #define DEFAULT_TYPELOC_IMPL(CLASS, PARENT) \
1701 bool CursorVisitor::Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
1702 return Visit##PARENT##Loc(TL); \
1703 }
1704
DEFAULT_TYPELOC_IMPL(Complex,Type)1705 DEFAULT_TYPELOC_IMPL(Complex, Type)
1706 DEFAULT_TYPELOC_IMPL(ConstantArray, ArrayType)
1707 DEFAULT_TYPELOC_IMPL(IncompleteArray, ArrayType)
1708 DEFAULT_TYPELOC_IMPL(VariableArray, ArrayType)
1709 DEFAULT_TYPELOC_IMPL(DependentSizedArray, ArrayType)
1710 DEFAULT_TYPELOC_IMPL(DependentSizedExtVector, Type)
1711 DEFAULT_TYPELOC_IMPL(Vector, Type)
1712 DEFAULT_TYPELOC_IMPL(ExtVector, VectorType)
1713 DEFAULT_TYPELOC_IMPL(FunctionProto, FunctionType)
1714 DEFAULT_TYPELOC_IMPL(FunctionNoProto, FunctionType)
1715 DEFAULT_TYPELOC_IMPL(Record, TagType)
1716 DEFAULT_TYPELOC_IMPL(Enum, TagType)
1717 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParm, Type)
1718 DEFAULT_TYPELOC_IMPL(SubstTemplateTypeParmPack, Type)
1719 DEFAULT_TYPELOC_IMPL(Auto, Type)
1720
1721 bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) {
1722 // Visit the nested-name-specifier, if present.
1723 if (NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc())
1724 if (VisitNestedNameSpecifierLoc(QualifierLoc))
1725 return true;
1726
1727 if (D->isCompleteDefinition()) {
1728 for (const auto &I : D->bases()) {
1729 if (Visit(cxcursor::MakeCursorCXXBaseSpecifier(&I, TU)))
1730 return true;
1731 }
1732 }
1733
1734 return VisitTagDecl(D);
1735 }
1736
VisitAttributes(Decl * D)1737 bool CursorVisitor::VisitAttributes(Decl *D) {
1738 for (const auto *I : D->attrs())
1739 if (Visit(MakeCXCursor(I, D, TU)))
1740 return true;
1741
1742 return false;
1743 }
1744
1745 //===----------------------------------------------------------------------===//
1746 // Data-recursive visitor methods.
1747 //===----------------------------------------------------------------------===//
1748
1749 namespace {
1750 #define DEF_JOB(NAME, DATA, KIND)\
1751 class NAME : public VisitorJob {\
1752 public:\
1753 NAME(const DATA *d, CXCursor parent) : \
1754 VisitorJob(parent, VisitorJob::KIND, d) {} \
1755 static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
1756 const DATA *get() const { return static_cast<const DATA*>(data[0]); }\
1757 };
1758
1759 DEF_JOB(StmtVisit, Stmt, StmtVisitKind)
1760 DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
1761 DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
1762 DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
1763 DEF_JOB(SizeOfPackExprParts, SizeOfPackExpr, SizeOfPackExprPartsKind)
1764 DEF_JOB(LambdaExprParts, LambdaExpr, LambdaExprPartsKind)
1765 DEF_JOB(PostChildrenVisit, void, PostChildrenVisitKind)
1766 #undef DEF_JOB
1767
1768 class ExplicitTemplateArgsVisit : public VisitorJob {
1769 public:
ExplicitTemplateArgsVisit(const TemplateArgumentLoc * Begin,const TemplateArgumentLoc * End,CXCursor parent)1770 ExplicitTemplateArgsVisit(const TemplateArgumentLoc *Begin,
1771 const TemplateArgumentLoc *End, CXCursor parent)
1772 : VisitorJob(parent, VisitorJob::ExplicitTemplateArgsVisitKind, Begin,
1773 End) {}
classof(const VisitorJob * VJ)1774 static bool classof(const VisitorJob *VJ) {
1775 return VJ->getKind() == ExplicitTemplateArgsVisitKind;
1776 }
begin() const1777 const TemplateArgumentLoc *begin() const {
1778 return static_cast<const TemplateArgumentLoc *>(data[0]);
1779 }
end()1780 const TemplateArgumentLoc *end() {
1781 return static_cast<const TemplateArgumentLoc *>(data[1]);
1782 }
1783 };
1784 class DeclVisit : public VisitorJob {
1785 public:
DeclVisit(const Decl * D,CXCursor parent,bool isFirst)1786 DeclVisit(const Decl *D, CXCursor parent, bool isFirst) :
1787 VisitorJob(parent, VisitorJob::DeclVisitKind,
1788 D, isFirst ? (void*) 1 : (void*) nullptr) {}
classof(const VisitorJob * VJ)1789 static bool classof(const VisitorJob *VJ) {
1790 return VJ->getKind() == DeclVisitKind;
1791 }
get() const1792 const Decl *get() const { return static_cast<const Decl *>(data[0]); }
isFirst() const1793 bool isFirst() const { return data[1] != nullptr; }
1794 };
1795 class TypeLocVisit : public VisitorJob {
1796 public:
TypeLocVisit(TypeLoc tl,CXCursor parent)1797 TypeLocVisit(TypeLoc tl, CXCursor parent) :
1798 VisitorJob(parent, VisitorJob::TypeLocVisitKind,
1799 tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {}
1800
classof(const VisitorJob * VJ)1801 static bool classof(const VisitorJob *VJ) {
1802 return VJ->getKind() == TypeLocVisitKind;
1803 }
1804
get() const1805 TypeLoc get() const {
1806 QualType T = QualType::getFromOpaquePtr(data[0]);
1807 return TypeLoc(T, const_cast<void *>(data[1]));
1808 }
1809 };
1810
1811 class LabelRefVisit : public VisitorJob {
1812 public:
LabelRefVisit(LabelDecl * LD,SourceLocation labelLoc,CXCursor parent)1813 LabelRefVisit(LabelDecl *LD, SourceLocation labelLoc, CXCursor parent)
1814 : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LD,
1815 labelLoc.getPtrEncoding()) {}
1816
classof(const VisitorJob * VJ)1817 static bool classof(const VisitorJob *VJ) {
1818 return VJ->getKind() == VisitorJob::LabelRefVisitKind;
1819 }
get() const1820 const LabelDecl *get() const {
1821 return static_cast<const LabelDecl *>(data[0]);
1822 }
getLoc() const1823 SourceLocation getLoc() const {
1824 return SourceLocation::getFromPtrEncoding(data[1]); }
1825 };
1826
1827 class NestedNameSpecifierLocVisit : public VisitorJob {
1828 public:
NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier,CXCursor parent)1829 NestedNameSpecifierLocVisit(NestedNameSpecifierLoc Qualifier, CXCursor parent)
1830 : VisitorJob(parent, VisitorJob::NestedNameSpecifierLocVisitKind,
1831 Qualifier.getNestedNameSpecifier(),
1832 Qualifier.getOpaqueData()) { }
1833
classof(const VisitorJob * VJ)1834 static bool classof(const VisitorJob *VJ) {
1835 return VJ->getKind() == VisitorJob::NestedNameSpecifierLocVisitKind;
1836 }
1837
get() const1838 NestedNameSpecifierLoc get() const {
1839 return NestedNameSpecifierLoc(
1840 const_cast<NestedNameSpecifier *>(
1841 static_cast<const NestedNameSpecifier *>(data[0])),
1842 const_cast<void *>(data[1]));
1843 }
1844 };
1845
1846 class DeclarationNameInfoVisit : public VisitorJob {
1847 public:
DeclarationNameInfoVisit(const Stmt * S,CXCursor parent)1848 DeclarationNameInfoVisit(const Stmt *S, CXCursor parent)
1849 : VisitorJob(parent, VisitorJob::DeclarationNameInfoVisitKind, S) {}
classof(const VisitorJob * VJ)1850 static bool classof(const VisitorJob *VJ) {
1851 return VJ->getKind() == VisitorJob::DeclarationNameInfoVisitKind;
1852 }
get() const1853 DeclarationNameInfo get() const {
1854 const Stmt *S = static_cast<const Stmt *>(data[0]);
1855 switch (S->getStmtClass()) {
1856 default:
1857 llvm_unreachable("Unhandled Stmt");
1858 case clang::Stmt::MSDependentExistsStmtClass:
1859 return cast<MSDependentExistsStmt>(S)->getNameInfo();
1860 case Stmt::CXXDependentScopeMemberExprClass:
1861 return cast<CXXDependentScopeMemberExpr>(S)->getMemberNameInfo();
1862 case Stmt::DependentScopeDeclRefExprClass:
1863 return cast<DependentScopeDeclRefExpr>(S)->getNameInfo();
1864 case Stmt::OMPCriticalDirectiveClass:
1865 return cast<OMPCriticalDirective>(S)->getDirectiveName();
1866 }
1867 }
1868 };
1869 class MemberRefVisit : public VisitorJob {
1870 public:
MemberRefVisit(const FieldDecl * D,SourceLocation L,CXCursor parent)1871 MemberRefVisit(const FieldDecl *D, SourceLocation L, CXCursor parent)
1872 : VisitorJob(parent, VisitorJob::MemberRefVisitKind, D,
1873 L.getPtrEncoding()) {}
classof(const VisitorJob * VJ)1874 static bool classof(const VisitorJob *VJ) {
1875 return VJ->getKind() == VisitorJob::MemberRefVisitKind;
1876 }
get() const1877 const FieldDecl *get() const {
1878 return static_cast<const FieldDecl *>(data[0]);
1879 }
getLoc() const1880 SourceLocation getLoc() const {
1881 return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) data[1]);
1882 }
1883 };
1884 class EnqueueVisitor : public ConstStmtVisitor<EnqueueVisitor, void> {
1885 friend class OMPClauseEnqueue;
1886 VisitorWorkList &WL;
1887 CXCursor Parent;
1888 public:
EnqueueVisitor(VisitorWorkList & wl,CXCursor parent)1889 EnqueueVisitor(VisitorWorkList &wl, CXCursor parent)
1890 : WL(wl), Parent(parent) {}
1891
1892 void VisitAddrLabelExpr(const AddrLabelExpr *E);
1893 void VisitBlockExpr(const BlockExpr *B);
1894 void VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
1895 void VisitCompoundStmt(const CompoundStmt *S);
VisitCXXDefaultArgExpr(const CXXDefaultArgExpr * E)1896 void VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E) { /* Do nothing. */ }
1897 void VisitMSDependentExistsStmt(const MSDependentExistsStmt *S);
1898 void VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E);
1899 void VisitCXXNewExpr(const CXXNewExpr *E);
1900 void VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E);
1901 void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *E);
1902 void VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E);
1903 void VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr *E);
1904 void VisitCXXTypeidExpr(const CXXTypeidExpr *E);
1905 void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *E);
1906 void VisitCXXUuidofExpr(const CXXUuidofExpr *E);
1907 void VisitCXXCatchStmt(const CXXCatchStmt *S);
1908 void VisitCXXForRangeStmt(const CXXForRangeStmt *S);
1909 void VisitDeclRefExpr(const DeclRefExpr *D);
1910 void VisitDeclStmt(const DeclStmt *S);
1911 void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr *E);
1912 void VisitDesignatedInitExpr(const DesignatedInitExpr *E);
1913 void VisitExplicitCastExpr(const ExplicitCastExpr *E);
1914 void VisitForStmt(const ForStmt *FS);
1915 void VisitGotoStmt(const GotoStmt *GS);
1916 void VisitIfStmt(const IfStmt *If);
1917 void VisitInitListExpr(const InitListExpr *IE);
1918 void VisitMemberExpr(const MemberExpr *M);
1919 void VisitOffsetOfExpr(const OffsetOfExpr *E);
1920 void VisitObjCEncodeExpr(const ObjCEncodeExpr *E);
1921 void VisitObjCMessageExpr(const ObjCMessageExpr *M);
1922 void VisitOverloadExpr(const OverloadExpr *E);
1923 void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E);
1924 void VisitStmt(const Stmt *S);
1925 void VisitSwitchStmt(const SwitchStmt *S);
1926 void VisitWhileStmt(const WhileStmt *W);
1927 void VisitTypeTraitExpr(const TypeTraitExpr *E);
1928 void VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E);
1929 void VisitExpressionTraitExpr(const ExpressionTraitExpr *E);
1930 void VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U);
1931 void VisitVAArgExpr(const VAArgExpr *E);
1932 void VisitSizeOfPackExpr(const SizeOfPackExpr *E);
1933 void VisitPseudoObjectExpr(const PseudoObjectExpr *E);
1934 void VisitOpaqueValueExpr(const OpaqueValueExpr *E);
1935 void VisitLambdaExpr(const LambdaExpr *E);
1936 void VisitOMPExecutableDirective(const OMPExecutableDirective *D);
1937 void VisitOMPLoopDirective(const OMPLoopDirective *D);
1938 void VisitOMPParallelDirective(const OMPParallelDirective *D);
1939 void VisitOMPSimdDirective(const OMPSimdDirective *D);
1940 void VisitOMPForDirective(const OMPForDirective *D);
1941 void VisitOMPForSimdDirective(const OMPForSimdDirective *D);
1942 void VisitOMPSectionsDirective(const OMPSectionsDirective *D);
1943 void VisitOMPSectionDirective(const OMPSectionDirective *D);
1944 void VisitOMPSingleDirective(const OMPSingleDirective *D);
1945 void VisitOMPMasterDirective(const OMPMasterDirective *D);
1946 void VisitOMPCriticalDirective(const OMPCriticalDirective *D);
1947 void VisitOMPParallelForDirective(const OMPParallelForDirective *D);
1948 void VisitOMPParallelForSimdDirective(const OMPParallelForSimdDirective *D);
1949 void VisitOMPParallelSectionsDirective(const OMPParallelSectionsDirective *D);
1950 void VisitOMPTaskDirective(const OMPTaskDirective *D);
1951 void VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D);
1952 void VisitOMPBarrierDirective(const OMPBarrierDirective *D);
1953 void VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D);
1954 void VisitOMPTaskgroupDirective(const OMPTaskgroupDirective *D);
1955 void
1956 VisitOMPCancellationPointDirective(const OMPCancellationPointDirective *D);
1957 void VisitOMPCancelDirective(const OMPCancelDirective *D);
1958 void VisitOMPFlushDirective(const OMPFlushDirective *D);
1959 void VisitOMPOrderedDirective(const OMPOrderedDirective *D);
1960 void VisitOMPAtomicDirective(const OMPAtomicDirective *D);
1961 void VisitOMPTargetDirective(const OMPTargetDirective *D);
1962 void VisitOMPTargetDataDirective(const OMPTargetDataDirective *D);
1963 void VisitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective *D);
1964 void VisitOMPTargetExitDataDirective(const OMPTargetExitDataDirective *D);
1965 void VisitOMPTargetParallelDirective(const OMPTargetParallelDirective *D);
1966 void
1967 VisitOMPTargetParallelForDirective(const OMPTargetParallelForDirective *D);
1968 void VisitOMPTeamsDirective(const OMPTeamsDirective *D);
1969 void VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D);
1970 void VisitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective *D);
1971 void VisitOMPDistributeDirective(const OMPDistributeDirective *D);
1972 void VisitOMPDistributeParallelForDirective(
1973 const OMPDistributeParallelForDirective *D);
1974 void VisitOMPDistributeParallelForSimdDirective(
1975 const OMPDistributeParallelForSimdDirective *D);
1976 void VisitOMPDistributeSimdDirective(const OMPDistributeSimdDirective *D);
1977 void VisitOMPTargetParallelForSimdDirective(
1978 const OMPTargetParallelForSimdDirective *D);
1979
1980 private:
1981 void AddDeclarationNameInfo(const Stmt *S);
1982 void AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier);
1983 void AddExplicitTemplateArgs(const TemplateArgumentLoc *A,
1984 unsigned NumTemplateArgs);
1985 void AddMemberRef(const FieldDecl *D, SourceLocation L);
1986 void AddStmt(const Stmt *S);
1987 void AddDecl(const Decl *D, bool isFirst = true);
1988 void AddTypeLoc(TypeSourceInfo *TI);
1989 void EnqueueChildren(const Stmt *S);
1990 void EnqueueChildren(const OMPClause *S);
1991 };
1992 } // end anonyous namespace
1993
AddDeclarationNameInfo(const Stmt * S)1994 void EnqueueVisitor::AddDeclarationNameInfo(const Stmt *S) {
1995 // 'S' should always be non-null, since it comes from the
1996 // statement we are visiting.
1997 WL.push_back(DeclarationNameInfoVisit(S, Parent));
1998 }
1999
2000 void
AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier)2001 EnqueueVisitor::AddNestedNameSpecifierLoc(NestedNameSpecifierLoc Qualifier) {
2002 if (Qualifier)
2003 WL.push_back(NestedNameSpecifierLocVisit(Qualifier, Parent));
2004 }
2005
AddStmt(const Stmt * S)2006 void EnqueueVisitor::AddStmt(const Stmt *S) {
2007 if (S)
2008 WL.push_back(StmtVisit(S, Parent));
2009 }
AddDecl(const Decl * D,bool isFirst)2010 void EnqueueVisitor::AddDecl(const Decl *D, bool isFirst) {
2011 if (D)
2012 WL.push_back(DeclVisit(D, Parent, isFirst));
2013 }
AddExplicitTemplateArgs(const TemplateArgumentLoc * A,unsigned NumTemplateArgs)2014 void EnqueueVisitor::AddExplicitTemplateArgs(const TemplateArgumentLoc *A,
2015 unsigned NumTemplateArgs) {
2016 WL.push_back(ExplicitTemplateArgsVisit(A, A + NumTemplateArgs, Parent));
2017 }
AddMemberRef(const FieldDecl * D,SourceLocation L)2018 void EnqueueVisitor::AddMemberRef(const FieldDecl *D, SourceLocation L) {
2019 if (D)
2020 WL.push_back(MemberRefVisit(D, L, Parent));
2021 }
AddTypeLoc(TypeSourceInfo * TI)2022 void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
2023 if (TI)
2024 WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
2025 }
EnqueueChildren(const Stmt * S)2026 void EnqueueVisitor::EnqueueChildren(const Stmt *S) {
2027 unsigned size = WL.size();
2028 for (const Stmt *SubStmt : S->children()) {
2029 AddStmt(SubStmt);
2030 }
2031 if (size == WL.size())
2032 return;
2033 // Now reverse the entries we just added. This will match the DFS
2034 // ordering performed by the worklist.
2035 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2036 std::reverse(I, E);
2037 }
2038 namespace {
2039 class OMPClauseEnqueue : public ConstOMPClauseVisitor<OMPClauseEnqueue> {
2040 EnqueueVisitor *Visitor;
2041 /// \brief Process clauses with list of variables.
2042 template <typename T>
2043 void VisitOMPClauseList(T *Node);
2044 public:
OMPClauseEnqueue(EnqueueVisitor * Visitor)2045 OMPClauseEnqueue(EnqueueVisitor *Visitor) : Visitor(Visitor) { }
2046 #define OPENMP_CLAUSE(Name, Class) \
2047 void Visit##Class(const Class *C);
2048 #include "clang/Basic/OpenMPKinds.def"
2049 void VisitOMPClauseWithPreInit(const OMPClauseWithPreInit *C);
2050 void VisitOMPClauseWithPostUpdate(const OMPClauseWithPostUpdate *C);
2051 };
2052
VisitOMPClauseWithPreInit(const OMPClauseWithPreInit * C)2053 void OMPClauseEnqueue::VisitOMPClauseWithPreInit(
2054 const OMPClauseWithPreInit *C) {
2055 Visitor->AddStmt(C->getPreInitStmt());
2056 }
2057
VisitOMPClauseWithPostUpdate(const OMPClauseWithPostUpdate * C)2058 void OMPClauseEnqueue::VisitOMPClauseWithPostUpdate(
2059 const OMPClauseWithPostUpdate *C) {
2060 VisitOMPClauseWithPreInit(C);
2061 Visitor->AddStmt(C->getPostUpdateExpr());
2062 }
2063
VisitOMPIfClause(const OMPIfClause * C)2064 void OMPClauseEnqueue::VisitOMPIfClause(const OMPIfClause *C) {
2065 Visitor->AddStmt(C->getCondition());
2066 }
2067
VisitOMPFinalClause(const OMPFinalClause * C)2068 void OMPClauseEnqueue::VisitOMPFinalClause(const OMPFinalClause *C) {
2069 Visitor->AddStmt(C->getCondition());
2070 }
2071
VisitOMPNumThreadsClause(const OMPNumThreadsClause * C)2072 void OMPClauseEnqueue::VisitOMPNumThreadsClause(const OMPNumThreadsClause *C) {
2073 Visitor->AddStmt(C->getNumThreads());
2074 }
2075
VisitOMPSafelenClause(const OMPSafelenClause * C)2076 void OMPClauseEnqueue::VisitOMPSafelenClause(const OMPSafelenClause *C) {
2077 Visitor->AddStmt(C->getSafelen());
2078 }
2079
VisitOMPSimdlenClause(const OMPSimdlenClause * C)2080 void OMPClauseEnqueue::VisitOMPSimdlenClause(const OMPSimdlenClause *C) {
2081 Visitor->AddStmt(C->getSimdlen());
2082 }
2083
VisitOMPCollapseClause(const OMPCollapseClause * C)2084 void OMPClauseEnqueue::VisitOMPCollapseClause(const OMPCollapseClause *C) {
2085 Visitor->AddStmt(C->getNumForLoops());
2086 }
2087
VisitOMPDefaultClause(const OMPDefaultClause * C)2088 void OMPClauseEnqueue::VisitOMPDefaultClause(const OMPDefaultClause *C) { }
2089
VisitOMPProcBindClause(const OMPProcBindClause * C)2090 void OMPClauseEnqueue::VisitOMPProcBindClause(const OMPProcBindClause *C) { }
2091
VisitOMPScheduleClause(const OMPScheduleClause * C)2092 void OMPClauseEnqueue::VisitOMPScheduleClause(const OMPScheduleClause *C) {
2093 VisitOMPClauseWithPreInit(C);
2094 Visitor->AddStmt(C->getChunkSize());
2095 }
2096
VisitOMPOrderedClause(const OMPOrderedClause * C)2097 void OMPClauseEnqueue::VisitOMPOrderedClause(const OMPOrderedClause *C) {
2098 Visitor->AddStmt(C->getNumForLoops());
2099 }
2100
VisitOMPNowaitClause(const OMPNowaitClause *)2101 void OMPClauseEnqueue::VisitOMPNowaitClause(const OMPNowaitClause *) {}
2102
VisitOMPUntiedClause(const OMPUntiedClause *)2103 void OMPClauseEnqueue::VisitOMPUntiedClause(const OMPUntiedClause *) {}
2104
VisitOMPMergeableClause(const OMPMergeableClause *)2105 void OMPClauseEnqueue::VisitOMPMergeableClause(const OMPMergeableClause *) {}
2106
VisitOMPReadClause(const OMPReadClause *)2107 void OMPClauseEnqueue::VisitOMPReadClause(const OMPReadClause *) {}
2108
VisitOMPWriteClause(const OMPWriteClause *)2109 void OMPClauseEnqueue::VisitOMPWriteClause(const OMPWriteClause *) {}
2110
VisitOMPUpdateClause(const OMPUpdateClause *)2111 void OMPClauseEnqueue::VisitOMPUpdateClause(const OMPUpdateClause *) {}
2112
VisitOMPCaptureClause(const OMPCaptureClause *)2113 void OMPClauseEnqueue::VisitOMPCaptureClause(const OMPCaptureClause *) {}
2114
VisitOMPSeqCstClause(const OMPSeqCstClause *)2115 void OMPClauseEnqueue::VisitOMPSeqCstClause(const OMPSeqCstClause *) {}
2116
VisitOMPThreadsClause(const OMPThreadsClause *)2117 void OMPClauseEnqueue::VisitOMPThreadsClause(const OMPThreadsClause *) {}
2118
VisitOMPSIMDClause(const OMPSIMDClause *)2119 void OMPClauseEnqueue::VisitOMPSIMDClause(const OMPSIMDClause *) {}
2120
VisitOMPNogroupClause(const OMPNogroupClause *)2121 void OMPClauseEnqueue::VisitOMPNogroupClause(const OMPNogroupClause *) {}
2122
VisitOMPDeviceClause(const OMPDeviceClause * C)2123 void OMPClauseEnqueue::VisitOMPDeviceClause(const OMPDeviceClause *C) {
2124 Visitor->AddStmt(C->getDevice());
2125 }
2126
VisitOMPNumTeamsClause(const OMPNumTeamsClause * C)2127 void OMPClauseEnqueue::VisitOMPNumTeamsClause(const OMPNumTeamsClause *C) {
2128 Visitor->AddStmt(C->getNumTeams());
2129 }
2130
VisitOMPThreadLimitClause(const OMPThreadLimitClause * C)2131 void OMPClauseEnqueue::VisitOMPThreadLimitClause(const OMPThreadLimitClause *C) {
2132 Visitor->AddStmt(C->getThreadLimit());
2133 }
2134
VisitOMPPriorityClause(const OMPPriorityClause * C)2135 void OMPClauseEnqueue::VisitOMPPriorityClause(const OMPPriorityClause *C) {
2136 Visitor->AddStmt(C->getPriority());
2137 }
2138
VisitOMPGrainsizeClause(const OMPGrainsizeClause * C)2139 void OMPClauseEnqueue::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) {
2140 Visitor->AddStmt(C->getGrainsize());
2141 }
2142
VisitOMPNumTasksClause(const OMPNumTasksClause * C)2143 void OMPClauseEnqueue::VisitOMPNumTasksClause(const OMPNumTasksClause *C) {
2144 Visitor->AddStmt(C->getNumTasks());
2145 }
2146
VisitOMPHintClause(const OMPHintClause * C)2147 void OMPClauseEnqueue::VisitOMPHintClause(const OMPHintClause *C) {
2148 Visitor->AddStmt(C->getHint());
2149 }
2150
2151 template<typename T>
VisitOMPClauseList(T * Node)2152 void OMPClauseEnqueue::VisitOMPClauseList(T *Node) {
2153 for (const auto *I : Node->varlists()) {
2154 Visitor->AddStmt(I);
2155 }
2156 }
2157
VisitOMPPrivateClause(const OMPPrivateClause * C)2158 void OMPClauseEnqueue::VisitOMPPrivateClause(const OMPPrivateClause *C) {
2159 VisitOMPClauseList(C);
2160 for (const auto *E : C->private_copies()) {
2161 Visitor->AddStmt(E);
2162 }
2163 }
VisitOMPFirstprivateClause(const OMPFirstprivateClause * C)2164 void OMPClauseEnqueue::VisitOMPFirstprivateClause(
2165 const OMPFirstprivateClause *C) {
2166 VisitOMPClauseList(C);
2167 VisitOMPClauseWithPreInit(C);
2168 for (const auto *E : C->private_copies()) {
2169 Visitor->AddStmt(E);
2170 }
2171 for (const auto *E : C->inits()) {
2172 Visitor->AddStmt(E);
2173 }
2174 }
VisitOMPLastprivateClause(const OMPLastprivateClause * C)2175 void OMPClauseEnqueue::VisitOMPLastprivateClause(
2176 const OMPLastprivateClause *C) {
2177 VisitOMPClauseList(C);
2178 VisitOMPClauseWithPostUpdate(C);
2179 for (auto *E : C->private_copies()) {
2180 Visitor->AddStmt(E);
2181 }
2182 for (auto *E : C->source_exprs()) {
2183 Visitor->AddStmt(E);
2184 }
2185 for (auto *E : C->destination_exprs()) {
2186 Visitor->AddStmt(E);
2187 }
2188 for (auto *E : C->assignment_ops()) {
2189 Visitor->AddStmt(E);
2190 }
2191 }
VisitOMPSharedClause(const OMPSharedClause * C)2192 void OMPClauseEnqueue::VisitOMPSharedClause(const OMPSharedClause *C) {
2193 VisitOMPClauseList(C);
2194 }
VisitOMPReductionClause(const OMPReductionClause * C)2195 void OMPClauseEnqueue::VisitOMPReductionClause(const OMPReductionClause *C) {
2196 VisitOMPClauseList(C);
2197 VisitOMPClauseWithPostUpdate(C);
2198 for (auto *E : C->privates()) {
2199 Visitor->AddStmt(E);
2200 }
2201 for (auto *E : C->lhs_exprs()) {
2202 Visitor->AddStmt(E);
2203 }
2204 for (auto *E : C->rhs_exprs()) {
2205 Visitor->AddStmt(E);
2206 }
2207 for (auto *E : C->reduction_ops()) {
2208 Visitor->AddStmt(E);
2209 }
2210 }
VisitOMPLinearClause(const OMPLinearClause * C)2211 void OMPClauseEnqueue::VisitOMPLinearClause(const OMPLinearClause *C) {
2212 VisitOMPClauseList(C);
2213 VisitOMPClauseWithPostUpdate(C);
2214 for (const auto *E : C->privates()) {
2215 Visitor->AddStmt(E);
2216 }
2217 for (const auto *E : C->inits()) {
2218 Visitor->AddStmt(E);
2219 }
2220 for (const auto *E : C->updates()) {
2221 Visitor->AddStmt(E);
2222 }
2223 for (const auto *E : C->finals()) {
2224 Visitor->AddStmt(E);
2225 }
2226 Visitor->AddStmt(C->getStep());
2227 Visitor->AddStmt(C->getCalcStep());
2228 }
VisitOMPAlignedClause(const OMPAlignedClause * C)2229 void OMPClauseEnqueue::VisitOMPAlignedClause(const OMPAlignedClause *C) {
2230 VisitOMPClauseList(C);
2231 Visitor->AddStmt(C->getAlignment());
2232 }
VisitOMPCopyinClause(const OMPCopyinClause * C)2233 void OMPClauseEnqueue::VisitOMPCopyinClause(const OMPCopyinClause *C) {
2234 VisitOMPClauseList(C);
2235 for (auto *E : C->source_exprs()) {
2236 Visitor->AddStmt(E);
2237 }
2238 for (auto *E : C->destination_exprs()) {
2239 Visitor->AddStmt(E);
2240 }
2241 for (auto *E : C->assignment_ops()) {
2242 Visitor->AddStmt(E);
2243 }
2244 }
2245 void
VisitOMPCopyprivateClause(const OMPCopyprivateClause * C)2246 OMPClauseEnqueue::VisitOMPCopyprivateClause(const OMPCopyprivateClause *C) {
2247 VisitOMPClauseList(C);
2248 for (auto *E : C->source_exprs()) {
2249 Visitor->AddStmt(E);
2250 }
2251 for (auto *E : C->destination_exprs()) {
2252 Visitor->AddStmt(E);
2253 }
2254 for (auto *E : C->assignment_ops()) {
2255 Visitor->AddStmt(E);
2256 }
2257 }
VisitOMPFlushClause(const OMPFlushClause * C)2258 void OMPClauseEnqueue::VisitOMPFlushClause(const OMPFlushClause *C) {
2259 VisitOMPClauseList(C);
2260 }
VisitOMPDependClause(const OMPDependClause * C)2261 void OMPClauseEnqueue::VisitOMPDependClause(const OMPDependClause *C) {
2262 VisitOMPClauseList(C);
2263 }
VisitOMPMapClause(const OMPMapClause * C)2264 void OMPClauseEnqueue::VisitOMPMapClause(const OMPMapClause *C) {
2265 VisitOMPClauseList(C);
2266 }
VisitOMPDistScheduleClause(const OMPDistScheduleClause * C)2267 void OMPClauseEnqueue::VisitOMPDistScheduleClause(
2268 const OMPDistScheduleClause *C) {
2269 VisitOMPClauseWithPreInit(C);
2270 Visitor->AddStmt(C->getChunkSize());
2271 }
VisitOMPDefaultmapClause(const OMPDefaultmapClause *)2272 void OMPClauseEnqueue::VisitOMPDefaultmapClause(
2273 const OMPDefaultmapClause * /*C*/) {}
VisitOMPToClause(const OMPToClause * C)2274 void OMPClauseEnqueue::VisitOMPToClause(const OMPToClause *C) {
2275 VisitOMPClauseList(C);
2276 }
VisitOMPFromClause(const OMPFromClause * C)2277 void OMPClauseEnqueue::VisitOMPFromClause(const OMPFromClause *C) {
2278 VisitOMPClauseList(C);
2279 }
VisitOMPUseDevicePtrClause(const OMPUseDevicePtrClause * C)2280 void OMPClauseEnqueue::VisitOMPUseDevicePtrClause(const OMPUseDevicePtrClause *C) {
2281 VisitOMPClauseList(C);
2282 }
VisitOMPIsDevicePtrClause(const OMPIsDevicePtrClause * C)2283 void OMPClauseEnqueue::VisitOMPIsDevicePtrClause(const OMPIsDevicePtrClause *C) {
2284 VisitOMPClauseList(C);
2285 }
2286 }
2287
EnqueueChildren(const OMPClause * S)2288 void EnqueueVisitor::EnqueueChildren(const OMPClause *S) {
2289 unsigned size = WL.size();
2290 OMPClauseEnqueue Visitor(this);
2291 Visitor.Visit(S);
2292 if (size == WL.size())
2293 return;
2294 // Now reverse the entries we just added. This will match the DFS
2295 // ordering performed by the worklist.
2296 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2297 std::reverse(I, E);
2298 }
VisitAddrLabelExpr(const AddrLabelExpr * E)2299 void EnqueueVisitor::VisitAddrLabelExpr(const AddrLabelExpr *E) {
2300 WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent));
2301 }
VisitBlockExpr(const BlockExpr * B)2302 void EnqueueVisitor::VisitBlockExpr(const BlockExpr *B) {
2303 AddDecl(B->getBlockDecl());
2304 }
VisitCompoundLiteralExpr(const CompoundLiteralExpr * E)2305 void EnqueueVisitor::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
2306 EnqueueChildren(E);
2307 AddTypeLoc(E->getTypeSourceInfo());
2308 }
VisitCompoundStmt(const CompoundStmt * S)2309 void EnqueueVisitor::VisitCompoundStmt(const CompoundStmt *S) {
2310 for (auto &I : llvm::reverse(S->body()))
2311 AddStmt(I);
2312 }
2313 void EnqueueVisitor::
VisitMSDependentExistsStmt(const MSDependentExistsStmt * S)2314 VisitMSDependentExistsStmt(const MSDependentExistsStmt *S) {
2315 AddStmt(S->getSubStmt());
2316 AddDeclarationNameInfo(S);
2317 if (NestedNameSpecifierLoc QualifierLoc = S->getQualifierLoc())
2318 AddNestedNameSpecifierLoc(QualifierLoc);
2319 }
2320
2321 void EnqueueVisitor::
VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr * E)2322 VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *E) {
2323 if (E->hasExplicitTemplateArgs())
2324 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2325 AddDeclarationNameInfo(E);
2326 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
2327 AddNestedNameSpecifierLoc(QualifierLoc);
2328 if (!E->isImplicitAccess())
2329 AddStmt(E->getBase());
2330 }
VisitCXXNewExpr(const CXXNewExpr * E)2331 void EnqueueVisitor::VisitCXXNewExpr(const CXXNewExpr *E) {
2332 // Enqueue the initializer , if any.
2333 AddStmt(E->getInitializer());
2334 // Enqueue the array size, if any.
2335 AddStmt(E->getArraySize());
2336 // Enqueue the allocated type.
2337 AddTypeLoc(E->getAllocatedTypeSourceInfo());
2338 // Enqueue the placement arguments.
2339 for (unsigned I = E->getNumPlacementArgs(); I > 0; --I)
2340 AddStmt(E->getPlacementArg(I-1));
2341 }
VisitCXXOperatorCallExpr(const CXXOperatorCallExpr * CE)2342 void EnqueueVisitor::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *CE) {
2343 for (unsigned I = CE->getNumArgs(); I > 1 /* Yes, this is 1 */; --I)
2344 AddStmt(CE->getArg(I-1));
2345 AddStmt(CE->getCallee());
2346 AddStmt(CE->getArg(0));
2347 }
VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr * E)2348 void EnqueueVisitor::VisitCXXPseudoDestructorExpr(
2349 const CXXPseudoDestructorExpr *E) {
2350 // Visit the name of the type being destroyed.
2351 AddTypeLoc(E->getDestroyedTypeInfo());
2352 // Visit the scope type that looks disturbingly like the nested-name-specifier
2353 // but isn't.
2354 AddTypeLoc(E->getScopeTypeInfo());
2355 // Visit the nested-name-specifier.
2356 if (NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc())
2357 AddNestedNameSpecifierLoc(QualifierLoc);
2358 // Visit base expression.
2359 AddStmt(E->getBase());
2360 }
VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr * E)2361 void EnqueueVisitor::VisitCXXScalarValueInitExpr(
2362 const CXXScalarValueInitExpr *E) {
2363 AddTypeLoc(E->getTypeSourceInfo());
2364 }
VisitCXXTemporaryObjectExpr(const CXXTemporaryObjectExpr * E)2365 void EnqueueVisitor::VisitCXXTemporaryObjectExpr(
2366 const CXXTemporaryObjectExpr *E) {
2367 EnqueueChildren(E);
2368 AddTypeLoc(E->getTypeSourceInfo());
2369 }
VisitCXXTypeidExpr(const CXXTypeidExpr * E)2370 void EnqueueVisitor::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
2371 EnqueueChildren(E);
2372 if (E->isTypeOperand())
2373 AddTypeLoc(E->getTypeOperandSourceInfo());
2374 }
2375
VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr * E)2376 void EnqueueVisitor::VisitCXXUnresolvedConstructExpr(
2377 const CXXUnresolvedConstructExpr *E) {
2378 EnqueueChildren(E);
2379 AddTypeLoc(E->getTypeSourceInfo());
2380 }
VisitCXXUuidofExpr(const CXXUuidofExpr * E)2381 void EnqueueVisitor::VisitCXXUuidofExpr(const CXXUuidofExpr *E) {
2382 EnqueueChildren(E);
2383 if (E->isTypeOperand())
2384 AddTypeLoc(E->getTypeOperandSourceInfo());
2385 }
2386
VisitCXXCatchStmt(const CXXCatchStmt * S)2387 void EnqueueVisitor::VisitCXXCatchStmt(const CXXCatchStmt *S) {
2388 EnqueueChildren(S);
2389 AddDecl(S->getExceptionDecl());
2390 }
2391
VisitCXXForRangeStmt(const CXXForRangeStmt * S)2392 void EnqueueVisitor::VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
2393 AddStmt(S->getBody());
2394 AddStmt(S->getRangeInit());
2395 AddDecl(S->getLoopVariable());
2396 }
2397
VisitDeclRefExpr(const DeclRefExpr * DR)2398 void EnqueueVisitor::VisitDeclRefExpr(const DeclRefExpr *DR) {
2399 if (DR->hasExplicitTemplateArgs())
2400 AddExplicitTemplateArgs(DR->getTemplateArgs(), DR->getNumTemplateArgs());
2401 WL.push_back(DeclRefExprParts(DR, Parent));
2402 }
VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr * E)2403 void EnqueueVisitor::VisitDependentScopeDeclRefExpr(
2404 const DependentScopeDeclRefExpr *E) {
2405 if (E->hasExplicitTemplateArgs())
2406 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2407 AddDeclarationNameInfo(E);
2408 AddNestedNameSpecifierLoc(E->getQualifierLoc());
2409 }
VisitDeclStmt(const DeclStmt * S)2410 void EnqueueVisitor::VisitDeclStmt(const DeclStmt *S) {
2411 unsigned size = WL.size();
2412 bool isFirst = true;
2413 for (const auto *D : S->decls()) {
2414 AddDecl(D, isFirst);
2415 isFirst = false;
2416 }
2417 if (size == WL.size())
2418 return;
2419 // Now reverse the entries we just added. This will match the DFS
2420 // ordering performed by the worklist.
2421 VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
2422 std::reverse(I, E);
2423 }
VisitDesignatedInitExpr(const DesignatedInitExpr * E)2424 void EnqueueVisitor::VisitDesignatedInitExpr(const DesignatedInitExpr *E) {
2425 AddStmt(E->getInit());
2426 for (const DesignatedInitExpr::Designator &D :
2427 llvm::reverse(E->designators())) {
2428 if (D.isFieldDesignator()) {
2429 if (FieldDecl *Field = D.getField())
2430 AddMemberRef(Field, D.getFieldLoc());
2431 continue;
2432 }
2433 if (D.isArrayDesignator()) {
2434 AddStmt(E->getArrayIndex(D));
2435 continue;
2436 }
2437 assert(D.isArrayRangeDesignator() && "Unknown designator kind");
2438 AddStmt(E->getArrayRangeEnd(D));
2439 AddStmt(E->getArrayRangeStart(D));
2440 }
2441 }
VisitExplicitCastExpr(const ExplicitCastExpr * E)2442 void EnqueueVisitor::VisitExplicitCastExpr(const ExplicitCastExpr *E) {
2443 EnqueueChildren(E);
2444 AddTypeLoc(E->getTypeInfoAsWritten());
2445 }
VisitForStmt(const ForStmt * FS)2446 void EnqueueVisitor::VisitForStmt(const ForStmt *FS) {
2447 AddStmt(FS->getBody());
2448 AddStmt(FS->getInc());
2449 AddStmt(FS->getCond());
2450 AddDecl(FS->getConditionVariable());
2451 AddStmt(FS->getInit());
2452 }
VisitGotoStmt(const GotoStmt * GS)2453 void EnqueueVisitor::VisitGotoStmt(const GotoStmt *GS) {
2454 WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent));
2455 }
VisitIfStmt(const IfStmt * If)2456 void EnqueueVisitor::VisitIfStmt(const IfStmt *If) {
2457 AddStmt(If->getElse());
2458 AddStmt(If->getThen());
2459 AddStmt(If->getCond());
2460 AddDecl(If->getConditionVariable());
2461 }
VisitInitListExpr(const InitListExpr * IE)2462 void EnqueueVisitor::VisitInitListExpr(const InitListExpr *IE) {
2463 // We care about the syntactic form of the initializer list, only.
2464 if (InitListExpr *Syntactic = IE->getSyntacticForm())
2465 IE = Syntactic;
2466 EnqueueChildren(IE);
2467 }
VisitMemberExpr(const MemberExpr * M)2468 void EnqueueVisitor::VisitMemberExpr(const MemberExpr *M) {
2469 WL.push_back(MemberExprParts(M, Parent));
2470
2471 // If the base of the member access expression is an implicit 'this', don't
2472 // visit it.
2473 // FIXME: If we ever want to show these implicit accesses, this will be
2474 // unfortunate. However, clang_getCursor() relies on this behavior.
2475 if (M->isImplicitAccess())
2476 return;
2477
2478 // Ignore base anonymous struct/union fields, otherwise they will shadow the
2479 // real field that that we are interested in.
2480 if (auto *SubME = dyn_cast<MemberExpr>(M->getBase())) {
2481 if (auto *FD = dyn_cast_or_null<FieldDecl>(SubME->getMemberDecl())) {
2482 if (FD->isAnonymousStructOrUnion()) {
2483 AddStmt(SubME->getBase());
2484 return;
2485 }
2486 }
2487 }
2488
2489 AddStmt(M->getBase());
2490 }
VisitObjCEncodeExpr(const ObjCEncodeExpr * E)2491 void EnqueueVisitor::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {
2492 AddTypeLoc(E->getEncodedTypeSourceInfo());
2493 }
VisitObjCMessageExpr(const ObjCMessageExpr * M)2494 void EnqueueVisitor::VisitObjCMessageExpr(const ObjCMessageExpr *M) {
2495 EnqueueChildren(M);
2496 AddTypeLoc(M->getClassReceiverTypeInfo());
2497 }
VisitOffsetOfExpr(const OffsetOfExpr * E)2498 void EnqueueVisitor::VisitOffsetOfExpr(const OffsetOfExpr *E) {
2499 // Visit the components of the offsetof expression.
2500 for (unsigned N = E->getNumComponents(), I = N; I > 0; --I) {
2501 const OffsetOfNode &Node = E->getComponent(I-1);
2502 switch (Node.getKind()) {
2503 case OffsetOfNode::Array:
2504 AddStmt(E->getIndexExpr(Node.getArrayExprIndex()));
2505 break;
2506 case OffsetOfNode::Field:
2507 AddMemberRef(Node.getField(), Node.getSourceRange().getEnd());
2508 break;
2509 case OffsetOfNode::Identifier:
2510 case OffsetOfNode::Base:
2511 continue;
2512 }
2513 }
2514 // Visit the type into which we're computing the offset.
2515 AddTypeLoc(E->getTypeSourceInfo());
2516 }
VisitOverloadExpr(const OverloadExpr * E)2517 void EnqueueVisitor::VisitOverloadExpr(const OverloadExpr *E) {
2518 if (E->hasExplicitTemplateArgs())
2519 AddExplicitTemplateArgs(E->getTemplateArgs(), E->getNumTemplateArgs());
2520 WL.push_back(OverloadExprParts(E, Parent));
2521 }
VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr * E)2522 void EnqueueVisitor::VisitUnaryExprOrTypeTraitExpr(
2523 const UnaryExprOrTypeTraitExpr *E) {
2524 EnqueueChildren(E);
2525 if (E->isArgumentType())
2526 AddTypeLoc(E->getArgumentTypeInfo());
2527 }
VisitStmt(const Stmt * S)2528 void EnqueueVisitor::VisitStmt(const Stmt *S) {
2529 EnqueueChildren(S);
2530 }
VisitSwitchStmt(const SwitchStmt * S)2531 void EnqueueVisitor::VisitSwitchStmt(const SwitchStmt *S) {
2532 AddStmt(S->getBody());
2533 AddStmt(S->getCond());
2534 AddDecl(S->getConditionVariable());
2535 }
2536
VisitWhileStmt(const WhileStmt * W)2537 void EnqueueVisitor::VisitWhileStmt(const WhileStmt *W) {
2538 AddStmt(W->getBody());
2539 AddStmt(W->getCond());
2540 AddDecl(W->getConditionVariable());
2541 }
2542
VisitTypeTraitExpr(const TypeTraitExpr * E)2543 void EnqueueVisitor::VisitTypeTraitExpr(const TypeTraitExpr *E) {
2544 for (unsigned I = E->getNumArgs(); I > 0; --I)
2545 AddTypeLoc(E->getArg(I-1));
2546 }
2547
VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr * E)2548 void EnqueueVisitor::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E) {
2549 AddTypeLoc(E->getQueriedTypeSourceInfo());
2550 }
2551
VisitExpressionTraitExpr(const ExpressionTraitExpr * E)2552 void EnqueueVisitor::VisitExpressionTraitExpr(const ExpressionTraitExpr *E) {
2553 EnqueueChildren(E);
2554 }
2555
VisitUnresolvedMemberExpr(const UnresolvedMemberExpr * U)2556 void EnqueueVisitor::VisitUnresolvedMemberExpr(const UnresolvedMemberExpr *U) {
2557 VisitOverloadExpr(U);
2558 if (!U->isImplicitAccess())
2559 AddStmt(U->getBase());
2560 }
VisitVAArgExpr(const VAArgExpr * E)2561 void EnqueueVisitor::VisitVAArgExpr(const VAArgExpr *E) {
2562 AddStmt(E->getSubExpr());
2563 AddTypeLoc(E->getWrittenTypeInfo());
2564 }
VisitSizeOfPackExpr(const SizeOfPackExpr * E)2565 void EnqueueVisitor::VisitSizeOfPackExpr(const SizeOfPackExpr *E) {
2566 WL.push_back(SizeOfPackExprParts(E, Parent));
2567 }
VisitOpaqueValueExpr(const OpaqueValueExpr * E)2568 void EnqueueVisitor::VisitOpaqueValueExpr(const OpaqueValueExpr *E) {
2569 // If the opaque value has a source expression, just transparently
2570 // visit that. This is useful for (e.g.) pseudo-object expressions.
2571 if (Expr *SourceExpr = E->getSourceExpr())
2572 return Visit(SourceExpr);
2573 }
VisitLambdaExpr(const LambdaExpr * E)2574 void EnqueueVisitor::VisitLambdaExpr(const LambdaExpr *E) {
2575 AddStmt(E->getBody());
2576 WL.push_back(LambdaExprParts(E, Parent));
2577 }
VisitPseudoObjectExpr(const PseudoObjectExpr * E)2578 void EnqueueVisitor::VisitPseudoObjectExpr(const PseudoObjectExpr *E) {
2579 // Treat the expression like its syntactic form.
2580 Visit(E->getSyntacticForm());
2581 }
2582
VisitOMPExecutableDirective(const OMPExecutableDirective * D)2583 void EnqueueVisitor::VisitOMPExecutableDirective(
2584 const OMPExecutableDirective *D) {
2585 EnqueueChildren(D);
2586 for (ArrayRef<OMPClause *>::iterator I = D->clauses().begin(),
2587 E = D->clauses().end();
2588 I != E; ++I)
2589 EnqueueChildren(*I);
2590 }
2591
VisitOMPLoopDirective(const OMPLoopDirective * D)2592 void EnqueueVisitor::VisitOMPLoopDirective(const OMPLoopDirective *D) {
2593 VisitOMPExecutableDirective(D);
2594 }
2595
VisitOMPParallelDirective(const OMPParallelDirective * D)2596 void EnqueueVisitor::VisitOMPParallelDirective(const OMPParallelDirective *D) {
2597 VisitOMPExecutableDirective(D);
2598 }
2599
VisitOMPSimdDirective(const OMPSimdDirective * D)2600 void EnqueueVisitor::VisitOMPSimdDirective(const OMPSimdDirective *D) {
2601 VisitOMPLoopDirective(D);
2602 }
2603
VisitOMPForDirective(const OMPForDirective * D)2604 void EnqueueVisitor::VisitOMPForDirective(const OMPForDirective *D) {
2605 VisitOMPLoopDirective(D);
2606 }
2607
VisitOMPForSimdDirective(const OMPForSimdDirective * D)2608 void EnqueueVisitor::VisitOMPForSimdDirective(const OMPForSimdDirective *D) {
2609 VisitOMPLoopDirective(D);
2610 }
2611
VisitOMPSectionsDirective(const OMPSectionsDirective * D)2612 void EnqueueVisitor::VisitOMPSectionsDirective(const OMPSectionsDirective *D) {
2613 VisitOMPExecutableDirective(D);
2614 }
2615
VisitOMPSectionDirective(const OMPSectionDirective * D)2616 void EnqueueVisitor::VisitOMPSectionDirective(const OMPSectionDirective *D) {
2617 VisitOMPExecutableDirective(D);
2618 }
2619
VisitOMPSingleDirective(const OMPSingleDirective * D)2620 void EnqueueVisitor::VisitOMPSingleDirective(const OMPSingleDirective *D) {
2621 VisitOMPExecutableDirective(D);
2622 }
2623
VisitOMPMasterDirective(const OMPMasterDirective * D)2624 void EnqueueVisitor::VisitOMPMasterDirective(const OMPMasterDirective *D) {
2625 VisitOMPExecutableDirective(D);
2626 }
2627
VisitOMPCriticalDirective(const OMPCriticalDirective * D)2628 void EnqueueVisitor::VisitOMPCriticalDirective(const OMPCriticalDirective *D) {
2629 VisitOMPExecutableDirective(D);
2630 AddDeclarationNameInfo(D);
2631 }
2632
2633 void
VisitOMPParallelForDirective(const OMPParallelForDirective * D)2634 EnqueueVisitor::VisitOMPParallelForDirective(const OMPParallelForDirective *D) {
2635 VisitOMPLoopDirective(D);
2636 }
2637
VisitOMPParallelForSimdDirective(const OMPParallelForSimdDirective * D)2638 void EnqueueVisitor::VisitOMPParallelForSimdDirective(
2639 const OMPParallelForSimdDirective *D) {
2640 VisitOMPLoopDirective(D);
2641 }
2642
VisitOMPParallelSectionsDirective(const OMPParallelSectionsDirective * D)2643 void EnqueueVisitor::VisitOMPParallelSectionsDirective(
2644 const OMPParallelSectionsDirective *D) {
2645 VisitOMPExecutableDirective(D);
2646 }
2647
VisitOMPTaskDirective(const OMPTaskDirective * D)2648 void EnqueueVisitor::VisitOMPTaskDirective(const OMPTaskDirective *D) {
2649 VisitOMPExecutableDirective(D);
2650 }
2651
2652 void
VisitOMPTaskyieldDirective(const OMPTaskyieldDirective * D)2653 EnqueueVisitor::VisitOMPTaskyieldDirective(const OMPTaskyieldDirective *D) {
2654 VisitOMPExecutableDirective(D);
2655 }
2656
VisitOMPBarrierDirective(const OMPBarrierDirective * D)2657 void EnqueueVisitor::VisitOMPBarrierDirective(const OMPBarrierDirective *D) {
2658 VisitOMPExecutableDirective(D);
2659 }
2660
VisitOMPTaskwaitDirective(const OMPTaskwaitDirective * D)2661 void EnqueueVisitor::VisitOMPTaskwaitDirective(const OMPTaskwaitDirective *D) {
2662 VisitOMPExecutableDirective(D);
2663 }
2664
VisitOMPTaskgroupDirective(const OMPTaskgroupDirective * D)2665 void EnqueueVisitor::VisitOMPTaskgroupDirective(
2666 const OMPTaskgroupDirective *D) {
2667 VisitOMPExecutableDirective(D);
2668 }
2669
VisitOMPFlushDirective(const OMPFlushDirective * D)2670 void EnqueueVisitor::VisitOMPFlushDirective(const OMPFlushDirective *D) {
2671 VisitOMPExecutableDirective(D);
2672 }
2673
VisitOMPOrderedDirective(const OMPOrderedDirective * D)2674 void EnqueueVisitor::VisitOMPOrderedDirective(const OMPOrderedDirective *D) {
2675 VisitOMPExecutableDirective(D);
2676 }
2677
VisitOMPAtomicDirective(const OMPAtomicDirective * D)2678 void EnqueueVisitor::VisitOMPAtomicDirective(const OMPAtomicDirective *D) {
2679 VisitOMPExecutableDirective(D);
2680 }
2681
VisitOMPTargetDirective(const OMPTargetDirective * D)2682 void EnqueueVisitor::VisitOMPTargetDirective(const OMPTargetDirective *D) {
2683 VisitOMPExecutableDirective(D);
2684 }
2685
VisitOMPTargetDataDirective(const OMPTargetDataDirective * D)2686 void EnqueueVisitor::VisitOMPTargetDataDirective(const
2687 OMPTargetDataDirective *D) {
2688 VisitOMPExecutableDirective(D);
2689 }
2690
VisitOMPTargetEnterDataDirective(const OMPTargetEnterDataDirective * D)2691 void EnqueueVisitor::VisitOMPTargetEnterDataDirective(
2692 const OMPTargetEnterDataDirective *D) {
2693 VisitOMPExecutableDirective(D);
2694 }
2695
VisitOMPTargetExitDataDirective(const OMPTargetExitDataDirective * D)2696 void EnqueueVisitor::VisitOMPTargetExitDataDirective(
2697 const OMPTargetExitDataDirective *D) {
2698 VisitOMPExecutableDirective(D);
2699 }
2700
VisitOMPTargetParallelDirective(const OMPTargetParallelDirective * D)2701 void EnqueueVisitor::VisitOMPTargetParallelDirective(
2702 const OMPTargetParallelDirective *D) {
2703 VisitOMPExecutableDirective(D);
2704 }
2705
VisitOMPTargetParallelForDirective(const OMPTargetParallelForDirective * D)2706 void EnqueueVisitor::VisitOMPTargetParallelForDirective(
2707 const OMPTargetParallelForDirective *D) {
2708 VisitOMPLoopDirective(D);
2709 }
2710
VisitOMPTeamsDirective(const OMPTeamsDirective * D)2711 void EnqueueVisitor::VisitOMPTeamsDirective(const OMPTeamsDirective *D) {
2712 VisitOMPExecutableDirective(D);
2713 }
2714
VisitOMPCancellationPointDirective(const OMPCancellationPointDirective * D)2715 void EnqueueVisitor::VisitOMPCancellationPointDirective(
2716 const OMPCancellationPointDirective *D) {
2717 VisitOMPExecutableDirective(D);
2718 }
2719
VisitOMPCancelDirective(const OMPCancelDirective * D)2720 void EnqueueVisitor::VisitOMPCancelDirective(const OMPCancelDirective *D) {
2721 VisitOMPExecutableDirective(D);
2722 }
2723
VisitOMPTaskLoopDirective(const OMPTaskLoopDirective * D)2724 void EnqueueVisitor::VisitOMPTaskLoopDirective(const OMPTaskLoopDirective *D) {
2725 VisitOMPLoopDirective(D);
2726 }
2727
VisitOMPTaskLoopSimdDirective(const OMPTaskLoopSimdDirective * D)2728 void EnqueueVisitor::VisitOMPTaskLoopSimdDirective(
2729 const OMPTaskLoopSimdDirective *D) {
2730 VisitOMPLoopDirective(D);
2731 }
2732
VisitOMPDistributeDirective(const OMPDistributeDirective * D)2733 void EnqueueVisitor::VisitOMPDistributeDirective(
2734 const OMPDistributeDirective *D) {
2735 VisitOMPLoopDirective(D);
2736 }
2737
VisitOMPDistributeParallelForDirective(const OMPDistributeParallelForDirective * D)2738 void EnqueueVisitor::VisitOMPDistributeParallelForDirective(
2739 const OMPDistributeParallelForDirective *D) {
2740 VisitOMPLoopDirective(D);
2741 }
2742
VisitOMPDistributeParallelForSimdDirective(const OMPDistributeParallelForSimdDirective * D)2743 void EnqueueVisitor::VisitOMPDistributeParallelForSimdDirective(
2744 const OMPDistributeParallelForSimdDirective *D) {
2745 VisitOMPLoopDirective(D);
2746 }
2747
VisitOMPDistributeSimdDirective(const OMPDistributeSimdDirective * D)2748 void EnqueueVisitor::VisitOMPDistributeSimdDirective(
2749 const OMPDistributeSimdDirective *D) {
2750 VisitOMPLoopDirective(D);
2751 }
2752
VisitOMPTargetParallelForSimdDirective(const OMPTargetParallelForSimdDirective * D)2753 void EnqueueVisitor::VisitOMPTargetParallelForSimdDirective(
2754 const OMPTargetParallelForSimdDirective *D) {
2755 VisitOMPLoopDirective(D);
2756 }
2757
EnqueueWorkList(VisitorWorkList & WL,const Stmt * S)2758 void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, const Stmt *S) {
2759 EnqueueVisitor(WL, MakeCXCursor(S, StmtParent, TU,RegionOfInterest)).Visit(S);
2760 }
2761
IsInRegionOfInterest(CXCursor C)2762 bool CursorVisitor::IsInRegionOfInterest(CXCursor C) {
2763 if (RegionOfInterest.isValid()) {
2764 SourceRange Range = getRawCursorExtent(C);
2765 if (Range.isInvalid() || CompareRegionOfInterest(Range))
2766 return false;
2767 }
2768 return true;
2769 }
2770
RunVisitorWorkList(VisitorWorkList & WL)2771 bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
2772 while (!WL.empty()) {
2773 // Dequeue the worklist item.
2774 VisitorJob LI = WL.pop_back_val();
2775
2776 // Set the Parent field, then back to its old value once we're done.
2777 SetParentRAII SetParent(Parent, StmtParent, LI.getParent());
2778
2779 switch (LI.getKind()) {
2780 case VisitorJob::DeclVisitKind: {
2781 const Decl *D = cast<DeclVisit>(&LI)->get();
2782 if (!D)
2783 continue;
2784
2785 // For now, perform default visitation for Decls.
2786 if (Visit(MakeCXCursor(D, TU, RegionOfInterest,
2787 cast<DeclVisit>(&LI)->isFirst())))
2788 return true;
2789
2790 continue;
2791 }
2792 case VisitorJob::ExplicitTemplateArgsVisitKind: {
2793 for (const TemplateArgumentLoc &Arg :
2794 *cast<ExplicitTemplateArgsVisit>(&LI)) {
2795 if (VisitTemplateArgumentLoc(Arg))
2796 return true;
2797 }
2798 continue;
2799 }
2800 case VisitorJob::TypeLocVisitKind: {
2801 // Perform default visitation for TypeLocs.
2802 if (Visit(cast<TypeLocVisit>(&LI)->get()))
2803 return true;
2804 continue;
2805 }
2806 case VisitorJob::LabelRefVisitKind: {
2807 const LabelDecl *LS = cast<LabelRefVisit>(&LI)->get();
2808 if (LabelStmt *stmt = LS->getStmt()) {
2809 if (Visit(MakeCursorLabelRef(stmt, cast<LabelRefVisit>(&LI)->getLoc(),
2810 TU))) {
2811 return true;
2812 }
2813 }
2814 continue;
2815 }
2816
2817 case VisitorJob::NestedNameSpecifierLocVisitKind: {
2818 NestedNameSpecifierLocVisit *V = cast<NestedNameSpecifierLocVisit>(&LI);
2819 if (VisitNestedNameSpecifierLoc(V->get()))
2820 return true;
2821 continue;
2822 }
2823
2824 case VisitorJob::DeclarationNameInfoVisitKind: {
2825 if (VisitDeclarationNameInfo(cast<DeclarationNameInfoVisit>(&LI)
2826 ->get()))
2827 return true;
2828 continue;
2829 }
2830 case VisitorJob::MemberRefVisitKind: {
2831 MemberRefVisit *V = cast<MemberRefVisit>(&LI);
2832 if (Visit(MakeCursorMemberRef(V->get(), V->getLoc(), TU)))
2833 return true;
2834 continue;
2835 }
2836 case VisitorJob::StmtVisitKind: {
2837 const Stmt *S = cast<StmtVisit>(&LI)->get();
2838 if (!S)
2839 continue;
2840
2841 // Update the current cursor.
2842 CXCursor Cursor = MakeCXCursor(S, StmtParent, TU, RegionOfInterest);
2843 if (!IsInRegionOfInterest(Cursor))
2844 continue;
2845 switch (Visitor(Cursor, Parent, ClientData)) {
2846 case CXChildVisit_Break: return true;
2847 case CXChildVisit_Continue: break;
2848 case CXChildVisit_Recurse:
2849 if (PostChildrenVisitor)
2850 WL.push_back(PostChildrenVisit(nullptr, Cursor));
2851 EnqueueWorkList(WL, S);
2852 break;
2853 }
2854 continue;
2855 }
2856 case VisitorJob::MemberExprPartsKind: {
2857 // Handle the other pieces in the MemberExpr besides the base.
2858 const MemberExpr *M = cast<MemberExprParts>(&LI)->get();
2859
2860 // Visit the nested-name-specifier
2861 if (NestedNameSpecifierLoc QualifierLoc = M->getQualifierLoc())
2862 if (VisitNestedNameSpecifierLoc(QualifierLoc))
2863 return true;
2864
2865 // Visit the declaration name.
2866 if (VisitDeclarationNameInfo(M->getMemberNameInfo()))
2867 return true;
2868
2869 // Visit the explicitly-specified template arguments, if any.
2870 if (M->hasExplicitTemplateArgs()) {
2871 for (const TemplateArgumentLoc *Arg = M->getTemplateArgs(),
2872 *ArgEnd = Arg + M->getNumTemplateArgs();
2873 Arg != ArgEnd; ++Arg) {
2874 if (VisitTemplateArgumentLoc(*Arg))
2875 return true;
2876 }
2877 }
2878 continue;
2879 }
2880 case VisitorJob::DeclRefExprPartsKind: {
2881 const DeclRefExpr *DR = cast<DeclRefExprParts>(&LI)->get();
2882 // Visit nested-name-specifier, if present.
2883 if (NestedNameSpecifierLoc QualifierLoc = DR->getQualifierLoc())
2884 if (VisitNestedNameSpecifierLoc(QualifierLoc))
2885 return true;
2886 // Visit declaration name.
2887 if (VisitDeclarationNameInfo(DR->getNameInfo()))
2888 return true;
2889 continue;
2890 }
2891 case VisitorJob::OverloadExprPartsKind: {
2892 const OverloadExpr *O = cast<OverloadExprParts>(&LI)->get();
2893 // Visit the nested-name-specifier.
2894 if (NestedNameSpecifierLoc QualifierLoc = O->getQualifierLoc())
2895 if (VisitNestedNameSpecifierLoc(QualifierLoc))
2896 return true;
2897 // Visit the declaration name.
2898 if (VisitDeclarationNameInfo(O->getNameInfo()))
2899 return true;
2900 // Visit the overloaded declaration reference.
2901 if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
2902 return true;
2903 continue;
2904 }
2905 case VisitorJob::SizeOfPackExprPartsKind: {
2906 const SizeOfPackExpr *E = cast<SizeOfPackExprParts>(&LI)->get();
2907 NamedDecl *Pack = E->getPack();
2908 if (isa<TemplateTypeParmDecl>(Pack)) {
2909 if (Visit(MakeCursorTypeRef(cast<TemplateTypeParmDecl>(Pack),
2910 E->getPackLoc(), TU)))
2911 return true;
2912
2913 continue;
2914 }
2915
2916 if (isa<TemplateTemplateParmDecl>(Pack)) {
2917 if (Visit(MakeCursorTemplateRef(cast<TemplateTemplateParmDecl>(Pack),
2918 E->getPackLoc(), TU)))
2919 return true;
2920
2921 continue;
2922 }
2923
2924 // Non-type template parameter packs and function parameter packs are
2925 // treated like DeclRefExpr cursors.
2926 continue;
2927 }
2928
2929 case VisitorJob::LambdaExprPartsKind: {
2930 // Visit captures.
2931 const LambdaExpr *E = cast<LambdaExprParts>(&LI)->get();
2932 for (LambdaExpr::capture_iterator C = E->explicit_capture_begin(),
2933 CEnd = E->explicit_capture_end();
2934 C != CEnd; ++C) {
2935 // FIXME: Lambda init-captures.
2936 if (!C->capturesVariable())
2937 continue;
2938
2939 if (Visit(MakeCursorVariableRef(C->getCapturedVar(),
2940 C->getLocation(),
2941 TU)))
2942 return true;
2943 }
2944
2945 // Visit parameters and return type, if present.
2946 if (E->hasExplicitParameters() || E->hasExplicitResultType()) {
2947 TypeLoc TL = E->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2948 if (E->hasExplicitParameters() && E->hasExplicitResultType()) {
2949 // Visit the whole type.
2950 if (Visit(TL))
2951 return true;
2952 } else if (FunctionProtoTypeLoc Proto =
2953 TL.getAs<FunctionProtoTypeLoc>()) {
2954 if (E->hasExplicitParameters()) {
2955 // Visit parameters.
2956 for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
2957 if (Visit(MakeCXCursor(Proto.getParam(I), TU)))
2958 return true;
2959 } else {
2960 // Visit result type.
2961 if (Visit(Proto.getReturnLoc()))
2962 return true;
2963 }
2964 }
2965 }
2966 break;
2967 }
2968
2969 case VisitorJob::PostChildrenVisitKind:
2970 if (PostChildrenVisitor(Parent, ClientData))
2971 return true;
2972 break;
2973 }
2974 }
2975 return false;
2976 }
2977
Visit(const Stmt * S)2978 bool CursorVisitor::Visit(const Stmt *S) {
2979 VisitorWorkList *WL = nullptr;
2980 if (!WorkListFreeList.empty()) {
2981 WL = WorkListFreeList.back();
2982 WL->clear();
2983 WorkListFreeList.pop_back();
2984 }
2985 else {
2986 WL = new VisitorWorkList();
2987 WorkListCache.push_back(WL);
2988 }
2989 EnqueueWorkList(*WL, S);
2990 bool result = RunVisitorWorkList(*WL);
2991 WorkListFreeList.push_back(WL);
2992 return result;
2993 }
2994
2995 namespace {
2996 typedef SmallVector<SourceRange, 4> RefNamePieces;
buildPieces(unsigned NameFlags,bool IsMemberRefExpr,const DeclarationNameInfo & NI,SourceRange QLoc,const SourceRange * TemplateArgsLoc=nullptr)2997 RefNamePieces buildPieces(unsigned NameFlags, bool IsMemberRefExpr,
2998 const DeclarationNameInfo &NI, SourceRange QLoc,
2999 const SourceRange *TemplateArgsLoc = nullptr) {
3000 const bool WantQualifier = NameFlags & CXNameRange_WantQualifier;
3001 const bool WantTemplateArgs = NameFlags & CXNameRange_WantTemplateArgs;
3002 const bool WantSinglePiece = NameFlags & CXNameRange_WantSinglePiece;
3003
3004 const DeclarationName::NameKind Kind = NI.getName().getNameKind();
3005
3006 RefNamePieces Pieces;
3007
3008 if (WantQualifier && QLoc.isValid())
3009 Pieces.push_back(QLoc);
3010
3011 if (Kind != DeclarationName::CXXOperatorName || IsMemberRefExpr)
3012 Pieces.push_back(NI.getLoc());
3013
3014 if (WantTemplateArgs && TemplateArgsLoc && TemplateArgsLoc->isValid())
3015 Pieces.push_back(*TemplateArgsLoc);
3016
3017 if (Kind == DeclarationName::CXXOperatorName) {
3018 Pieces.push_back(SourceLocation::getFromRawEncoding(
3019 NI.getInfo().CXXOperatorName.BeginOpNameLoc));
3020 Pieces.push_back(SourceLocation::getFromRawEncoding(
3021 NI.getInfo().CXXOperatorName.EndOpNameLoc));
3022 }
3023
3024 if (WantSinglePiece) {
3025 SourceRange R(Pieces.front().getBegin(), Pieces.back().getEnd());
3026 Pieces.clear();
3027 Pieces.push_back(R);
3028 }
3029
3030 return Pieces;
3031 }
3032 }
3033
3034 //===----------------------------------------------------------------------===//
3035 // Misc. API hooks.
3036 //===----------------------------------------------------------------------===//
3037
fatal_error_handler(void * user_data,const std::string & reason,bool gen_crash_diag)3038 static void fatal_error_handler(void *user_data, const std::string& reason,
3039 bool gen_crash_diag) {
3040 // Write the result out to stderr avoiding errs() because raw_ostreams can
3041 // call report_fatal_error.
3042 fprintf(stderr, "LIBCLANG FATAL ERROR: %s\n", reason.c_str());
3043 ::abort();
3044 }
3045
3046 namespace {
3047 struct RegisterFatalErrorHandler {
RegisterFatalErrorHandler__anoncb786fb90511::RegisterFatalErrorHandler3048 RegisterFatalErrorHandler() {
3049 llvm::install_fatal_error_handler(fatal_error_handler, nullptr);
3050 }
3051 };
3052 }
3053
3054 static llvm::ManagedStatic<RegisterFatalErrorHandler> RegisterFatalErrorHandlerOnce;
3055
3056 extern "C" {
clang_createIndex(int excludeDeclarationsFromPCH,int displayDiagnostics)3057 CXIndex clang_createIndex(int excludeDeclarationsFromPCH,
3058 int displayDiagnostics) {
3059 // We use crash recovery to make some of our APIs more reliable, implicitly
3060 // enable it.
3061 if (!getenv("LIBCLANG_DISABLE_CRASH_RECOVERY"))
3062 llvm::CrashRecoveryContext::Enable();
3063
3064 // Look through the managed static to trigger construction of the managed
3065 // static which registers our fatal error handler. This ensures it is only
3066 // registered once.
3067 (void)*RegisterFatalErrorHandlerOnce;
3068
3069 // Initialize targets for clang module support.
3070 llvm::InitializeAllTargets();
3071 llvm::InitializeAllTargetMCs();
3072 llvm::InitializeAllAsmPrinters();
3073 llvm::InitializeAllAsmParsers();
3074
3075 CIndexer *CIdxr = new CIndexer();
3076
3077 if (excludeDeclarationsFromPCH)
3078 CIdxr->setOnlyLocalDecls();
3079 if (displayDiagnostics)
3080 CIdxr->setDisplayDiagnostics();
3081
3082 if (getenv("LIBCLANG_BGPRIO_INDEX"))
3083 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
3084 CXGlobalOpt_ThreadBackgroundPriorityForIndexing);
3085 if (getenv("LIBCLANG_BGPRIO_EDIT"))
3086 CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() |
3087 CXGlobalOpt_ThreadBackgroundPriorityForEditing);
3088
3089 return CIdxr;
3090 }
3091
clang_disposeIndex(CXIndex CIdx)3092 void clang_disposeIndex(CXIndex CIdx) {
3093 if (CIdx)
3094 delete static_cast<CIndexer *>(CIdx);
3095 }
3096
clang_CXIndex_setGlobalOptions(CXIndex CIdx,unsigned options)3097 void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) {
3098 if (CIdx)
3099 static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options);
3100 }
3101
clang_CXIndex_getGlobalOptions(CXIndex CIdx)3102 unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) {
3103 if (CIdx)
3104 return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags();
3105 return 0;
3106 }
3107
clang_toggleCrashRecovery(unsigned isEnabled)3108 void clang_toggleCrashRecovery(unsigned isEnabled) {
3109 if (isEnabled)
3110 llvm::CrashRecoveryContext::Enable();
3111 else
3112 llvm::CrashRecoveryContext::Disable();
3113 }
3114
clang_createTranslationUnit(CXIndex CIdx,const char * ast_filename)3115 CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx,
3116 const char *ast_filename) {
3117 CXTranslationUnit TU;
3118 enum CXErrorCode Result =
3119 clang_createTranslationUnit2(CIdx, ast_filename, &TU);
3120 (void)Result;
3121 assert((TU && Result == CXError_Success) ||
3122 (!TU && Result != CXError_Success));
3123 return TU;
3124 }
3125
clang_createTranslationUnit2(CXIndex CIdx,const char * ast_filename,CXTranslationUnit * out_TU)3126 enum CXErrorCode clang_createTranslationUnit2(CXIndex CIdx,
3127 const char *ast_filename,
3128 CXTranslationUnit *out_TU) {
3129 if (out_TU)
3130 *out_TU = nullptr;
3131
3132 if (!CIdx || !ast_filename || !out_TU)
3133 return CXError_InvalidArguments;
3134
3135 LOG_FUNC_SECTION {
3136 *Log << ast_filename;
3137 }
3138
3139 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
3140 FileSystemOptions FileSystemOpts;
3141
3142 IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
3143 CompilerInstance::createDiagnostics(new DiagnosticOptions());
3144 std::unique_ptr<ASTUnit> AU = ASTUnit::LoadFromASTFile(
3145 ast_filename, CXXIdx->getPCHContainerOperations()->getRawReader(), Diags,
3146 FileSystemOpts, /*UseDebugInfo=*/false,
3147 CXXIdx->getOnlyLocalDecls(), None,
3148 /*CaptureDiagnostics=*/true,
3149 /*AllowPCHWithCompilerErrors=*/true,
3150 /*UserFilesAreVolatile=*/true);
3151 *out_TU = MakeCXTranslationUnit(CXXIdx, AU.release());
3152 return *out_TU ? CXError_Success : CXError_Failure;
3153 }
3154
clang_defaultEditingTranslationUnitOptions()3155 unsigned clang_defaultEditingTranslationUnitOptions() {
3156 return CXTranslationUnit_PrecompiledPreamble |
3157 CXTranslationUnit_CacheCompletionResults;
3158 }
3159
3160 CXTranslationUnit
clang_createTranslationUnitFromSourceFile(CXIndex CIdx,const char * source_filename,int num_command_line_args,const char * const * command_line_args,unsigned num_unsaved_files,struct CXUnsavedFile * unsaved_files)3161 clang_createTranslationUnitFromSourceFile(CXIndex CIdx,
3162 const char *source_filename,
3163 int num_command_line_args,
3164 const char * const *command_line_args,
3165 unsigned num_unsaved_files,
3166 struct CXUnsavedFile *unsaved_files) {
3167 unsigned Options = CXTranslationUnit_DetailedPreprocessingRecord;
3168 return clang_parseTranslationUnit(CIdx, source_filename,
3169 command_line_args, num_command_line_args,
3170 unsaved_files, num_unsaved_files,
3171 Options);
3172 }
3173
3174 static CXErrorCode
clang_parseTranslationUnit_Impl(CXIndex CIdx,const char * source_filename,const char * const * command_line_args,int num_command_line_args,ArrayRef<CXUnsavedFile> unsaved_files,unsigned options,CXTranslationUnit * out_TU)3175 clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename,
3176 const char *const *command_line_args,
3177 int num_command_line_args,
3178 ArrayRef<CXUnsavedFile> unsaved_files,
3179 unsigned options, CXTranslationUnit *out_TU) {
3180 // Set up the initial return values.
3181 if (out_TU)
3182 *out_TU = nullptr;
3183
3184 // Check arguments.
3185 if (!CIdx || !out_TU)
3186 return CXError_InvalidArguments;
3187
3188 CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx);
3189
3190 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
3191 setThreadBackgroundPriority();
3192
3193 bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble;
3194 bool CreatePreambleOnFirstParse =
3195 options & CXTranslationUnit_CreatePreambleOnFirstParse;
3196 // FIXME: Add a flag for modules.
3197 TranslationUnitKind TUKind
3198 = (options & CXTranslationUnit_Incomplete)? TU_Prefix : TU_Complete;
3199 bool CacheCodeCompletionResults
3200 = options & CXTranslationUnit_CacheCompletionResults;
3201 bool IncludeBriefCommentsInCodeCompletion
3202 = options & CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
3203 bool SkipFunctionBodies = options & CXTranslationUnit_SkipFunctionBodies;
3204 bool ForSerialization = options & CXTranslationUnit_ForSerialization;
3205
3206 // Configure the diagnostics.
3207 IntrusiveRefCntPtr<DiagnosticsEngine>
3208 Diags(CompilerInstance::createDiagnostics(new DiagnosticOptions));
3209
3210 if (options & CXTranslationUnit_KeepGoing)
3211 Diags->setFatalsAsError(true);
3212
3213 // Recover resources if we crash before exiting this function.
3214 llvm::CrashRecoveryContextCleanupRegistrar<DiagnosticsEngine,
3215 llvm::CrashRecoveryContextReleaseRefCleanup<DiagnosticsEngine> >
3216 DiagCleanup(Diags.get());
3217
3218 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles(
3219 new std::vector<ASTUnit::RemappedFile>());
3220
3221 // Recover resources if we crash before exiting this function.
3222 llvm::CrashRecoveryContextCleanupRegistrar<
3223 std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
3224
3225 for (auto &UF : unsaved_files) {
3226 std::unique_ptr<llvm::MemoryBuffer> MB =
3227 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
3228 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
3229 }
3230
3231 std::unique_ptr<std::vector<const char *>> Args(
3232 new std::vector<const char *>());
3233
3234 // Recover resources if we crash before exiting this method.
3235 llvm::CrashRecoveryContextCleanupRegistrar<std::vector<const char*> >
3236 ArgsCleanup(Args.get());
3237
3238 // Since the Clang C library is primarily used by batch tools dealing with
3239 // (often very broken) source code, where spell-checking can have a
3240 // significant negative impact on performance (particularly when
3241 // precompiled headers are involved), we disable it by default.
3242 // Only do this if we haven't found a spell-checking-related argument.
3243 bool FoundSpellCheckingArgument = false;
3244 for (int I = 0; I != num_command_line_args; ++I) {
3245 if (strcmp(command_line_args[I], "-fno-spell-checking") == 0 ||
3246 strcmp(command_line_args[I], "-fspell-checking") == 0) {
3247 FoundSpellCheckingArgument = true;
3248 break;
3249 }
3250 }
3251 Args->insert(Args->end(), command_line_args,
3252 command_line_args + num_command_line_args);
3253
3254 if (!FoundSpellCheckingArgument)
3255 Args->insert(Args->begin() + 1, "-fno-spell-checking");
3256
3257 // The 'source_filename' argument is optional. If the caller does not
3258 // specify it then it is assumed that the source file is specified
3259 // in the actual argument list.
3260 // Put the source file after command_line_args otherwise if '-x' flag is
3261 // present it will be unused.
3262 if (source_filename)
3263 Args->push_back(source_filename);
3264
3265 // Do we need the detailed preprocessing record?
3266 if (options & CXTranslationUnit_DetailedPreprocessingRecord) {
3267 Args->push_back("-Xclang");
3268 Args->push_back("-detailed-preprocessing-record");
3269 }
3270
3271 unsigned NumErrors = Diags->getClient()->getNumErrors();
3272 std::unique_ptr<ASTUnit> ErrUnit;
3273 // Unless the user specified that they want the preamble on the first parse
3274 // set it up to be created on the first reparse. This makes the first parse
3275 // faster, trading for a slower (first) reparse.
3276 unsigned PrecompilePreambleAfterNParses =
3277 !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse;
3278 std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine(
3279 Args->data(), Args->data() + Args->size(),
3280 CXXIdx->getPCHContainerOperations(), Diags,
3281 CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(),
3282 /*CaptureDiagnostics=*/true, *RemappedFiles.get(),
3283 /*RemappedFilesKeepOriginalName=*/true, PrecompilePreambleAfterNParses,
3284 TUKind, CacheCodeCompletionResults, IncludeBriefCommentsInCodeCompletion,
3285 /*AllowPCHWithCompilerErrors=*/true, SkipFunctionBodies,
3286 /*UserFilesAreVolatile=*/true, ForSerialization,
3287 CXXIdx->getPCHContainerOperations()->getRawReader().getFormat(),
3288 &ErrUnit));
3289
3290 // Early failures in LoadFromCommandLine may return with ErrUnit unset.
3291 if (!Unit && !ErrUnit)
3292 return CXError_ASTReadError;
3293
3294 if (NumErrors != Diags->getClient()->getNumErrors()) {
3295 // Make sure to check that 'Unit' is non-NULL.
3296 if (CXXIdx->getDisplayDiagnostics())
3297 printDiagsToStderr(Unit ? Unit.get() : ErrUnit.get());
3298 }
3299
3300 if (isASTReadError(Unit ? Unit.get() : ErrUnit.get()))
3301 return CXError_ASTReadError;
3302
3303 *out_TU = MakeCXTranslationUnit(CXXIdx, Unit.release());
3304 return *out_TU ? CXError_Success : CXError_Failure;
3305 }
3306
3307 CXTranslationUnit
clang_parseTranslationUnit(CXIndex CIdx,const char * source_filename,const char * const * command_line_args,int num_command_line_args,struct CXUnsavedFile * unsaved_files,unsigned num_unsaved_files,unsigned options)3308 clang_parseTranslationUnit(CXIndex CIdx,
3309 const char *source_filename,
3310 const char *const *command_line_args,
3311 int num_command_line_args,
3312 struct CXUnsavedFile *unsaved_files,
3313 unsigned num_unsaved_files,
3314 unsigned options) {
3315 CXTranslationUnit TU;
3316 enum CXErrorCode Result = clang_parseTranslationUnit2(
3317 CIdx, source_filename, command_line_args, num_command_line_args,
3318 unsaved_files, num_unsaved_files, options, &TU);
3319 (void)Result;
3320 assert((TU && Result == CXError_Success) ||
3321 (!TU && Result != CXError_Success));
3322 return TU;
3323 }
3324
clang_parseTranslationUnit2(CXIndex CIdx,const char * source_filename,const char * const * command_line_args,int num_command_line_args,struct CXUnsavedFile * unsaved_files,unsigned num_unsaved_files,unsigned options,CXTranslationUnit * out_TU)3325 enum CXErrorCode clang_parseTranslationUnit2(
3326 CXIndex CIdx, const char *source_filename,
3327 const char *const *command_line_args, int num_command_line_args,
3328 struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files,
3329 unsigned options, CXTranslationUnit *out_TU) {
3330 SmallVector<const char *, 4> Args;
3331 Args.push_back("clang");
3332 Args.append(command_line_args, command_line_args + num_command_line_args);
3333 return clang_parseTranslationUnit2FullArgv(
3334 CIdx, source_filename, Args.data(), Args.size(), unsaved_files,
3335 num_unsaved_files, options, out_TU);
3336 }
3337
clang_parseTranslationUnit2FullArgv(CXIndex CIdx,const char * source_filename,const char * const * command_line_args,int num_command_line_args,struct CXUnsavedFile * unsaved_files,unsigned num_unsaved_files,unsigned options,CXTranslationUnit * out_TU)3338 enum CXErrorCode clang_parseTranslationUnit2FullArgv(
3339 CXIndex CIdx, const char *source_filename,
3340 const char *const *command_line_args, int num_command_line_args,
3341 struct CXUnsavedFile *unsaved_files, unsigned num_unsaved_files,
3342 unsigned options, CXTranslationUnit *out_TU) {
3343 LOG_FUNC_SECTION {
3344 *Log << source_filename << ": ";
3345 for (int i = 0; i != num_command_line_args; ++i)
3346 *Log << command_line_args[i] << " ";
3347 }
3348
3349 if (num_unsaved_files && !unsaved_files)
3350 return CXError_InvalidArguments;
3351
3352 CXErrorCode result = CXError_Failure;
3353 auto ParseTranslationUnitImpl = [=, &result] {
3354 result = clang_parseTranslationUnit_Impl(
3355 CIdx, source_filename, command_line_args, num_command_line_args,
3356 llvm::makeArrayRef(unsaved_files, num_unsaved_files), options, out_TU);
3357 };
3358 llvm::CrashRecoveryContext CRC;
3359
3360 if (!RunSafely(CRC, ParseTranslationUnitImpl)) {
3361 fprintf(stderr, "libclang: crash detected during parsing: {\n");
3362 fprintf(stderr, " 'source_filename' : '%s'\n", source_filename);
3363 fprintf(stderr, " 'command_line_args' : [");
3364 for (int i = 0; i != num_command_line_args; ++i) {
3365 if (i)
3366 fprintf(stderr, ", ");
3367 fprintf(stderr, "'%s'", command_line_args[i]);
3368 }
3369 fprintf(stderr, "],\n");
3370 fprintf(stderr, " 'unsaved_files' : [");
3371 for (unsigned i = 0; i != num_unsaved_files; ++i) {
3372 if (i)
3373 fprintf(stderr, ", ");
3374 fprintf(stderr, "('%s', '...', %ld)", unsaved_files[i].Filename,
3375 unsaved_files[i].Length);
3376 }
3377 fprintf(stderr, "],\n");
3378 fprintf(stderr, " 'options' : %d,\n", options);
3379 fprintf(stderr, "}\n");
3380
3381 return CXError_Crashed;
3382 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
3383 if (CXTranslationUnit *TU = out_TU)
3384 PrintLibclangResourceUsage(*TU);
3385 }
3386
3387 return result;
3388 }
3389
clang_Type_getObjCEncoding(CXType CT)3390 CXString clang_Type_getObjCEncoding(CXType CT) {
3391 CXTranslationUnit tu = static_cast<CXTranslationUnit>(CT.data[1]);
3392 ASTContext &Ctx = getASTUnit(tu)->getASTContext();
3393 std::string encoding;
3394 Ctx.getObjCEncodingForType(QualType::getFromOpaquePtr(CT.data[0]),
3395 encoding);
3396
3397 return cxstring::createDup(encoding);
3398 }
3399
getMacroIdentifier(CXCursor C)3400 static const IdentifierInfo *getMacroIdentifier(CXCursor C) {
3401 if (C.kind == CXCursor_MacroDefinition) {
3402 if (const MacroDefinitionRecord *MDR = getCursorMacroDefinition(C))
3403 return MDR->getName();
3404 } else if (C.kind == CXCursor_MacroExpansion) {
3405 MacroExpansionCursor ME = getCursorMacroExpansion(C);
3406 return ME.getName();
3407 }
3408 return nullptr;
3409 }
3410
clang_Cursor_isMacroFunctionLike(CXCursor C)3411 unsigned clang_Cursor_isMacroFunctionLike(CXCursor C) {
3412 const IdentifierInfo *II = getMacroIdentifier(C);
3413 if (!II) {
3414 return false;
3415 }
3416 ASTUnit *ASTU = getCursorASTUnit(C);
3417 Preprocessor &PP = ASTU->getPreprocessor();
3418 if (const MacroInfo *MI = PP.getMacroInfo(II))
3419 return MI->isFunctionLike();
3420 return false;
3421 }
3422
clang_Cursor_isMacroBuiltin(CXCursor C)3423 unsigned clang_Cursor_isMacroBuiltin(CXCursor C) {
3424 const IdentifierInfo *II = getMacroIdentifier(C);
3425 if (!II) {
3426 return false;
3427 }
3428 ASTUnit *ASTU = getCursorASTUnit(C);
3429 Preprocessor &PP = ASTU->getPreprocessor();
3430 if (const MacroInfo *MI = PP.getMacroInfo(II))
3431 return MI->isBuiltinMacro();
3432 return false;
3433 }
3434
clang_Cursor_isFunctionInlined(CXCursor C)3435 unsigned clang_Cursor_isFunctionInlined(CXCursor C) {
3436 const Decl *D = getCursorDecl(C);
3437 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
3438 if (!FD) {
3439 return false;
3440 }
3441 return FD->isInlined();
3442 }
3443
getCFSTR_value(CallExpr * callExpr)3444 static StringLiteral* getCFSTR_value(CallExpr *callExpr) {
3445 if (callExpr->getNumArgs() != 1) {
3446 return nullptr;
3447 }
3448
3449 StringLiteral *S = nullptr;
3450 auto *arg = callExpr->getArg(0);
3451 if (arg->getStmtClass() == Stmt::ImplicitCastExprClass) {
3452 ImplicitCastExpr *I = static_cast<ImplicitCastExpr *>(arg);
3453 auto *subExpr = I->getSubExprAsWritten();
3454
3455 if(subExpr->getStmtClass() != Stmt::StringLiteralClass){
3456 return nullptr;
3457 }
3458
3459 S = static_cast<StringLiteral *>(I->getSubExprAsWritten());
3460 } else if (arg->getStmtClass() == Stmt::StringLiteralClass) {
3461 S = static_cast<StringLiteral *>(callExpr->getArg(0));
3462 } else {
3463 return nullptr;
3464 }
3465 return S;
3466 }
3467
3468 struct ExprEvalResult {
3469 CXEvalResultKind EvalType;
3470 union {
3471 int intVal;
3472 double floatVal;
3473 char *stringVal;
3474 } EvalData;
~ExprEvalResultExprEvalResult3475 ~ExprEvalResult() {
3476 if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float &&
3477 EvalType != CXEval_Int) {
3478 delete EvalData.stringVal;
3479 }
3480 }
3481 };
3482
clang_EvalResult_dispose(CXEvalResult E)3483 void clang_EvalResult_dispose(CXEvalResult E) {
3484 delete static_cast<ExprEvalResult *>(E);
3485 }
3486
clang_EvalResult_getKind(CXEvalResult E)3487 CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) {
3488 if (!E) {
3489 return CXEval_UnExposed;
3490 }
3491 return ((ExprEvalResult *)E)->EvalType;
3492 }
3493
clang_EvalResult_getAsInt(CXEvalResult E)3494 int clang_EvalResult_getAsInt(CXEvalResult E) {
3495 if (!E) {
3496 return 0;
3497 }
3498 return ((ExprEvalResult *)E)->EvalData.intVal;
3499 }
3500
clang_EvalResult_getAsDouble(CXEvalResult E)3501 double clang_EvalResult_getAsDouble(CXEvalResult E) {
3502 if (!E) {
3503 return 0;
3504 }
3505 return ((ExprEvalResult *)E)->EvalData.floatVal;
3506 }
3507
clang_EvalResult_getAsStr(CXEvalResult E)3508 const char* clang_EvalResult_getAsStr(CXEvalResult E) {
3509 if (!E) {
3510 return nullptr;
3511 }
3512 return ((ExprEvalResult *)E)->EvalData.stringVal;
3513 }
3514
evaluateExpr(Expr * expr,CXCursor C)3515 static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
3516 Expr::EvalResult ER;
3517 ASTContext &ctx = getCursorContext(C);
3518 if (!expr)
3519 return nullptr;
3520
3521 expr = expr->IgnoreParens();
3522 if (!expr->EvaluateAsRValue(ER, ctx))
3523 return nullptr;
3524
3525 QualType rettype;
3526 CallExpr *callExpr;
3527 auto result = llvm::make_unique<ExprEvalResult>();
3528 result->EvalType = CXEval_UnExposed;
3529
3530 if (ER.Val.isInt()) {
3531 result->EvalType = CXEval_Int;
3532 result->EvalData.intVal = ER.Val.getInt().getExtValue();
3533 return result.release();
3534 }
3535
3536 if (ER.Val.isFloat()) {
3537 llvm::SmallVector<char, 100> Buffer;
3538 ER.Val.getFloat().toString(Buffer);
3539 std::string floatStr(Buffer.data(), Buffer.size());
3540 result->EvalType = CXEval_Float;
3541 bool ignored;
3542 llvm::APFloat apFloat = ER.Val.getFloat();
3543 apFloat.convert(llvm::APFloat::IEEEdouble,
3544 llvm::APFloat::rmNearestTiesToEven, &ignored);
3545 result->EvalData.floatVal = apFloat.convertToDouble();
3546 return result.release();
3547 }
3548
3549 if (expr->getStmtClass() == Stmt::ImplicitCastExprClass) {
3550 const ImplicitCastExpr *I = dyn_cast<ImplicitCastExpr>(expr);
3551 auto *subExpr = I->getSubExprAsWritten();
3552 if (subExpr->getStmtClass() == Stmt::StringLiteralClass ||
3553 subExpr->getStmtClass() == Stmt::ObjCStringLiteralClass) {
3554 const StringLiteral *StrE = nullptr;
3555 const ObjCStringLiteral *ObjCExpr;
3556 ObjCExpr = dyn_cast<ObjCStringLiteral>(subExpr);
3557
3558 if (ObjCExpr) {
3559 StrE = ObjCExpr->getString();
3560 result->EvalType = CXEval_ObjCStrLiteral;
3561 } else {
3562 StrE = cast<StringLiteral>(I->getSubExprAsWritten());
3563 result->EvalType = CXEval_StrLiteral;
3564 }
3565
3566 std::string strRef(StrE->getString().str());
3567 result->EvalData.stringVal = new char[strRef.size() + 1];
3568 strncpy((char *)result->EvalData.stringVal, strRef.c_str(),
3569 strRef.size());
3570 result->EvalData.stringVal[strRef.size()] = '\0';
3571 return result.release();
3572 }
3573 } else if (expr->getStmtClass() == Stmt::ObjCStringLiteralClass ||
3574 expr->getStmtClass() == Stmt::StringLiteralClass) {
3575 const StringLiteral *StrE = nullptr;
3576 const ObjCStringLiteral *ObjCExpr;
3577 ObjCExpr = dyn_cast<ObjCStringLiteral>(expr);
3578
3579 if (ObjCExpr) {
3580 StrE = ObjCExpr->getString();
3581 result->EvalType = CXEval_ObjCStrLiteral;
3582 } else {
3583 StrE = cast<StringLiteral>(expr);
3584 result->EvalType = CXEval_StrLiteral;
3585 }
3586
3587 std::string strRef(StrE->getString().str());
3588 result->EvalData.stringVal = new char[strRef.size() + 1];
3589 strncpy((char *)result->EvalData.stringVal, strRef.c_str(), strRef.size());
3590 result->EvalData.stringVal[strRef.size()] = '\0';
3591 return result.release();
3592 }
3593
3594 if (expr->getStmtClass() == Stmt::CStyleCastExprClass) {
3595 CStyleCastExpr *CC = static_cast<CStyleCastExpr *>(expr);
3596
3597 rettype = CC->getType();
3598 if (rettype.getAsString() == "CFStringRef" &&
3599 CC->getSubExpr()->getStmtClass() == Stmt::CallExprClass) {
3600
3601 callExpr = static_cast<CallExpr *>(CC->getSubExpr());
3602 StringLiteral *S = getCFSTR_value(callExpr);
3603 if (S) {
3604 std::string strLiteral(S->getString().str());
3605 result->EvalType = CXEval_CFStr;
3606
3607 result->EvalData.stringVal = new char[strLiteral.size() + 1];
3608 strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(),
3609 strLiteral.size());
3610 result->EvalData.stringVal[strLiteral.size()] = '\0';
3611 return result.release();
3612 }
3613 }
3614
3615 } else if (expr->getStmtClass() == Stmt::CallExprClass) {
3616 callExpr = static_cast<CallExpr *>(expr);
3617 rettype = callExpr->getCallReturnType(ctx);
3618
3619 if (rettype->isVectorType() || callExpr->getNumArgs() > 1)
3620 return nullptr;
3621
3622 if (rettype->isIntegralType(ctx) || rettype->isRealFloatingType()) {
3623 if (callExpr->getNumArgs() == 1 &&
3624 !callExpr->getArg(0)->getType()->isIntegralType(ctx))
3625 return nullptr;
3626 } else if (rettype.getAsString() == "CFStringRef") {
3627
3628 StringLiteral *S = getCFSTR_value(callExpr);
3629 if (S) {
3630 std::string strLiteral(S->getString().str());
3631 result->EvalType = CXEval_CFStr;
3632 result->EvalData.stringVal = new char[strLiteral.size() + 1];
3633 strncpy((char *)result->EvalData.stringVal, strLiteral.c_str(),
3634 strLiteral.size());
3635 result->EvalData.stringVal[strLiteral.size()] = '\0';
3636 return result.release();
3637 }
3638 }
3639 } else if (expr->getStmtClass() == Stmt::DeclRefExprClass) {
3640 DeclRefExpr *D = static_cast<DeclRefExpr *>(expr);
3641 ValueDecl *V = D->getDecl();
3642 if (V->getKind() == Decl::Function) {
3643 std::string strName = V->getNameAsString();
3644 result->EvalType = CXEval_Other;
3645 result->EvalData.stringVal = new char[strName.size() + 1];
3646 strncpy(result->EvalData.stringVal, strName.c_str(), strName.size());
3647 result->EvalData.stringVal[strName.size()] = '\0';
3648 return result.release();
3649 }
3650 }
3651
3652 return nullptr;
3653 }
3654
clang_Cursor_Evaluate(CXCursor C)3655 CXEvalResult clang_Cursor_Evaluate(CXCursor C) {
3656 const Decl *D = getCursorDecl(C);
3657 if (D) {
3658 const Expr *expr = nullptr;
3659 if (auto *Var = dyn_cast<VarDecl>(D)) {
3660 expr = Var->getInit();
3661 } else if (auto *Field = dyn_cast<FieldDecl>(D)) {
3662 expr = Field->getInClassInitializer();
3663 }
3664 if (expr)
3665 return const_cast<CXEvalResult>(reinterpret_cast<const void *>(
3666 evaluateExpr(const_cast<Expr *>(expr), C)));
3667 return nullptr;
3668 }
3669
3670 const CompoundStmt *compoundStmt = dyn_cast_or_null<CompoundStmt>(getCursorStmt(C));
3671 if (compoundStmt) {
3672 Expr *expr = nullptr;
3673 for (auto *bodyIterator : compoundStmt->body()) {
3674 if ((expr = dyn_cast<Expr>(bodyIterator))) {
3675 break;
3676 }
3677 }
3678 if (expr)
3679 return const_cast<CXEvalResult>(
3680 reinterpret_cast<const void *>(evaluateExpr(expr, C)));
3681 }
3682 return nullptr;
3683 }
3684
clang_Cursor_hasAttrs(CXCursor C)3685 unsigned clang_Cursor_hasAttrs(CXCursor C) {
3686 const Decl *D = getCursorDecl(C);
3687 if (!D) {
3688 return 0;
3689 }
3690
3691 if (D->hasAttrs()) {
3692 return 1;
3693 }
3694
3695 return 0;
3696 }
clang_defaultSaveOptions(CXTranslationUnit TU)3697 unsigned clang_defaultSaveOptions(CXTranslationUnit TU) {
3698 return CXSaveTranslationUnit_None;
3699 }
3700
clang_saveTranslationUnit_Impl(CXTranslationUnit TU,const char * FileName,unsigned options)3701 static CXSaveError clang_saveTranslationUnit_Impl(CXTranslationUnit TU,
3702 const char *FileName,
3703 unsigned options) {
3704 CIndexer *CXXIdx = TU->CIdx;
3705 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing))
3706 setThreadBackgroundPriority();
3707
3708 bool hadError = cxtu::getASTUnit(TU)->Save(FileName);
3709 return hadError ? CXSaveError_Unknown : CXSaveError_None;
3710 }
3711
clang_saveTranslationUnit(CXTranslationUnit TU,const char * FileName,unsigned options)3712 int clang_saveTranslationUnit(CXTranslationUnit TU, const char *FileName,
3713 unsigned options) {
3714 LOG_FUNC_SECTION {
3715 *Log << TU << ' ' << FileName;
3716 }
3717
3718 if (isNotUsableTU(TU)) {
3719 LOG_BAD_TU(TU);
3720 return CXSaveError_InvalidTU;
3721 }
3722
3723 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3724 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3725 if (!CXXUnit->hasSema())
3726 return CXSaveError_InvalidTU;
3727
3728 CXSaveError result;
3729 auto SaveTranslationUnitImpl = [=, &result]() {
3730 result = clang_saveTranslationUnit_Impl(TU, FileName, options);
3731 };
3732
3733 if (!CXXUnit->getDiagnostics().hasUnrecoverableErrorOccurred() ||
3734 getenv("LIBCLANG_NOTHREADS")) {
3735 SaveTranslationUnitImpl();
3736
3737 if (getenv("LIBCLANG_RESOURCE_USAGE"))
3738 PrintLibclangResourceUsage(TU);
3739
3740 return result;
3741 }
3742
3743 // We have an AST that has invalid nodes due to compiler errors.
3744 // Use a crash recovery thread for protection.
3745
3746 llvm::CrashRecoveryContext CRC;
3747
3748 if (!RunSafely(CRC, SaveTranslationUnitImpl)) {
3749 fprintf(stderr, "libclang: crash detected during AST saving: {\n");
3750 fprintf(stderr, " 'filename' : '%s'\n", FileName);
3751 fprintf(stderr, " 'options' : %d,\n", options);
3752 fprintf(stderr, "}\n");
3753
3754 return CXSaveError_Unknown;
3755
3756 } else if (getenv("LIBCLANG_RESOURCE_USAGE")) {
3757 PrintLibclangResourceUsage(TU);
3758 }
3759
3760 return result;
3761 }
3762
clang_disposeTranslationUnit(CXTranslationUnit CTUnit)3763 void clang_disposeTranslationUnit(CXTranslationUnit CTUnit) {
3764 if (CTUnit) {
3765 // If the translation unit has been marked as unsafe to free, just discard
3766 // it.
3767 ASTUnit *Unit = cxtu::getASTUnit(CTUnit);
3768 if (Unit && Unit->isUnsafeToFree())
3769 return;
3770
3771 delete cxtu::getASTUnit(CTUnit);
3772 delete CTUnit->StringPool;
3773 delete static_cast<CXDiagnosticSetImpl *>(CTUnit->Diagnostics);
3774 disposeOverridenCXCursorsPool(CTUnit->OverridenCursorsPool);
3775 delete CTUnit->CommentToXML;
3776 delete CTUnit;
3777 }
3778 }
3779
clang_defaultReparseOptions(CXTranslationUnit TU)3780 unsigned clang_defaultReparseOptions(CXTranslationUnit TU) {
3781 return CXReparse_None;
3782 }
3783
3784 static CXErrorCode
clang_reparseTranslationUnit_Impl(CXTranslationUnit TU,ArrayRef<CXUnsavedFile> unsaved_files,unsigned options)3785 clang_reparseTranslationUnit_Impl(CXTranslationUnit TU,
3786 ArrayRef<CXUnsavedFile> unsaved_files,
3787 unsigned options) {
3788 // Check arguments.
3789 if (isNotUsableTU(TU)) {
3790 LOG_BAD_TU(TU);
3791 return CXError_InvalidArguments;
3792 }
3793
3794 // Reset the associated diagnostics.
3795 delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics);
3796 TU->Diagnostics = nullptr;
3797
3798 CIndexer *CXXIdx = TU->CIdx;
3799 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
3800 setThreadBackgroundPriority();
3801
3802 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3803 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3804
3805 std::unique_ptr<std::vector<ASTUnit::RemappedFile>> RemappedFiles(
3806 new std::vector<ASTUnit::RemappedFile>());
3807
3808 // Recover resources if we crash before exiting this function.
3809 llvm::CrashRecoveryContextCleanupRegistrar<
3810 std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
3811
3812 for (auto &UF : unsaved_files) {
3813 std::unique_ptr<llvm::MemoryBuffer> MB =
3814 llvm::MemoryBuffer::getMemBufferCopy(getContents(UF), UF.Filename);
3815 RemappedFiles->push_back(std::make_pair(UF.Filename, MB.release()));
3816 }
3817
3818 if (!CXXUnit->Reparse(CXXIdx->getPCHContainerOperations(),
3819 *RemappedFiles.get()))
3820 return CXError_Success;
3821 if (isASTReadError(CXXUnit))
3822 return CXError_ASTReadError;
3823 return CXError_Failure;
3824 }
3825
clang_reparseTranslationUnit(CXTranslationUnit TU,unsigned num_unsaved_files,struct CXUnsavedFile * unsaved_files,unsigned options)3826 int clang_reparseTranslationUnit(CXTranslationUnit TU,
3827 unsigned num_unsaved_files,
3828 struct CXUnsavedFile *unsaved_files,
3829 unsigned options) {
3830 LOG_FUNC_SECTION {
3831 *Log << TU;
3832 }
3833
3834 if (num_unsaved_files && !unsaved_files)
3835 return CXError_InvalidArguments;
3836
3837 CXErrorCode result;
3838 auto ReparseTranslationUnitImpl = [=, &result]() {
3839 result = clang_reparseTranslationUnit_Impl(
3840 TU, llvm::makeArrayRef(unsaved_files, num_unsaved_files), options);
3841 };
3842
3843 if (getenv("LIBCLANG_NOTHREADS")) {
3844 ReparseTranslationUnitImpl();
3845 return result;
3846 }
3847
3848 llvm::CrashRecoveryContext CRC;
3849
3850 if (!RunSafely(CRC, ReparseTranslationUnitImpl)) {
3851 fprintf(stderr, "libclang: crash detected during reparsing\n");
3852 cxtu::getASTUnit(TU)->setUnsafeToFree(true);
3853 return CXError_Crashed;
3854 } else if (getenv("LIBCLANG_RESOURCE_USAGE"))
3855 PrintLibclangResourceUsage(TU);
3856
3857 return result;
3858 }
3859
3860
clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit)3861 CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
3862 if (isNotUsableTU(CTUnit)) {
3863 LOG_BAD_TU(CTUnit);
3864 return cxstring::createEmpty();
3865 }
3866
3867 ASTUnit *CXXUnit = cxtu::getASTUnit(CTUnit);
3868 return cxstring::createDup(CXXUnit->getOriginalSourceFileName());
3869 }
3870
clang_getTranslationUnitCursor(CXTranslationUnit TU)3871 CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
3872 if (isNotUsableTU(TU)) {
3873 LOG_BAD_TU(TU);
3874 return clang_getNullCursor();
3875 }
3876
3877 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3878 return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU);
3879 }
3880
3881 } // end: extern "C"
3882
3883 //===----------------------------------------------------------------------===//
3884 // CXFile Operations.
3885 //===----------------------------------------------------------------------===//
3886
3887 extern "C" {
clang_getFileName(CXFile SFile)3888 CXString clang_getFileName(CXFile SFile) {
3889 if (!SFile)
3890 return cxstring::createNull();
3891
3892 FileEntry *FEnt = static_cast<FileEntry *>(SFile);
3893 return cxstring::createRef(FEnt->getName());
3894 }
3895
clang_getFileTime(CXFile SFile)3896 time_t clang_getFileTime(CXFile SFile) {
3897 if (!SFile)
3898 return 0;
3899
3900 FileEntry *FEnt = static_cast<FileEntry *>(SFile);
3901 return FEnt->getModificationTime();
3902 }
3903
clang_getFile(CXTranslationUnit TU,const char * file_name)3904 CXFile clang_getFile(CXTranslationUnit TU, const char *file_name) {
3905 if (isNotUsableTU(TU)) {
3906 LOG_BAD_TU(TU);
3907 return nullptr;
3908 }
3909
3910 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3911
3912 FileManager &FMgr = CXXUnit->getFileManager();
3913 return const_cast<FileEntry *>(FMgr.getFile(file_name));
3914 }
3915
clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU,CXFile file)3916 unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit TU,
3917 CXFile file) {
3918 if (isNotUsableTU(TU)) {
3919 LOG_BAD_TU(TU);
3920 return 0;
3921 }
3922
3923 if (!file)
3924 return 0;
3925
3926 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
3927 FileEntry *FEnt = static_cast<FileEntry *>(file);
3928 return CXXUnit->getPreprocessor().getHeaderSearchInfo()
3929 .isFileMultipleIncludeGuarded(FEnt);
3930 }
3931
clang_getFileUniqueID(CXFile file,CXFileUniqueID * outID)3932 int clang_getFileUniqueID(CXFile file, CXFileUniqueID *outID) {
3933 if (!file || !outID)
3934 return 1;
3935
3936 FileEntry *FEnt = static_cast<FileEntry *>(file);
3937 const llvm::sys::fs::UniqueID &ID = FEnt->getUniqueID();
3938 outID->data[0] = ID.getDevice();
3939 outID->data[1] = ID.getFile();
3940 outID->data[2] = FEnt->getModificationTime();
3941 return 0;
3942 }
3943
clang_File_isEqual(CXFile file1,CXFile file2)3944 int clang_File_isEqual(CXFile file1, CXFile file2) {
3945 if (file1 == file2)
3946 return true;
3947
3948 if (!file1 || !file2)
3949 return false;
3950
3951 FileEntry *FEnt1 = static_cast<FileEntry *>(file1);
3952 FileEntry *FEnt2 = static_cast<FileEntry *>(file2);
3953 return FEnt1->getUniqueID() == FEnt2->getUniqueID();
3954 }
3955
3956 } // end: extern "C"
3957
3958 //===----------------------------------------------------------------------===//
3959 // CXCursor Operations.
3960 //===----------------------------------------------------------------------===//
3961
getDeclFromExpr(const Stmt * E)3962 static const Decl *getDeclFromExpr(const Stmt *E) {
3963 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
3964 return getDeclFromExpr(CE->getSubExpr());
3965
3966 if (const DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
3967 return RefExpr->getDecl();
3968 if (const MemberExpr *ME = dyn_cast<MemberExpr>(E))
3969 return ME->getMemberDecl();
3970 if (const ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
3971 return RE->getDecl();
3972 if (const ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) {
3973 if (PRE->isExplicitProperty())
3974 return PRE->getExplicitProperty();
3975 // It could be messaging both getter and setter as in:
3976 // ++myobj.myprop;
3977 // in which case prefer to associate the setter since it is less obvious
3978 // from inspecting the source that the setter is going to get called.
3979 if (PRE->isMessagingSetter())
3980 return PRE->getImplicitPropertySetter();
3981 return PRE->getImplicitPropertyGetter();
3982 }
3983 if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
3984 return getDeclFromExpr(POE->getSyntacticForm());
3985 if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
3986 if (Expr *Src = OVE->getSourceExpr())
3987 return getDeclFromExpr(Src);
3988
3989 if (const CallExpr *CE = dyn_cast<CallExpr>(E))
3990 return getDeclFromExpr(CE->getCallee());
3991 if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
3992 if (!CE->isElidable())
3993 return CE->getConstructor();
3994 if (const CXXInheritedCtorInitExpr *CE =
3995 dyn_cast<CXXInheritedCtorInitExpr>(E))
3996 return CE->getConstructor();
3997 if (const ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
3998 return OME->getMethodDecl();
3999
4000 if (const ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
4001 return PE->getProtocol();
4002 if (const SubstNonTypeTemplateParmPackExpr *NTTP
4003 = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E))
4004 return NTTP->getParameterPack();
4005 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
4006 if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) ||
4007 isa<ParmVarDecl>(SizeOfPack->getPack()))
4008 return SizeOfPack->getPack();
4009
4010 return nullptr;
4011 }
4012
getLocationFromExpr(const Expr * E)4013 static SourceLocation getLocationFromExpr(const Expr *E) {
4014 if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
4015 return getLocationFromExpr(CE->getSubExpr());
4016
4017 if (const ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
4018 return /*FIXME:*/Msg->getLeftLoc();
4019 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
4020 return DRE->getLocation();
4021 if (const MemberExpr *Member = dyn_cast<MemberExpr>(E))
4022 return Member->getMemberLoc();
4023 if (const ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
4024 return Ivar->getLocation();
4025 if (const SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
4026 return SizeOfPack->getPackLoc();
4027 if (const ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E))
4028 return PropRef->getLocation();
4029
4030 return E->getLocStart();
4031 }
4032
4033 extern "C" {
4034
clang_visitChildren(CXCursor parent,CXCursorVisitor visitor,CXClientData client_data)4035 unsigned clang_visitChildren(CXCursor parent,
4036 CXCursorVisitor visitor,
4037 CXClientData client_data) {
4038 CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data,
4039 /*VisitPreprocessorLast=*/false);
4040 return CursorVis.VisitChildren(parent);
4041 }
4042
4043 #ifndef __has_feature
4044 #define __has_feature(x) 0
4045 #endif
4046 #if __has_feature(blocks)
4047 typedef enum CXChildVisitResult
4048 (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent);
4049
visitWithBlock(CXCursor cursor,CXCursor parent,CXClientData client_data)4050 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
4051 CXClientData client_data) {
4052 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
4053 return block(cursor, parent);
4054 }
4055 #else
4056 // If we are compiled with a compiler that doesn't have native blocks support,
4057 // define and call the block manually, so the
4058 typedef struct _CXChildVisitResult
4059 {
4060 void *isa;
4061 int flags;
4062 int reserved;
4063 enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor,
4064 CXCursor);
4065 } *CXCursorVisitorBlock;
4066
visitWithBlock(CXCursor cursor,CXCursor parent,CXClientData client_data)4067 static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
4068 CXClientData client_data) {
4069 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
4070 return block->invoke(block, cursor, parent);
4071 }
4072 #endif
4073
4074
clang_visitChildrenWithBlock(CXCursor parent,CXCursorVisitorBlock block)4075 unsigned clang_visitChildrenWithBlock(CXCursor parent,
4076 CXCursorVisitorBlock block) {
4077 return clang_visitChildren(parent, visitWithBlock, block);
4078 }
4079
getDeclSpelling(const Decl * D)4080 static CXString getDeclSpelling(const Decl *D) {
4081 if (!D)
4082 return cxstring::createEmpty();
4083
4084 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
4085 if (!ND) {
4086 if (const ObjCPropertyImplDecl *PropImpl =
4087 dyn_cast<ObjCPropertyImplDecl>(D))
4088 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
4089 return cxstring::createDup(Property->getIdentifier()->getName());
4090
4091 if (const ImportDecl *ImportD = dyn_cast<ImportDecl>(D))
4092 if (Module *Mod = ImportD->getImportedModule())
4093 return cxstring::createDup(Mod->getFullModuleName());
4094
4095 return cxstring::createEmpty();
4096 }
4097
4098 if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
4099 return cxstring::createDup(OMD->getSelector().getAsString());
4100
4101 if (const ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
4102 // No, this isn't the same as the code below. getIdentifier() is non-virtual
4103 // and returns different names. NamedDecl returns the class name and
4104 // ObjCCategoryImplDecl returns the category name.
4105 return cxstring::createRef(CIMP->getIdentifier()->getNameStart());
4106
4107 if (isa<UsingDirectiveDecl>(D))
4108 return cxstring::createEmpty();
4109
4110 SmallString<1024> S;
4111 llvm::raw_svector_ostream os(S);
4112 ND->printName(os);
4113
4114 return cxstring::createDup(os.str());
4115 }
4116
clang_getCursorSpelling(CXCursor C)4117 CXString clang_getCursorSpelling(CXCursor C) {
4118 if (clang_isTranslationUnit(C.kind))
4119 return clang_getTranslationUnitSpelling(getCursorTU(C));
4120
4121 if (clang_isReference(C.kind)) {
4122 switch (C.kind) {
4123 case CXCursor_ObjCSuperClassRef: {
4124 const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
4125 return cxstring::createRef(Super->getIdentifier()->getNameStart());
4126 }
4127 case CXCursor_ObjCClassRef: {
4128 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
4129 return cxstring::createRef(Class->getIdentifier()->getNameStart());
4130 }
4131 case CXCursor_ObjCProtocolRef: {
4132 const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
4133 assert(OID && "getCursorSpelling(): Missing protocol decl");
4134 return cxstring::createRef(OID->getIdentifier()->getNameStart());
4135 }
4136 case CXCursor_CXXBaseSpecifier: {
4137 const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
4138 return cxstring::createDup(B->getType().getAsString());
4139 }
4140 case CXCursor_TypeRef: {
4141 const TypeDecl *Type = getCursorTypeRef(C).first;
4142 assert(Type && "Missing type decl");
4143
4144 return cxstring::createDup(getCursorContext(C).getTypeDeclType(Type).
4145 getAsString());
4146 }
4147 case CXCursor_TemplateRef: {
4148 const TemplateDecl *Template = getCursorTemplateRef(C).first;
4149 assert(Template && "Missing template decl");
4150
4151 return cxstring::createDup(Template->getNameAsString());
4152 }
4153
4154 case CXCursor_NamespaceRef: {
4155 const NamedDecl *NS = getCursorNamespaceRef(C).first;
4156 assert(NS && "Missing namespace decl");
4157
4158 return cxstring::createDup(NS->getNameAsString());
4159 }
4160
4161 case CXCursor_MemberRef: {
4162 const FieldDecl *Field = getCursorMemberRef(C).first;
4163 assert(Field && "Missing member decl");
4164
4165 return cxstring::createDup(Field->getNameAsString());
4166 }
4167
4168 case CXCursor_LabelRef: {
4169 const LabelStmt *Label = getCursorLabelRef(C).first;
4170 assert(Label && "Missing label");
4171
4172 return cxstring::createRef(Label->getName());
4173 }
4174
4175 case CXCursor_OverloadedDeclRef: {
4176 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
4177 if (const Decl *D = Storage.dyn_cast<const Decl *>()) {
4178 if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
4179 return cxstring::createDup(ND->getNameAsString());
4180 return cxstring::createEmpty();
4181 }
4182 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
4183 return cxstring::createDup(E->getName().getAsString());
4184 OverloadedTemplateStorage *Ovl
4185 = Storage.get<OverloadedTemplateStorage*>();
4186 if (Ovl->size() == 0)
4187 return cxstring::createEmpty();
4188 return cxstring::createDup((*Ovl->begin())->getNameAsString());
4189 }
4190
4191 case CXCursor_VariableRef: {
4192 const VarDecl *Var = getCursorVariableRef(C).first;
4193 assert(Var && "Missing variable decl");
4194
4195 return cxstring::createDup(Var->getNameAsString());
4196 }
4197
4198 default:
4199 return cxstring::createRef("<not implemented>");
4200 }
4201 }
4202
4203 if (clang_isExpression(C.kind)) {
4204 const Expr *E = getCursorExpr(C);
4205
4206 if (C.kind == CXCursor_ObjCStringLiteral ||
4207 C.kind == CXCursor_StringLiteral) {
4208 const StringLiteral *SLit;
4209 if (const ObjCStringLiteral *OSL = dyn_cast<ObjCStringLiteral>(E)) {
4210 SLit = OSL->getString();
4211 } else {
4212 SLit = cast<StringLiteral>(E);
4213 }
4214 SmallString<256> Buf;
4215 llvm::raw_svector_ostream OS(Buf);
4216 SLit->outputString(OS);
4217 return cxstring::createDup(OS.str());
4218 }
4219
4220 const Decl *D = getDeclFromExpr(getCursorExpr(C));
4221 if (D)
4222 return getDeclSpelling(D);
4223 return cxstring::createEmpty();
4224 }
4225
4226 if (clang_isStatement(C.kind)) {
4227 const Stmt *S = getCursorStmt(C);
4228 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
4229 return cxstring::createRef(Label->getName());
4230
4231 return cxstring::createEmpty();
4232 }
4233
4234 if (C.kind == CXCursor_MacroExpansion)
4235 return cxstring::createRef(getCursorMacroExpansion(C).getName()
4236 ->getNameStart());
4237
4238 if (C.kind == CXCursor_MacroDefinition)
4239 return cxstring::createRef(getCursorMacroDefinition(C)->getName()
4240 ->getNameStart());
4241
4242 if (C.kind == CXCursor_InclusionDirective)
4243 return cxstring::createDup(getCursorInclusionDirective(C)->getFileName());
4244
4245 if (clang_isDeclaration(C.kind))
4246 return getDeclSpelling(getCursorDecl(C));
4247
4248 if (C.kind == CXCursor_AnnotateAttr) {
4249 const AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C));
4250 return cxstring::createDup(AA->getAnnotation());
4251 }
4252
4253 if (C.kind == CXCursor_AsmLabelAttr) {
4254 const AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C));
4255 return cxstring::createDup(AA->getLabel());
4256 }
4257
4258 if (C.kind == CXCursor_PackedAttr) {
4259 return cxstring::createRef("packed");
4260 }
4261
4262 if (C.kind == CXCursor_VisibilityAttr) {
4263 const VisibilityAttr *AA = cast<VisibilityAttr>(cxcursor::getCursorAttr(C));
4264 switch (AA->getVisibility()) {
4265 case VisibilityAttr::VisibilityType::Default:
4266 return cxstring::createRef("default");
4267 case VisibilityAttr::VisibilityType::Hidden:
4268 return cxstring::createRef("hidden");
4269 case VisibilityAttr::VisibilityType::Protected:
4270 return cxstring::createRef("protected");
4271 }
4272 llvm_unreachable("unknown visibility type");
4273 }
4274
4275 return cxstring::createEmpty();
4276 }
4277
clang_Cursor_getSpellingNameRange(CXCursor C,unsigned pieceIndex,unsigned options)4278 CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C,
4279 unsigned pieceIndex,
4280 unsigned options) {
4281 if (clang_Cursor_isNull(C))
4282 return clang_getNullRange();
4283
4284 ASTContext &Ctx = getCursorContext(C);
4285
4286 if (clang_isStatement(C.kind)) {
4287 const Stmt *S = getCursorStmt(C);
4288 if (const LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) {
4289 if (pieceIndex > 0)
4290 return clang_getNullRange();
4291 return cxloc::translateSourceRange(Ctx, Label->getIdentLoc());
4292 }
4293
4294 return clang_getNullRange();
4295 }
4296
4297 if (C.kind == CXCursor_ObjCMessageExpr) {
4298 if (const ObjCMessageExpr *
4299 ME = dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) {
4300 if (pieceIndex >= ME->getNumSelectorLocs())
4301 return clang_getNullRange();
4302 return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex));
4303 }
4304 }
4305
4306 if (C.kind == CXCursor_ObjCInstanceMethodDecl ||
4307 C.kind == CXCursor_ObjCClassMethodDecl) {
4308 if (const ObjCMethodDecl *
4309 MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) {
4310 if (pieceIndex >= MD->getNumSelectorLocs())
4311 return clang_getNullRange();
4312 return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex));
4313 }
4314 }
4315
4316 if (C.kind == CXCursor_ObjCCategoryDecl ||
4317 C.kind == CXCursor_ObjCCategoryImplDecl) {
4318 if (pieceIndex > 0)
4319 return clang_getNullRange();
4320 if (const ObjCCategoryDecl *
4321 CD = dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C)))
4322 return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc());
4323 if (const ObjCCategoryImplDecl *
4324 CID = dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C)))
4325 return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc());
4326 }
4327
4328 if (C.kind == CXCursor_ModuleImportDecl) {
4329 if (pieceIndex > 0)
4330 return clang_getNullRange();
4331 if (const ImportDecl *ImportD =
4332 dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) {
4333 ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs();
4334 if (!Locs.empty())
4335 return cxloc::translateSourceRange(Ctx,
4336 SourceRange(Locs.front(), Locs.back()));
4337 }
4338 return clang_getNullRange();
4339 }
4340
4341 if (C.kind == CXCursor_CXXMethod || C.kind == CXCursor_Destructor ||
4342 C.kind == CXCursor_ConversionFunction) {
4343 if (pieceIndex > 0)
4344 return clang_getNullRange();
4345 if (const FunctionDecl *FD =
4346 dyn_cast_or_null<FunctionDecl>(getCursorDecl(C))) {
4347 DeclarationNameInfo FunctionName = FD->getNameInfo();
4348 return cxloc::translateSourceRange(Ctx, FunctionName.getSourceRange());
4349 }
4350 return clang_getNullRange();
4351 }
4352
4353 // FIXME: A CXCursor_InclusionDirective should give the location of the
4354 // filename, but we don't keep track of this.
4355
4356 // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation
4357 // but we don't keep track of this.
4358
4359 // FIXME: A CXCursor_AsmLabelAttr should give the location of the label
4360 // but we don't keep track of this.
4361
4362 // Default handling, give the location of the cursor.
4363
4364 if (pieceIndex > 0)
4365 return clang_getNullRange();
4366
4367 CXSourceLocation CXLoc = clang_getCursorLocation(C);
4368 SourceLocation Loc = cxloc::translateSourceLocation(CXLoc);
4369 return cxloc::translateSourceRange(Ctx, Loc);
4370 }
4371
clang_Cursor_getMangling(CXCursor C)4372 CXString clang_Cursor_getMangling(CXCursor C) {
4373 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
4374 return cxstring::createEmpty();
4375
4376 // Mangling only works for functions and variables.
4377 const Decl *D = getCursorDecl(C);
4378 if (!D || !(isa<FunctionDecl>(D) || isa<VarDecl>(D)))
4379 return cxstring::createEmpty();
4380
4381 ASTContext &Ctx = D->getASTContext();
4382 index::CodegenNameGenerator CGNameGen(Ctx);
4383 return cxstring::createDup(CGNameGen.getName(D));
4384 }
4385
clang_Cursor_getCXXManglings(CXCursor C)4386 CXStringSet *clang_Cursor_getCXXManglings(CXCursor C) {
4387 if (clang_isInvalid(C.kind) || !clang_isDeclaration(C.kind))
4388 return nullptr;
4389
4390 const Decl *D = getCursorDecl(C);
4391 if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D)))
4392 return nullptr;
4393
4394 ASTContext &Ctx = D->getASTContext();
4395 index::CodegenNameGenerator CGNameGen(Ctx);
4396 std::vector<std::string> Manglings = CGNameGen.getAllManglings(D);
4397 return cxstring::createSet(Manglings);
4398 }
4399
clang_getCursorDisplayName(CXCursor C)4400 CXString clang_getCursorDisplayName(CXCursor C) {
4401 if (!clang_isDeclaration(C.kind))
4402 return clang_getCursorSpelling(C);
4403
4404 const Decl *D = getCursorDecl(C);
4405 if (!D)
4406 return cxstring::createEmpty();
4407
4408 PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy();
4409 if (const FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
4410 D = FunTmpl->getTemplatedDecl();
4411
4412 if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
4413 SmallString<64> Str;
4414 llvm::raw_svector_ostream OS(Str);
4415 OS << *Function;
4416 if (Function->getPrimaryTemplate())
4417 OS << "<>";
4418 OS << "(";
4419 for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
4420 if (I)
4421 OS << ", ";
4422 OS << Function->getParamDecl(I)->getType().getAsString(Policy);
4423 }
4424
4425 if (Function->isVariadic()) {
4426 if (Function->getNumParams())
4427 OS << ", ";
4428 OS << "...";
4429 }
4430 OS << ")";
4431 return cxstring::createDup(OS.str());
4432 }
4433
4434 if (const ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
4435 SmallString<64> Str;
4436 llvm::raw_svector_ostream OS(Str);
4437 OS << *ClassTemplate;
4438 OS << "<";
4439 TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
4440 for (unsigned I = 0, N = Params->size(); I != N; ++I) {
4441 if (I)
4442 OS << ", ";
4443
4444 NamedDecl *Param = Params->getParam(I);
4445 if (Param->getIdentifier()) {
4446 OS << Param->getIdentifier()->getName();
4447 continue;
4448 }
4449
4450 // There is no parameter name, which makes this tricky. Try to come up
4451 // with something useful that isn't too long.
4452 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
4453 OS << (TTP->wasDeclaredWithTypename()? "typename" : "class");
4454 else if (NonTypeTemplateParmDecl *NTTP
4455 = dyn_cast<NonTypeTemplateParmDecl>(Param))
4456 OS << NTTP->getType().getAsString(Policy);
4457 else
4458 OS << "template<...> class";
4459 }
4460
4461 OS << ">";
4462 return cxstring::createDup(OS.str());
4463 }
4464
4465 if (const ClassTemplateSpecializationDecl *ClassSpec
4466 = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
4467 // If the type was explicitly written, use that.
4468 if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
4469 return cxstring::createDup(TSInfo->getType().getAsString(Policy));
4470
4471 SmallString<128> Str;
4472 llvm::raw_svector_ostream OS(Str);
4473 OS << *ClassSpec;
4474 TemplateSpecializationType::PrintTemplateArgumentList(
4475 OS, ClassSpec->getTemplateArgs().asArray(), Policy);
4476 return cxstring::createDup(OS.str());
4477 }
4478
4479 return clang_getCursorSpelling(C);
4480 }
4481
clang_getCursorKindSpelling(enum CXCursorKind Kind)4482 CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
4483 switch (Kind) {
4484 case CXCursor_FunctionDecl:
4485 return cxstring::createRef("FunctionDecl");
4486 case CXCursor_TypedefDecl:
4487 return cxstring::createRef("TypedefDecl");
4488 case CXCursor_EnumDecl:
4489 return cxstring::createRef("EnumDecl");
4490 case CXCursor_EnumConstantDecl:
4491 return cxstring::createRef("EnumConstantDecl");
4492 case CXCursor_StructDecl:
4493 return cxstring::createRef("StructDecl");
4494 case CXCursor_UnionDecl:
4495 return cxstring::createRef("UnionDecl");
4496 case CXCursor_ClassDecl:
4497 return cxstring::createRef("ClassDecl");
4498 case CXCursor_FieldDecl:
4499 return cxstring::createRef("FieldDecl");
4500 case CXCursor_VarDecl:
4501 return cxstring::createRef("VarDecl");
4502 case CXCursor_ParmDecl:
4503 return cxstring::createRef("ParmDecl");
4504 case CXCursor_ObjCInterfaceDecl:
4505 return cxstring::createRef("ObjCInterfaceDecl");
4506 case CXCursor_ObjCCategoryDecl:
4507 return cxstring::createRef("ObjCCategoryDecl");
4508 case CXCursor_ObjCProtocolDecl:
4509 return cxstring::createRef("ObjCProtocolDecl");
4510 case CXCursor_ObjCPropertyDecl:
4511 return cxstring::createRef("ObjCPropertyDecl");
4512 case CXCursor_ObjCIvarDecl:
4513 return cxstring::createRef("ObjCIvarDecl");
4514 case CXCursor_ObjCInstanceMethodDecl:
4515 return cxstring::createRef("ObjCInstanceMethodDecl");
4516 case CXCursor_ObjCClassMethodDecl:
4517 return cxstring::createRef("ObjCClassMethodDecl");
4518 case CXCursor_ObjCImplementationDecl:
4519 return cxstring::createRef("ObjCImplementationDecl");
4520 case CXCursor_ObjCCategoryImplDecl:
4521 return cxstring::createRef("ObjCCategoryImplDecl");
4522 case CXCursor_CXXMethod:
4523 return cxstring::createRef("CXXMethod");
4524 case CXCursor_UnexposedDecl:
4525 return cxstring::createRef("UnexposedDecl");
4526 case CXCursor_ObjCSuperClassRef:
4527 return cxstring::createRef("ObjCSuperClassRef");
4528 case CXCursor_ObjCProtocolRef:
4529 return cxstring::createRef("ObjCProtocolRef");
4530 case CXCursor_ObjCClassRef:
4531 return cxstring::createRef("ObjCClassRef");
4532 case CXCursor_TypeRef:
4533 return cxstring::createRef("TypeRef");
4534 case CXCursor_TemplateRef:
4535 return cxstring::createRef("TemplateRef");
4536 case CXCursor_NamespaceRef:
4537 return cxstring::createRef("NamespaceRef");
4538 case CXCursor_MemberRef:
4539 return cxstring::createRef("MemberRef");
4540 case CXCursor_LabelRef:
4541 return cxstring::createRef("LabelRef");
4542 case CXCursor_OverloadedDeclRef:
4543 return cxstring::createRef("OverloadedDeclRef");
4544 case CXCursor_VariableRef:
4545 return cxstring::createRef("VariableRef");
4546 case CXCursor_IntegerLiteral:
4547 return cxstring::createRef("IntegerLiteral");
4548 case CXCursor_FloatingLiteral:
4549 return cxstring::createRef("FloatingLiteral");
4550 case CXCursor_ImaginaryLiteral:
4551 return cxstring::createRef("ImaginaryLiteral");
4552 case CXCursor_StringLiteral:
4553 return cxstring::createRef("StringLiteral");
4554 case CXCursor_CharacterLiteral:
4555 return cxstring::createRef("CharacterLiteral");
4556 case CXCursor_ParenExpr:
4557 return cxstring::createRef("ParenExpr");
4558 case CXCursor_UnaryOperator:
4559 return cxstring::createRef("UnaryOperator");
4560 case CXCursor_ArraySubscriptExpr:
4561 return cxstring::createRef("ArraySubscriptExpr");
4562 case CXCursor_OMPArraySectionExpr:
4563 return cxstring::createRef("OMPArraySectionExpr");
4564 case CXCursor_BinaryOperator:
4565 return cxstring::createRef("BinaryOperator");
4566 case CXCursor_CompoundAssignOperator:
4567 return cxstring::createRef("CompoundAssignOperator");
4568 case CXCursor_ConditionalOperator:
4569 return cxstring::createRef("ConditionalOperator");
4570 case CXCursor_CStyleCastExpr:
4571 return cxstring::createRef("CStyleCastExpr");
4572 case CXCursor_CompoundLiteralExpr:
4573 return cxstring::createRef("CompoundLiteralExpr");
4574 case CXCursor_InitListExpr:
4575 return cxstring::createRef("InitListExpr");
4576 case CXCursor_AddrLabelExpr:
4577 return cxstring::createRef("AddrLabelExpr");
4578 case CXCursor_StmtExpr:
4579 return cxstring::createRef("StmtExpr");
4580 case CXCursor_GenericSelectionExpr:
4581 return cxstring::createRef("GenericSelectionExpr");
4582 case CXCursor_GNUNullExpr:
4583 return cxstring::createRef("GNUNullExpr");
4584 case CXCursor_CXXStaticCastExpr:
4585 return cxstring::createRef("CXXStaticCastExpr");
4586 case CXCursor_CXXDynamicCastExpr:
4587 return cxstring::createRef("CXXDynamicCastExpr");
4588 case CXCursor_CXXReinterpretCastExpr:
4589 return cxstring::createRef("CXXReinterpretCastExpr");
4590 case CXCursor_CXXConstCastExpr:
4591 return cxstring::createRef("CXXConstCastExpr");
4592 case CXCursor_CXXFunctionalCastExpr:
4593 return cxstring::createRef("CXXFunctionalCastExpr");
4594 case CXCursor_CXXTypeidExpr:
4595 return cxstring::createRef("CXXTypeidExpr");
4596 case CXCursor_CXXBoolLiteralExpr:
4597 return cxstring::createRef("CXXBoolLiteralExpr");
4598 case CXCursor_CXXNullPtrLiteralExpr:
4599 return cxstring::createRef("CXXNullPtrLiteralExpr");
4600 case CXCursor_CXXThisExpr:
4601 return cxstring::createRef("CXXThisExpr");
4602 case CXCursor_CXXThrowExpr:
4603 return cxstring::createRef("CXXThrowExpr");
4604 case CXCursor_CXXNewExpr:
4605 return cxstring::createRef("CXXNewExpr");
4606 case CXCursor_CXXDeleteExpr:
4607 return cxstring::createRef("CXXDeleteExpr");
4608 case CXCursor_UnaryExpr:
4609 return cxstring::createRef("UnaryExpr");
4610 case CXCursor_ObjCStringLiteral:
4611 return cxstring::createRef("ObjCStringLiteral");
4612 case CXCursor_ObjCBoolLiteralExpr:
4613 return cxstring::createRef("ObjCBoolLiteralExpr");
4614 case CXCursor_ObjCSelfExpr:
4615 return cxstring::createRef("ObjCSelfExpr");
4616 case CXCursor_ObjCEncodeExpr:
4617 return cxstring::createRef("ObjCEncodeExpr");
4618 case CXCursor_ObjCSelectorExpr:
4619 return cxstring::createRef("ObjCSelectorExpr");
4620 case CXCursor_ObjCProtocolExpr:
4621 return cxstring::createRef("ObjCProtocolExpr");
4622 case CXCursor_ObjCBridgedCastExpr:
4623 return cxstring::createRef("ObjCBridgedCastExpr");
4624 case CXCursor_BlockExpr:
4625 return cxstring::createRef("BlockExpr");
4626 case CXCursor_PackExpansionExpr:
4627 return cxstring::createRef("PackExpansionExpr");
4628 case CXCursor_SizeOfPackExpr:
4629 return cxstring::createRef("SizeOfPackExpr");
4630 case CXCursor_LambdaExpr:
4631 return cxstring::createRef("LambdaExpr");
4632 case CXCursor_UnexposedExpr:
4633 return cxstring::createRef("UnexposedExpr");
4634 case CXCursor_DeclRefExpr:
4635 return cxstring::createRef("DeclRefExpr");
4636 case CXCursor_MemberRefExpr:
4637 return cxstring::createRef("MemberRefExpr");
4638 case CXCursor_CallExpr:
4639 return cxstring::createRef("CallExpr");
4640 case CXCursor_ObjCMessageExpr:
4641 return cxstring::createRef("ObjCMessageExpr");
4642 case CXCursor_UnexposedStmt:
4643 return cxstring::createRef("UnexposedStmt");
4644 case CXCursor_DeclStmt:
4645 return cxstring::createRef("DeclStmt");
4646 case CXCursor_LabelStmt:
4647 return cxstring::createRef("LabelStmt");
4648 case CXCursor_CompoundStmt:
4649 return cxstring::createRef("CompoundStmt");
4650 case CXCursor_CaseStmt:
4651 return cxstring::createRef("CaseStmt");
4652 case CXCursor_DefaultStmt:
4653 return cxstring::createRef("DefaultStmt");
4654 case CXCursor_IfStmt:
4655 return cxstring::createRef("IfStmt");
4656 case CXCursor_SwitchStmt:
4657 return cxstring::createRef("SwitchStmt");
4658 case CXCursor_WhileStmt:
4659 return cxstring::createRef("WhileStmt");
4660 case CXCursor_DoStmt:
4661 return cxstring::createRef("DoStmt");
4662 case CXCursor_ForStmt:
4663 return cxstring::createRef("ForStmt");
4664 case CXCursor_GotoStmt:
4665 return cxstring::createRef("GotoStmt");
4666 case CXCursor_IndirectGotoStmt:
4667 return cxstring::createRef("IndirectGotoStmt");
4668 case CXCursor_ContinueStmt:
4669 return cxstring::createRef("ContinueStmt");
4670 case CXCursor_BreakStmt:
4671 return cxstring::createRef("BreakStmt");
4672 case CXCursor_ReturnStmt:
4673 return cxstring::createRef("ReturnStmt");
4674 case CXCursor_GCCAsmStmt:
4675 return cxstring::createRef("GCCAsmStmt");
4676 case CXCursor_MSAsmStmt:
4677 return cxstring::createRef("MSAsmStmt");
4678 case CXCursor_ObjCAtTryStmt:
4679 return cxstring::createRef("ObjCAtTryStmt");
4680 case CXCursor_ObjCAtCatchStmt:
4681 return cxstring::createRef("ObjCAtCatchStmt");
4682 case CXCursor_ObjCAtFinallyStmt:
4683 return cxstring::createRef("ObjCAtFinallyStmt");
4684 case CXCursor_ObjCAtThrowStmt:
4685 return cxstring::createRef("ObjCAtThrowStmt");
4686 case CXCursor_ObjCAtSynchronizedStmt:
4687 return cxstring::createRef("ObjCAtSynchronizedStmt");
4688 case CXCursor_ObjCAutoreleasePoolStmt:
4689 return cxstring::createRef("ObjCAutoreleasePoolStmt");
4690 case CXCursor_ObjCForCollectionStmt:
4691 return cxstring::createRef("ObjCForCollectionStmt");
4692 case CXCursor_CXXCatchStmt:
4693 return cxstring::createRef("CXXCatchStmt");
4694 case CXCursor_CXXTryStmt:
4695 return cxstring::createRef("CXXTryStmt");
4696 case CXCursor_CXXForRangeStmt:
4697 return cxstring::createRef("CXXForRangeStmt");
4698 case CXCursor_SEHTryStmt:
4699 return cxstring::createRef("SEHTryStmt");
4700 case CXCursor_SEHExceptStmt:
4701 return cxstring::createRef("SEHExceptStmt");
4702 case CXCursor_SEHFinallyStmt:
4703 return cxstring::createRef("SEHFinallyStmt");
4704 case CXCursor_SEHLeaveStmt:
4705 return cxstring::createRef("SEHLeaveStmt");
4706 case CXCursor_NullStmt:
4707 return cxstring::createRef("NullStmt");
4708 case CXCursor_InvalidFile:
4709 return cxstring::createRef("InvalidFile");
4710 case CXCursor_InvalidCode:
4711 return cxstring::createRef("InvalidCode");
4712 case CXCursor_NoDeclFound:
4713 return cxstring::createRef("NoDeclFound");
4714 case CXCursor_NotImplemented:
4715 return cxstring::createRef("NotImplemented");
4716 case CXCursor_TranslationUnit:
4717 return cxstring::createRef("TranslationUnit");
4718 case CXCursor_UnexposedAttr:
4719 return cxstring::createRef("UnexposedAttr");
4720 case CXCursor_IBActionAttr:
4721 return cxstring::createRef("attribute(ibaction)");
4722 case CXCursor_IBOutletAttr:
4723 return cxstring::createRef("attribute(iboutlet)");
4724 case CXCursor_IBOutletCollectionAttr:
4725 return cxstring::createRef("attribute(iboutletcollection)");
4726 case CXCursor_CXXFinalAttr:
4727 return cxstring::createRef("attribute(final)");
4728 case CXCursor_CXXOverrideAttr:
4729 return cxstring::createRef("attribute(override)");
4730 case CXCursor_AnnotateAttr:
4731 return cxstring::createRef("attribute(annotate)");
4732 case CXCursor_AsmLabelAttr:
4733 return cxstring::createRef("asm label");
4734 case CXCursor_PackedAttr:
4735 return cxstring::createRef("attribute(packed)");
4736 case CXCursor_PureAttr:
4737 return cxstring::createRef("attribute(pure)");
4738 case CXCursor_ConstAttr:
4739 return cxstring::createRef("attribute(const)");
4740 case CXCursor_NoDuplicateAttr:
4741 return cxstring::createRef("attribute(noduplicate)");
4742 case CXCursor_CUDAConstantAttr:
4743 return cxstring::createRef("attribute(constant)");
4744 case CXCursor_CUDADeviceAttr:
4745 return cxstring::createRef("attribute(device)");
4746 case CXCursor_CUDAGlobalAttr:
4747 return cxstring::createRef("attribute(global)");
4748 case CXCursor_CUDAHostAttr:
4749 return cxstring::createRef("attribute(host)");
4750 case CXCursor_CUDASharedAttr:
4751 return cxstring::createRef("attribute(shared)");
4752 case CXCursor_VisibilityAttr:
4753 return cxstring::createRef("attribute(visibility)");
4754 case CXCursor_DLLExport:
4755 return cxstring::createRef("attribute(dllexport)");
4756 case CXCursor_DLLImport:
4757 return cxstring::createRef("attribute(dllimport)");
4758 case CXCursor_PreprocessingDirective:
4759 return cxstring::createRef("preprocessing directive");
4760 case CXCursor_MacroDefinition:
4761 return cxstring::createRef("macro definition");
4762 case CXCursor_MacroExpansion:
4763 return cxstring::createRef("macro expansion");
4764 case CXCursor_InclusionDirective:
4765 return cxstring::createRef("inclusion directive");
4766 case CXCursor_Namespace:
4767 return cxstring::createRef("Namespace");
4768 case CXCursor_LinkageSpec:
4769 return cxstring::createRef("LinkageSpec");
4770 case CXCursor_CXXBaseSpecifier:
4771 return cxstring::createRef("C++ base class specifier");
4772 case CXCursor_Constructor:
4773 return cxstring::createRef("CXXConstructor");
4774 case CXCursor_Destructor:
4775 return cxstring::createRef("CXXDestructor");
4776 case CXCursor_ConversionFunction:
4777 return cxstring::createRef("CXXConversion");
4778 case CXCursor_TemplateTypeParameter:
4779 return cxstring::createRef("TemplateTypeParameter");
4780 case CXCursor_NonTypeTemplateParameter:
4781 return cxstring::createRef("NonTypeTemplateParameter");
4782 case CXCursor_TemplateTemplateParameter:
4783 return cxstring::createRef("TemplateTemplateParameter");
4784 case CXCursor_FunctionTemplate:
4785 return cxstring::createRef("FunctionTemplate");
4786 case CXCursor_ClassTemplate:
4787 return cxstring::createRef("ClassTemplate");
4788 case CXCursor_ClassTemplatePartialSpecialization:
4789 return cxstring::createRef("ClassTemplatePartialSpecialization");
4790 case CXCursor_NamespaceAlias:
4791 return cxstring::createRef("NamespaceAlias");
4792 case CXCursor_UsingDirective:
4793 return cxstring::createRef("UsingDirective");
4794 case CXCursor_UsingDeclaration:
4795 return cxstring::createRef("UsingDeclaration");
4796 case CXCursor_TypeAliasDecl:
4797 return cxstring::createRef("TypeAliasDecl");
4798 case CXCursor_ObjCSynthesizeDecl:
4799 return cxstring::createRef("ObjCSynthesizeDecl");
4800 case CXCursor_ObjCDynamicDecl:
4801 return cxstring::createRef("ObjCDynamicDecl");
4802 case CXCursor_CXXAccessSpecifier:
4803 return cxstring::createRef("CXXAccessSpecifier");
4804 case CXCursor_ModuleImportDecl:
4805 return cxstring::createRef("ModuleImport");
4806 case CXCursor_OMPParallelDirective:
4807 return cxstring::createRef("OMPParallelDirective");
4808 case CXCursor_OMPSimdDirective:
4809 return cxstring::createRef("OMPSimdDirective");
4810 case CXCursor_OMPForDirective:
4811 return cxstring::createRef("OMPForDirective");
4812 case CXCursor_OMPForSimdDirective:
4813 return cxstring::createRef("OMPForSimdDirective");
4814 case CXCursor_OMPSectionsDirective:
4815 return cxstring::createRef("OMPSectionsDirective");
4816 case CXCursor_OMPSectionDirective:
4817 return cxstring::createRef("OMPSectionDirective");
4818 case CXCursor_OMPSingleDirective:
4819 return cxstring::createRef("OMPSingleDirective");
4820 case CXCursor_OMPMasterDirective:
4821 return cxstring::createRef("OMPMasterDirective");
4822 case CXCursor_OMPCriticalDirective:
4823 return cxstring::createRef("OMPCriticalDirective");
4824 case CXCursor_OMPParallelForDirective:
4825 return cxstring::createRef("OMPParallelForDirective");
4826 case CXCursor_OMPParallelForSimdDirective:
4827 return cxstring::createRef("OMPParallelForSimdDirective");
4828 case CXCursor_OMPParallelSectionsDirective:
4829 return cxstring::createRef("OMPParallelSectionsDirective");
4830 case CXCursor_OMPTaskDirective:
4831 return cxstring::createRef("OMPTaskDirective");
4832 case CXCursor_OMPTaskyieldDirective:
4833 return cxstring::createRef("OMPTaskyieldDirective");
4834 case CXCursor_OMPBarrierDirective:
4835 return cxstring::createRef("OMPBarrierDirective");
4836 case CXCursor_OMPTaskwaitDirective:
4837 return cxstring::createRef("OMPTaskwaitDirective");
4838 case CXCursor_OMPTaskgroupDirective:
4839 return cxstring::createRef("OMPTaskgroupDirective");
4840 case CXCursor_OMPFlushDirective:
4841 return cxstring::createRef("OMPFlushDirective");
4842 case CXCursor_OMPOrderedDirective:
4843 return cxstring::createRef("OMPOrderedDirective");
4844 case CXCursor_OMPAtomicDirective:
4845 return cxstring::createRef("OMPAtomicDirective");
4846 case CXCursor_OMPTargetDirective:
4847 return cxstring::createRef("OMPTargetDirective");
4848 case CXCursor_OMPTargetDataDirective:
4849 return cxstring::createRef("OMPTargetDataDirective");
4850 case CXCursor_OMPTargetEnterDataDirective:
4851 return cxstring::createRef("OMPTargetEnterDataDirective");
4852 case CXCursor_OMPTargetExitDataDirective:
4853 return cxstring::createRef("OMPTargetExitDataDirective");
4854 case CXCursor_OMPTargetParallelDirective:
4855 return cxstring::createRef("OMPTargetParallelDirective");
4856 case CXCursor_OMPTargetParallelForDirective:
4857 return cxstring::createRef("OMPTargetParallelForDirective");
4858 case CXCursor_OMPTargetUpdateDirective:
4859 return cxstring::createRef("OMPTargetUpdateDirective");
4860 case CXCursor_OMPTeamsDirective:
4861 return cxstring::createRef("OMPTeamsDirective");
4862 case CXCursor_OMPCancellationPointDirective:
4863 return cxstring::createRef("OMPCancellationPointDirective");
4864 case CXCursor_OMPCancelDirective:
4865 return cxstring::createRef("OMPCancelDirective");
4866 case CXCursor_OMPTaskLoopDirective:
4867 return cxstring::createRef("OMPTaskLoopDirective");
4868 case CXCursor_OMPTaskLoopSimdDirective:
4869 return cxstring::createRef("OMPTaskLoopSimdDirective");
4870 case CXCursor_OMPDistributeDirective:
4871 return cxstring::createRef("OMPDistributeDirective");
4872 case CXCursor_OMPDistributeParallelForDirective:
4873 return cxstring::createRef("OMPDistributeParallelForDirective");
4874 case CXCursor_OMPDistributeParallelForSimdDirective:
4875 return cxstring::createRef("OMPDistributeParallelForSimdDirective");
4876 case CXCursor_OMPDistributeSimdDirective:
4877 return cxstring::createRef("OMPDistributeSimdDirective");
4878 case CXCursor_OMPTargetParallelForSimdDirective:
4879 return cxstring::createRef("OMPTargetParallelForSimdDirective");
4880 case CXCursor_OverloadCandidate:
4881 return cxstring::createRef("OverloadCandidate");
4882 case CXCursor_TypeAliasTemplateDecl:
4883 return cxstring::createRef("TypeAliasTemplateDecl");
4884 case CXCursor_StaticAssert:
4885 return cxstring::createRef("StaticAssert");
4886 }
4887
4888 llvm_unreachable("Unhandled CXCursorKind");
4889 }
4890
4891 struct GetCursorData {
4892 SourceLocation TokenBeginLoc;
4893 bool PointsAtMacroArgExpansion;
4894 bool VisitedObjCPropertyImplDecl;
4895 SourceLocation VisitedDeclaratorDeclStartLoc;
4896 CXCursor &BestCursor;
4897
GetCursorDataGetCursorData4898 GetCursorData(SourceManager &SM,
4899 SourceLocation tokenBegin, CXCursor &outputCursor)
4900 : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) {
4901 PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin);
4902 VisitedObjCPropertyImplDecl = false;
4903 }
4904 };
4905
GetCursorVisitor(CXCursor cursor,CXCursor parent,CXClientData client_data)4906 static enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
4907 CXCursor parent,
4908 CXClientData client_data) {
4909 GetCursorData *Data = static_cast<GetCursorData *>(client_data);
4910 CXCursor *BestCursor = &Data->BestCursor;
4911
4912 // If we point inside a macro argument we should provide info of what the
4913 // token is so use the actual cursor, don't replace it with a macro expansion
4914 // cursor.
4915 if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion)
4916 return CXChildVisit_Recurse;
4917
4918 if (clang_isDeclaration(cursor.kind)) {
4919 // Avoid having the implicit methods override the property decls.
4920 if (const ObjCMethodDecl *MD
4921 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
4922 if (MD->isImplicit())
4923 return CXChildVisit_Break;
4924
4925 } else if (const ObjCInterfaceDecl *ID
4926 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) {
4927 // Check that when we have multiple @class references in the same line,
4928 // that later ones do not override the previous ones.
4929 // If we have:
4930 // @class Foo, Bar;
4931 // source ranges for both start at '@', so 'Bar' will end up overriding
4932 // 'Foo' even though the cursor location was at 'Foo'.
4933 if (BestCursor->kind == CXCursor_ObjCInterfaceDecl ||
4934 BestCursor->kind == CXCursor_ObjCClassRef)
4935 if (const ObjCInterfaceDecl *PrevID
4936 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(*BestCursor))){
4937 if (PrevID != ID &&
4938 !PrevID->isThisDeclarationADefinition() &&
4939 !ID->isThisDeclarationADefinition())
4940 return CXChildVisit_Break;
4941 }
4942
4943 } else if (const DeclaratorDecl *DD
4944 = dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) {
4945 SourceLocation StartLoc = DD->getSourceRange().getBegin();
4946 // Check that when we have multiple declarators in the same line,
4947 // that later ones do not override the previous ones.
4948 // If we have:
4949 // int Foo, Bar;
4950 // source ranges for both start at 'int', so 'Bar' will end up overriding
4951 // 'Foo' even though the cursor location was at 'Foo'.
4952 if (Data->VisitedDeclaratorDeclStartLoc == StartLoc)
4953 return CXChildVisit_Break;
4954 Data->VisitedDeclaratorDeclStartLoc = StartLoc;
4955
4956 } else if (const ObjCPropertyImplDecl *PropImp
4957 = dyn_cast_or_null<ObjCPropertyImplDecl>(getCursorDecl(cursor))) {
4958 (void)PropImp;
4959 // Check that when we have multiple @synthesize in the same line,
4960 // that later ones do not override the previous ones.
4961 // If we have:
4962 // @synthesize Foo, Bar;
4963 // source ranges for both start at '@', so 'Bar' will end up overriding
4964 // 'Foo' even though the cursor location was at 'Foo'.
4965 if (Data->VisitedObjCPropertyImplDecl)
4966 return CXChildVisit_Break;
4967 Data->VisitedObjCPropertyImplDecl = true;
4968 }
4969 }
4970
4971 if (clang_isExpression(cursor.kind) &&
4972 clang_isDeclaration(BestCursor->kind)) {
4973 if (const Decl *D = getCursorDecl(*BestCursor)) {
4974 // Avoid having the cursor of an expression replace the declaration cursor
4975 // when the expression source range overlaps the declaration range.
4976 // This can happen for C++ constructor expressions whose range generally
4977 // include the variable declaration, e.g.:
4978 // MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor.
4979 if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() &&
4980 D->getLocation() == Data->TokenBeginLoc)
4981 return CXChildVisit_Break;
4982 }
4983 }
4984
4985 // If our current best cursor is the construction of a temporary object,
4986 // don't replace that cursor with a type reference, because we want
4987 // clang_getCursor() to point at the constructor.
4988 if (clang_isExpression(BestCursor->kind) &&
4989 isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
4990 cursor.kind == CXCursor_TypeRef) {
4991 // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it
4992 // as having the actual point on the type reference.
4993 *BestCursor = getTypeRefedCallExprCursor(*BestCursor);
4994 return CXChildVisit_Recurse;
4995 }
4996
4997 // If we already have an Objective-C superclass reference, don't
4998 // update it further.
4999 if (BestCursor->kind == CXCursor_ObjCSuperClassRef)
5000 return CXChildVisit_Break;
5001
5002 *BestCursor = cursor;
5003 return CXChildVisit_Recurse;
5004 }
5005
clang_getCursor(CXTranslationUnit TU,CXSourceLocation Loc)5006 CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
5007 if (isNotUsableTU(TU)) {
5008 LOG_BAD_TU(TU);
5009 return clang_getNullCursor();
5010 }
5011
5012 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5013 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
5014
5015 SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
5016 CXCursor Result = cxcursor::getCursor(TU, SLoc);
5017
5018 LOG_FUNC_SECTION {
5019 CXFile SearchFile;
5020 unsigned SearchLine, SearchColumn;
5021 CXFile ResultFile;
5022 unsigned ResultLine, ResultColumn;
5023 CXString SearchFileName, ResultFileName, KindSpelling, USR;
5024 const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : "";
5025 CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
5026
5027 clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn,
5028 nullptr);
5029 clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine,
5030 &ResultColumn, nullptr);
5031 SearchFileName = clang_getFileName(SearchFile);
5032 ResultFileName = clang_getFileName(ResultFile);
5033 KindSpelling = clang_getCursorKindSpelling(Result.kind);
5034 USR = clang_getCursorUSR(Result);
5035 *Log << llvm::format("(%s:%d:%d) = %s",
5036 clang_getCString(SearchFileName), SearchLine, SearchColumn,
5037 clang_getCString(KindSpelling))
5038 << llvm::format("(%s:%d:%d):%s%s",
5039 clang_getCString(ResultFileName), ResultLine, ResultColumn,
5040 clang_getCString(USR), IsDef);
5041 clang_disposeString(SearchFileName);
5042 clang_disposeString(ResultFileName);
5043 clang_disposeString(KindSpelling);
5044 clang_disposeString(USR);
5045
5046 CXCursor Definition = clang_getCursorDefinition(Result);
5047 if (!clang_equalCursors(Definition, clang_getNullCursor())) {
5048 CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition);
5049 CXString DefinitionKindSpelling
5050 = clang_getCursorKindSpelling(Definition.kind);
5051 CXFile DefinitionFile;
5052 unsigned DefinitionLine, DefinitionColumn;
5053 clang_getFileLocation(DefinitionLoc, &DefinitionFile,
5054 &DefinitionLine, &DefinitionColumn, nullptr);
5055 CXString DefinitionFileName = clang_getFileName(DefinitionFile);
5056 *Log << llvm::format(" -> %s(%s:%d:%d)",
5057 clang_getCString(DefinitionKindSpelling),
5058 clang_getCString(DefinitionFileName),
5059 DefinitionLine, DefinitionColumn);
5060 clang_disposeString(DefinitionFileName);
5061 clang_disposeString(DefinitionKindSpelling);
5062 }
5063 }
5064
5065 return Result;
5066 }
5067
clang_getNullCursor(void)5068 CXCursor clang_getNullCursor(void) {
5069 return MakeCXCursorInvalid(CXCursor_InvalidFile);
5070 }
5071
clang_equalCursors(CXCursor X,CXCursor Y)5072 unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
5073 // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we
5074 // can't set consistently. For example, when visiting a DeclStmt we will set
5075 // it but we don't set it on the result of clang_getCursorDefinition for
5076 // a reference of the same declaration.
5077 // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works
5078 // when visiting a DeclStmt currently, the AST should be enhanced to be able
5079 // to provide that kind of info.
5080 if (clang_isDeclaration(X.kind))
5081 X.data[1] = nullptr;
5082 if (clang_isDeclaration(Y.kind))
5083 Y.data[1] = nullptr;
5084
5085 return X == Y;
5086 }
5087
clang_hashCursor(CXCursor C)5088 unsigned clang_hashCursor(CXCursor C) {
5089 unsigned Index = 0;
5090 if (clang_isExpression(C.kind) || clang_isStatement(C.kind))
5091 Index = 1;
5092
5093 return llvm::DenseMapInfo<std::pair<unsigned, const void*> >::getHashValue(
5094 std::make_pair(C.kind, C.data[Index]));
5095 }
5096
clang_isInvalid(enum CXCursorKind K)5097 unsigned clang_isInvalid(enum CXCursorKind K) {
5098 return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
5099 }
5100
clang_isDeclaration(enum CXCursorKind K)5101 unsigned clang_isDeclaration(enum CXCursorKind K) {
5102 return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) ||
5103 (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl);
5104 }
5105
clang_isReference(enum CXCursorKind K)5106 unsigned clang_isReference(enum CXCursorKind K) {
5107 return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
5108 }
5109
clang_isExpression(enum CXCursorKind K)5110 unsigned clang_isExpression(enum CXCursorKind K) {
5111 return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
5112 }
5113
clang_isStatement(enum CXCursorKind K)5114 unsigned clang_isStatement(enum CXCursorKind K) {
5115 return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
5116 }
5117
clang_isAttribute(enum CXCursorKind K)5118 unsigned clang_isAttribute(enum CXCursorKind K) {
5119 return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr;
5120 }
5121
clang_isTranslationUnit(enum CXCursorKind K)5122 unsigned clang_isTranslationUnit(enum CXCursorKind K) {
5123 return K == CXCursor_TranslationUnit;
5124 }
5125
clang_isPreprocessing(enum CXCursorKind K)5126 unsigned clang_isPreprocessing(enum CXCursorKind K) {
5127 return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
5128 }
5129
clang_isUnexposed(enum CXCursorKind K)5130 unsigned clang_isUnexposed(enum CXCursorKind K) {
5131 switch (K) {
5132 case CXCursor_UnexposedDecl:
5133 case CXCursor_UnexposedExpr:
5134 case CXCursor_UnexposedStmt:
5135 case CXCursor_UnexposedAttr:
5136 return true;
5137 default:
5138 return false;
5139 }
5140 }
5141
clang_getCursorKind(CXCursor C)5142 CXCursorKind clang_getCursorKind(CXCursor C) {
5143 return C.kind;
5144 }
5145
clang_getCursorLocation(CXCursor C)5146 CXSourceLocation clang_getCursorLocation(CXCursor C) {
5147 if (clang_isReference(C.kind)) {
5148 switch (C.kind) {
5149 case CXCursor_ObjCSuperClassRef: {
5150 std::pair<const ObjCInterfaceDecl *, SourceLocation> P
5151 = getCursorObjCSuperClassRef(C);
5152 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5153 }
5154
5155 case CXCursor_ObjCProtocolRef: {
5156 std::pair<const ObjCProtocolDecl *, SourceLocation> P
5157 = getCursorObjCProtocolRef(C);
5158 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5159 }
5160
5161 case CXCursor_ObjCClassRef: {
5162 std::pair<const ObjCInterfaceDecl *, SourceLocation> P
5163 = getCursorObjCClassRef(C);
5164 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5165 }
5166
5167 case CXCursor_TypeRef: {
5168 std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
5169 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5170 }
5171
5172 case CXCursor_TemplateRef: {
5173 std::pair<const TemplateDecl *, SourceLocation> P =
5174 getCursorTemplateRef(C);
5175 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5176 }
5177
5178 case CXCursor_NamespaceRef: {
5179 std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
5180 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5181 }
5182
5183 case CXCursor_MemberRef: {
5184 std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
5185 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5186 }
5187
5188 case CXCursor_VariableRef: {
5189 std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C);
5190 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
5191 }
5192
5193 case CXCursor_CXXBaseSpecifier: {
5194 const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
5195 if (!BaseSpec)
5196 return clang_getNullLocation();
5197
5198 if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
5199 return cxloc::translateSourceLocation(getCursorContext(C),
5200 TSInfo->getTypeLoc().getBeginLoc());
5201
5202 return cxloc::translateSourceLocation(getCursorContext(C),
5203 BaseSpec->getLocStart());
5204 }
5205
5206 case CXCursor_LabelRef: {
5207 std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
5208 return cxloc::translateSourceLocation(getCursorContext(C), P.second);
5209 }
5210
5211 case CXCursor_OverloadedDeclRef:
5212 return cxloc::translateSourceLocation(getCursorContext(C),
5213 getCursorOverloadedDeclRef(C).second);
5214
5215 default:
5216 // FIXME: Need a way to enumerate all non-reference cases.
5217 llvm_unreachable("Missed a reference kind");
5218 }
5219 }
5220
5221 if (clang_isExpression(C.kind))
5222 return cxloc::translateSourceLocation(getCursorContext(C),
5223 getLocationFromExpr(getCursorExpr(C)));
5224
5225 if (clang_isStatement(C.kind))
5226 return cxloc::translateSourceLocation(getCursorContext(C),
5227 getCursorStmt(C)->getLocStart());
5228
5229 if (C.kind == CXCursor_PreprocessingDirective) {
5230 SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
5231 return cxloc::translateSourceLocation(getCursorContext(C), L);
5232 }
5233
5234 if (C.kind == CXCursor_MacroExpansion) {
5235 SourceLocation L
5236 = cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin();
5237 return cxloc::translateSourceLocation(getCursorContext(C), L);
5238 }
5239
5240 if (C.kind == CXCursor_MacroDefinition) {
5241 SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
5242 return cxloc::translateSourceLocation(getCursorContext(C), L);
5243 }
5244
5245 if (C.kind == CXCursor_InclusionDirective) {
5246 SourceLocation L
5247 = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
5248 return cxloc::translateSourceLocation(getCursorContext(C), L);
5249 }
5250
5251 if (clang_isAttribute(C.kind)) {
5252 SourceLocation L
5253 = cxcursor::getCursorAttr(C)->getLocation();
5254 return cxloc::translateSourceLocation(getCursorContext(C), L);
5255 }
5256
5257 if (!clang_isDeclaration(C.kind))
5258 return clang_getNullLocation();
5259
5260 const Decl *D = getCursorDecl(C);
5261 if (!D)
5262 return clang_getNullLocation();
5263
5264 SourceLocation Loc = D->getLocation();
5265 // FIXME: Multiple variables declared in a single declaration
5266 // currently lack the information needed to correctly determine their
5267 // ranges when accounting for the type-specifier. We use context
5268 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
5269 // and if so, whether it is the first decl.
5270 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
5271 if (!cxcursor::isFirstInDeclGroup(C))
5272 Loc = VD->getLocation();
5273 }
5274
5275 // For ObjC methods, give the start location of the method name.
5276 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
5277 Loc = MD->getSelectorStartLoc();
5278
5279 return cxloc::translateSourceLocation(getCursorContext(C), Loc);
5280 }
5281
5282 } // end extern "C"
5283
getCursor(CXTranslationUnit TU,SourceLocation SLoc)5284 CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
5285 assert(TU);
5286
5287 // Guard against an invalid SourceLocation, or we may assert in one
5288 // of the following calls.
5289 if (SLoc.isInvalid())
5290 return clang_getNullCursor();
5291
5292 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5293
5294 // Translate the given source location to make it point at the beginning of
5295 // the token under the cursor.
5296 SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
5297 CXXUnit->getASTContext().getLangOpts());
5298
5299 CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
5300 if (SLoc.isValid()) {
5301 GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
5302 CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
5303 /*VisitPreprocessorLast=*/true,
5304 /*VisitIncludedEntities=*/false,
5305 SourceLocation(SLoc));
5306 CursorVis.visitFileRegion();
5307 }
5308
5309 return Result;
5310 }
5311
getRawCursorExtent(CXCursor C)5312 static SourceRange getRawCursorExtent(CXCursor C) {
5313 if (clang_isReference(C.kind)) {
5314 switch (C.kind) {
5315 case CXCursor_ObjCSuperClassRef:
5316 return getCursorObjCSuperClassRef(C).second;
5317
5318 case CXCursor_ObjCProtocolRef:
5319 return getCursorObjCProtocolRef(C).second;
5320
5321 case CXCursor_ObjCClassRef:
5322 return getCursorObjCClassRef(C).second;
5323
5324 case CXCursor_TypeRef:
5325 return getCursorTypeRef(C).second;
5326
5327 case CXCursor_TemplateRef:
5328 return getCursorTemplateRef(C).second;
5329
5330 case CXCursor_NamespaceRef:
5331 return getCursorNamespaceRef(C).second;
5332
5333 case CXCursor_MemberRef:
5334 return getCursorMemberRef(C).second;
5335
5336 case CXCursor_CXXBaseSpecifier:
5337 return getCursorCXXBaseSpecifier(C)->getSourceRange();
5338
5339 case CXCursor_LabelRef:
5340 return getCursorLabelRef(C).second;
5341
5342 case CXCursor_OverloadedDeclRef:
5343 return getCursorOverloadedDeclRef(C).second;
5344
5345 case CXCursor_VariableRef:
5346 return getCursorVariableRef(C).second;
5347
5348 default:
5349 // FIXME: Need a way to enumerate all non-reference cases.
5350 llvm_unreachable("Missed a reference kind");
5351 }
5352 }
5353
5354 if (clang_isExpression(C.kind))
5355 return getCursorExpr(C)->getSourceRange();
5356
5357 if (clang_isStatement(C.kind))
5358 return getCursorStmt(C)->getSourceRange();
5359
5360 if (clang_isAttribute(C.kind))
5361 return getCursorAttr(C)->getRange();
5362
5363 if (C.kind == CXCursor_PreprocessingDirective)
5364 return cxcursor::getCursorPreprocessingDirective(C);
5365
5366 if (C.kind == CXCursor_MacroExpansion) {
5367 ASTUnit *TU = getCursorASTUnit(C);
5368 SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange();
5369 return TU->mapRangeFromPreamble(Range);
5370 }
5371
5372 if (C.kind == CXCursor_MacroDefinition) {
5373 ASTUnit *TU = getCursorASTUnit(C);
5374 SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange();
5375 return TU->mapRangeFromPreamble(Range);
5376 }
5377
5378 if (C.kind == CXCursor_InclusionDirective) {
5379 ASTUnit *TU = getCursorASTUnit(C);
5380 SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange();
5381 return TU->mapRangeFromPreamble(Range);
5382 }
5383
5384 if (C.kind == CXCursor_TranslationUnit) {
5385 ASTUnit *TU = getCursorASTUnit(C);
5386 FileID MainID = TU->getSourceManager().getMainFileID();
5387 SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID);
5388 SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID);
5389 return SourceRange(Start, End);
5390 }
5391
5392 if (clang_isDeclaration(C.kind)) {
5393 const Decl *D = cxcursor::getCursorDecl(C);
5394 if (!D)
5395 return SourceRange();
5396
5397 SourceRange R = D->getSourceRange();
5398 // FIXME: Multiple variables declared in a single declaration
5399 // currently lack the information needed to correctly determine their
5400 // ranges when accounting for the type-specifier. We use context
5401 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
5402 // and if so, whether it is the first decl.
5403 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
5404 if (!cxcursor::isFirstInDeclGroup(C))
5405 R.setBegin(VD->getLocation());
5406 }
5407 return R;
5408 }
5409 return SourceRange();
5410 }
5411
5412 /// \brief Retrieves the "raw" cursor extent, which is then extended to include
5413 /// the decl-specifier-seq for declarations.
getFullCursorExtent(CXCursor C,SourceManager & SrcMgr)5414 static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) {
5415 if (clang_isDeclaration(C.kind)) {
5416 const Decl *D = cxcursor::getCursorDecl(C);
5417 if (!D)
5418 return SourceRange();
5419
5420 SourceRange R = D->getSourceRange();
5421
5422 // Adjust the start of the location for declarations preceded by
5423 // declaration specifiers.
5424 SourceLocation StartLoc;
5425 if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
5426 if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
5427 StartLoc = TI->getTypeLoc().getLocStart();
5428 } else if (const TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) {
5429 if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
5430 StartLoc = TI->getTypeLoc().getLocStart();
5431 }
5432
5433 if (StartLoc.isValid() && R.getBegin().isValid() &&
5434 SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin()))
5435 R.setBegin(StartLoc);
5436
5437 // FIXME: Multiple variables declared in a single declaration
5438 // currently lack the information needed to correctly determine their
5439 // ranges when accounting for the type-specifier. We use context
5440 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
5441 // and if so, whether it is the first decl.
5442 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
5443 if (!cxcursor::isFirstInDeclGroup(C))
5444 R.setBegin(VD->getLocation());
5445 }
5446
5447 return R;
5448 }
5449
5450 return getRawCursorExtent(C);
5451 }
5452
5453 extern "C" {
5454
clang_getCursorExtent(CXCursor C)5455 CXSourceRange clang_getCursorExtent(CXCursor C) {
5456 SourceRange R = getRawCursorExtent(C);
5457 if (R.isInvalid())
5458 return clang_getNullRange();
5459
5460 return cxloc::translateSourceRange(getCursorContext(C), R);
5461 }
5462
clang_getCursorReferenced(CXCursor C)5463 CXCursor clang_getCursorReferenced(CXCursor C) {
5464 if (clang_isInvalid(C.kind))
5465 return clang_getNullCursor();
5466
5467 CXTranslationUnit tu = getCursorTU(C);
5468 if (clang_isDeclaration(C.kind)) {
5469 const Decl *D = getCursorDecl(C);
5470 if (!D)
5471 return clang_getNullCursor();
5472 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
5473 return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu);
5474 if (const ObjCPropertyImplDecl *PropImpl =
5475 dyn_cast<ObjCPropertyImplDecl>(D))
5476 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
5477 return MakeCXCursor(Property, tu);
5478
5479 return C;
5480 }
5481
5482 if (clang_isExpression(C.kind)) {
5483 const Expr *E = getCursorExpr(C);
5484 const Decl *D = getDeclFromExpr(E);
5485 if (D) {
5486 CXCursor declCursor = MakeCXCursor(D, tu);
5487 declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C),
5488 declCursor);
5489 return declCursor;
5490 }
5491
5492 if (const OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
5493 return MakeCursorOverloadedDeclRef(Ovl, tu);
5494
5495 return clang_getNullCursor();
5496 }
5497
5498 if (clang_isStatement(C.kind)) {
5499 const Stmt *S = getCursorStmt(C);
5500 if (const GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
5501 if (LabelDecl *label = Goto->getLabel())
5502 if (LabelStmt *labelS = label->getStmt())
5503 return MakeCXCursor(labelS, getCursorDecl(C), tu);
5504
5505 return clang_getNullCursor();
5506 }
5507
5508 if (C.kind == CXCursor_MacroExpansion) {
5509 if (const MacroDefinitionRecord *Def =
5510 getCursorMacroExpansion(C).getDefinition())
5511 return MakeMacroDefinitionCursor(Def, tu);
5512 }
5513
5514 if (!clang_isReference(C.kind))
5515 return clang_getNullCursor();
5516
5517 switch (C.kind) {
5518 case CXCursor_ObjCSuperClassRef:
5519 return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu);
5520
5521 case CXCursor_ObjCProtocolRef: {
5522 const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first;
5523 if (const ObjCProtocolDecl *Def = Prot->getDefinition())
5524 return MakeCXCursor(Def, tu);
5525
5526 return MakeCXCursor(Prot, tu);
5527 }
5528
5529 case CXCursor_ObjCClassRef: {
5530 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
5531 if (const ObjCInterfaceDecl *Def = Class->getDefinition())
5532 return MakeCXCursor(Def, tu);
5533
5534 return MakeCXCursor(Class, tu);
5535 }
5536
5537 case CXCursor_TypeRef:
5538 return MakeCXCursor(getCursorTypeRef(C).first, tu );
5539
5540 case CXCursor_TemplateRef:
5541 return MakeCXCursor(getCursorTemplateRef(C).first, tu );
5542
5543 case CXCursor_NamespaceRef:
5544 return MakeCXCursor(getCursorNamespaceRef(C).first, tu );
5545
5546 case CXCursor_MemberRef:
5547 return MakeCXCursor(getCursorMemberRef(C).first, tu );
5548
5549 case CXCursor_CXXBaseSpecifier: {
5550 const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
5551 return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
5552 tu ));
5553 }
5554
5555 case CXCursor_LabelRef:
5556 // FIXME: We end up faking the "parent" declaration here because we
5557 // don't want to make CXCursor larger.
5558 return MakeCXCursor(getCursorLabelRef(C).first,
5559 cxtu::getASTUnit(tu)->getASTContext()
5560 .getTranslationUnitDecl(),
5561 tu);
5562
5563 case CXCursor_OverloadedDeclRef:
5564 return C;
5565
5566 case CXCursor_VariableRef:
5567 return MakeCXCursor(getCursorVariableRef(C).first, tu);
5568
5569 default:
5570 // We would prefer to enumerate all non-reference cursor kinds here.
5571 llvm_unreachable("Unhandled reference cursor kind");
5572 }
5573 }
5574
clang_getCursorDefinition(CXCursor C)5575 CXCursor clang_getCursorDefinition(CXCursor C) {
5576 if (clang_isInvalid(C.kind))
5577 return clang_getNullCursor();
5578
5579 CXTranslationUnit TU = getCursorTU(C);
5580
5581 bool WasReference = false;
5582 if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
5583 C = clang_getCursorReferenced(C);
5584 WasReference = true;
5585 }
5586
5587 if (C.kind == CXCursor_MacroExpansion)
5588 return clang_getCursorReferenced(C);
5589
5590 if (!clang_isDeclaration(C.kind))
5591 return clang_getNullCursor();
5592
5593 const Decl *D = getCursorDecl(C);
5594 if (!D)
5595 return clang_getNullCursor();
5596
5597 switch (D->getKind()) {
5598 // Declaration kinds that don't really separate the notions of
5599 // declaration and definition.
5600 case Decl::Namespace:
5601 case Decl::Typedef:
5602 case Decl::TypeAlias:
5603 case Decl::TypeAliasTemplate:
5604 case Decl::TemplateTypeParm:
5605 case Decl::EnumConstant:
5606 case Decl::Field:
5607 case Decl::MSProperty:
5608 case Decl::IndirectField:
5609 case Decl::ObjCIvar:
5610 case Decl::ObjCAtDefsField:
5611 case Decl::ImplicitParam:
5612 case Decl::ParmVar:
5613 case Decl::NonTypeTemplateParm:
5614 case Decl::TemplateTemplateParm:
5615 case Decl::ObjCCategoryImpl:
5616 case Decl::ObjCImplementation:
5617 case Decl::AccessSpec:
5618 case Decl::LinkageSpec:
5619 case Decl::ObjCPropertyImpl:
5620 case Decl::FileScopeAsm:
5621 case Decl::StaticAssert:
5622 case Decl::Block:
5623 case Decl::Captured:
5624 case Decl::OMPCapturedExpr:
5625 case Decl::Label: // FIXME: Is this right??
5626 case Decl::ClassScopeFunctionSpecialization:
5627 case Decl::Import:
5628 case Decl::OMPThreadPrivate:
5629 case Decl::OMPDeclareReduction:
5630 case Decl::ObjCTypeParam:
5631 case Decl::BuiltinTemplate:
5632 case Decl::PragmaComment:
5633 case Decl::PragmaDetectMismatch:
5634 return C;
5635
5636 // Declaration kinds that don't make any sense here, but are
5637 // nonetheless harmless.
5638 case Decl::Empty:
5639 case Decl::TranslationUnit:
5640 case Decl::ExternCContext:
5641 break;
5642
5643 // Declaration kinds for which the definition is not resolvable.
5644 case Decl::UnresolvedUsingTypename:
5645 case Decl::UnresolvedUsingValue:
5646 break;
5647
5648 case Decl::UsingDirective:
5649 return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
5650 TU);
5651
5652 case Decl::NamespaceAlias:
5653 return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU);
5654
5655 case Decl::Enum:
5656 case Decl::Record:
5657 case Decl::CXXRecord:
5658 case Decl::ClassTemplateSpecialization:
5659 case Decl::ClassTemplatePartialSpecialization:
5660 if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
5661 return MakeCXCursor(Def, TU);
5662 return clang_getNullCursor();
5663
5664 case Decl::Function:
5665 case Decl::CXXMethod:
5666 case Decl::CXXConstructor:
5667 case Decl::CXXDestructor:
5668 case Decl::CXXConversion: {
5669 const FunctionDecl *Def = nullptr;
5670 if (cast<FunctionDecl>(D)->getBody(Def))
5671 return MakeCXCursor(Def, TU);
5672 return clang_getNullCursor();
5673 }
5674
5675 case Decl::Var:
5676 case Decl::VarTemplateSpecialization:
5677 case Decl::VarTemplatePartialSpecialization: {
5678 // Ask the variable if it has a definition.
5679 if (const VarDecl *Def = cast<VarDecl>(D)->getDefinition())
5680 return MakeCXCursor(Def, TU);
5681 return clang_getNullCursor();
5682 }
5683
5684 case Decl::FunctionTemplate: {
5685 const FunctionDecl *Def = nullptr;
5686 if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
5687 return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU);
5688 return clang_getNullCursor();
5689 }
5690
5691 case Decl::ClassTemplate: {
5692 if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
5693 ->getDefinition())
5694 return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
5695 TU);
5696 return clang_getNullCursor();
5697 }
5698
5699 case Decl::VarTemplate: {
5700 if (VarDecl *Def =
5701 cast<VarTemplateDecl>(D)->getTemplatedDecl()->getDefinition())
5702 return MakeCXCursor(cast<VarDecl>(Def)->getDescribedVarTemplate(), TU);
5703 return clang_getNullCursor();
5704 }
5705
5706 case Decl::Using:
5707 return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D),
5708 D->getLocation(), TU);
5709
5710 case Decl::UsingShadow:
5711 case Decl::ConstructorUsingShadow:
5712 return clang_getCursorDefinition(
5713 MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
5714 TU));
5715
5716 case Decl::ObjCMethod: {
5717 const ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
5718 if (Method->isThisDeclarationADefinition())
5719 return C;
5720
5721 // Dig out the method definition in the associated
5722 // @implementation, if we have it.
5723 // FIXME: The ASTs should make finding the definition easier.
5724 if (const ObjCInterfaceDecl *Class
5725 = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
5726 if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
5727 if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
5728 Method->isInstanceMethod()))
5729 if (Def->isThisDeclarationADefinition())
5730 return MakeCXCursor(Def, TU);
5731
5732 return clang_getNullCursor();
5733 }
5734
5735 case Decl::ObjCCategory:
5736 if (ObjCCategoryImplDecl *Impl
5737 = cast<ObjCCategoryDecl>(D)->getImplementation())
5738 return MakeCXCursor(Impl, TU);
5739 return clang_getNullCursor();
5740
5741 case Decl::ObjCProtocol:
5742 if (const ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition())
5743 return MakeCXCursor(Def, TU);
5744 return clang_getNullCursor();
5745
5746 case Decl::ObjCInterface: {
5747 // There are two notions of a "definition" for an Objective-C
5748 // class: the interface and its implementation. When we resolved a
5749 // reference to an Objective-C class, produce the @interface as
5750 // the definition; when we were provided with the interface,
5751 // produce the @implementation as the definition.
5752 const ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D);
5753 if (WasReference) {
5754 if (const ObjCInterfaceDecl *Def = IFace->getDefinition())
5755 return MakeCXCursor(Def, TU);
5756 } else if (ObjCImplementationDecl *Impl = IFace->getImplementation())
5757 return MakeCXCursor(Impl, TU);
5758 return clang_getNullCursor();
5759 }
5760
5761 case Decl::ObjCProperty:
5762 // FIXME: We don't really know where to find the
5763 // ObjCPropertyImplDecls that implement this property.
5764 return clang_getNullCursor();
5765
5766 case Decl::ObjCCompatibleAlias:
5767 if (const ObjCInterfaceDecl *Class
5768 = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
5769 if (const ObjCInterfaceDecl *Def = Class->getDefinition())
5770 return MakeCXCursor(Def, TU);
5771
5772 return clang_getNullCursor();
5773
5774 case Decl::Friend:
5775 if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
5776 return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
5777 return clang_getNullCursor();
5778
5779 case Decl::FriendTemplate:
5780 if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
5781 return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
5782 return clang_getNullCursor();
5783 }
5784
5785 return clang_getNullCursor();
5786 }
5787
clang_isCursorDefinition(CXCursor C)5788 unsigned clang_isCursorDefinition(CXCursor C) {
5789 if (!clang_isDeclaration(C.kind))
5790 return 0;
5791
5792 return clang_getCursorDefinition(C) == C;
5793 }
5794
clang_getCanonicalCursor(CXCursor C)5795 CXCursor clang_getCanonicalCursor(CXCursor C) {
5796 if (!clang_isDeclaration(C.kind))
5797 return C;
5798
5799 if (const Decl *D = getCursorDecl(C)) {
5800 if (const ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D))
5801 if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl())
5802 return MakeCXCursor(CatD, getCursorTU(C));
5803
5804 if (const ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
5805 if (const ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
5806 return MakeCXCursor(IFD, getCursorTU(C));
5807
5808 return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
5809 }
5810
5811 return C;
5812 }
5813
clang_Cursor_getObjCSelectorIndex(CXCursor cursor)5814 int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
5815 return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
5816 }
5817
clang_getNumOverloadedDecls(CXCursor C)5818 unsigned clang_getNumOverloadedDecls(CXCursor C) {
5819 if (C.kind != CXCursor_OverloadedDeclRef)
5820 return 0;
5821
5822 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
5823 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
5824 return E->getNumDecls();
5825
5826 if (OverloadedTemplateStorage *S
5827 = Storage.dyn_cast<OverloadedTemplateStorage*>())
5828 return S->size();
5829
5830 const Decl *D = Storage.get<const Decl *>();
5831 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D))
5832 return Using->shadow_size();
5833
5834 return 0;
5835 }
5836
clang_getOverloadedDecl(CXCursor cursor,unsigned index)5837 CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
5838 if (cursor.kind != CXCursor_OverloadedDeclRef)
5839 return clang_getNullCursor();
5840
5841 if (index >= clang_getNumOverloadedDecls(cursor))
5842 return clang_getNullCursor();
5843
5844 CXTranslationUnit TU = getCursorTU(cursor);
5845 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
5846 if (const OverloadExpr *E = Storage.dyn_cast<const OverloadExpr *>())
5847 return MakeCXCursor(E->decls_begin()[index], TU);
5848
5849 if (OverloadedTemplateStorage *S
5850 = Storage.dyn_cast<OverloadedTemplateStorage*>())
5851 return MakeCXCursor(S->begin()[index], TU);
5852
5853 const Decl *D = Storage.get<const Decl *>();
5854 if (const UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
5855 // FIXME: This is, unfortunately, linear time.
5856 UsingDecl::shadow_iterator Pos = Using->shadow_begin();
5857 std::advance(Pos, index);
5858 return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
5859 }
5860
5861 return clang_getNullCursor();
5862 }
5863
clang_getDefinitionSpellingAndExtent(CXCursor C,const char ** startBuf,const char ** endBuf,unsigned * startLine,unsigned * startColumn,unsigned * endLine,unsigned * endColumn)5864 void clang_getDefinitionSpellingAndExtent(CXCursor C,
5865 const char **startBuf,
5866 const char **endBuf,
5867 unsigned *startLine,
5868 unsigned *startColumn,
5869 unsigned *endLine,
5870 unsigned *endColumn) {
5871 assert(getCursorDecl(C) && "CXCursor has null decl");
5872 const FunctionDecl *FD = dyn_cast<FunctionDecl>(getCursorDecl(C));
5873 CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
5874
5875 SourceManager &SM = FD->getASTContext().getSourceManager();
5876 *startBuf = SM.getCharacterData(Body->getLBracLoc());
5877 *endBuf = SM.getCharacterData(Body->getRBracLoc());
5878 *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
5879 *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
5880 *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
5881 *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
5882 }
5883
5884
clang_getCursorReferenceNameRange(CXCursor C,unsigned NameFlags,unsigned PieceIndex)5885 CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags,
5886 unsigned PieceIndex) {
5887 RefNamePieces Pieces;
5888
5889 switch (C.kind) {
5890 case CXCursor_MemberRefExpr:
5891 if (const MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C)))
5892 Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(),
5893 E->getQualifierLoc().getSourceRange());
5894 break;
5895
5896 case CXCursor_DeclRefExpr:
5897 if (const DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C))) {
5898 SourceRange TemplateArgLoc(E->getLAngleLoc(), E->getRAngleLoc());
5899 Pieces =
5900 buildPieces(NameFlags, false, E->getNameInfo(),
5901 E->getQualifierLoc().getSourceRange(), &TemplateArgLoc);
5902 }
5903 break;
5904
5905 case CXCursor_CallExpr:
5906 if (const CXXOperatorCallExpr *OCE =
5907 dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) {
5908 const Expr *Callee = OCE->getCallee();
5909 if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
5910 Callee = ICE->getSubExpr();
5911
5912 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee))
5913 Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(),
5914 DRE->getQualifierLoc().getSourceRange());
5915 }
5916 break;
5917
5918 default:
5919 break;
5920 }
5921
5922 if (Pieces.empty()) {
5923 if (PieceIndex == 0)
5924 return clang_getCursorExtent(C);
5925 } else if (PieceIndex < Pieces.size()) {
5926 SourceRange R = Pieces[PieceIndex];
5927 if (R.isValid())
5928 return cxloc::translateSourceRange(getCursorContext(C), R);
5929 }
5930
5931 return clang_getNullRange();
5932 }
5933
clang_enableStackTraces(void)5934 void clang_enableStackTraces(void) {
5935 // FIXME: Provide an argv0 here so we can find llvm-symbolizer.
5936 llvm::sys::PrintStackTraceOnErrorSignal(StringRef());
5937 }
5938
clang_executeOnThread(void (* fn)(void *),void * user_data,unsigned stack_size)5939 void clang_executeOnThread(void (*fn)(void*), void *user_data,
5940 unsigned stack_size) {
5941 llvm::llvm_execute_on_thread(fn, user_data, stack_size);
5942 }
5943
5944 } // end: extern "C"
5945
5946 //===----------------------------------------------------------------------===//
5947 // Token-based Operations.
5948 //===----------------------------------------------------------------------===//
5949
5950 /* CXToken layout:
5951 * int_data[0]: a CXTokenKind
5952 * int_data[1]: starting token location
5953 * int_data[2]: token length
5954 * int_data[3]: reserved
5955 * ptr_data: for identifiers and keywords, an IdentifierInfo*.
5956 * otherwise unused.
5957 */
5958 extern "C" {
5959
clang_getTokenKind(CXToken CXTok)5960 CXTokenKind clang_getTokenKind(CXToken CXTok) {
5961 return static_cast<CXTokenKind>(CXTok.int_data[0]);
5962 }
5963
clang_getTokenSpelling(CXTranslationUnit TU,CXToken CXTok)5964 CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
5965 switch (clang_getTokenKind(CXTok)) {
5966 case CXToken_Identifier:
5967 case CXToken_Keyword:
5968 // We know we have an IdentifierInfo*, so use that.
5969 return cxstring::createRef(static_cast<IdentifierInfo *>(CXTok.ptr_data)
5970 ->getNameStart());
5971
5972 case CXToken_Literal: {
5973 // We have stashed the starting pointer in the ptr_data field. Use it.
5974 const char *Text = static_cast<const char *>(CXTok.ptr_data);
5975 return cxstring::createDup(StringRef(Text, CXTok.int_data[2]));
5976 }
5977
5978 case CXToken_Punctuation:
5979 case CXToken_Comment:
5980 break;
5981 }
5982
5983 if (isNotUsableTU(TU)) {
5984 LOG_BAD_TU(TU);
5985 return cxstring::createEmpty();
5986 }
5987
5988 // We have to find the starting buffer pointer the hard way, by
5989 // deconstructing the source location.
5990 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
5991 if (!CXXUnit)
5992 return cxstring::createEmpty();
5993
5994 SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
5995 std::pair<FileID, unsigned> LocInfo
5996 = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc);
5997 bool Invalid = false;
5998 StringRef Buffer
5999 = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
6000 if (Invalid)
6001 return cxstring::createEmpty();
6002
6003 return cxstring::createDup(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
6004 }
6005
clang_getTokenLocation(CXTranslationUnit TU,CXToken CXTok)6006 CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
6007 if (isNotUsableTU(TU)) {
6008 LOG_BAD_TU(TU);
6009 return clang_getNullLocation();
6010 }
6011
6012 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6013 if (!CXXUnit)
6014 return clang_getNullLocation();
6015
6016 return cxloc::translateSourceLocation(CXXUnit->getASTContext(),
6017 SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
6018 }
6019
clang_getTokenExtent(CXTranslationUnit TU,CXToken CXTok)6020 CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
6021 if (isNotUsableTU(TU)) {
6022 LOG_BAD_TU(TU);
6023 return clang_getNullRange();
6024 }
6025
6026 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6027 if (!CXXUnit)
6028 return clang_getNullRange();
6029
6030 return cxloc::translateSourceRange(CXXUnit->getASTContext(),
6031 SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
6032 }
6033
getTokens(ASTUnit * CXXUnit,SourceRange Range,SmallVectorImpl<CXToken> & CXTokens)6034 static void getTokens(ASTUnit *CXXUnit, SourceRange Range,
6035 SmallVectorImpl<CXToken> &CXTokens) {
6036 SourceManager &SourceMgr = CXXUnit->getSourceManager();
6037 std::pair<FileID, unsigned> BeginLocInfo
6038 = SourceMgr.getDecomposedSpellingLoc(Range.getBegin());
6039 std::pair<FileID, unsigned> EndLocInfo
6040 = SourceMgr.getDecomposedSpellingLoc(Range.getEnd());
6041
6042 // Cannot tokenize across files.
6043 if (BeginLocInfo.first != EndLocInfo.first)
6044 return;
6045
6046 // Create a lexer
6047 bool Invalid = false;
6048 StringRef Buffer
6049 = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
6050 if (Invalid)
6051 return;
6052
6053 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
6054 CXXUnit->getASTContext().getLangOpts(),
6055 Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end());
6056 Lex.SetCommentRetentionState(true);
6057
6058 // Lex tokens until we hit the end of the range.
6059 const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
6060 Token Tok;
6061 bool previousWasAt = false;
6062 do {
6063 // Lex the next token
6064 Lex.LexFromRawLexer(Tok);
6065 if (Tok.is(tok::eof))
6066 break;
6067
6068 // Initialize the CXToken.
6069 CXToken CXTok;
6070
6071 // - Common fields
6072 CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
6073 CXTok.int_data[2] = Tok.getLength();
6074 CXTok.int_data[3] = 0;
6075
6076 // - Kind-specific fields
6077 if (Tok.isLiteral()) {
6078 CXTok.int_data[0] = CXToken_Literal;
6079 CXTok.ptr_data = const_cast<char *>(Tok.getLiteralData());
6080 } else if (Tok.is(tok::raw_identifier)) {
6081 // Lookup the identifier to determine whether we have a keyword.
6082 IdentifierInfo *II
6083 = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok);
6084
6085 if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
6086 CXTok.int_data[0] = CXToken_Keyword;
6087 }
6088 else {
6089 CXTok.int_data[0] = Tok.is(tok::identifier)
6090 ? CXToken_Identifier
6091 : CXToken_Keyword;
6092 }
6093 CXTok.ptr_data = II;
6094 } else if (Tok.is(tok::comment)) {
6095 CXTok.int_data[0] = CXToken_Comment;
6096 CXTok.ptr_data = nullptr;
6097 } else {
6098 CXTok.int_data[0] = CXToken_Punctuation;
6099 CXTok.ptr_data = nullptr;
6100 }
6101 CXTokens.push_back(CXTok);
6102 previousWasAt = Tok.is(tok::at);
6103 } while (Lex.getBufferLocation() <= EffectiveBufferEnd);
6104 }
6105
clang_tokenize(CXTranslationUnit TU,CXSourceRange Range,CXToken ** Tokens,unsigned * NumTokens)6106 void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,
6107 CXToken **Tokens, unsigned *NumTokens) {
6108 LOG_FUNC_SECTION {
6109 *Log << TU << ' ' << Range;
6110 }
6111
6112 if (Tokens)
6113 *Tokens = nullptr;
6114 if (NumTokens)
6115 *NumTokens = 0;
6116
6117 if (isNotUsableTU(TU)) {
6118 LOG_BAD_TU(TU);
6119 return;
6120 }
6121
6122 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6123 if (!CXXUnit || !Tokens || !NumTokens)
6124 return;
6125
6126 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
6127
6128 SourceRange R = cxloc::translateCXSourceRange(Range);
6129 if (R.isInvalid())
6130 return;
6131
6132 SmallVector<CXToken, 32> CXTokens;
6133 getTokens(CXXUnit, R, CXTokens);
6134
6135 if (CXTokens.empty())
6136 return;
6137
6138 *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());
6139 memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
6140 *NumTokens = CXTokens.size();
6141 }
6142
clang_disposeTokens(CXTranslationUnit TU,CXToken * Tokens,unsigned NumTokens)6143 void clang_disposeTokens(CXTranslationUnit TU,
6144 CXToken *Tokens, unsigned NumTokens) {
6145 free(Tokens);
6146 }
6147
6148 } // end: extern "C"
6149
6150 //===----------------------------------------------------------------------===//
6151 // Token annotation APIs.
6152 //===----------------------------------------------------------------------===//
6153
6154 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
6155 CXCursor parent,
6156 CXClientData client_data);
6157 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
6158 CXClientData client_data);
6159
6160 namespace {
6161 class AnnotateTokensWorker {
6162 CXToken *Tokens;
6163 CXCursor *Cursors;
6164 unsigned NumTokens;
6165 unsigned TokIdx;
6166 unsigned PreprocessingTokIdx;
6167 CursorVisitor AnnotateVis;
6168 SourceManager &SrcMgr;
6169 bool HasContextSensitiveKeywords;
6170
6171 struct PostChildrenInfo {
6172 CXCursor Cursor;
6173 SourceRange CursorRange;
6174 unsigned BeforeReachingCursorIdx;
6175 unsigned BeforeChildrenTokenIdx;
6176 };
6177 SmallVector<PostChildrenInfo, 8> PostChildrenInfos;
6178
getTok(unsigned Idx)6179 CXToken &getTok(unsigned Idx) {
6180 assert(Idx < NumTokens);
6181 return Tokens[Idx];
6182 }
getTok(unsigned Idx) const6183 const CXToken &getTok(unsigned Idx) const {
6184 assert(Idx < NumTokens);
6185 return Tokens[Idx];
6186 }
MoreTokens() const6187 bool MoreTokens() const { return TokIdx < NumTokens; }
NextToken() const6188 unsigned NextToken() const { return TokIdx; }
AdvanceToken()6189 void AdvanceToken() { ++TokIdx; }
GetTokenLoc(unsigned tokI)6190 SourceLocation GetTokenLoc(unsigned tokI) {
6191 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]);
6192 }
isFunctionMacroToken(unsigned tokI) const6193 bool isFunctionMacroToken(unsigned tokI) const {
6194 return getTok(tokI).int_data[3] != 0;
6195 }
getFunctionMacroTokenLoc(unsigned tokI) const6196 SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const {
6197 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[3]);
6198 }
6199
6200 void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange);
6201 bool annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult,
6202 SourceRange);
6203
6204 public:
AnnotateTokensWorker(CXToken * tokens,CXCursor * cursors,unsigned numTokens,CXTranslationUnit TU,SourceRange RegionOfInterest)6205 AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens,
6206 CXTranslationUnit TU, SourceRange RegionOfInterest)
6207 : Tokens(tokens), Cursors(cursors),
6208 NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0),
6209 AnnotateVis(TU,
6210 AnnotateTokensVisitor, this,
6211 /*VisitPreprocessorLast=*/true,
6212 /*VisitIncludedEntities=*/false,
6213 RegionOfInterest,
6214 /*VisitDeclsOnly=*/false,
6215 AnnotateTokensPostChildrenVisitor),
6216 SrcMgr(cxtu::getASTUnit(TU)->getSourceManager()),
6217 HasContextSensitiveKeywords(false) { }
6218
VisitChildren(CXCursor C)6219 void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
6220 enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
6221 bool postVisitChildren(CXCursor cursor);
6222 void AnnotateTokens();
6223
6224 /// \brief Determine whether the annotator saw any cursors that have
6225 /// context-sensitive keywords.
hasContextSensitiveKeywords() const6226 bool hasContextSensitiveKeywords() const {
6227 return HasContextSensitiveKeywords;
6228 }
6229
~AnnotateTokensWorker()6230 ~AnnotateTokensWorker() {
6231 assert(PostChildrenInfos.empty());
6232 }
6233 };
6234 }
6235
AnnotateTokens()6236 void AnnotateTokensWorker::AnnotateTokens() {
6237 // Walk the AST within the region of interest, annotating tokens
6238 // along the way.
6239 AnnotateVis.visitFileRegion();
6240 }
6241
updateCursorAnnotation(CXCursor & Cursor,const CXCursor & updateC)6242 static inline void updateCursorAnnotation(CXCursor &Cursor,
6243 const CXCursor &updateC) {
6244 if (clang_isInvalid(updateC.kind) || !clang_isInvalid(Cursor.kind))
6245 return;
6246 Cursor = updateC;
6247 }
6248
6249 /// \brief It annotates and advances tokens with a cursor until the comparison
6250 //// between the cursor location and the source range is the same as
6251 /// \arg compResult.
6252 ///
6253 /// Pass RangeBefore to annotate tokens with a cursor until a range is reached.
6254 /// Pass RangeOverlap to annotate tokens inside a range.
annotateAndAdvanceTokens(CXCursor updateC,RangeComparisonResult compResult,SourceRange range)6255 void AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC,
6256 RangeComparisonResult compResult,
6257 SourceRange range) {
6258 while (MoreTokens()) {
6259 const unsigned I = NextToken();
6260 if (isFunctionMacroToken(I))
6261 if (!annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range))
6262 return;
6263
6264 SourceLocation TokLoc = GetTokenLoc(I);
6265 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
6266 updateCursorAnnotation(Cursors[I], updateC);
6267 AdvanceToken();
6268 continue;
6269 }
6270 break;
6271 }
6272 }
6273
6274 /// \brief Special annotation handling for macro argument tokens.
6275 /// \returns true if it advanced beyond all macro tokens, false otherwise.
annotateAndAdvanceFunctionMacroTokens(CXCursor updateC,RangeComparisonResult compResult,SourceRange range)6276 bool AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens(
6277 CXCursor updateC,
6278 RangeComparisonResult compResult,
6279 SourceRange range) {
6280 assert(MoreTokens());
6281 assert(isFunctionMacroToken(NextToken()) &&
6282 "Should be called only for macro arg tokens");
6283
6284 // This works differently than annotateAndAdvanceTokens; because expanded
6285 // macro arguments can have arbitrary translation-unit source order, we do not
6286 // advance the token index one by one until a token fails the range test.
6287 // We only advance once past all of the macro arg tokens if all of them
6288 // pass the range test. If one of them fails we keep the token index pointing
6289 // at the start of the macro arg tokens so that the failing token will be
6290 // annotated by a subsequent annotation try.
6291
6292 bool atLeastOneCompFail = false;
6293
6294 unsigned I = NextToken();
6295 for (; I < NumTokens && isFunctionMacroToken(I); ++I) {
6296 SourceLocation TokLoc = getFunctionMacroTokenLoc(I);
6297 if (TokLoc.isFileID())
6298 continue; // not macro arg token, it's parens or comma.
6299 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
6300 if (clang_isInvalid(clang_getCursorKind(Cursors[I])))
6301 Cursors[I] = updateC;
6302 } else
6303 atLeastOneCompFail = true;
6304 }
6305
6306 if (atLeastOneCompFail)
6307 return false;
6308
6309 TokIdx = I; // All of the tokens were handled, advance beyond all of them.
6310 return true;
6311 }
6312
6313 enum CXChildVisitResult
Visit(CXCursor cursor,CXCursor parent)6314 AnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) {
6315 SourceRange cursorRange = getRawCursorExtent(cursor);
6316 if (cursorRange.isInvalid())
6317 return CXChildVisit_Recurse;
6318
6319 if (!HasContextSensitiveKeywords) {
6320 // Objective-C properties can have context-sensitive keywords.
6321 if (cursor.kind == CXCursor_ObjCPropertyDecl) {
6322 if (const ObjCPropertyDecl *Property
6323 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor)))
6324 HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0;
6325 }
6326 // Objective-C methods can have context-sensitive keywords.
6327 else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl ||
6328 cursor.kind == CXCursor_ObjCClassMethodDecl) {
6329 if (const ObjCMethodDecl *Method
6330 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
6331 if (Method->getObjCDeclQualifier())
6332 HasContextSensitiveKeywords = true;
6333 else {
6334 for (const auto *P : Method->parameters()) {
6335 if (P->getObjCDeclQualifier()) {
6336 HasContextSensitiveKeywords = true;
6337 break;
6338 }
6339 }
6340 }
6341 }
6342 }
6343 // C++ methods can have context-sensitive keywords.
6344 else if (cursor.kind == CXCursor_CXXMethod) {
6345 if (const CXXMethodDecl *Method
6346 = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) {
6347 if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>())
6348 HasContextSensitiveKeywords = true;
6349 }
6350 }
6351 // C++ classes can have context-sensitive keywords.
6352 else if (cursor.kind == CXCursor_StructDecl ||
6353 cursor.kind == CXCursor_ClassDecl ||
6354 cursor.kind == CXCursor_ClassTemplate ||
6355 cursor.kind == CXCursor_ClassTemplatePartialSpecialization) {
6356 if (const Decl *D = getCursorDecl(cursor))
6357 if (D->hasAttr<FinalAttr>())
6358 HasContextSensitiveKeywords = true;
6359 }
6360 }
6361
6362 // Don't override a property annotation with its getter/setter method.
6363 if (cursor.kind == CXCursor_ObjCInstanceMethodDecl &&
6364 parent.kind == CXCursor_ObjCPropertyDecl)
6365 return CXChildVisit_Continue;
6366
6367 if (clang_isPreprocessing(cursor.kind)) {
6368 // Items in the preprocessing record are kept separate from items in
6369 // declarations, so we keep a separate token index.
6370 unsigned SavedTokIdx = TokIdx;
6371 TokIdx = PreprocessingTokIdx;
6372
6373 // Skip tokens up until we catch up to the beginning of the preprocessing
6374 // entry.
6375 while (MoreTokens()) {
6376 const unsigned I = NextToken();
6377 SourceLocation TokLoc = GetTokenLoc(I);
6378 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
6379 case RangeBefore:
6380 AdvanceToken();
6381 continue;
6382 case RangeAfter:
6383 case RangeOverlap:
6384 break;
6385 }
6386 break;
6387 }
6388
6389 // Look at all of the tokens within this range.
6390 while (MoreTokens()) {
6391 const unsigned I = NextToken();
6392 SourceLocation TokLoc = GetTokenLoc(I);
6393 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
6394 case RangeBefore:
6395 llvm_unreachable("Infeasible");
6396 case RangeAfter:
6397 break;
6398 case RangeOverlap:
6399 // For macro expansions, just note where the beginning of the macro
6400 // expansion occurs.
6401 if (cursor.kind == CXCursor_MacroExpansion) {
6402 if (TokLoc == cursorRange.getBegin())
6403 Cursors[I] = cursor;
6404 AdvanceToken();
6405 break;
6406 }
6407 // We may have already annotated macro names inside macro definitions.
6408 if (Cursors[I].kind != CXCursor_MacroExpansion)
6409 Cursors[I] = cursor;
6410 AdvanceToken();
6411 continue;
6412 }
6413 break;
6414 }
6415
6416 // Save the preprocessing token index; restore the non-preprocessing
6417 // token index.
6418 PreprocessingTokIdx = TokIdx;
6419 TokIdx = SavedTokIdx;
6420 return CXChildVisit_Recurse;
6421 }
6422
6423 if (cursorRange.isInvalid())
6424 return CXChildVisit_Continue;
6425
6426 unsigned BeforeReachingCursorIdx = NextToken();
6427 const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
6428 const enum CXCursorKind K = clang_getCursorKind(parent);
6429 const CXCursor updateC =
6430 (clang_isInvalid(K) || K == CXCursor_TranslationUnit ||
6431 // Attributes are annotated out-of-order, skip tokens until we reach it.
6432 clang_isAttribute(cursor.kind))
6433 ? clang_getNullCursor() : parent;
6434
6435 annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange);
6436
6437 // Avoid having the cursor of an expression "overwrite" the annotation of the
6438 // variable declaration that it belongs to.
6439 // This can happen for C++ constructor expressions whose range generally
6440 // include the variable declaration, e.g.:
6441 // MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
6442 if (clang_isExpression(cursorK) && MoreTokens()) {
6443 const Expr *E = getCursorExpr(cursor);
6444 if (const Decl *D = getCursorParentDecl(cursor)) {
6445 const unsigned I = NextToken();
6446 if (E->getLocStart().isValid() && D->getLocation().isValid() &&
6447 E->getLocStart() == D->getLocation() &&
6448 E->getLocStart() == GetTokenLoc(I)) {
6449 updateCursorAnnotation(Cursors[I], updateC);
6450 AdvanceToken();
6451 }
6452 }
6453 }
6454
6455 // Before recursing into the children keep some state that we are going
6456 // to use in the AnnotateTokensWorker::postVisitChildren callback to do some
6457 // extra work after the child nodes are visited.
6458 // Note that we don't call VisitChildren here to avoid traversing statements
6459 // code-recursively which can blow the stack.
6460
6461 PostChildrenInfo Info;
6462 Info.Cursor = cursor;
6463 Info.CursorRange = cursorRange;
6464 Info.BeforeReachingCursorIdx = BeforeReachingCursorIdx;
6465 Info.BeforeChildrenTokenIdx = NextToken();
6466 PostChildrenInfos.push_back(Info);
6467
6468 return CXChildVisit_Recurse;
6469 }
6470
postVisitChildren(CXCursor cursor)6471 bool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) {
6472 if (PostChildrenInfos.empty())
6473 return false;
6474 const PostChildrenInfo &Info = PostChildrenInfos.back();
6475 if (!clang_equalCursors(Info.Cursor, cursor))
6476 return false;
6477
6478 const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx;
6479 const unsigned AfterChildren = NextToken();
6480 SourceRange cursorRange = Info.CursorRange;
6481
6482 // Scan the tokens that are at the end of the cursor, but are not captured
6483 // but the child cursors.
6484 annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange);
6485
6486 // Scan the tokens that are at the beginning of the cursor, but are not
6487 // capture by the child cursors.
6488 for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
6489 if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
6490 break;
6491
6492 Cursors[I] = cursor;
6493 }
6494
6495 // Attributes are annotated out-of-order, rewind TokIdx to when we first
6496 // encountered the attribute cursor.
6497 if (clang_isAttribute(cursor.kind))
6498 TokIdx = Info.BeforeReachingCursorIdx;
6499
6500 PostChildrenInfos.pop_back();
6501 return false;
6502 }
6503
AnnotateTokensVisitor(CXCursor cursor,CXCursor parent,CXClientData client_data)6504 static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
6505 CXCursor parent,
6506 CXClientData client_data) {
6507 return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent);
6508 }
6509
AnnotateTokensPostChildrenVisitor(CXCursor cursor,CXClientData client_data)6510 static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
6511 CXClientData client_data) {
6512 return static_cast<AnnotateTokensWorker*>(client_data)->
6513 postVisitChildren(cursor);
6514 }
6515
6516 namespace {
6517
6518 /// \brief Uses the macro expansions in the preprocessing record to find
6519 /// and mark tokens that are macro arguments. This info is used by the
6520 /// AnnotateTokensWorker.
6521 class MarkMacroArgTokensVisitor {
6522 SourceManager &SM;
6523 CXToken *Tokens;
6524 unsigned NumTokens;
6525 unsigned CurIdx;
6526
6527 public:
MarkMacroArgTokensVisitor(SourceManager & SM,CXToken * tokens,unsigned numTokens)6528 MarkMacroArgTokensVisitor(SourceManager &SM,
6529 CXToken *tokens, unsigned numTokens)
6530 : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { }
6531
visit(CXCursor cursor,CXCursor parent)6532 CXChildVisitResult visit(CXCursor cursor, CXCursor parent) {
6533 if (cursor.kind != CXCursor_MacroExpansion)
6534 return CXChildVisit_Continue;
6535
6536 SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange();
6537 if (macroRange.getBegin() == macroRange.getEnd())
6538 return CXChildVisit_Continue; // it's not a function macro.
6539
6540 for (; CurIdx < NumTokens; ++CurIdx) {
6541 if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx),
6542 macroRange.getBegin()))
6543 break;
6544 }
6545
6546 if (CurIdx == NumTokens)
6547 return CXChildVisit_Break;
6548
6549 for (; CurIdx < NumTokens; ++CurIdx) {
6550 SourceLocation tokLoc = getTokenLoc(CurIdx);
6551 if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd()))
6552 break;
6553
6554 setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc));
6555 }
6556
6557 if (CurIdx == NumTokens)
6558 return CXChildVisit_Break;
6559
6560 return CXChildVisit_Continue;
6561 }
6562
6563 private:
getTok(unsigned Idx)6564 CXToken &getTok(unsigned Idx) {
6565 assert(Idx < NumTokens);
6566 return Tokens[Idx];
6567 }
getTok(unsigned Idx) const6568 const CXToken &getTok(unsigned Idx) const {
6569 assert(Idx < NumTokens);
6570 return Tokens[Idx];
6571 }
6572
getTokenLoc(unsigned tokI)6573 SourceLocation getTokenLoc(unsigned tokI) {
6574 return SourceLocation::getFromRawEncoding(getTok(tokI).int_data[1]);
6575 }
6576
setFunctionMacroTokenLoc(unsigned tokI,SourceLocation loc)6577 void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) {
6578 // The third field is reserved and currently not used. Use it here
6579 // to mark macro arg expanded tokens with their expanded locations.
6580 getTok(tokI).int_data[3] = loc.getRawEncoding();
6581 }
6582 };
6583
6584 } // end anonymous namespace
6585
6586 static CXChildVisitResult
MarkMacroArgTokensVisitorDelegate(CXCursor cursor,CXCursor parent,CXClientData client_data)6587 MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent,
6588 CXClientData client_data) {
6589 return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor,
6590 parent);
6591 }
6592
6593 /// \brief Used by \c annotatePreprocessorTokens.
6594 /// \returns true if lexing was finished, false otherwise.
lexNext(Lexer & Lex,Token & Tok,unsigned & NextIdx,unsigned NumTokens)6595 static bool lexNext(Lexer &Lex, Token &Tok,
6596 unsigned &NextIdx, unsigned NumTokens) {
6597 if (NextIdx >= NumTokens)
6598 return true;
6599
6600 ++NextIdx;
6601 Lex.LexFromRawLexer(Tok);
6602 return Tok.is(tok::eof);
6603 }
6604
annotatePreprocessorTokens(CXTranslationUnit TU,SourceRange RegionOfInterest,CXCursor * Cursors,CXToken * Tokens,unsigned NumTokens)6605 static void annotatePreprocessorTokens(CXTranslationUnit TU,
6606 SourceRange RegionOfInterest,
6607 CXCursor *Cursors,
6608 CXToken *Tokens,
6609 unsigned NumTokens) {
6610 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6611
6612 Preprocessor &PP = CXXUnit->getPreprocessor();
6613 SourceManager &SourceMgr = CXXUnit->getSourceManager();
6614 std::pair<FileID, unsigned> BeginLocInfo
6615 = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getBegin());
6616 std::pair<FileID, unsigned> EndLocInfo
6617 = SourceMgr.getDecomposedSpellingLoc(RegionOfInterest.getEnd());
6618
6619 if (BeginLocInfo.first != EndLocInfo.first)
6620 return;
6621
6622 StringRef Buffer;
6623 bool Invalid = false;
6624 Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
6625 if (Buffer.empty() || Invalid)
6626 return;
6627
6628 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
6629 CXXUnit->getASTContext().getLangOpts(),
6630 Buffer.begin(), Buffer.data() + BeginLocInfo.second,
6631 Buffer.end());
6632 Lex.SetCommentRetentionState(true);
6633
6634 unsigned NextIdx = 0;
6635 // Lex tokens in raw mode until we hit the end of the range, to avoid
6636 // entering #includes or expanding macros.
6637 while (true) {
6638 Token Tok;
6639 if (lexNext(Lex, Tok, NextIdx, NumTokens))
6640 break;
6641 unsigned TokIdx = NextIdx-1;
6642 assert(Tok.getLocation() ==
6643 SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1]));
6644
6645 reprocess:
6646 if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
6647 // We have found a preprocessing directive. Annotate the tokens
6648 // appropriately.
6649 //
6650 // FIXME: Some simple tests here could identify macro definitions and
6651 // #undefs, to provide specific cursor kinds for those.
6652
6653 SourceLocation BeginLoc = Tok.getLocation();
6654 if (lexNext(Lex, Tok, NextIdx, NumTokens))
6655 break;
6656
6657 MacroInfo *MI = nullptr;
6658 if (Tok.is(tok::raw_identifier) && Tok.getRawIdentifier() == "define") {
6659 if (lexNext(Lex, Tok, NextIdx, NumTokens))
6660 break;
6661
6662 if (Tok.is(tok::raw_identifier)) {
6663 IdentifierInfo &II =
6664 PP.getIdentifierTable().get(Tok.getRawIdentifier());
6665 SourceLocation MappedTokLoc =
6666 CXXUnit->mapLocationToPreamble(Tok.getLocation());
6667 MI = getMacroInfo(II, MappedTokLoc, TU);
6668 }
6669 }
6670
6671 bool finished = false;
6672 do {
6673 if (lexNext(Lex, Tok, NextIdx, NumTokens)) {
6674 finished = true;
6675 break;
6676 }
6677 // If we are in a macro definition, check if the token was ever a
6678 // macro name and annotate it if that's the case.
6679 if (MI) {
6680 SourceLocation SaveLoc = Tok.getLocation();
6681 Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc));
6682 MacroDefinitionRecord *MacroDef =
6683 checkForMacroInMacroDefinition(MI, Tok, TU);
6684 Tok.setLocation(SaveLoc);
6685 if (MacroDef)
6686 Cursors[NextIdx - 1] =
6687 MakeMacroExpansionCursor(MacroDef, Tok.getLocation(), TU);
6688 }
6689 } while (!Tok.isAtStartOfLine());
6690
6691 unsigned LastIdx = finished ? NextIdx-1 : NextIdx-2;
6692 assert(TokIdx <= LastIdx);
6693 SourceLocation EndLoc =
6694 SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]);
6695 CXCursor Cursor =
6696 MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU);
6697
6698 for (; TokIdx <= LastIdx; ++TokIdx)
6699 updateCursorAnnotation(Cursors[TokIdx], Cursor);
6700
6701 if (finished)
6702 break;
6703 goto reprocess;
6704 }
6705 }
6706 }
6707
6708 // This gets run a separate thread to avoid stack blowout.
clang_annotateTokensImpl(CXTranslationUnit TU,ASTUnit * CXXUnit,CXToken * Tokens,unsigned NumTokens,CXCursor * Cursors)6709 static void clang_annotateTokensImpl(CXTranslationUnit TU, ASTUnit *CXXUnit,
6710 CXToken *Tokens, unsigned NumTokens,
6711 CXCursor *Cursors) {
6712 CIndexer *CXXIdx = TU->CIdx;
6713 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
6714 setThreadBackgroundPriority();
6715
6716 // Determine the region of interest, which contains all of the tokens.
6717 SourceRange RegionOfInterest;
6718 RegionOfInterest.setBegin(
6719 cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
6720 RegionOfInterest.setEnd(
6721 cxloc::translateSourceLocation(clang_getTokenLocation(TU,
6722 Tokens[NumTokens-1])));
6723
6724 // Relex the tokens within the source range to look for preprocessing
6725 // directives.
6726 annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens);
6727
6728 // If begin location points inside a macro argument, set it to the expansion
6729 // location so we can have the full context when annotating semantically.
6730 {
6731 SourceManager &SM = CXXUnit->getSourceManager();
6732 SourceLocation Loc =
6733 SM.getMacroArgExpandedLocation(RegionOfInterest.getBegin());
6734 if (Loc.isMacroID())
6735 RegionOfInterest.setBegin(SM.getExpansionLoc(Loc));
6736 }
6737
6738 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
6739 // Search and mark tokens that are macro argument expansions.
6740 MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(),
6741 Tokens, NumTokens);
6742 CursorVisitor MacroArgMarker(TU,
6743 MarkMacroArgTokensVisitorDelegate, &Visitor,
6744 /*VisitPreprocessorLast=*/true,
6745 /*VisitIncludedEntities=*/false,
6746 RegionOfInterest);
6747 MacroArgMarker.visitPreprocessedEntitiesInRegion();
6748 }
6749
6750 // Annotate all of the source locations in the region of interest that map to
6751 // a specific cursor.
6752 AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest);
6753
6754 // FIXME: We use a ridiculous stack size here because the data-recursion
6755 // algorithm uses a large stack frame than the non-data recursive version,
6756 // and AnnotationTokensWorker currently transforms the data-recursion
6757 // algorithm back into a traditional recursion by explicitly calling
6758 // VisitChildren(). We will need to remove this explicit recursive call.
6759 W.AnnotateTokens();
6760
6761 // If we ran into any entities that involve context-sensitive keywords,
6762 // take another pass through the tokens to mark them as such.
6763 if (W.hasContextSensitiveKeywords()) {
6764 for (unsigned I = 0; I != NumTokens; ++I) {
6765 if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier)
6766 continue;
6767
6768 if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) {
6769 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
6770 if (const ObjCPropertyDecl *Property
6771 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) {
6772 if (Property->getPropertyAttributesAsWritten() != 0 &&
6773 llvm::StringSwitch<bool>(II->getName())
6774 .Case("readonly", true)
6775 .Case("assign", true)
6776 .Case("unsafe_unretained", true)
6777 .Case("readwrite", true)
6778 .Case("retain", true)
6779 .Case("copy", true)
6780 .Case("nonatomic", true)
6781 .Case("atomic", true)
6782 .Case("getter", true)
6783 .Case("setter", true)
6784 .Case("strong", true)
6785 .Case("weak", true)
6786 .Case("class", true)
6787 .Default(false))
6788 Tokens[I].int_data[0] = CXToken_Keyword;
6789 }
6790 continue;
6791 }
6792
6793 if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl ||
6794 Cursors[I].kind == CXCursor_ObjCClassMethodDecl) {
6795 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
6796 if (llvm::StringSwitch<bool>(II->getName())
6797 .Case("in", true)
6798 .Case("out", true)
6799 .Case("inout", true)
6800 .Case("oneway", true)
6801 .Case("bycopy", true)
6802 .Case("byref", true)
6803 .Default(false))
6804 Tokens[I].int_data[0] = CXToken_Keyword;
6805 continue;
6806 }
6807
6808 if (Cursors[I].kind == CXCursor_CXXFinalAttr ||
6809 Cursors[I].kind == CXCursor_CXXOverrideAttr) {
6810 Tokens[I].int_data[0] = CXToken_Keyword;
6811 continue;
6812 }
6813 }
6814 }
6815 }
6816
6817 extern "C" {
6818
clang_annotateTokens(CXTranslationUnit TU,CXToken * Tokens,unsigned NumTokens,CXCursor * Cursors)6819 void clang_annotateTokens(CXTranslationUnit TU,
6820 CXToken *Tokens, unsigned NumTokens,
6821 CXCursor *Cursors) {
6822 if (isNotUsableTU(TU)) {
6823 LOG_BAD_TU(TU);
6824 return;
6825 }
6826 if (NumTokens == 0 || !Tokens || !Cursors) {
6827 LOG_FUNC_SECTION { *Log << "<null input>"; }
6828 return;
6829 }
6830
6831 LOG_FUNC_SECTION {
6832 *Log << TU << ' ';
6833 CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]);
6834 CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens-1]);
6835 *Log << clang_getRange(bloc, eloc);
6836 }
6837
6838 // Any token we don't specifically annotate will have a NULL cursor.
6839 CXCursor C = clang_getNullCursor();
6840 for (unsigned I = 0; I != NumTokens; ++I)
6841 Cursors[I] = C;
6842
6843 ASTUnit *CXXUnit = cxtu::getASTUnit(TU);
6844 if (!CXXUnit)
6845 return;
6846
6847 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
6848
6849 auto AnnotateTokensImpl = [=]() {
6850 clang_annotateTokensImpl(TU, CXXUnit, Tokens, NumTokens, Cursors);
6851 };
6852 llvm::CrashRecoveryContext CRC;
6853 if (!RunSafely(CRC, AnnotateTokensImpl, GetSafetyThreadStackSize() * 2)) {
6854 fprintf(stderr, "libclang: crash detected while annotating tokens\n");
6855 }
6856 }
6857
6858 } // end: extern "C"
6859
6860 //===----------------------------------------------------------------------===//
6861 // Operations for querying linkage of a cursor.
6862 //===----------------------------------------------------------------------===//
6863
6864 extern "C" {
clang_getCursorLinkage(CXCursor cursor)6865 CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
6866 if (!clang_isDeclaration(cursor.kind))
6867 return CXLinkage_Invalid;
6868
6869 const Decl *D = cxcursor::getCursorDecl(cursor);
6870 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
6871 switch (ND->getLinkageInternal()) {
6872 case NoLinkage:
6873 case VisibleNoLinkage: return CXLinkage_NoLinkage;
6874 case InternalLinkage: return CXLinkage_Internal;
6875 case UniqueExternalLinkage: return CXLinkage_UniqueExternal;
6876 case ExternalLinkage: return CXLinkage_External;
6877 };
6878
6879 return CXLinkage_Invalid;
6880 }
6881 } // end: extern "C"
6882
6883 //===----------------------------------------------------------------------===//
6884 // Operations for querying visibility of a cursor.
6885 //===----------------------------------------------------------------------===//
6886
6887 extern "C" {
clang_getCursorVisibility(CXCursor cursor)6888 CXVisibilityKind clang_getCursorVisibility(CXCursor cursor) {
6889 if (!clang_isDeclaration(cursor.kind))
6890 return CXVisibility_Invalid;
6891
6892 const Decl *D = cxcursor::getCursorDecl(cursor);
6893 if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
6894 switch (ND->getVisibility()) {
6895 case HiddenVisibility: return CXVisibility_Hidden;
6896 case ProtectedVisibility: return CXVisibility_Protected;
6897 case DefaultVisibility: return CXVisibility_Default;
6898 };
6899
6900 return CXVisibility_Invalid;
6901 }
6902 } // end: extern "C"
6903
6904 //===----------------------------------------------------------------------===//
6905 // Operations for querying language of a cursor.
6906 //===----------------------------------------------------------------------===//
6907
getDeclLanguage(const Decl * D)6908 static CXLanguageKind getDeclLanguage(const Decl *D) {
6909 if (!D)
6910 return CXLanguage_C;
6911
6912 switch (D->getKind()) {
6913 default:
6914 break;
6915 case Decl::ImplicitParam:
6916 case Decl::ObjCAtDefsField:
6917 case Decl::ObjCCategory:
6918 case Decl::ObjCCategoryImpl:
6919 case Decl::ObjCCompatibleAlias:
6920 case Decl::ObjCImplementation:
6921 case Decl::ObjCInterface:
6922 case Decl::ObjCIvar:
6923 case Decl::ObjCMethod:
6924 case Decl::ObjCProperty:
6925 case Decl::ObjCPropertyImpl:
6926 case Decl::ObjCProtocol:
6927 case Decl::ObjCTypeParam:
6928 return CXLanguage_ObjC;
6929 case Decl::CXXConstructor:
6930 case Decl::CXXConversion:
6931 case Decl::CXXDestructor:
6932 case Decl::CXXMethod:
6933 case Decl::CXXRecord:
6934 case Decl::ClassTemplate:
6935 case Decl::ClassTemplatePartialSpecialization:
6936 case Decl::ClassTemplateSpecialization:
6937 case Decl::Friend:
6938 case Decl::FriendTemplate:
6939 case Decl::FunctionTemplate:
6940 case Decl::LinkageSpec:
6941 case Decl::Namespace:
6942 case Decl::NamespaceAlias:
6943 case Decl::NonTypeTemplateParm:
6944 case Decl::StaticAssert:
6945 case Decl::TemplateTemplateParm:
6946 case Decl::TemplateTypeParm:
6947 case Decl::UnresolvedUsingTypename:
6948 case Decl::UnresolvedUsingValue:
6949 case Decl::Using:
6950 case Decl::UsingDirective:
6951 case Decl::UsingShadow:
6952 return CXLanguage_CPlusPlus;
6953 }
6954
6955 return CXLanguage_C;
6956 }
6957
6958 extern "C" {
6959
getCursorAvailabilityForDecl(const Decl * D)6960 static CXAvailabilityKind getCursorAvailabilityForDecl(const Decl *D) {
6961 if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())
6962 return CXAvailability_NotAvailable;
6963
6964 switch (D->getAvailability()) {
6965 case AR_Available:
6966 case AR_NotYetIntroduced:
6967 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D))
6968 return getCursorAvailabilityForDecl(
6969 cast<Decl>(EnumConst->getDeclContext()));
6970 return CXAvailability_Available;
6971
6972 case AR_Deprecated:
6973 return CXAvailability_Deprecated;
6974
6975 case AR_Unavailable:
6976 return CXAvailability_NotAvailable;
6977 }
6978
6979 llvm_unreachable("Unknown availability kind!");
6980 }
6981
clang_getCursorAvailability(CXCursor cursor)6982 enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
6983 if (clang_isDeclaration(cursor.kind))
6984 if (const Decl *D = cxcursor::getCursorDecl(cursor))
6985 return getCursorAvailabilityForDecl(D);
6986
6987 return CXAvailability_Available;
6988 }
6989
convertVersion(VersionTuple In)6990 static CXVersion convertVersion(VersionTuple In) {
6991 CXVersion Out = { -1, -1, -1 };
6992 if (In.empty())
6993 return Out;
6994
6995 Out.Major = In.getMajor();
6996
6997 Optional<unsigned> Minor = In.getMinor();
6998 if (Minor.hasValue())
6999 Out.Minor = *Minor;
7000 else
7001 return Out;
7002
7003 Optional<unsigned> Subminor = In.getSubminor();
7004 if (Subminor.hasValue())
7005 Out.Subminor = *Subminor;
7006
7007 return Out;
7008 }
7009
getCursorPlatformAvailabilityForDecl(const Decl * D,int * always_deprecated,CXString * deprecated_message,int * always_unavailable,CXString * unavailable_message,CXPlatformAvailability * availability,int availability_size)7010 static int getCursorPlatformAvailabilityForDecl(const Decl *D,
7011 int *always_deprecated,
7012 CXString *deprecated_message,
7013 int *always_unavailable,
7014 CXString *unavailable_message,
7015 CXPlatformAvailability *availability,
7016 int availability_size) {
7017 bool HadAvailAttr = false;
7018 int N = 0;
7019 for (auto A : D->attrs()) {
7020 if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) {
7021 HadAvailAttr = true;
7022 if (always_deprecated)
7023 *always_deprecated = 1;
7024 if (deprecated_message) {
7025 clang_disposeString(*deprecated_message);
7026 *deprecated_message = cxstring::createDup(Deprecated->getMessage());
7027 }
7028 continue;
7029 }
7030
7031 if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) {
7032 HadAvailAttr = true;
7033 if (always_unavailable)
7034 *always_unavailable = 1;
7035 if (unavailable_message) {
7036 clang_disposeString(*unavailable_message);
7037 *unavailable_message = cxstring::createDup(Unavailable->getMessage());
7038 }
7039 continue;
7040 }
7041
7042 if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) {
7043 HadAvailAttr = true;
7044 if (N < availability_size) {
7045 availability[N].Platform
7046 = cxstring::createDup(Avail->getPlatform()->getName());
7047 availability[N].Introduced = convertVersion(Avail->getIntroduced());
7048 availability[N].Deprecated = convertVersion(Avail->getDeprecated());
7049 availability[N].Obsoleted = convertVersion(Avail->getObsoleted());
7050 availability[N].Unavailable = Avail->getUnavailable();
7051 availability[N].Message = cxstring::createDup(Avail->getMessage());
7052 }
7053 ++N;
7054 }
7055 }
7056
7057 if (!HadAvailAttr)
7058 if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D))
7059 return getCursorPlatformAvailabilityForDecl(
7060 cast<Decl>(EnumConst->getDeclContext()),
7061 always_deprecated,
7062 deprecated_message,
7063 always_unavailable,
7064 unavailable_message,
7065 availability,
7066 availability_size);
7067
7068 return N;
7069 }
7070
clang_getCursorPlatformAvailability(CXCursor cursor,int * always_deprecated,CXString * deprecated_message,int * always_unavailable,CXString * unavailable_message,CXPlatformAvailability * availability,int availability_size)7071 int clang_getCursorPlatformAvailability(CXCursor cursor,
7072 int *always_deprecated,
7073 CXString *deprecated_message,
7074 int *always_unavailable,
7075 CXString *unavailable_message,
7076 CXPlatformAvailability *availability,
7077 int availability_size) {
7078 if (always_deprecated)
7079 *always_deprecated = 0;
7080 if (deprecated_message)
7081 *deprecated_message = cxstring::createEmpty();
7082 if (always_unavailable)
7083 *always_unavailable = 0;
7084 if (unavailable_message)
7085 *unavailable_message = cxstring::createEmpty();
7086
7087 if (!clang_isDeclaration(cursor.kind))
7088 return 0;
7089
7090 const Decl *D = cxcursor::getCursorDecl(cursor);
7091 if (!D)
7092 return 0;
7093
7094 return getCursorPlatformAvailabilityForDecl(D, always_deprecated,
7095 deprecated_message,
7096 always_unavailable,
7097 unavailable_message,
7098 availability,
7099 availability_size);
7100 }
7101
clang_disposeCXPlatformAvailability(CXPlatformAvailability * availability)7102 void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) {
7103 clang_disposeString(availability->Platform);
7104 clang_disposeString(availability->Message);
7105 }
7106
clang_getCursorLanguage(CXCursor cursor)7107 CXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
7108 if (clang_isDeclaration(cursor.kind))
7109 return getDeclLanguage(cxcursor::getCursorDecl(cursor));
7110
7111 return CXLanguage_Invalid;
7112 }
7113
7114 /// \brief If the given cursor is the "templated" declaration
7115 /// descibing a class or function template, return the class or
7116 /// function template.
maybeGetTemplateCursor(const Decl * D)7117 static const Decl *maybeGetTemplateCursor(const Decl *D) {
7118 if (!D)
7119 return nullptr;
7120
7121 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
7122 if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate())
7123 return FunTmpl;
7124
7125 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
7126 if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate())
7127 return ClassTmpl;
7128
7129 return D;
7130 }
7131
7132
clang_Cursor_getStorageClass(CXCursor C)7133 enum CX_StorageClass clang_Cursor_getStorageClass(CXCursor C) {
7134 StorageClass sc = SC_None;
7135 const Decl *D = getCursorDecl(C);
7136 if (D) {
7137 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
7138 sc = FD->getStorageClass();
7139 } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
7140 sc = VD->getStorageClass();
7141 } else {
7142 return CX_SC_Invalid;
7143 }
7144 } else {
7145 return CX_SC_Invalid;
7146 }
7147 switch (sc) {
7148 case SC_None:
7149 return CX_SC_None;
7150 case SC_Extern:
7151 return CX_SC_Extern;
7152 case SC_Static:
7153 return CX_SC_Static;
7154 case SC_PrivateExtern:
7155 return CX_SC_PrivateExtern;
7156 case SC_Auto:
7157 return CX_SC_Auto;
7158 case SC_Register:
7159 return CX_SC_Register;
7160 }
7161 llvm_unreachable("Unhandled storage class!");
7162 }
7163
clang_getCursorSemanticParent(CXCursor cursor)7164 CXCursor clang_getCursorSemanticParent(CXCursor cursor) {
7165 if (clang_isDeclaration(cursor.kind)) {
7166 if (const Decl *D = getCursorDecl(cursor)) {
7167 const DeclContext *DC = D->getDeclContext();
7168 if (!DC)
7169 return clang_getNullCursor();
7170
7171 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
7172 getCursorTU(cursor));
7173 }
7174 }
7175
7176 if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
7177 if (const Decl *D = getCursorDecl(cursor))
7178 return MakeCXCursor(D, getCursorTU(cursor));
7179 }
7180
7181 return clang_getNullCursor();
7182 }
7183
clang_getCursorLexicalParent(CXCursor cursor)7184 CXCursor clang_getCursorLexicalParent(CXCursor cursor) {
7185 if (clang_isDeclaration(cursor.kind)) {
7186 if (const Decl *D = getCursorDecl(cursor)) {
7187 const DeclContext *DC = D->getLexicalDeclContext();
7188 if (!DC)
7189 return clang_getNullCursor();
7190
7191 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
7192 getCursorTU(cursor));
7193 }
7194 }
7195
7196 // FIXME: Note that we can't easily compute the lexical context of a
7197 // statement or expression, so we return nothing.
7198 return clang_getNullCursor();
7199 }
7200
clang_getIncludedFile(CXCursor cursor)7201 CXFile clang_getIncludedFile(CXCursor cursor) {
7202 if (cursor.kind != CXCursor_InclusionDirective)
7203 return nullptr;
7204
7205 const InclusionDirective *ID = getCursorInclusionDirective(cursor);
7206 return const_cast<FileEntry *>(ID->getFile());
7207 }
7208
clang_Cursor_getObjCPropertyAttributes(CXCursor C,unsigned reserved)7209 unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) {
7210 if (C.kind != CXCursor_ObjCPropertyDecl)
7211 return CXObjCPropertyAttr_noattr;
7212
7213 unsigned Result = CXObjCPropertyAttr_noattr;
7214 const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
7215 ObjCPropertyDecl::PropertyAttributeKind Attr =
7216 PD->getPropertyAttributesAsWritten();
7217
7218 #define SET_CXOBJCPROP_ATTR(A) \
7219 if (Attr & ObjCPropertyDecl::OBJC_PR_##A) \
7220 Result |= CXObjCPropertyAttr_##A
7221 SET_CXOBJCPROP_ATTR(readonly);
7222 SET_CXOBJCPROP_ATTR(getter);
7223 SET_CXOBJCPROP_ATTR(assign);
7224 SET_CXOBJCPROP_ATTR(readwrite);
7225 SET_CXOBJCPROP_ATTR(retain);
7226 SET_CXOBJCPROP_ATTR(copy);
7227 SET_CXOBJCPROP_ATTR(nonatomic);
7228 SET_CXOBJCPROP_ATTR(setter);
7229 SET_CXOBJCPROP_ATTR(atomic);
7230 SET_CXOBJCPROP_ATTR(weak);
7231 SET_CXOBJCPROP_ATTR(strong);
7232 SET_CXOBJCPROP_ATTR(unsafe_unretained);
7233 SET_CXOBJCPROP_ATTR(class);
7234 #undef SET_CXOBJCPROP_ATTR
7235
7236 return Result;
7237 }
7238
clang_Cursor_getObjCDeclQualifiers(CXCursor C)7239 unsigned clang_Cursor_getObjCDeclQualifiers(CXCursor C) {
7240 if (!clang_isDeclaration(C.kind))
7241 return CXObjCDeclQualifier_None;
7242
7243 Decl::ObjCDeclQualifier QT = Decl::OBJC_TQ_None;
7244 const Decl *D = getCursorDecl(C);
7245 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
7246 QT = MD->getObjCDeclQualifier();
7247 else if (const ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D))
7248 QT = PD->getObjCDeclQualifier();
7249 if (QT == Decl::OBJC_TQ_None)
7250 return CXObjCDeclQualifier_None;
7251
7252 unsigned Result = CXObjCDeclQualifier_None;
7253 if (QT & Decl::OBJC_TQ_In) Result |= CXObjCDeclQualifier_In;
7254 if (QT & Decl::OBJC_TQ_Inout) Result |= CXObjCDeclQualifier_Inout;
7255 if (QT & Decl::OBJC_TQ_Out) Result |= CXObjCDeclQualifier_Out;
7256 if (QT & Decl::OBJC_TQ_Bycopy) Result |= CXObjCDeclQualifier_Bycopy;
7257 if (QT & Decl::OBJC_TQ_Byref) Result |= CXObjCDeclQualifier_Byref;
7258 if (QT & Decl::OBJC_TQ_Oneway) Result |= CXObjCDeclQualifier_Oneway;
7259
7260 return Result;
7261 }
7262
clang_Cursor_isObjCOptional(CXCursor C)7263 unsigned clang_Cursor_isObjCOptional(CXCursor C) {
7264 if (!clang_isDeclaration(C.kind))
7265 return 0;
7266
7267 const Decl *D = getCursorDecl(C);
7268 if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
7269 return PD->getPropertyImplementation() == ObjCPropertyDecl::Optional;
7270 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
7271 return MD->getImplementationControl() == ObjCMethodDecl::Optional;
7272
7273 return 0;
7274 }
7275
clang_Cursor_isVariadic(CXCursor C)7276 unsigned clang_Cursor_isVariadic(CXCursor C) {
7277 if (!clang_isDeclaration(C.kind))
7278 return 0;
7279
7280 const Decl *D = getCursorDecl(C);
7281 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
7282 return FD->isVariadic();
7283 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
7284 return MD->isVariadic();
7285
7286 return 0;
7287 }
7288
clang_Cursor_getCommentRange(CXCursor C)7289 CXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
7290 if (!clang_isDeclaration(C.kind))
7291 return clang_getNullRange();
7292
7293 const Decl *D = getCursorDecl(C);
7294 ASTContext &Context = getCursorContext(C);
7295 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
7296 if (!RC)
7297 return clang_getNullRange();
7298
7299 return cxloc::translateSourceRange(Context, RC->getSourceRange());
7300 }
7301
clang_Cursor_getRawCommentText(CXCursor C)7302 CXString clang_Cursor_getRawCommentText(CXCursor C) {
7303 if (!clang_isDeclaration(C.kind))
7304 return cxstring::createNull();
7305
7306 const Decl *D = getCursorDecl(C);
7307 ASTContext &Context = getCursorContext(C);
7308 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
7309 StringRef RawText = RC ? RC->getRawText(Context.getSourceManager()) :
7310 StringRef();
7311
7312 // Don't duplicate the string because RawText points directly into source
7313 // code.
7314 return cxstring::createRef(RawText);
7315 }
7316
clang_Cursor_getBriefCommentText(CXCursor C)7317 CXString clang_Cursor_getBriefCommentText(CXCursor C) {
7318 if (!clang_isDeclaration(C.kind))
7319 return cxstring::createNull();
7320
7321 const Decl *D = getCursorDecl(C);
7322 const ASTContext &Context = getCursorContext(C);
7323 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
7324
7325 if (RC) {
7326 StringRef BriefText = RC->getBriefText(Context);
7327
7328 // Don't duplicate the string because RawComment ensures that this memory
7329 // will not go away.
7330 return cxstring::createRef(BriefText);
7331 }
7332
7333 return cxstring::createNull();
7334 }
7335
clang_Cursor_getModule(CXCursor C)7336 CXModule clang_Cursor_getModule(CXCursor C) {
7337 if (C.kind == CXCursor_ModuleImportDecl) {
7338 if (const ImportDecl *ImportD =
7339 dyn_cast_or_null<ImportDecl>(getCursorDecl(C)))
7340 return ImportD->getImportedModule();
7341 }
7342
7343 return nullptr;
7344 }
7345
clang_getModuleForFile(CXTranslationUnit TU,CXFile File)7346 CXModule clang_getModuleForFile(CXTranslationUnit TU, CXFile File) {
7347 if (isNotUsableTU(TU)) {
7348 LOG_BAD_TU(TU);
7349 return nullptr;
7350 }
7351 if (!File)
7352 return nullptr;
7353 FileEntry *FE = static_cast<FileEntry *>(File);
7354
7355 ASTUnit &Unit = *cxtu::getASTUnit(TU);
7356 HeaderSearch &HS = Unit.getPreprocessor().getHeaderSearchInfo();
7357 ModuleMap::KnownHeader Header = HS.findModuleForHeader(FE);
7358
7359 return Header.getModule();
7360 }
7361
clang_Module_getASTFile(CXModule CXMod)7362 CXFile clang_Module_getASTFile(CXModule CXMod) {
7363 if (!CXMod)
7364 return nullptr;
7365 Module *Mod = static_cast<Module*>(CXMod);
7366 return const_cast<FileEntry *>(Mod->getASTFile());
7367 }
7368
clang_Module_getParent(CXModule CXMod)7369 CXModule clang_Module_getParent(CXModule CXMod) {
7370 if (!CXMod)
7371 return nullptr;
7372 Module *Mod = static_cast<Module*>(CXMod);
7373 return Mod->Parent;
7374 }
7375
clang_Module_getName(CXModule CXMod)7376 CXString clang_Module_getName(CXModule CXMod) {
7377 if (!CXMod)
7378 return cxstring::createEmpty();
7379 Module *Mod = static_cast<Module*>(CXMod);
7380 return cxstring::createDup(Mod->Name);
7381 }
7382
clang_Module_getFullName(CXModule CXMod)7383 CXString clang_Module_getFullName(CXModule CXMod) {
7384 if (!CXMod)
7385 return cxstring::createEmpty();
7386 Module *Mod = static_cast<Module*>(CXMod);
7387 return cxstring::createDup(Mod->getFullModuleName());
7388 }
7389
clang_Module_isSystem(CXModule CXMod)7390 int clang_Module_isSystem(CXModule CXMod) {
7391 if (!CXMod)
7392 return 0;
7393 Module *Mod = static_cast<Module*>(CXMod);
7394 return Mod->IsSystem;
7395 }
7396
clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU,CXModule CXMod)7397 unsigned clang_Module_getNumTopLevelHeaders(CXTranslationUnit TU,
7398 CXModule CXMod) {
7399 if (isNotUsableTU(TU)) {
7400 LOG_BAD_TU(TU);
7401 return 0;
7402 }
7403 if (!CXMod)
7404 return 0;
7405 Module *Mod = static_cast<Module*>(CXMod);
7406 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
7407 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
7408 return TopHeaders.size();
7409 }
7410
clang_Module_getTopLevelHeader(CXTranslationUnit TU,CXModule CXMod,unsigned Index)7411 CXFile clang_Module_getTopLevelHeader(CXTranslationUnit TU,
7412 CXModule CXMod, unsigned Index) {
7413 if (isNotUsableTU(TU)) {
7414 LOG_BAD_TU(TU);
7415 return nullptr;
7416 }
7417 if (!CXMod)
7418 return nullptr;
7419 Module *Mod = static_cast<Module*>(CXMod);
7420 FileManager &FileMgr = cxtu::getASTUnit(TU)->getFileManager();
7421
7422 ArrayRef<const FileEntry *> TopHeaders = Mod->getTopHeaders(FileMgr);
7423 if (Index < TopHeaders.size())
7424 return const_cast<FileEntry *>(TopHeaders[Index]);
7425
7426 return nullptr;
7427 }
7428
7429 } // end: extern "C"
7430
7431 //===----------------------------------------------------------------------===//
7432 // C++ AST instrospection.
7433 //===----------------------------------------------------------------------===//
7434
7435 extern "C" {
7436
clang_CXXConstructor_isDefaultConstructor(CXCursor C)7437 unsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C) {
7438 if (!clang_isDeclaration(C.kind))
7439 return 0;
7440
7441 const Decl *D = cxcursor::getCursorDecl(C);
7442 const CXXConstructorDecl *Constructor =
7443 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
7444 return (Constructor && Constructor->isDefaultConstructor()) ? 1 : 0;
7445 }
7446
clang_CXXConstructor_isCopyConstructor(CXCursor C)7447 unsigned clang_CXXConstructor_isCopyConstructor(CXCursor C) {
7448 if (!clang_isDeclaration(C.kind))
7449 return 0;
7450
7451 const Decl *D = cxcursor::getCursorDecl(C);
7452 const CXXConstructorDecl *Constructor =
7453 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
7454 return (Constructor && Constructor->isCopyConstructor()) ? 1 : 0;
7455 }
7456
clang_CXXConstructor_isMoveConstructor(CXCursor C)7457 unsigned clang_CXXConstructor_isMoveConstructor(CXCursor C) {
7458 if (!clang_isDeclaration(C.kind))
7459 return 0;
7460
7461 const Decl *D = cxcursor::getCursorDecl(C);
7462 const CXXConstructorDecl *Constructor =
7463 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
7464 return (Constructor && Constructor->isMoveConstructor()) ? 1 : 0;
7465 }
7466
clang_CXXConstructor_isConvertingConstructor(CXCursor C)7467 unsigned clang_CXXConstructor_isConvertingConstructor(CXCursor C) {
7468 if (!clang_isDeclaration(C.kind))
7469 return 0;
7470
7471 const Decl *D = cxcursor::getCursorDecl(C);
7472 const CXXConstructorDecl *Constructor =
7473 D ? dyn_cast_or_null<CXXConstructorDecl>(D->getAsFunction()) : nullptr;
7474 // Passing 'false' excludes constructors marked 'explicit'.
7475 return (Constructor && Constructor->isConvertingConstructor(false)) ? 1 : 0;
7476 }
7477
clang_CXXField_isMutable(CXCursor C)7478 unsigned clang_CXXField_isMutable(CXCursor C) {
7479 if (!clang_isDeclaration(C.kind))
7480 return 0;
7481
7482 if (const auto D = cxcursor::getCursorDecl(C))
7483 if (const auto FD = dyn_cast_or_null<FieldDecl>(D))
7484 return FD->isMutable() ? 1 : 0;
7485 return 0;
7486 }
7487
clang_CXXMethod_isPureVirtual(CXCursor C)7488 unsigned clang_CXXMethod_isPureVirtual(CXCursor C) {
7489 if (!clang_isDeclaration(C.kind))
7490 return 0;
7491
7492 const Decl *D = cxcursor::getCursorDecl(C);
7493 const CXXMethodDecl *Method =
7494 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7495 return (Method && Method->isVirtual() && Method->isPure()) ? 1 : 0;
7496 }
7497
clang_CXXMethod_isConst(CXCursor C)7498 unsigned clang_CXXMethod_isConst(CXCursor C) {
7499 if (!clang_isDeclaration(C.kind))
7500 return 0;
7501
7502 const Decl *D = cxcursor::getCursorDecl(C);
7503 const CXXMethodDecl *Method =
7504 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7505 return (Method && (Method->getTypeQualifiers() & Qualifiers::Const)) ? 1 : 0;
7506 }
7507
clang_CXXMethod_isDefaulted(CXCursor C)7508 unsigned clang_CXXMethod_isDefaulted(CXCursor C) {
7509 if (!clang_isDeclaration(C.kind))
7510 return 0;
7511
7512 const Decl *D = cxcursor::getCursorDecl(C);
7513 const CXXMethodDecl *Method =
7514 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7515 return (Method && Method->isDefaulted()) ? 1 : 0;
7516 }
7517
clang_CXXMethod_isStatic(CXCursor C)7518 unsigned clang_CXXMethod_isStatic(CXCursor C) {
7519 if (!clang_isDeclaration(C.kind))
7520 return 0;
7521
7522 const Decl *D = cxcursor::getCursorDecl(C);
7523 const CXXMethodDecl *Method =
7524 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7525 return (Method && Method->isStatic()) ? 1 : 0;
7526 }
7527
clang_CXXMethod_isVirtual(CXCursor C)7528 unsigned clang_CXXMethod_isVirtual(CXCursor C) {
7529 if (!clang_isDeclaration(C.kind))
7530 return 0;
7531
7532 const Decl *D = cxcursor::getCursorDecl(C);
7533 const CXXMethodDecl *Method =
7534 D ? dyn_cast_or_null<CXXMethodDecl>(D->getAsFunction()) : nullptr;
7535 return (Method && Method->isVirtual()) ? 1 : 0;
7536 }
7537 } // end: extern "C"
7538
7539 //===----------------------------------------------------------------------===//
7540 // Attribute introspection.
7541 //===----------------------------------------------------------------------===//
7542
7543 extern "C" {
clang_getIBOutletCollectionType(CXCursor C)7544 CXType clang_getIBOutletCollectionType(CXCursor C) {
7545 if (C.kind != CXCursor_IBOutletCollectionAttr)
7546 return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C));
7547
7548 const IBOutletCollectionAttr *A =
7549 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
7550
7551 return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C));
7552 }
7553 } // end: extern "C"
7554
7555 //===----------------------------------------------------------------------===//
7556 // Inspecting memory usage.
7557 //===----------------------------------------------------------------------===//
7558
7559 typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries;
7560
createCXTUResourceUsageEntry(MemUsageEntries & entries,enum CXTUResourceUsageKind k,unsigned long amount)7561 static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,
7562 enum CXTUResourceUsageKind k,
7563 unsigned long amount) {
7564 CXTUResourceUsageEntry entry = { k, amount };
7565 entries.push_back(entry);
7566 }
7567
7568 extern "C" {
7569
clang_getTUResourceUsageName(CXTUResourceUsageKind kind)7570 const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
7571 const char *str = "";
7572 switch (kind) {
7573 case CXTUResourceUsage_AST:
7574 str = "ASTContext: expressions, declarations, and types";
7575 break;
7576 case CXTUResourceUsage_Identifiers:
7577 str = "ASTContext: identifiers";
7578 break;
7579 case CXTUResourceUsage_Selectors:
7580 str = "ASTContext: selectors";
7581 break;
7582 case CXTUResourceUsage_GlobalCompletionResults:
7583 str = "Code completion: cached global results";
7584 break;
7585 case CXTUResourceUsage_SourceManagerContentCache:
7586 str = "SourceManager: content cache allocator";
7587 break;
7588 case CXTUResourceUsage_AST_SideTables:
7589 str = "ASTContext: side tables";
7590 break;
7591 case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
7592 str = "SourceManager: malloc'ed memory buffers";
7593 break;
7594 case CXTUResourceUsage_SourceManager_Membuffer_MMap:
7595 str = "SourceManager: mmap'ed memory buffers";
7596 break;
7597 case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:
7598 str = "ExternalASTSource: malloc'ed memory buffers";
7599 break;
7600 case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:
7601 str = "ExternalASTSource: mmap'ed memory buffers";
7602 break;
7603 case CXTUResourceUsage_Preprocessor:
7604 str = "Preprocessor: malloc'ed memory";
7605 break;
7606 case CXTUResourceUsage_PreprocessingRecord:
7607 str = "Preprocessor: PreprocessingRecord";
7608 break;
7609 case CXTUResourceUsage_SourceManager_DataStructures:
7610 str = "SourceManager: data structures and tables";
7611 break;
7612 case CXTUResourceUsage_Preprocessor_HeaderSearch:
7613 str = "Preprocessor: header search tables";
7614 break;
7615 }
7616 return str;
7617 }
7618
clang_getCXTUResourceUsage(CXTranslationUnit TU)7619 CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
7620 if (isNotUsableTU(TU)) {
7621 LOG_BAD_TU(TU);
7622 CXTUResourceUsage usage = { (void*) nullptr, 0, nullptr };
7623 return usage;
7624 }
7625
7626 ASTUnit *astUnit = cxtu::getASTUnit(TU);
7627 std::unique_ptr<MemUsageEntries> entries(new MemUsageEntries());
7628 ASTContext &astContext = astUnit->getASTContext();
7629
7630 // How much memory is used by AST nodes and types?
7631 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST,
7632 (unsigned long) astContext.getASTAllocatedMemory());
7633
7634 // How much memory is used by identifiers?
7635 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers,
7636 (unsigned long) astContext.Idents.getAllocator().getTotalMemory());
7637
7638 // How much memory is used for selectors?
7639 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors,
7640 (unsigned long) astContext.Selectors.getTotalMemory());
7641
7642 // How much memory is used by ASTContext's side tables?
7643 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables,
7644 (unsigned long) astContext.getSideTableAllocatedMemory());
7645
7646 // How much memory is used for caching global code completion results?
7647 unsigned long completionBytes = 0;
7648 if (GlobalCodeCompletionAllocator *completionAllocator =
7649 astUnit->getCachedCompletionAllocator().get()) {
7650 completionBytes = completionAllocator->getTotalMemory();
7651 }
7652 createCXTUResourceUsageEntry(*entries,
7653 CXTUResourceUsage_GlobalCompletionResults,
7654 completionBytes);
7655
7656 // How much memory is being used by SourceManager's content cache?
7657 createCXTUResourceUsageEntry(*entries,
7658 CXTUResourceUsage_SourceManagerContentCache,
7659 (unsigned long) astContext.getSourceManager().getContentCacheSize());
7660
7661 // How much memory is being used by the MemoryBuffer's in SourceManager?
7662 const SourceManager::MemoryBufferSizes &srcBufs =
7663 astUnit->getSourceManager().getMemoryBufferSizes();
7664
7665 createCXTUResourceUsageEntry(*entries,
7666 CXTUResourceUsage_SourceManager_Membuffer_Malloc,
7667 (unsigned long) srcBufs.malloc_bytes);
7668 createCXTUResourceUsageEntry(*entries,
7669 CXTUResourceUsage_SourceManager_Membuffer_MMap,
7670 (unsigned long) srcBufs.mmap_bytes);
7671 createCXTUResourceUsageEntry(*entries,
7672 CXTUResourceUsage_SourceManager_DataStructures,
7673 (unsigned long) astContext.getSourceManager()
7674 .getDataStructureSizes());
7675
7676 // How much memory is being used by the ExternalASTSource?
7677 if (ExternalASTSource *esrc = astContext.getExternalSource()) {
7678 const ExternalASTSource::MemoryBufferSizes &sizes =
7679 esrc->getMemoryBufferSizes();
7680
7681 createCXTUResourceUsageEntry(*entries,
7682 CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc,
7683 (unsigned long) sizes.malloc_bytes);
7684 createCXTUResourceUsageEntry(*entries,
7685 CXTUResourceUsage_ExternalASTSource_Membuffer_MMap,
7686 (unsigned long) sizes.mmap_bytes);
7687 }
7688
7689 // How much memory is being used by the Preprocessor?
7690 Preprocessor &pp = astUnit->getPreprocessor();
7691 createCXTUResourceUsageEntry(*entries,
7692 CXTUResourceUsage_Preprocessor,
7693 pp.getTotalMemory());
7694
7695 if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) {
7696 createCXTUResourceUsageEntry(*entries,
7697 CXTUResourceUsage_PreprocessingRecord,
7698 pRec->getTotalMemory());
7699 }
7700
7701 createCXTUResourceUsageEntry(*entries,
7702 CXTUResourceUsage_Preprocessor_HeaderSearch,
7703 pp.getHeaderSearchInfo().getTotalMemory());
7704
7705 CXTUResourceUsage usage = { (void*) entries.get(),
7706 (unsigned) entries->size(),
7707 !entries->empty() ? &(*entries)[0] : nullptr };
7708 entries.release();
7709 return usage;
7710 }
7711
clang_disposeCXTUResourceUsage(CXTUResourceUsage usage)7712 void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) {
7713 if (usage.data)
7714 delete (MemUsageEntries*) usage.data;
7715 }
7716
clang_getSkippedRanges(CXTranslationUnit TU,CXFile file)7717 CXSourceRangeList *clang_getSkippedRanges(CXTranslationUnit TU, CXFile file) {
7718 CXSourceRangeList *skipped = new CXSourceRangeList;
7719 skipped->count = 0;
7720 skipped->ranges = nullptr;
7721
7722 if (isNotUsableTU(TU)) {
7723 LOG_BAD_TU(TU);
7724 return skipped;
7725 }
7726
7727 if (!file)
7728 return skipped;
7729
7730 ASTUnit *astUnit = cxtu::getASTUnit(TU);
7731 PreprocessingRecord *ppRec = astUnit->getPreprocessor().getPreprocessingRecord();
7732 if (!ppRec)
7733 return skipped;
7734
7735 ASTContext &Ctx = astUnit->getASTContext();
7736 SourceManager &sm = Ctx.getSourceManager();
7737 FileEntry *fileEntry = static_cast<FileEntry *>(file);
7738 FileID wantedFileID = sm.translateFile(fileEntry);
7739
7740 const std::vector<SourceRange> &SkippedRanges = ppRec->getSkippedRanges();
7741 std::vector<SourceRange> wantedRanges;
7742 for (std::vector<SourceRange>::const_iterator i = SkippedRanges.begin(), ei = SkippedRanges.end();
7743 i != ei; ++i) {
7744 if (sm.getFileID(i->getBegin()) == wantedFileID || sm.getFileID(i->getEnd()) == wantedFileID)
7745 wantedRanges.push_back(*i);
7746 }
7747
7748 skipped->count = wantedRanges.size();
7749 skipped->ranges = new CXSourceRange[skipped->count];
7750 for (unsigned i = 0, ei = skipped->count; i != ei; ++i)
7751 skipped->ranges[i] = cxloc::translateSourceRange(Ctx, wantedRanges[i]);
7752
7753 return skipped;
7754 }
7755
clang_disposeSourceRangeList(CXSourceRangeList * ranges)7756 void clang_disposeSourceRangeList(CXSourceRangeList *ranges) {
7757 if (ranges) {
7758 delete[] ranges->ranges;
7759 delete ranges;
7760 }
7761 }
7762
7763 } // end extern "C"
7764
PrintLibclangResourceUsage(CXTranslationUnit TU)7765 void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) {
7766 CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU);
7767 for (unsigned I = 0; I != Usage.numEntries; ++I)
7768 fprintf(stderr, " %s: %lu\n",
7769 clang_getTUResourceUsageName(Usage.entries[I].kind),
7770 Usage.entries[I].amount);
7771
7772 clang_disposeCXTUResourceUsage(Usage);
7773 }
7774
7775 //===----------------------------------------------------------------------===//
7776 // Misc. utility functions.
7777 //===----------------------------------------------------------------------===//
7778
7779 /// Default to using an 8 MB stack size on "safety" threads.
7780 static unsigned SafetyStackThreadSize = 8 << 20;
7781
7782 namespace clang {
7783
RunSafely(llvm::CrashRecoveryContext & CRC,llvm::function_ref<void ()> Fn,unsigned Size)7784 bool RunSafely(llvm::CrashRecoveryContext &CRC, llvm::function_ref<void()> Fn,
7785 unsigned Size) {
7786 if (!Size)
7787 Size = GetSafetyThreadStackSize();
7788 if (Size)
7789 return CRC.RunSafelyOnThread(Fn, Size);
7790 return CRC.RunSafely(Fn);
7791 }
7792
GetSafetyThreadStackSize()7793 unsigned GetSafetyThreadStackSize() {
7794 return SafetyStackThreadSize;
7795 }
7796
SetSafetyThreadStackSize(unsigned Value)7797 void SetSafetyThreadStackSize(unsigned Value) {
7798 SafetyStackThreadSize = Value;
7799 }
7800
7801 }
7802
setThreadBackgroundPriority()7803 void clang::setThreadBackgroundPriority() {
7804 if (getenv("LIBCLANG_BGPRIO_DISABLE"))
7805 return;
7806
7807 #ifdef USE_DARWIN_THREADS
7808 setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG);
7809 #endif
7810 }
7811
printDiagsToStderr(ASTUnit * Unit)7812 void cxindex::printDiagsToStderr(ASTUnit *Unit) {
7813 if (!Unit)
7814 return;
7815
7816 for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
7817 DEnd = Unit->stored_diag_end();
7818 D != DEnd; ++D) {
7819 CXStoredDiagnostic Diag(*D, Unit->getLangOpts());
7820 CXString Msg = clang_formatDiagnostic(&Diag,
7821 clang_defaultDiagnosticDisplayOptions());
7822 fprintf(stderr, "%s\n", clang_getCString(Msg));
7823 clang_disposeString(Msg);
7824 }
7825 #ifdef LLVM_ON_WIN32
7826 // On Windows, force a flush, since there may be multiple copies of
7827 // stderr and stdout in the file system, all with different buffers
7828 // but writing to the same device.
7829 fflush(stderr);
7830 #endif
7831 }
7832
getMacroInfo(const IdentifierInfo & II,SourceLocation MacroDefLoc,CXTranslationUnit TU)7833 MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II,
7834 SourceLocation MacroDefLoc,
7835 CXTranslationUnit TU){
7836 if (MacroDefLoc.isInvalid() || !TU)
7837 return nullptr;
7838 if (!II.hadMacroDefinition())
7839 return nullptr;
7840
7841 ASTUnit *Unit = cxtu::getASTUnit(TU);
7842 Preprocessor &PP = Unit->getPreprocessor();
7843 MacroDirective *MD = PP.getLocalMacroDirectiveHistory(&II);
7844 if (MD) {
7845 for (MacroDirective::DefInfo
7846 Def = MD->getDefinition(); Def; Def = Def.getPreviousDefinition()) {
7847 if (MacroDefLoc == Def.getMacroInfo()->getDefinitionLoc())
7848 return Def.getMacroInfo();
7849 }
7850 }
7851
7852 return nullptr;
7853 }
7854
getMacroInfo(const MacroDefinitionRecord * MacroDef,CXTranslationUnit TU)7855 const MacroInfo *cxindex::getMacroInfo(const MacroDefinitionRecord *MacroDef,
7856 CXTranslationUnit TU) {
7857 if (!MacroDef || !TU)
7858 return nullptr;
7859 const IdentifierInfo *II = MacroDef->getName();
7860 if (!II)
7861 return nullptr;
7862
7863 return getMacroInfo(*II, MacroDef->getLocation(), TU);
7864 }
7865
7866 MacroDefinitionRecord *
checkForMacroInMacroDefinition(const MacroInfo * MI,const Token & Tok,CXTranslationUnit TU)7867 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, const Token &Tok,
7868 CXTranslationUnit TU) {
7869 if (!MI || !TU)
7870 return nullptr;
7871 if (Tok.isNot(tok::raw_identifier))
7872 return nullptr;
7873
7874 if (MI->getNumTokens() == 0)
7875 return nullptr;
7876 SourceRange DefRange(MI->getReplacementToken(0).getLocation(),
7877 MI->getDefinitionEndLoc());
7878 ASTUnit *Unit = cxtu::getASTUnit(TU);
7879
7880 // Check that the token is inside the definition and not its argument list.
7881 SourceManager &SM = Unit->getSourceManager();
7882 if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin()))
7883 return nullptr;
7884 if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation()))
7885 return nullptr;
7886
7887 Preprocessor &PP = Unit->getPreprocessor();
7888 PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
7889 if (!PPRec)
7890 return nullptr;
7891
7892 IdentifierInfo &II = PP.getIdentifierTable().get(Tok.getRawIdentifier());
7893 if (!II.hadMacroDefinition())
7894 return nullptr;
7895
7896 // Check that the identifier is not one of the macro arguments.
7897 if (std::find(MI->arg_begin(), MI->arg_end(), &II) != MI->arg_end())
7898 return nullptr;
7899
7900 MacroDirective *InnerMD = PP.getLocalMacroDirectiveHistory(&II);
7901 if (!InnerMD)
7902 return nullptr;
7903
7904 return PPRec->findMacroDefinition(InnerMD->getMacroInfo());
7905 }
7906
7907 MacroDefinitionRecord *
checkForMacroInMacroDefinition(const MacroInfo * MI,SourceLocation Loc,CXTranslationUnit TU)7908 cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI, SourceLocation Loc,
7909 CXTranslationUnit TU) {
7910 if (Loc.isInvalid() || !MI || !TU)
7911 return nullptr;
7912
7913 if (MI->getNumTokens() == 0)
7914 return nullptr;
7915 ASTUnit *Unit = cxtu::getASTUnit(TU);
7916 Preprocessor &PP = Unit->getPreprocessor();
7917 if (!PP.getPreprocessingRecord())
7918 return nullptr;
7919 Loc = Unit->getSourceManager().getSpellingLoc(Loc);
7920 Token Tok;
7921 if (PP.getRawToken(Loc, Tok))
7922 return nullptr;
7923
7924 return checkForMacroInMacroDefinition(MI, Tok, TU);
7925 }
7926
7927 extern "C" {
7928
clang_getClangVersion()7929 CXString clang_getClangVersion() {
7930 return cxstring::createDup(getClangFullVersion());
7931 }
7932
7933 } // end: extern "C"
7934
operator <<(CXTranslationUnit TU)7935 Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) {
7936 if (TU) {
7937 if (ASTUnit *Unit = cxtu::getASTUnit(TU)) {
7938 LogOS << '<' << Unit->getMainFileName() << '>';
7939 if (Unit->isMainFileAST())
7940 LogOS << " (" << Unit->getASTFileName() << ')';
7941 return *this;
7942 }
7943 } else {
7944 LogOS << "<NULL TU>";
7945 }
7946 return *this;
7947 }
7948
operator <<(const FileEntry * FE)7949 Logger &cxindex::Logger::operator<<(const FileEntry *FE) {
7950 *this << FE->getName();
7951 return *this;
7952 }
7953
operator <<(CXCursor cursor)7954 Logger &cxindex::Logger::operator<<(CXCursor cursor) {
7955 CXString cursorName = clang_getCursorDisplayName(cursor);
7956 *this << cursorName << "@" << clang_getCursorLocation(cursor);
7957 clang_disposeString(cursorName);
7958 return *this;
7959 }
7960
operator <<(CXSourceLocation Loc)7961 Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) {
7962 CXFile File;
7963 unsigned Line, Column;
7964 clang_getFileLocation(Loc, &File, &Line, &Column, nullptr);
7965 CXString FileName = clang_getFileName(File);
7966 *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column);
7967 clang_disposeString(FileName);
7968 return *this;
7969 }
7970
operator <<(CXSourceRange range)7971 Logger &cxindex::Logger::operator<<(CXSourceRange range) {
7972 CXSourceLocation BLoc = clang_getRangeStart(range);
7973 CXSourceLocation ELoc = clang_getRangeEnd(range);
7974
7975 CXFile BFile;
7976 unsigned BLine, BColumn;
7977 clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, nullptr);
7978
7979 CXFile EFile;
7980 unsigned ELine, EColumn;
7981 clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, nullptr);
7982
7983 CXString BFileName = clang_getFileName(BFile);
7984 if (BFile == EFile) {
7985 *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName),
7986 BLine, BColumn, ELine, EColumn);
7987 } else {
7988 CXString EFileName = clang_getFileName(EFile);
7989 *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName),
7990 BLine, BColumn)
7991 << llvm::format("%s:%d:%d]", clang_getCString(EFileName),
7992 ELine, EColumn);
7993 clang_disposeString(EFileName);
7994 }
7995 clang_disposeString(BFileName);
7996 return *this;
7997 }
7998
operator <<(CXString Str)7999 Logger &cxindex::Logger::operator<<(CXString Str) {
8000 *this << clang_getCString(Str);
8001 return *this;
8002 }
8003
operator <<(const llvm::format_object_base & Fmt)8004 Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) {
8005 LogOS << Fmt;
8006 return *this;
8007 }
8008
8009 static llvm::ManagedStatic<llvm::sys::Mutex> LoggingMutex;
8010
~Logger()8011 cxindex::Logger::~Logger() {
8012 llvm::sys::ScopedLock L(*LoggingMutex);
8013
8014 static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime();
8015
8016 raw_ostream &OS = llvm::errs();
8017 OS << "[libclang:" << Name << ':';
8018
8019 #ifdef USE_DARWIN_THREADS
8020 // TODO: Portability.
8021 mach_port_t tid = pthread_mach_thread_np(pthread_self());
8022 OS << tid << ':';
8023 #endif
8024
8025 llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime();
8026 OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime());
8027 OS << Msg << '\n';
8028
8029 if (Trace) {
8030 llvm::sys::PrintStackTrace(OS);
8031 OS << "--------------------------------------------------\n";
8032 }
8033 }
8034
8035 #ifdef CLANG_TOOL_EXTRA_BUILD
8036 // This anchor is used to force the linker to link the clang-tidy plugin.
8037 extern volatile int ClangTidyPluginAnchorSource;
8038 static int LLVM_ATTRIBUTE_UNUSED ClangTidyPluginAnchorDestination =
8039 ClangTidyPluginAnchorSource;
8040 #endif
8041