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