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