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