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