blob: 7d999b86fbb5677b25a3405fbe3502b7049ebe66 [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"
Chandler Carruthb1ba0ef2013-01-19 08:09:44 +000017#include "CLog.h"
Guy Benyei7f92f2d2012-12-18 14:30:41 +000018#include "CXComment.h"
19#include "CXCursor.h"
20#include "CXSourceLocation.h"
21#include "CXString.h"
22#include "CXTranslationUnit.h"
23#include "CXType.h"
24#include "CursorVisitor.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"
Chandler Carruthb1ba0ef2013-01-19 08:09:44 +000039#include "llvm/Config/config.h"
Guy Benyei7f92f2d2012-12-18 14:30:41 +000040#include "llvm/Support/Compiler.h"
41#include "llvm/Support/CrashRecoveryContext.h"
Chandler Carruthb1ba0ef2013-01-19 08:09:44 +000042#include "llvm/Support/Format.h"
Guy Benyei7f92f2d2012-12-18 14:30:41 +000043#include "llvm/Support/MemoryBuffer.h"
44#include "llvm/Support/Mutex.h"
45#include "llvm/Support/PrettyStackTrace.h"
46#include "llvm/Support/Program.h"
47#include "llvm/Support/SaveAndRestore.h"
48#include "llvm/Support/Signals.h"
49#include "llvm/Support/Threading.h"
50#include "llvm/Support/Timer.h"
51#include "llvm/Support/raw_ostream.h"
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +000052
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;
Argyrios Kyrtzidisd7bf4a42013-01-16 18:13:00 +00002837 if (!TU)
2838 return;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002839
2840 // Reset the associated diagnostics.
2841 delete static_cast<CXDiagnosticSetImpl*>(TU->Diagnostics);
2842 TU->Diagnostics = 0;
2843
2844 unsigned num_unsaved_files = RTUI->num_unsaved_files;
2845 struct CXUnsavedFile *unsaved_files = RTUI->unsaved_files;
2846 unsigned options = RTUI->options;
2847 (void) options;
2848 RTUI->result = 1;
2849
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002850 CIndexer *CXXIdx = (CIndexer*)TU->CIdx;
2851 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
2852 setThreadBackgroundPriority();
2853
2854 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
2855 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
2856
2857 OwningPtr<std::vector<ASTUnit::RemappedFile> >
2858 RemappedFiles(new std::vector<ASTUnit::RemappedFile>());
2859
2860 // Recover resources if we crash before exiting this function.
2861 llvm::CrashRecoveryContextCleanupRegistrar<
2862 std::vector<ASTUnit::RemappedFile> > RemappedCleanup(RemappedFiles.get());
2863
2864 for (unsigned I = 0; I != num_unsaved_files; ++I) {
2865 StringRef Data(unsaved_files[I].Contents, unsaved_files[I].Length);
2866 const llvm::MemoryBuffer *Buffer
2867 = llvm::MemoryBuffer::getMemBufferCopy(Data, unsaved_files[I].Filename);
2868 RemappedFiles->push_back(std::make_pair(unsaved_files[I].Filename,
2869 Buffer));
2870 }
2871
2872 if (!CXXUnit->Reparse(RemappedFiles->size() ? &(*RemappedFiles)[0] : 0,
2873 RemappedFiles->size()))
2874 RTUI->result = 0;
2875}
2876
2877int clang_reparseTranslationUnit(CXTranslationUnit TU,
2878 unsigned num_unsaved_files,
2879 struct CXUnsavedFile *unsaved_files,
2880 unsigned options) {
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00002881 LOG_FUNC_SECTION {
2882 *Log << TU;
2883 }
2884
Guy Benyei7f92f2d2012-12-18 14:30:41 +00002885 ReparseTranslationUnitInfo RTUI = { TU, num_unsaved_files, unsaved_files,
2886 options, 0 };
2887
2888 if (getenv("LIBCLANG_NOTHREADS")) {
2889 clang_reparseTranslationUnit_Impl(&RTUI);
2890 return RTUI.result;
2891 }
2892
2893 llvm::CrashRecoveryContext CRC;
2894
2895 if (!RunSafely(CRC, clang_reparseTranslationUnit_Impl, &RTUI)) {
2896 fprintf(stderr, "libclang: crash detected during reparsing\n");
2897 static_cast<ASTUnit *>(TU->TUData)->setUnsafeToFree(true);
2898 return 1;
2899 } else if (getenv("LIBCLANG_RESOURCE_USAGE"))
2900 PrintLibclangResourceUsage(TU);
2901
2902 return RTUI.result;
2903}
2904
2905
2906CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
2907 if (!CTUnit)
2908 return createCXString("");
2909
2910 ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit->TUData);
2911 return createCXString(CXXUnit->getOriginalSourceFileName(), true);
2912}
2913
2914CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
2915 ASTUnit *CXXUnit = static_cast<ASTUnit*>(TU->TUData);
2916 return MakeCXCursor(CXXUnit->getASTContext().getTranslationUnitDecl(), TU);
2917}
2918
2919} // end: extern "C"
2920
2921//===----------------------------------------------------------------------===//
2922// CXFile Operations.
2923//===----------------------------------------------------------------------===//
2924
2925extern "C" {
2926CXString clang_getFileName(CXFile SFile) {
2927 if (!SFile)
2928 return createCXString((const char*)NULL);
2929
2930 FileEntry *FEnt = static_cast<FileEntry *>(SFile);
2931 return createCXString(FEnt->getName());
2932}
2933
2934time_t clang_getFileTime(CXFile SFile) {
2935 if (!SFile)
2936 return 0;
2937
2938 FileEntry *FEnt = static_cast<FileEntry *>(SFile);
2939 return FEnt->getModificationTime();
2940}
2941
2942CXFile clang_getFile(CXTranslationUnit tu, const char *file_name) {
2943 if (!tu)
2944 return 0;
2945
2946 ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu->TUData);
2947
2948 FileManager &FMgr = CXXUnit->getFileManager();
2949 return const_cast<FileEntry *>(FMgr.getFile(file_name));
2950}
2951
2952unsigned clang_isFileMultipleIncludeGuarded(CXTranslationUnit tu, CXFile file) {
2953 if (!tu || !file)
2954 return 0;
2955
2956 ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu->TUData);
2957 FileEntry *FEnt = static_cast<FileEntry *>(file);
2958 return CXXUnit->getPreprocessor().getHeaderSearchInfo()
2959 .isFileMultipleIncludeGuarded(FEnt);
2960}
2961
2962} // end: extern "C"
2963
2964//===----------------------------------------------------------------------===//
2965// CXCursor Operations.
2966//===----------------------------------------------------------------------===//
2967
2968static Decl *getDeclFromExpr(Stmt *E) {
2969 if (ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
2970 return getDeclFromExpr(CE->getSubExpr());
2971
2972 if (DeclRefExpr *RefExpr = dyn_cast<DeclRefExpr>(E))
2973 return RefExpr->getDecl();
2974 if (MemberExpr *ME = dyn_cast<MemberExpr>(E))
2975 return ME->getMemberDecl();
2976 if (ObjCIvarRefExpr *RE = dyn_cast<ObjCIvarRefExpr>(E))
2977 return RE->getDecl();
2978 if (ObjCPropertyRefExpr *PRE = dyn_cast<ObjCPropertyRefExpr>(E)) {
2979 if (PRE->isExplicitProperty())
2980 return PRE->getExplicitProperty();
2981 // It could be messaging both getter and setter as in:
2982 // ++myobj.myprop;
2983 // in which case prefer to associate the setter since it is less obvious
2984 // from inspecting the source that the setter is going to get called.
2985 if (PRE->isMessagingSetter())
2986 return PRE->getImplicitPropertySetter();
2987 return PRE->getImplicitPropertyGetter();
2988 }
2989 if (PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E))
2990 return getDeclFromExpr(POE->getSyntacticForm());
2991 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E))
2992 if (Expr *Src = OVE->getSourceExpr())
2993 return getDeclFromExpr(Src);
2994
2995 if (CallExpr *CE = dyn_cast<CallExpr>(E))
2996 return getDeclFromExpr(CE->getCallee());
2997 if (CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
2998 if (!CE->isElidable())
2999 return CE->getConstructor();
3000 if (ObjCMessageExpr *OME = dyn_cast<ObjCMessageExpr>(E))
3001 return OME->getMethodDecl();
3002
3003 if (ObjCProtocolExpr *PE = dyn_cast<ObjCProtocolExpr>(E))
3004 return PE->getProtocol();
3005 if (SubstNonTypeTemplateParmPackExpr *NTTP
3006 = dyn_cast<SubstNonTypeTemplateParmPackExpr>(E))
3007 return NTTP->getParameterPack();
3008 if (SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
3009 if (isa<NonTypeTemplateParmDecl>(SizeOfPack->getPack()) ||
3010 isa<ParmVarDecl>(SizeOfPack->getPack()))
3011 return SizeOfPack->getPack();
3012
3013 return 0;
3014}
3015
3016static SourceLocation getLocationFromExpr(Expr *E) {
3017 if (ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
3018 return getLocationFromExpr(CE->getSubExpr());
3019
3020 if (ObjCMessageExpr *Msg = dyn_cast<ObjCMessageExpr>(E))
3021 return /*FIXME:*/Msg->getLeftLoc();
3022 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
3023 return DRE->getLocation();
3024 if (MemberExpr *Member = dyn_cast<MemberExpr>(E))
3025 return Member->getMemberLoc();
3026 if (ObjCIvarRefExpr *Ivar = dyn_cast<ObjCIvarRefExpr>(E))
3027 return Ivar->getLocation();
3028 if (SizeOfPackExpr *SizeOfPack = dyn_cast<SizeOfPackExpr>(E))
3029 return SizeOfPack->getPackLoc();
3030 if (ObjCPropertyRefExpr *PropRef = dyn_cast<ObjCPropertyRefExpr>(E))
3031 return PropRef->getLocation();
3032
3033 return E->getLocStart();
3034}
3035
3036extern "C" {
3037
3038unsigned clang_visitChildren(CXCursor parent,
3039 CXCursorVisitor visitor,
3040 CXClientData client_data) {
3041 CursorVisitor CursorVis(getCursorTU(parent), visitor, client_data,
3042 /*VisitPreprocessorLast=*/false);
3043 return CursorVis.VisitChildren(parent);
3044}
3045
3046#ifndef __has_feature
3047#define __has_feature(x) 0
3048#endif
3049#if __has_feature(blocks)
3050typedef enum CXChildVisitResult
3051 (^CXCursorVisitorBlock)(CXCursor cursor, CXCursor parent);
3052
3053static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
3054 CXClientData client_data) {
3055 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
3056 return block(cursor, parent);
3057}
3058#else
3059// If we are compiled with a compiler that doesn't have native blocks support,
3060// define and call the block manually, so the
3061typedef struct _CXChildVisitResult
3062{
3063 void *isa;
3064 int flags;
3065 int reserved;
3066 enum CXChildVisitResult(*invoke)(struct _CXChildVisitResult*, CXCursor,
3067 CXCursor);
3068} *CXCursorVisitorBlock;
3069
3070static enum CXChildVisitResult visitWithBlock(CXCursor cursor, CXCursor parent,
3071 CXClientData client_data) {
3072 CXCursorVisitorBlock block = (CXCursorVisitorBlock)client_data;
3073 return block->invoke(block, cursor, parent);
3074}
3075#endif
3076
3077
3078unsigned clang_visitChildrenWithBlock(CXCursor parent,
3079 CXCursorVisitorBlock block) {
3080 return clang_visitChildren(parent, visitWithBlock, block);
3081}
3082
3083static CXString getDeclSpelling(Decl *D) {
3084 if (!D)
3085 return createCXString("");
3086
3087 NamedDecl *ND = dyn_cast<NamedDecl>(D);
3088 if (!ND) {
3089 if (ObjCPropertyImplDecl *PropImpl =dyn_cast<ObjCPropertyImplDecl>(D))
3090 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
3091 return createCXString(Property->getIdentifier()->getName());
3092
3093 if (ImportDecl *ImportD = dyn_cast<ImportDecl>(D))
3094 if (Module *Mod = ImportD->getImportedModule())
3095 return createCXString(Mod->getFullModuleName());
3096
3097 return createCXString("");
3098 }
3099
3100 if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(ND))
3101 return createCXString(OMD->getSelector().getAsString());
3102
3103 if (ObjCCategoryImplDecl *CIMP = dyn_cast<ObjCCategoryImplDecl>(ND))
3104 // No, this isn't the same as the code below. getIdentifier() is non-virtual
3105 // and returns different names. NamedDecl returns the class name and
3106 // ObjCCategoryImplDecl returns the category name.
3107 return createCXString(CIMP->getIdentifier()->getNameStart());
3108
3109 if (isa<UsingDirectiveDecl>(D))
3110 return createCXString("");
3111
3112 SmallString<1024> S;
3113 llvm::raw_svector_ostream os(S);
3114 ND->printName(os);
3115
3116 return createCXString(os.str());
3117}
3118
3119CXString clang_getCursorSpelling(CXCursor C) {
3120 if (clang_isTranslationUnit(C.kind))
Dmitri Gribenko46f92522013-01-11 19:28:44 +00003121 return clang_getTranslationUnitSpelling(getCursorTU(C));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003122
3123 if (clang_isReference(C.kind)) {
3124 switch (C.kind) {
3125 case CXCursor_ObjCSuperClassRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003126 const ObjCInterfaceDecl *Super = getCursorObjCSuperClassRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003127 return createCXString(Super->getIdentifier()->getNameStart());
3128 }
3129 case CXCursor_ObjCClassRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003130 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003131 return createCXString(Class->getIdentifier()->getNameStart());
3132 }
3133 case CXCursor_ObjCProtocolRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003134 const ObjCProtocolDecl *OID = getCursorObjCProtocolRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003135 assert(OID && "getCursorSpelling(): Missing protocol decl");
3136 return createCXString(OID->getIdentifier()->getNameStart());
3137 }
3138 case CXCursor_CXXBaseSpecifier: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003139 const CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003140 return createCXString(B->getType().getAsString());
3141 }
3142 case CXCursor_TypeRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003143 const TypeDecl *Type = getCursorTypeRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003144 assert(Type && "Missing type decl");
3145
3146 return createCXString(getCursorContext(C).getTypeDeclType(Type).
3147 getAsString());
3148 }
3149 case CXCursor_TemplateRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003150 const TemplateDecl *Template = getCursorTemplateRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003151 assert(Template && "Missing template decl");
3152
3153 return createCXString(Template->getNameAsString());
3154 }
3155
3156 case CXCursor_NamespaceRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003157 const NamedDecl *NS = getCursorNamespaceRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003158 assert(NS && "Missing namespace decl");
3159
3160 return createCXString(NS->getNameAsString());
3161 }
3162
3163 case CXCursor_MemberRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003164 const FieldDecl *Field = getCursorMemberRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003165 assert(Field && "Missing member decl");
3166
3167 return createCXString(Field->getNameAsString());
3168 }
3169
3170 case CXCursor_LabelRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003171 const LabelStmt *Label = getCursorLabelRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003172 assert(Label && "Missing label");
3173
3174 return createCXString(Label->getName());
3175 }
3176
3177 case CXCursor_OverloadedDeclRef: {
3178 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
3179 if (Decl *D = Storage.dyn_cast<Decl *>()) {
3180 if (NamedDecl *ND = dyn_cast<NamedDecl>(D))
3181 return createCXString(ND->getNameAsString());
3182 return createCXString("");
3183 }
3184 if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
3185 return createCXString(E->getName().getAsString());
3186 OverloadedTemplateStorage *Ovl
3187 = Storage.get<OverloadedTemplateStorage*>();
3188 if (Ovl->size() == 0)
3189 return createCXString("");
3190 return createCXString((*Ovl->begin())->getNameAsString());
3191 }
3192
3193 case CXCursor_VariableRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003194 const VarDecl *Var = getCursorVariableRef(C).first;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003195 assert(Var && "Missing variable decl");
3196
3197 return createCXString(Var->getNameAsString());
3198 }
3199
3200 default:
3201 return createCXString("<not implemented>");
3202 }
3203 }
3204
3205 if (clang_isExpression(C.kind)) {
3206 Decl *D = getDeclFromExpr(getCursorExpr(C));
3207 if (D)
3208 return getDeclSpelling(D);
3209 return createCXString("");
3210 }
3211
3212 if (clang_isStatement(C.kind)) {
3213 Stmt *S = getCursorStmt(C);
3214 if (LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S))
3215 return createCXString(Label->getName());
3216
3217 return createCXString("");
3218 }
3219
3220 if (C.kind == CXCursor_MacroExpansion)
Argyrios Kyrtzidis664b06f2013-01-07 19:16:25 +00003221 return createCXString(getCursorMacroExpansion(C).getName()
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003222 ->getNameStart());
3223
3224 if (C.kind == CXCursor_MacroDefinition)
3225 return createCXString(getCursorMacroDefinition(C)->getName()
3226 ->getNameStart());
3227
3228 if (C.kind == CXCursor_InclusionDirective)
3229 return createCXString(getCursorInclusionDirective(C)->getFileName());
3230
3231 if (clang_isDeclaration(C.kind))
3232 return getDeclSpelling(getCursorDecl(C));
3233
3234 if (C.kind == CXCursor_AnnotateAttr) {
3235 AnnotateAttr *AA = cast<AnnotateAttr>(cxcursor::getCursorAttr(C));
3236 return createCXString(AA->getAnnotation());
3237 }
3238
3239 if (C.kind == CXCursor_AsmLabelAttr) {
3240 AsmLabelAttr *AA = cast<AsmLabelAttr>(cxcursor::getCursorAttr(C));
3241 return createCXString(AA->getLabel());
3242 }
3243
3244 return createCXString("");
3245}
3246
3247CXSourceRange clang_Cursor_getSpellingNameRange(CXCursor C,
3248 unsigned pieceIndex,
3249 unsigned options) {
3250 if (clang_Cursor_isNull(C))
3251 return clang_getNullRange();
3252
3253 ASTContext &Ctx = getCursorContext(C);
3254
3255 if (clang_isStatement(C.kind)) {
3256 Stmt *S = getCursorStmt(C);
3257 if (LabelStmt *Label = dyn_cast_or_null<LabelStmt>(S)) {
3258 if (pieceIndex > 0)
3259 return clang_getNullRange();
3260 return cxloc::translateSourceRange(Ctx, Label->getIdentLoc());
3261 }
3262
3263 return clang_getNullRange();
3264 }
3265
3266 if (C.kind == CXCursor_ObjCMessageExpr) {
3267 if (ObjCMessageExpr *
3268 ME = dyn_cast_or_null<ObjCMessageExpr>(getCursorExpr(C))) {
3269 if (pieceIndex >= ME->getNumSelectorLocs())
3270 return clang_getNullRange();
3271 return cxloc::translateSourceRange(Ctx, ME->getSelectorLoc(pieceIndex));
3272 }
3273 }
3274
3275 if (C.kind == CXCursor_ObjCInstanceMethodDecl ||
3276 C.kind == CXCursor_ObjCClassMethodDecl) {
3277 if (ObjCMethodDecl *
3278 MD = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(C))) {
3279 if (pieceIndex >= MD->getNumSelectorLocs())
3280 return clang_getNullRange();
3281 return cxloc::translateSourceRange(Ctx, MD->getSelectorLoc(pieceIndex));
3282 }
3283 }
3284
3285 if (C.kind == CXCursor_ObjCCategoryDecl ||
3286 C.kind == CXCursor_ObjCCategoryImplDecl) {
3287 if (pieceIndex > 0)
3288 return clang_getNullRange();
3289 if (ObjCCategoryDecl *
3290 CD = dyn_cast_or_null<ObjCCategoryDecl>(getCursorDecl(C)))
3291 return cxloc::translateSourceRange(Ctx, CD->getCategoryNameLoc());
3292 if (ObjCCategoryImplDecl *
3293 CID = dyn_cast_or_null<ObjCCategoryImplDecl>(getCursorDecl(C)))
3294 return cxloc::translateSourceRange(Ctx, CID->getCategoryNameLoc());
3295 }
3296
3297 if (C.kind == CXCursor_ModuleImportDecl) {
3298 if (pieceIndex > 0)
3299 return clang_getNullRange();
3300 if (ImportDecl *ImportD = dyn_cast_or_null<ImportDecl>(getCursorDecl(C))) {
3301 ArrayRef<SourceLocation> Locs = ImportD->getIdentifierLocs();
3302 if (!Locs.empty())
3303 return cxloc::translateSourceRange(Ctx,
3304 SourceRange(Locs.front(), Locs.back()));
3305 }
3306 return clang_getNullRange();
3307 }
3308
3309 // FIXME: A CXCursor_InclusionDirective should give the location of the
3310 // filename, but we don't keep track of this.
3311
3312 // FIXME: A CXCursor_AnnotateAttr should give the location of the annotation
3313 // but we don't keep track of this.
3314
3315 // FIXME: A CXCursor_AsmLabelAttr should give the location of the label
3316 // but we don't keep track of this.
3317
3318 // Default handling, give the location of the cursor.
3319
3320 if (pieceIndex > 0)
3321 return clang_getNullRange();
3322
3323 CXSourceLocation CXLoc = clang_getCursorLocation(C);
3324 SourceLocation Loc = cxloc::translateSourceLocation(CXLoc);
3325 return cxloc::translateSourceRange(Ctx, Loc);
3326}
3327
3328CXString clang_getCursorDisplayName(CXCursor C) {
3329 if (!clang_isDeclaration(C.kind))
3330 return clang_getCursorSpelling(C);
3331
3332 Decl *D = getCursorDecl(C);
3333 if (!D)
3334 return createCXString("");
3335
3336 PrintingPolicy Policy = getCursorContext(C).getPrintingPolicy();
3337 if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D))
3338 D = FunTmpl->getTemplatedDecl();
3339
3340 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
3341 SmallString<64> Str;
3342 llvm::raw_svector_ostream OS(Str);
3343 OS << *Function;
3344 if (Function->getPrimaryTemplate())
3345 OS << "<>";
3346 OS << "(";
3347 for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I) {
3348 if (I)
3349 OS << ", ";
3350 OS << Function->getParamDecl(I)->getType().getAsString(Policy);
3351 }
3352
3353 if (Function->isVariadic()) {
3354 if (Function->getNumParams())
3355 OS << ", ";
3356 OS << "...";
3357 }
3358 OS << ")";
3359 return createCXString(OS.str());
3360 }
3361
3362 if (ClassTemplateDecl *ClassTemplate = dyn_cast<ClassTemplateDecl>(D)) {
3363 SmallString<64> Str;
3364 llvm::raw_svector_ostream OS(Str);
3365 OS << *ClassTemplate;
3366 OS << "<";
3367 TemplateParameterList *Params = ClassTemplate->getTemplateParameters();
3368 for (unsigned I = 0, N = Params->size(); I != N; ++I) {
3369 if (I)
3370 OS << ", ";
3371
3372 NamedDecl *Param = Params->getParam(I);
3373 if (Param->getIdentifier()) {
3374 OS << Param->getIdentifier()->getName();
3375 continue;
3376 }
3377
3378 // There is no parameter name, which makes this tricky. Try to come up
3379 // with something useful that isn't too long.
3380 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
3381 OS << (TTP->wasDeclaredWithTypename()? "typename" : "class");
3382 else if (NonTypeTemplateParmDecl *NTTP
3383 = dyn_cast<NonTypeTemplateParmDecl>(Param))
3384 OS << NTTP->getType().getAsString(Policy);
3385 else
3386 OS << "template<...> class";
3387 }
3388
3389 OS << ">";
3390 return createCXString(OS.str());
3391 }
3392
3393 if (ClassTemplateSpecializationDecl *ClassSpec
3394 = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
3395 // If the type was explicitly written, use that.
3396 if (TypeSourceInfo *TSInfo = ClassSpec->getTypeAsWritten())
3397 return createCXString(TSInfo->getType().getAsString(Policy));
3398
3399 SmallString<64> Str;
3400 llvm::raw_svector_ostream OS(Str);
3401 OS << *ClassSpec;
3402 OS << TemplateSpecializationType::PrintTemplateArgumentList(
3403 ClassSpec->getTemplateArgs().data(),
3404 ClassSpec->getTemplateArgs().size(),
3405 Policy);
3406 return createCXString(OS.str());
3407 }
3408
3409 return clang_getCursorSpelling(C);
3410}
3411
3412CXString clang_getCursorKindSpelling(enum CXCursorKind Kind) {
3413 switch (Kind) {
3414 case CXCursor_FunctionDecl:
3415 return createCXString("FunctionDecl");
3416 case CXCursor_TypedefDecl:
3417 return createCXString("TypedefDecl");
3418 case CXCursor_EnumDecl:
3419 return createCXString("EnumDecl");
3420 case CXCursor_EnumConstantDecl:
3421 return createCXString("EnumConstantDecl");
3422 case CXCursor_StructDecl:
3423 return createCXString("StructDecl");
3424 case CXCursor_UnionDecl:
3425 return createCXString("UnionDecl");
3426 case CXCursor_ClassDecl:
3427 return createCXString("ClassDecl");
3428 case CXCursor_FieldDecl:
3429 return createCXString("FieldDecl");
3430 case CXCursor_VarDecl:
3431 return createCXString("VarDecl");
3432 case CXCursor_ParmDecl:
3433 return createCXString("ParmDecl");
3434 case CXCursor_ObjCInterfaceDecl:
3435 return createCXString("ObjCInterfaceDecl");
3436 case CXCursor_ObjCCategoryDecl:
3437 return createCXString("ObjCCategoryDecl");
3438 case CXCursor_ObjCProtocolDecl:
3439 return createCXString("ObjCProtocolDecl");
3440 case CXCursor_ObjCPropertyDecl:
3441 return createCXString("ObjCPropertyDecl");
3442 case CXCursor_ObjCIvarDecl:
3443 return createCXString("ObjCIvarDecl");
3444 case CXCursor_ObjCInstanceMethodDecl:
3445 return createCXString("ObjCInstanceMethodDecl");
3446 case CXCursor_ObjCClassMethodDecl:
3447 return createCXString("ObjCClassMethodDecl");
3448 case CXCursor_ObjCImplementationDecl:
3449 return createCXString("ObjCImplementationDecl");
3450 case CXCursor_ObjCCategoryImplDecl:
3451 return createCXString("ObjCCategoryImplDecl");
3452 case CXCursor_CXXMethod:
3453 return createCXString("CXXMethod");
3454 case CXCursor_UnexposedDecl:
3455 return createCXString("UnexposedDecl");
3456 case CXCursor_ObjCSuperClassRef:
3457 return createCXString("ObjCSuperClassRef");
3458 case CXCursor_ObjCProtocolRef:
3459 return createCXString("ObjCProtocolRef");
3460 case CXCursor_ObjCClassRef:
3461 return createCXString("ObjCClassRef");
3462 case CXCursor_TypeRef:
3463 return createCXString("TypeRef");
3464 case CXCursor_TemplateRef:
3465 return createCXString("TemplateRef");
3466 case CXCursor_NamespaceRef:
3467 return createCXString("NamespaceRef");
3468 case CXCursor_MemberRef:
3469 return createCXString("MemberRef");
3470 case CXCursor_LabelRef:
3471 return createCXString("LabelRef");
3472 case CXCursor_OverloadedDeclRef:
3473 return createCXString("OverloadedDeclRef");
3474 case CXCursor_VariableRef:
3475 return createCXString("VariableRef");
3476 case CXCursor_IntegerLiteral:
3477 return createCXString("IntegerLiteral");
3478 case CXCursor_FloatingLiteral:
3479 return createCXString("FloatingLiteral");
3480 case CXCursor_ImaginaryLiteral:
3481 return createCXString("ImaginaryLiteral");
3482 case CXCursor_StringLiteral:
3483 return createCXString("StringLiteral");
3484 case CXCursor_CharacterLiteral:
3485 return createCXString("CharacterLiteral");
3486 case CXCursor_ParenExpr:
3487 return createCXString("ParenExpr");
3488 case CXCursor_UnaryOperator:
3489 return createCXString("UnaryOperator");
3490 case CXCursor_ArraySubscriptExpr:
3491 return createCXString("ArraySubscriptExpr");
3492 case CXCursor_BinaryOperator:
3493 return createCXString("BinaryOperator");
3494 case CXCursor_CompoundAssignOperator:
3495 return createCXString("CompoundAssignOperator");
3496 case CXCursor_ConditionalOperator:
3497 return createCXString("ConditionalOperator");
3498 case CXCursor_CStyleCastExpr:
3499 return createCXString("CStyleCastExpr");
3500 case CXCursor_CompoundLiteralExpr:
3501 return createCXString("CompoundLiteralExpr");
3502 case CXCursor_InitListExpr:
3503 return createCXString("InitListExpr");
3504 case CXCursor_AddrLabelExpr:
3505 return createCXString("AddrLabelExpr");
3506 case CXCursor_StmtExpr:
3507 return createCXString("StmtExpr");
3508 case CXCursor_GenericSelectionExpr:
3509 return createCXString("GenericSelectionExpr");
3510 case CXCursor_GNUNullExpr:
3511 return createCXString("GNUNullExpr");
3512 case CXCursor_CXXStaticCastExpr:
3513 return createCXString("CXXStaticCastExpr");
3514 case CXCursor_CXXDynamicCastExpr:
3515 return createCXString("CXXDynamicCastExpr");
3516 case CXCursor_CXXReinterpretCastExpr:
3517 return createCXString("CXXReinterpretCastExpr");
3518 case CXCursor_CXXConstCastExpr:
3519 return createCXString("CXXConstCastExpr");
3520 case CXCursor_CXXFunctionalCastExpr:
3521 return createCXString("CXXFunctionalCastExpr");
3522 case CXCursor_CXXTypeidExpr:
3523 return createCXString("CXXTypeidExpr");
3524 case CXCursor_CXXBoolLiteralExpr:
3525 return createCXString("CXXBoolLiteralExpr");
3526 case CXCursor_CXXNullPtrLiteralExpr:
3527 return createCXString("CXXNullPtrLiteralExpr");
3528 case CXCursor_CXXThisExpr:
3529 return createCXString("CXXThisExpr");
3530 case CXCursor_CXXThrowExpr:
3531 return createCXString("CXXThrowExpr");
3532 case CXCursor_CXXNewExpr:
3533 return createCXString("CXXNewExpr");
3534 case CXCursor_CXXDeleteExpr:
3535 return createCXString("CXXDeleteExpr");
3536 case CXCursor_UnaryExpr:
3537 return createCXString("UnaryExpr");
3538 case CXCursor_ObjCStringLiteral:
3539 return createCXString("ObjCStringLiteral");
3540 case CXCursor_ObjCBoolLiteralExpr:
3541 return createCXString("ObjCBoolLiteralExpr");
3542 case CXCursor_ObjCEncodeExpr:
3543 return createCXString("ObjCEncodeExpr");
3544 case CXCursor_ObjCSelectorExpr:
3545 return createCXString("ObjCSelectorExpr");
3546 case CXCursor_ObjCProtocolExpr:
3547 return createCXString("ObjCProtocolExpr");
3548 case CXCursor_ObjCBridgedCastExpr:
3549 return createCXString("ObjCBridgedCastExpr");
3550 case CXCursor_BlockExpr:
3551 return createCXString("BlockExpr");
3552 case CXCursor_PackExpansionExpr:
3553 return createCXString("PackExpansionExpr");
3554 case CXCursor_SizeOfPackExpr:
3555 return createCXString("SizeOfPackExpr");
3556 case CXCursor_LambdaExpr:
3557 return createCXString("LambdaExpr");
3558 case CXCursor_UnexposedExpr:
3559 return createCXString("UnexposedExpr");
3560 case CXCursor_DeclRefExpr:
3561 return createCXString("DeclRefExpr");
3562 case CXCursor_MemberRefExpr:
3563 return createCXString("MemberRefExpr");
3564 case CXCursor_CallExpr:
3565 return createCXString("CallExpr");
3566 case CXCursor_ObjCMessageExpr:
3567 return createCXString("ObjCMessageExpr");
3568 case CXCursor_UnexposedStmt:
3569 return createCXString("UnexposedStmt");
3570 case CXCursor_DeclStmt:
3571 return createCXString("DeclStmt");
3572 case CXCursor_LabelStmt:
3573 return createCXString("LabelStmt");
3574 case CXCursor_CompoundStmt:
3575 return createCXString("CompoundStmt");
3576 case CXCursor_CaseStmt:
3577 return createCXString("CaseStmt");
3578 case CXCursor_DefaultStmt:
3579 return createCXString("DefaultStmt");
3580 case CXCursor_IfStmt:
3581 return createCXString("IfStmt");
3582 case CXCursor_SwitchStmt:
3583 return createCXString("SwitchStmt");
3584 case CXCursor_WhileStmt:
3585 return createCXString("WhileStmt");
3586 case CXCursor_DoStmt:
3587 return createCXString("DoStmt");
3588 case CXCursor_ForStmt:
3589 return createCXString("ForStmt");
3590 case CXCursor_GotoStmt:
3591 return createCXString("GotoStmt");
3592 case CXCursor_IndirectGotoStmt:
3593 return createCXString("IndirectGotoStmt");
3594 case CXCursor_ContinueStmt:
3595 return createCXString("ContinueStmt");
3596 case CXCursor_BreakStmt:
3597 return createCXString("BreakStmt");
3598 case CXCursor_ReturnStmt:
3599 return createCXString("ReturnStmt");
3600 case CXCursor_GCCAsmStmt:
3601 return createCXString("GCCAsmStmt");
3602 case CXCursor_MSAsmStmt:
3603 return createCXString("MSAsmStmt");
3604 case CXCursor_ObjCAtTryStmt:
3605 return createCXString("ObjCAtTryStmt");
3606 case CXCursor_ObjCAtCatchStmt:
3607 return createCXString("ObjCAtCatchStmt");
3608 case CXCursor_ObjCAtFinallyStmt:
3609 return createCXString("ObjCAtFinallyStmt");
3610 case CXCursor_ObjCAtThrowStmt:
3611 return createCXString("ObjCAtThrowStmt");
3612 case CXCursor_ObjCAtSynchronizedStmt:
3613 return createCXString("ObjCAtSynchronizedStmt");
3614 case CXCursor_ObjCAutoreleasePoolStmt:
3615 return createCXString("ObjCAutoreleasePoolStmt");
3616 case CXCursor_ObjCForCollectionStmt:
3617 return createCXString("ObjCForCollectionStmt");
3618 case CXCursor_CXXCatchStmt:
3619 return createCXString("CXXCatchStmt");
3620 case CXCursor_CXXTryStmt:
3621 return createCXString("CXXTryStmt");
3622 case CXCursor_CXXForRangeStmt:
3623 return createCXString("CXXForRangeStmt");
3624 case CXCursor_SEHTryStmt:
3625 return createCXString("SEHTryStmt");
3626 case CXCursor_SEHExceptStmt:
3627 return createCXString("SEHExceptStmt");
3628 case CXCursor_SEHFinallyStmt:
3629 return createCXString("SEHFinallyStmt");
3630 case CXCursor_NullStmt:
3631 return createCXString("NullStmt");
3632 case CXCursor_InvalidFile:
3633 return createCXString("InvalidFile");
3634 case CXCursor_InvalidCode:
3635 return createCXString("InvalidCode");
3636 case CXCursor_NoDeclFound:
3637 return createCXString("NoDeclFound");
3638 case CXCursor_NotImplemented:
3639 return createCXString("NotImplemented");
3640 case CXCursor_TranslationUnit:
3641 return createCXString("TranslationUnit");
3642 case CXCursor_UnexposedAttr:
3643 return createCXString("UnexposedAttr");
3644 case CXCursor_IBActionAttr:
3645 return createCXString("attribute(ibaction)");
3646 case CXCursor_IBOutletAttr:
3647 return createCXString("attribute(iboutlet)");
3648 case CXCursor_IBOutletCollectionAttr:
3649 return createCXString("attribute(iboutletcollection)");
3650 case CXCursor_CXXFinalAttr:
3651 return createCXString("attribute(final)");
3652 case CXCursor_CXXOverrideAttr:
3653 return createCXString("attribute(override)");
3654 case CXCursor_AnnotateAttr:
3655 return createCXString("attribute(annotate)");
3656 case CXCursor_AsmLabelAttr:
3657 return createCXString("asm label");
3658 case CXCursor_PreprocessingDirective:
3659 return createCXString("preprocessing directive");
3660 case CXCursor_MacroDefinition:
3661 return createCXString("macro definition");
3662 case CXCursor_MacroExpansion:
3663 return createCXString("macro expansion");
3664 case CXCursor_InclusionDirective:
3665 return createCXString("inclusion directive");
3666 case CXCursor_Namespace:
3667 return createCXString("Namespace");
3668 case CXCursor_LinkageSpec:
3669 return createCXString("LinkageSpec");
3670 case CXCursor_CXXBaseSpecifier:
3671 return createCXString("C++ base class specifier");
3672 case CXCursor_Constructor:
3673 return createCXString("CXXConstructor");
3674 case CXCursor_Destructor:
3675 return createCXString("CXXDestructor");
3676 case CXCursor_ConversionFunction:
3677 return createCXString("CXXConversion");
3678 case CXCursor_TemplateTypeParameter:
3679 return createCXString("TemplateTypeParameter");
3680 case CXCursor_NonTypeTemplateParameter:
3681 return createCXString("NonTypeTemplateParameter");
3682 case CXCursor_TemplateTemplateParameter:
3683 return createCXString("TemplateTemplateParameter");
3684 case CXCursor_FunctionTemplate:
3685 return createCXString("FunctionTemplate");
3686 case CXCursor_ClassTemplate:
3687 return createCXString("ClassTemplate");
3688 case CXCursor_ClassTemplatePartialSpecialization:
3689 return createCXString("ClassTemplatePartialSpecialization");
3690 case CXCursor_NamespaceAlias:
3691 return createCXString("NamespaceAlias");
3692 case CXCursor_UsingDirective:
3693 return createCXString("UsingDirective");
3694 case CXCursor_UsingDeclaration:
3695 return createCXString("UsingDeclaration");
3696 case CXCursor_TypeAliasDecl:
3697 return createCXString("TypeAliasDecl");
3698 case CXCursor_ObjCSynthesizeDecl:
3699 return createCXString("ObjCSynthesizeDecl");
3700 case CXCursor_ObjCDynamicDecl:
3701 return createCXString("ObjCDynamicDecl");
3702 case CXCursor_CXXAccessSpecifier:
3703 return createCXString("CXXAccessSpecifier");
3704 case CXCursor_ModuleImportDecl:
3705 return createCXString("ModuleImport");
3706 }
3707
3708 llvm_unreachable("Unhandled CXCursorKind");
3709}
3710
3711struct GetCursorData {
3712 SourceLocation TokenBeginLoc;
3713 bool PointsAtMacroArgExpansion;
3714 bool VisitedObjCPropertyImplDecl;
3715 SourceLocation VisitedDeclaratorDeclStartLoc;
3716 CXCursor &BestCursor;
3717
3718 GetCursorData(SourceManager &SM,
3719 SourceLocation tokenBegin, CXCursor &outputCursor)
3720 : TokenBeginLoc(tokenBegin), BestCursor(outputCursor) {
3721 PointsAtMacroArgExpansion = SM.isMacroArgExpansion(tokenBegin);
3722 VisitedObjCPropertyImplDecl = false;
3723 }
3724};
3725
3726static enum CXChildVisitResult GetCursorVisitor(CXCursor cursor,
3727 CXCursor parent,
3728 CXClientData client_data) {
3729 GetCursorData *Data = static_cast<GetCursorData *>(client_data);
3730 CXCursor *BestCursor = &Data->BestCursor;
3731
3732 // If we point inside a macro argument we should provide info of what the
3733 // token is so use the actual cursor, don't replace it with a macro expansion
3734 // cursor.
3735 if (cursor.kind == CXCursor_MacroExpansion && Data->PointsAtMacroArgExpansion)
3736 return CXChildVisit_Recurse;
3737
3738 if (clang_isDeclaration(cursor.kind)) {
3739 // Avoid having the implicit methods override the property decls.
3740 if (ObjCMethodDecl *MD
3741 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
3742 if (MD->isImplicit())
3743 return CXChildVisit_Break;
3744
3745 } else if (ObjCInterfaceDecl *ID
3746 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(cursor))) {
3747 // Check that when we have multiple @class references in the same line,
3748 // that later ones do not override the previous ones.
3749 // If we have:
3750 // @class Foo, Bar;
3751 // source ranges for both start at '@', so 'Bar' will end up overriding
3752 // 'Foo' even though the cursor location was at 'Foo'.
3753 if (BestCursor->kind == CXCursor_ObjCInterfaceDecl ||
3754 BestCursor->kind == CXCursor_ObjCClassRef)
3755 if (ObjCInterfaceDecl *PrevID
3756 = dyn_cast_or_null<ObjCInterfaceDecl>(getCursorDecl(*BestCursor))){
3757 if (PrevID != ID &&
3758 !PrevID->isThisDeclarationADefinition() &&
3759 !ID->isThisDeclarationADefinition())
3760 return CXChildVisit_Break;
3761 }
3762
3763 } else if (DeclaratorDecl *DD
3764 = dyn_cast_or_null<DeclaratorDecl>(getCursorDecl(cursor))) {
3765 SourceLocation StartLoc = DD->getSourceRange().getBegin();
3766 // Check that when we have multiple declarators in the same line,
3767 // that later ones do not override the previous ones.
3768 // If we have:
3769 // int Foo, Bar;
3770 // source ranges for both start at 'int', so 'Bar' will end up overriding
3771 // 'Foo' even though the cursor location was at 'Foo'.
3772 if (Data->VisitedDeclaratorDeclStartLoc == StartLoc)
3773 return CXChildVisit_Break;
3774 Data->VisitedDeclaratorDeclStartLoc = StartLoc;
3775
3776 } else if (ObjCPropertyImplDecl *PropImp
3777 = dyn_cast_or_null<ObjCPropertyImplDecl>(getCursorDecl(cursor))) {
3778 (void)PropImp;
3779 // Check that when we have multiple @synthesize in the same line,
3780 // that later ones do not override the previous ones.
3781 // If we have:
3782 // @synthesize Foo, Bar;
3783 // source ranges for both start at '@', so 'Bar' will end up overriding
3784 // 'Foo' even though the cursor location was at 'Foo'.
3785 if (Data->VisitedObjCPropertyImplDecl)
3786 return CXChildVisit_Break;
3787 Data->VisitedObjCPropertyImplDecl = true;
3788 }
3789 }
3790
3791 if (clang_isExpression(cursor.kind) &&
3792 clang_isDeclaration(BestCursor->kind)) {
3793 if (Decl *D = getCursorDecl(*BestCursor)) {
3794 // Avoid having the cursor of an expression replace the declaration cursor
3795 // when the expression source range overlaps the declaration range.
3796 // This can happen for C++ constructor expressions whose range generally
3797 // include the variable declaration, e.g.:
3798 // MyCXXClass foo; // Make sure pointing at 'foo' returns a VarDecl cursor.
3799 if (D->getLocation().isValid() && Data->TokenBeginLoc.isValid() &&
3800 D->getLocation() == Data->TokenBeginLoc)
3801 return CXChildVisit_Break;
3802 }
3803 }
3804
3805 // If our current best cursor is the construction of a temporary object,
3806 // don't replace that cursor with a type reference, because we want
3807 // clang_getCursor() to point at the constructor.
3808 if (clang_isExpression(BestCursor->kind) &&
3809 isa<CXXTemporaryObjectExpr>(getCursorExpr(*BestCursor)) &&
3810 cursor.kind == CXCursor_TypeRef) {
3811 // Keep the cursor pointing at CXXTemporaryObjectExpr but also mark it
3812 // as having the actual point on the type reference.
3813 *BestCursor = getTypeRefedCallExprCursor(*BestCursor);
3814 return CXChildVisit_Recurse;
3815 }
3816
3817 *BestCursor = cursor;
3818 return CXChildVisit_Recurse;
3819}
3820
3821CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
3822 if (!TU)
3823 return clang_getNullCursor();
3824
3825 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
3826 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
3827
3828 SourceLocation SLoc = cxloc::translateSourceLocation(Loc);
3829 CXCursor Result = cxcursor::getCursor(TU, SLoc);
3830
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00003831 LOG_FUNC_SECTION {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003832 CXFile SearchFile;
3833 unsigned SearchLine, SearchColumn;
3834 CXFile ResultFile;
3835 unsigned ResultLine, ResultColumn;
3836 CXString SearchFileName, ResultFileName, KindSpelling, USR;
3837 const char *IsDef = clang_isCursorDefinition(Result)? " (Definition)" : "";
3838 CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
3839
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00003840 clang_getFileLocation(Loc, &SearchFile, &SearchLine, &SearchColumn, 0);
3841 clang_getFileLocation(ResultLoc, &ResultFile, &ResultLine,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003842 &ResultColumn, 0);
3843 SearchFileName = clang_getFileName(SearchFile);
3844 ResultFileName = clang_getFileName(ResultFile);
3845 KindSpelling = clang_getCursorKindSpelling(Result.kind);
3846 USR = clang_getCursorUSR(Result);
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00003847 *Log << llvm::format("(%s:%d:%d) = %s",
3848 clang_getCString(SearchFileName), SearchLine, SearchColumn,
3849 clang_getCString(KindSpelling))
3850 << llvm::format("(%s:%d:%d):%s%s",
3851 clang_getCString(ResultFileName), ResultLine, ResultColumn,
3852 clang_getCString(USR), IsDef);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003853 clang_disposeString(SearchFileName);
3854 clang_disposeString(ResultFileName);
3855 clang_disposeString(KindSpelling);
3856 clang_disposeString(USR);
3857
3858 CXCursor Definition = clang_getCursorDefinition(Result);
3859 if (!clang_equalCursors(Definition, clang_getNullCursor())) {
3860 CXSourceLocation DefinitionLoc = clang_getCursorLocation(Definition);
3861 CXString DefinitionKindSpelling
3862 = clang_getCursorKindSpelling(Definition.kind);
3863 CXFile DefinitionFile;
3864 unsigned DefinitionLine, DefinitionColumn;
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00003865 clang_getFileLocation(DefinitionLoc, &DefinitionFile,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003866 &DefinitionLine, &DefinitionColumn, 0);
3867 CXString DefinitionFileName = clang_getFileName(DefinitionFile);
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00003868 *Log << llvm::format(" -> %s(%s:%d:%d)",
3869 clang_getCString(DefinitionKindSpelling),
3870 clang_getCString(DefinitionFileName),
3871 DefinitionLine, DefinitionColumn);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003872 clang_disposeString(DefinitionFileName);
3873 clang_disposeString(DefinitionKindSpelling);
3874 }
3875 }
3876
3877 return Result;
3878}
3879
3880CXCursor clang_getNullCursor(void) {
3881 return MakeCXCursorInvalid(CXCursor_InvalidFile);
3882}
3883
3884unsigned clang_equalCursors(CXCursor X, CXCursor Y) {
Argyrios Kyrtzidisd1d9df62013-01-08 18:23:28 +00003885 // Clear out the "FirstInDeclGroup" part in a declaration cursor, since we
3886 // can't set consistently. For example, when visiting a DeclStmt we will set
3887 // it but we don't set it on the result of clang_getCursorDefinition for
3888 // a reference of the same declaration.
3889 // FIXME: Setting "FirstInDeclGroup" in CXCursors is a hack that only works
3890 // when visiting a DeclStmt currently, the AST should be enhanced to be able
3891 // to provide that kind of info.
3892 if (clang_isDeclaration(X.kind))
3893 X.data[1] = 0;
3894 if (clang_isDeclaration(Y.kind))
3895 Y.data[1] = 0;
3896
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003897 return X == Y;
3898}
3899
3900unsigned clang_hashCursor(CXCursor C) {
3901 unsigned Index = 0;
3902 if (clang_isExpression(C.kind) || clang_isStatement(C.kind))
3903 Index = 1;
3904
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003905 return llvm::DenseMapInfo<std::pair<unsigned, const void*> >::getHashValue(
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003906 std::make_pair(C.kind, C.data[Index]));
3907}
3908
3909unsigned clang_isInvalid(enum CXCursorKind K) {
3910 return K >= CXCursor_FirstInvalid && K <= CXCursor_LastInvalid;
3911}
3912
3913unsigned clang_isDeclaration(enum CXCursorKind K) {
3914 return (K >= CXCursor_FirstDecl && K <= CXCursor_LastDecl) ||
3915 (K >= CXCursor_FirstExtraDecl && K <= CXCursor_LastExtraDecl);
3916}
3917
3918unsigned clang_isReference(enum CXCursorKind K) {
3919 return K >= CXCursor_FirstRef && K <= CXCursor_LastRef;
3920}
3921
3922unsigned clang_isExpression(enum CXCursorKind K) {
3923 return K >= CXCursor_FirstExpr && K <= CXCursor_LastExpr;
3924}
3925
3926unsigned clang_isStatement(enum CXCursorKind K) {
3927 return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
3928}
3929
3930unsigned clang_isAttribute(enum CXCursorKind K) {
3931 return K >= CXCursor_FirstAttr && K <= CXCursor_LastAttr;
3932}
3933
3934unsigned clang_isTranslationUnit(enum CXCursorKind K) {
3935 return K == CXCursor_TranslationUnit;
3936}
3937
3938unsigned clang_isPreprocessing(enum CXCursorKind K) {
3939 return K >= CXCursor_FirstPreprocessing && K <= CXCursor_LastPreprocessing;
3940}
3941
3942unsigned clang_isUnexposed(enum CXCursorKind K) {
3943 switch (K) {
3944 case CXCursor_UnexposedDecl:
3945 case CXCursor_UnexposedExpr:
3946 case CXCursor_UnexposedStmt:
3947 case CXCursor_UnexposedAttr:
3948 return true;
3949 default:
3950 return false;
3951 }
3952}
3953
3954CXCursorKind clang_getCursorKind(CXCursor C) {
3955 return C.kind;
3956}
3957
3958CXSourceLocation clang_getCursorLocation(CXCursor C) {
3959 if (clang_isReference(C.kind)) {
3960 switch (C.kind) {
3961 case CXCursor_ObjCSuperClassRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003962 std::pair<const ObjCInterfaceDecl *, SourceLocation> P
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003963 = getCursorObjCSuperClassRef(C);
3964 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3965 }
3966
3967 case CXCursor_ObjCProtocolRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003968 std::pair<const ObjCProtocolDecl *, SourceLocation> P
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003969 = getCursorObjCProtocolRef(C);
3970 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3971 }
3972
3973 case CXCursor_ObjCClassRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003974 std::pair<const ObjCInterfaceDecl *, SourceLocation> P
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003975 = getCursorObjCClassRef(C);
3976 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3977 }
3978
3979 case CXCursor_TypeRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003980 std::pair<const TypeDecl *, SourceLocation> P = getCursorTypeRef(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003981 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3982 }
3983
3984 case CXCursor_TemplateRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003985 std::pair<const TemplateDecl *, SourceLocation> P =
3986 getCursorTemplateRef(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003987 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3988 }
3989
3990 case CXCursor_NamespaceRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003991 std::pair<const NamedDecl *, SourceLocation> P = getCursorNamespaceRef(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003992 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3993 }
3994
3995 case CXCursor_MemberRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00003996 std::pair<const FieldDecl *, SourceLocation> P = getCursorMemberRef(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00003997 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
3998 }
3999
4000 case CXCursor_VariableRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00004001 std::pair<const VarDecl *, SourceLocation> P = getCursorVariableRef(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004002 return cxloc::translateSourceLocation(P.first->getASTContext(), P.second);
4003 }
4004
4005 case CXCursor_CXXBaseSpecifier: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00004006 const CXXBaseSpecifier *BaseSpec = getCursorCXXBaseSpecifier(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004007 if (!BaseSpec)
4008 return clang_getNullLocation();
4009
4010 if (TypeSourceInfo *TSInfo = BaseSpec->getTypeSourceInfo())
4011 return cxloc::translateSourceLocation(getCursorContext(C),
4012 TSInfo->getTypeLoc().getBeginLoc());
4013
4014 return cxloc::translateSourceLocation(getCursorContext(C),
4015 BaseSpec->getLocStart());
4016 }
4017
4018 case CXCursor_LabelRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00004019 std::pair<const LabelStmt *, SourceLocation> P = getCursorLabelRef(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004020 return cxloc::translateSourceLocation(getCursorContext(C), P.second);
4021 }
4022
4023 case CXCursor_OverloadedDeclRef:
4024 return cxloc::translateSourceLocation(getCursorContext(C),
4025 getCursorOverloadedDeclRef(C).second);
4026
4027 default:
4028 // FIXME: Need a way to enumerate all non-reference cases.
4029 llvm_unreachable("Missed a reference kind");
4030 }
4031 }
4032
4033 if (clang_isExpression(C.kind))
4034 return cxloc::translateSourceLocation(getCursorContext(C),
4035 getLocationFromExpr(getCursorExpr(C)));
4036
4037 if (clang_isStatement(C.kind))
4038 return cxloc::translateSourceLocation(getCursorContext(C),
4039 getCursorStmt(C)->getLocStart());
4040
4041 if (C.kind == CXCursor_PreprocessingDirective) {
4042 SourceLocation L = cxcursor::getCursorPreprocessingDirective(C).getBegin();
4043 return cxloc::translateSourceLocation(getCursorContext(C), L);
4044 }
4045
4046 if (C.kind == CXCursor_MacroExpansion) {
4047 SourceLocation L
Argyrios Kyrtzidis664b06f2013-01-07 19:16:25 +00004048 = cxcursor::getCursorMacroExpansion(C).getSourceRange().getBegin();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004049 return cxloc::translateSourceLocation(getCursorContext(C), L);
4050 }
4051
4052 if (C.kind == CXCursor_MacroDefinition) {
4053 SourceLocation L = cxcursor::getCursorMacroDefinition(C)->getLocation();
4054 return cxloc::translateSourceLocation(getCursorContext(C), L);
4055 }
4056
4057 if (C.kind == CXCursor_InclusionDirective) {
4058 SourceLocation L
4059 = cxcursor::getCursorInclusionDirective(C)->getSourceRange().getBegin();
4060 return cxloc::translateSourceLocation(getCursorContext(C), L);
4061 }
4062
4063 if (!clang_isDeclaration(C.kind))
4064 return clang_getNullLocation();
4065
4066 Decl *D = getCursorDecl(C);
4067 if (!D)
4068 return clang_getNullLocation();
4069
4070 SourceLocation Loc = D->getLocation();
4071 // FIXME: Multiple variables declared in a single declaration
4072 // currently lack the information needed to correctly determine their
4073 // ranges when accounting for the type-specifier. We use context
4074 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
4075 // and if so, whether it is the first decl.
4076 if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
4077 if (!cxcursor::isFirstInDeclGroup(C))
4078 Loc = VD->getLocation();
4079 }
4080
4081 // For ObjC methods, give the start location of the method name.
4082 if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
4083 Loc = MD->getSelectorStartLoc();
4084
4085 return cxloc::translateSourceLocation(getCursorContext(C), Loc);
4086}
4087
4088} // end extern "C"
4089
4090CXCursor cxcursor::getCursor(CXTranslationUnit TU, SourceLocation SLoc) {
4091 assert(TU);
4092
4093 // Guard against an invalid SourceLocation, or we may assert in one
4094 // of the following calls.
4095 if (SLoc.isInvalid())
4096 return clang_getNullCursor();
4097
4098 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4099
4100 // Translate the given source location to make it point at the beginning of
4101 // the token under the cursor.
4102 SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
4103 CXXUnit->getASTContext().getLangOpts());
4104
4105 CXCursor Result = MakeCXCursorInvalid(CXCursor_NoDeclFound);
4106 if (SLoc.isValid()) {
4107 GetCursorData ResultData(CXXUnit->getSourceManager(), SLoc, Result);
4108 CursorVisitor CursorVis(TU, GetCursorVisitor, &ResultData,
4109 /*VisitPreprocessorLast=*/true,
4110 /*VisitIncludedEntities=*/false,
4111 SourceLocation(SLoc));
4112 CursorVis.visitFileRegion();
4113 }
4114
4115 return Result;
4116}
4117
4118static SourceRange getRawCursorExtent(CXCursor C) {
4119 if (clang_isReference(C.kind)) {
4120 switch (C.kind) {
4121 case CXCursor_ObjCSuperClassRef:
4122 return getCursorObjCSuperClassRef(C).second;
4123
4124 case CXCursor_ObjCProtocolRef:
4125 return getCursorObjCProtocolRef(C).second;
4126
4127 case CXCursor_ObjCClassRef:
4128 return getCursorObjCClassRef(C).second;
4129
4130 case CXCursor_TypeRef:
4131 return getCursorTypeRef(C).second;
4132
4133 case CXCursor_TemplateRef:
4134 return getCursorTemplateRef(C).second;
4135
4136 case CXCursor_NamespaceRef:
4137 return getCursorNamespaceRef(C).second;
4138
4139 case CXCursor_MemberRef:
4140 return getCursorMemberRef(C).second;
4141
4142 case CXCursor_CXXBaseSpecifier:
4143 return getCursorCXXBaseSpecifier(C)->getSourceRange();
4144
4145 case CXCursor_LabelRef:
4146 return getCursorLabelRef(C).second;
4147
4148 case CXCursor_OverloadedDeclRef:
4149 return getCursorOverloadedDeclRef(C).second;
4150
4151 case CXCursor_VariableRef:
4152 return getCursorVariableRef(C).second;
4153
4154 default:
4155 // FIXME: Need a way to enumerate all non-reference cases.
4156 llvm_unreachable("Missed a reference kind");
4157 }
4158 }
4159
4160 if (clang_isExpression(C.kind))
4161 return getCursorExpr(C)->getSourceRange();
4162
4163 if (clang_isStatement(C.kind))
4164 return getCursorStmt(C)->getSourceRange();
4165
4166 if (clang_isAttribute(C.kind))
4167 return getCursorAttr(C)->getRange();
4168
4169 if (C.kind == CXCursor_PreprocessingDirective)
4170 return cxcursor::getCursorPreprocessingDirective(C);
4171
4172 if (C.kind == CXCursor_MacroExpansion) {
4173 ASTUnit *TU = getCursorASTUnit(C);
Argyrios Kyrtzidis664b06f2013-01-07 19:16:25 +00004174 SourceRange Range = cxcursor::getCursorMacroExpansion(C).getSourceRange();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004175 return TU->mapRangeFromPreamble(Range);
4176 }
4177
4178 if (C.kind == CXCursor_MacroDefinition) {
4179 ASTUnit *TU = getCursorASTUnit(C);
4180 SourceRange Range = cxcursor::getCursorMacroDefinition(C)->getSourceRange();
4181 return TU->mapRangeFromPreamble(Range);
4182 }
4183
4184 if (C.kind == CXCursor_InclusionDirective) {
4185 ASTUnit *TU = getCursorASTUnit(C);
4186 SourceRange Range = cxcursor::getCursorInclusionDirective(C)->getSourceRange();
4187 return TU->mapRangeFromPreamble(Range);
4188 }
4189
4190 if (C.kind == CXCursor_TranslationUnit) {
4191 ASTUnit *TU = getCursorASTUnit(C);
4192 FileID MainID = TU->getSourceManager().getMainFileID();
4193 SourceLocation Start = TU->getSourceManager().getLocForStartOfFile(MainID);
4194 SourceLocation End = TU->getSourceManager().getLocForEndOfFile(MainID);
4195 return SourceRange(Start, End);
4196 }
4197
4198 if (clang_isDeclaration(C.kind)) {
4199 Decl *D = cxcursor::getCursorDecl(C);
4200 if (!D)
4201 return SourceRange();
4202
4203 SourceRange R = D->getSourceRange();
4204 // FIXME: Multiple variables declared in a single declaration
4205 // currently lack the information needed to correctly determine their
4206 // ranges when accounting for the type-specifier. We use context
4207 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
4208 // and if so, whether it is the first decl.
4209 if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
4210 if (!cxcursor::isFirstInDeclGroup(C))
4211 R.setBegin(VD->getLocation());
4212 }
4213 return R;
4214 }
4215 return SourceRange();
4216}
4217
4218/// \brief Retrieves the "raw" cursor extent, which is then extended to include
4219/// the decl-specifier-seq for declarations.
4220static SourceRange getFullCursorExtent(CXCursor C, SourceManager &SrcMgr) {
4221 if (clang_isDeclaration(C.kind)) {
4222 Decl *D = cxcursor::getCursorDecl(C);
4223 if (!D)
4224 return SourceRange();
4225
4226 SourceRange R = D->getSourceRange();
4227
4228 // Adjust the start of the location for declarations preceded by
4229 // declaration specifiers.
4230 SourceLocation StartLoc;
4231 if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
4232 if (TypeSourceInfo *TI = DD->getTypeSourceInfo())
4233 StartLoc = TI->getTypeLoc().getLocStart();
4234 } else if (TypedefDecl *Typedef = dyn_cast<TypedefDecl>(D)) {
4235 if (TypeSourceInfo *TI = Typedef->getTypeSourceInfo())
4236 StartLoc = TI->getTypeLoc().getLocStart();
4237 }
4238
4239 if (StartLoc.isValid() && R.getBegin().isValid() &&
4240 SrcMgr.isBeforeInTranslationUnit(StartLoc, R.getBegin()))
4241 R.setBegin(StartLoc);
4242
4243 // FIXME: Multiple variables declared in a single declaration
4244 // currently lack the information needed to correctly determine their
4245 // ranges when accounting for the type-specifier. We use context
4246 // stored in the CXCursor to determine if the VarDecl is in a DeclGroup,
4247 // and if so, whether it is the first decl.
4248 if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
4249 if (!cxcursor::isFirstInDeclGroup(C))
4250 R.setBegin(VD->getLocation());
4251 }
4252
4253 return R;
4254 }
4255
4256 return getRawCursorExtent(C);
4257}
4258
4259extern "C" {
4260
4261CXSourceRange clang_getCursorExtent(CXCursor C) {
4262 SourceRange R = getRawCursorExtent(C);
4263 if (R.isInvalid())
4264 return clang_getNullRange();
4265
4266 return cxloc::translateSourceRange(getCursorContext(C), R);
4267}
4268
4269CXCursor clang_getCursorReferenced(CXCursor C) {
4270 if (clang_isInvalid(C.kind))
4271 return clang_getNullCursor();
4272
4273 CXTranslationUnit tu = getCursorTU(C);
4274 if (clang_isDeclaration(C.kind)) {
4275 Decl *D = getCursorDecl(C);
4276 if (!D)
4277 return clang_getNullCursor();
4278 if (UsingDecl *Using = dyn_cast<UsingDecl>(D))
4279 return MakeCursorOverloadedDeclRef(Using, D->getLocation(), tu);
4280 if (ObjCPropertyImplDecl *PropImpl =dyn_cast<ObjCPropertyImplDecl>(D))
4281 if (ObjCPropertyDecl *Property = PropImpl->getPropertyDecl())
4282 return MakeCXCursor(Property, tu);
4283
4284 return C;
4285 }
4286
4287 if (clang_isExpression(C.kind)) {
4288 Expr *E = getCursorExpr(C);
4289 Decl *D = getDeclFromExpr(E);
4290 if (D) {
4291 CXCursor declCursor = MakeCXCursor(D, tu);
4292 declCursor = getSelectorIdentifierCursor(getSelectorIdentifierIndex(C),
4293 declCursor);
4294 return declCursor;
4295 }
4296
4297 if (OverloadExpr *Ovl = dyn_cast_or_null<OverloadExpr>(E))
4298 return MakeCursorOverloadedDeclRef(Ovl, tu);
4299
4300 return clang_getNullCursor();
4301 }
4302
4303 if (clang_isStatement(C.kind)) {
4304 Stmt *S = getCursorStmt(C);
4305 if (GotoStmt *Goto = dyn_cast_or_null<GotoStmt>(S))
4306 if (LabelDecl *label = Goto->getLabel())
4307 if (LabelStmt *labelS = label->getStmt())
4308 return MakeCXCursor(labelS, getCursorDecl(C), tu);
4309
4310 return clang_getNullCursor();
4311 }
4312
4313 if (C.kind == CXCursor_MacroExpansion) {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00004314 if (const MacroDefinition *Def = getCursorMacroExpansion(C).getDefinition())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004315 return MakeMacroDefinitionCursor(Def, tu);
4316 }
4317
4318 if (!clang_isReference(C.kind))
4319 return clang_getNullCursor();
4320
4321 switch (C.kind) {
4322 case CXCursor_ObjCSuperClassRef:
4323 return MakeCXCursor(getCursorObjCSuperClassRef(C).first, tu);
4324
4325 case CXCursor_ObjCProtocolRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00004326 const ObjCProtocolDecl *Prot = getCursorObjCProtocolRef(C).first;
4327 if (const ObjCProtocolDecl *Def = Prot->getDefinition())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004328 return MakeCXCursor(Def, tu);
4329
4330 return MakeCXCursor(Prot, tu);
4331 }
4332
4333 case CXCursor_ObjCClassRef: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00004334 const ObjCInterfaceDecl *Class = getCursorObjCClassRef(C).first;
4335 if (const ObjCInterfaceDecl *Def = Class->getDefinition())
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004336 return MakeCXCursor(Def, tu);
4337
4338 return MakeCXCursor(Class, tu);
4339 }
4340
4341 case CXCursor_TypeRef:
4342 return MakeCXCursor(getCursorTypeRef(C).first, tu );
4343
4344 case CXCursor_TemplateRef:
4345 return MakeCXCursor(getCursorTemplateRef(C).first, tu );
4346
4347 case CXCursor_NamespaceRef:
4348 return MakeCXCursor(getCursorNamespaceRef(C).first, tu );
4349
4350 case CXCursor_MemberRef:
4351 return MakeCXCursor(getCursorMemberRef(C).first, tu );
4352
4353 case CXCursor_CXXBaseSpecifier: {
Dmitri Gribenko67812b22013-01-11 21:01:49 +00004354 const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(C);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004355 return clang_getTypeDeclaration(cxtype::MakeCXType(B->getType(),
4356 tu ));
4357 }
4358
4359 case CXCursor_LabelRef:
4360 // FIXME: We end up faking the "parent" declaration here because we
4361 // don't want to make CXCursor larger.
4362 return MakeCXCursor(getCursorLabelRef(C).first,
4363 static_cast<ASTUnit*>(tu->TUData)->getASTContext()
4364 .getTranslationUnitDecl(),
4365 tu);
4366
4367 case CXCursor_OverloadedDeclRef:
4368 return C;
4369
4370 case CXCursor_VariableRef:
4371 return MakeCXCursor(getCursorVariableRef(C).first, tu);
4372
4373 default:
4374 // We would prefer to enumerate all non-reference cursor kinds here.
4375 llvm_unreachable("Unhandled reference cursor kind");
4376 }
4377}
4378
4379CXCursor clang_getCursorDefinition(CXCursor C) {
4380 if (clang_isInvalid(C.kind))
4381 return clang_getNullCursor();
4382
4383 CXTranslationUnit TU = getCursorTU(C);
4384
4385 bool WasReference = false;
4386 if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
4387 C = clang_getCursorReferenced(C);
4388 WasReference = true;
4389 }
4390
4391 if (C.kind == CXCursor_MacroExpansion)
4392 return clang_getCursorReferenced(C);
4393
4394 if (!clang_isDeclaration(C.kind))
4395 return clang_getNullCursor();
4396
4397 Decl *D = getCursorDecl(C);
4398 if (!D)
4399 return clang_getNullCursor();
4400
4401 switch (D->getKind()) {
4402 // Declaration kinds that don't really separate the notions of
4403 // declaration and definition.
4404 case Decl::Namespace:
4405 case Decl::Typedef:
4406 case Decl::TypeAlias:
4407 case Decl::TypeAliasTemplate:
4408 case Decl::TemplateTypeParm:
4409 case Decl::EnumConstant:
4410 case Decl::Field:
4411 case Decl::IndirectField:
4412 case Decl::ObjCIvar:
4413 case Decl::ObjCAtDefsField:
4414 case Decl::ImplicitParam:
4415 case Decl::ParmVar:
4416 case Decl::NonTypeTemplateParm:
4417 case Decl::TemplateTemplateParm:
4418 case Decl::ObjCCategoryImpl:
4419 case Decl::ObjCImplementation:
4420 case Decl::AccessSpec:
4421 case Decl::LinkageSpec:
4422 case Decl::ObjCPropertyImpl:
4423 case Decl::FileScopeAsm:
4424 case Decl::StaticAssert:
4425 case Decl::Block:
4426 case Decl::Label: // FIXME: Is this right??
4427 case Decl::ClassScopeFunctionSpecialization:
4428 case Decl::Import:
4429 return C;
4430
4431 // Declaration kinds that don't make any sense here, but are
4432 // nonetheless harmless.
4433 case Decl::TranslationUnit:
4434 break;
4435
4436 // Declaration kinds for which the definition is not resolvable.
4437 case Decl::UnresolvedUsingTypename:
4438 case Decl::UnresolvedUsingValue:
4439 break;
4440
4441 case Decl::UsingDirective:
4442 return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
4443 TU);
4444
4445 case Decl::NamespaceAlias:
4446 return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), TU);
4447
4448 case Decl::Enum:
4449 case Decl::Record:
4450 case Decl::CXXRecord:
4451 case Decl::ClassTemplateSpecialization:
4452 case Decl::ClassTemplatePartialSpecialization:
4453 if (TagDecl *Def = cast<TagDecl>(D)->getDefinition())
4454 return MakeCXCursor(Def, TU);
4455 return clang_getNullCursor();
4456
4457 case Decl::Function:
4458 case Decl::CXXMethod:
4459 case Decl::CXXConstructor:
4460 case Decl::CXXDestructor:
4461 case Decl::CXXConversion: {
4462 const FunctionDecl *Def = 0;
4463 if (cast<FunctionDecl>(D)->getBody(Def))
Dmitri Gribenko05756dc2013-01-14 00:46:27 +00004464 return MakeCXCursor(Def, TU);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004465 return clang_getNullCursor();
4466 }
4467
4468 case Decl::Var: {
4469 // Ask the variable if it has a definition.
4470 if (VarDecl *Def = cast<VarDecl>(D)->getDefinition())
4471 return MakeCXCursor(Def, TU);
4472 return clang_getNullCursor();
4473 }
4474
4475 case Decl::FunctionTemplate: {
4476 const FunctionDecl *Def = 0;
4477 if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
4478 return MakeCXCursor(Def->getDescribedFunctionTemplate(), TU);
4479 return clang_getNullCursor();
4480 }
4481
4482 case Decl::ClassTemplate: {
4483 if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
4484 ->getDefinition())
4485 return MakeCXCursor(cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
4486 TU);
4487 return clang_getNullCursor();
4488 }
4489
4490 case Decl::Using:
4491 return MakeCursorOverloadedDeclRef(cast<UsingDecl>(D),
4492 D->getLocation(), TU);
4493
4494 case Decl::UsingShadow:
4495 return clang_getCursorDefinition(
4496 MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
4497 TU));
4498
4499 case Decl::ObjCMethod: {
4500 ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
4501 if (Method->isThisDeclarationADefinition())
4502 return C;
4503
4504 // Dig out the method definition in the associated
4505 // @implementation, if we have it.
4506 // FIXME: The ASTs should make finding the definition easier.
4507 if (ObjCInterfaceDecl *Class
4508 = dyn_cast<ObjCInterfaceDecl>(Method->getDeclContext()))
4509 if (ObjCImplementationDecl *ClassImpl = Class->getImplementation())
4510 if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
4511 Method->isInstanceMethod()))
4512 if (Def->isThisDeclarationADefinition())
4513 return MakeCXCursor(Def, TU);
4514
4515 return clang_getNullCursor();
4516 }
4517
4518 case Decl::ObjCCategory:
4519 if (ObjCCategoryImplDecl *Impl
4520 = cast<ObjCCategoryDecl>(D)->getImplementation())
4521 return MakeCXCursor(Impl, TU);
4522 return clang_getNullCursor();
4523
4524 case Decl::ObjCProtocol:
4525 if (ObjCProtocolDecl *Def = cast<ObjCProtocolDecl>(D)->getDefinition())
4526 return MakeCXCursor(Def, TU);
4527 return clang_getNullCursor();
4528
4529 case Decl::ObjCInterface: {
4530 // There are two notions of a "definition" for an Objective-C
4531 // class: the interface and its implementation. When we resolved a
4532 // reference to an Objective-C class, produce the @interface as
4533 // the definition; when we were provided with the interface,
4534 // produce the @implementation as the definition.
4535 ObjCInterfaceDecl *IFace = cast<ObjCInterfaceDecl>(D);
4536 if (WasReference) {
4537 if (ObjCInterfaceDecl *Def = IFace->getDefinition())
4538 return MakeCXCursor(Def, TU);
4539 } else if (ObjCImplementationDecl *Impl = IFace->getImplementation())
4540 return MakeCXCursor(Impl, TU);
4541 return clang_getNullCursor();
4542 }
4543
4544 case Decl::ObjCProperty:
4545 // FIXME: We don't really know where to find the
4546 // ObjCPropertyImplDecls that implement this property.
4547 return clang_getNullCursor();
4548
4549 case Decl::ObjCCompatibleAlias:
4550 if (ObjCInterfaceDecl *Class
4551 = cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
4552 if (ObjCInterfaceDecl *Def = Class->getDefinition())
4553 return MakeCXCursor(Def, TU);
4554
4555 return clang_getNullCursor();
4556
4557 case Decl::Friend:
4558 if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
4559 return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
4560 return clang_getNullCursor();
4561
4562 case Decl::FriendTemplate:
4563 if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
4564 return clang_getCursorDefinition(MakeCXCursor(Friend, TU));
4565 return clang_getNullCursor();
4566 }
4567
4568 return clang_getNullCursor();
4569}
4570
4571unsigned clang_isCursorDefinition(CXCursor C) {
4572 if (!clang_isDeclaration(C.kind))
4573 return 0;
4574
4575 return clang_getCursorDefinition(C) == C;
4576}
4577
4578CXCursor clang_getCanonicalCursor(CXCursor C) {
4579 if (!clang_isDeclaration(C.kind))
4580 return C;
4581
4582 if (Decl *D = getCursorDecl(C)) {
4583 if (ObjCCategoryImplDecl *CatImplD = dyn_cast<ObjCCategoryImplDecl>(D))
4584 if (ObjCCategoryDecl *CatD = CatImplD->getCategoryDecl())
4585 return MakeCXCursor(CatD, getCursorTU(C));
4586
4587 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D))
4588 if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
4589 return MakeCXCursor(IFD, getCursorTU(C));
4590
4591 return MakeCXCursor(D->getCanonicalDecl(), getCursorTU(C));
4592 }
4593
4594 return C;
4595}
4596
4597int clang_Cursor_getObjCSelectorIndex(CXCursor cursor) {
4598 return cxcursor::getSelectorIdentifierIndexAndLoc(cursor).first;
4599}
4600
4601unsigned clang_getNumOverloadedDecls(CXCursor C) {
4602 if (C.kind != CXCursor_OverloadedDeclRef)
4603 return 0;
4604
4605 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(C).first;
4606 if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
4607 return E->getNumDecls();
4608
4609 if (OverloadedTemplateStorage *S
4610 = Storage.dyn_cast<OverloadedTemplateStorage*>())
4611 return S->size();
4612
4613 Decl *D = Storage.get<Decl*>();
4614 if (UsingDecl *Using = dyn_cast<UsingDecl>(D))
4615 return Using->shadow_size();
4616
4617 return 0;
4618}
4619
4620CXCursor clang_getOverloadedDecl(CXCursor cursor, unsigned index) {
4621 if (cursor.kind != CXCursor_OverloadedDeclRef)
4622 return clang_getNullCursor();
4623
4624 if (index >= clang_getNumOverloadedDecls(cursor))
4625 return clang_getNullCursor();
4626
4627 CXTranslationUnit TU = getCursorTU(cursor);
4628 OverloadedDeclRefStorage Storage = getCursorOverloadedDeclRef(cursor).first;
4629 if (OverloadExpr *E = Storage.dyn_cast<OverloadExpr *>())
4630 return MakeCXCursor(E->decls_begin()[index], TU);
4631
4632 if (OverloadedTemplateStorage *S
4633 = Storage.dyn_cast<OverloadedTemplateStorage*>())
4634 return MakeCXCursor(S->begin()[index], TU);
4635
4636 Decl *D = Storage.get<Decl*>();
4637 if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) {
4638 // FIXME: This is, unfortunately, linear time.
4639 UsingDecl::shadow_iterator Pos = Using->shadow_begin();
4640 std::advance(Pos, index);
4641 return MakeCXCursor(cast<UsingShadowDecl>(*Pos)->getTargetDecl(), TU);
4642 }
4643
4644 return clang_getNullCursor();
4645}
4646
4647void clang_getDefinitionSpellingAndExtent(CXCursor C,
4648 const char **startBuf,
4649 const char **endBuf,
4650 unsigned *startLine,
4651 unsigned *startColumn,
4652 unsigned *endLine,
4653 unsigned *endColumn) {
4654 assert(getCursorDecl(C) && "CXCursor has null decl");
4655 NamedDecl *ND = static_cast<NamedDecl *>(getCursorDecl(C));
4656 FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
4657 CompoundStmt *Body = dyn_cast<CompoundStmt>(FD->getBody());
4658
4659 SourceManager &SM = FD->getASTContext().getSourceManager();
4660 *startBuf = SM.getCharacterData(Body->getLBracLoc());
4661 *endBuf = SM.getCharacterData(Body->getRBracLoc());
4662 *startLine = SM.getSpellingLineNumber(Body->getLBracLoc());
4663 *startColumn = SM.getSpellingColumnNumber(Body->getLBracLoc());
4664 *endLine = SM.getSpellingLineNumber(Body->getRBracLoc());
4665 *endColumn = SM.getSpellingColumnNumber(Body->getRBracLoc());
4666}
4667
4668
4669CXSourceRange clang_getCursorReferenceNameRange(CXCursor C, unsigned NameFlags,
4670 unsigned PieceIndex) {
4671 RefNamePieces Pieces;
4672
4673 switch (C.kind) {
4674 case CXCursor_MemberRefExpr:
4675 if (MemberExpr *E = dyn_cast<MemberExpr>(getCursorExpr(C)))
4676 Pieces = buildPieces(NameFlags, true, E->getMemberNameInfo(),
4677 E->getQualifierLoc().getSourceRange());
4678 break;
4679
4680 case CXCursor_DeclRefExpr:
4681 if (DeclRefExpr *E = dyn_cast<DeclRefExpr>(getCursorExpr(C)))
4682 Pieces = buildPieces(NameFlags, false, E->getNameInfo(),
4683 E->getQualifierLoc().getSourceRange(),
4684 E->getOptionalExplicitTemplateArgs());
4685 break;
4686
4687 case CXCursor_CallExpr:
4688 if (CXXOperatorCallExpr *OCE =
4689 dyn_cast<CXXOperatorCallExpr>(getCursorExpr(C))) {
4690 Expr *Callee = OCE->getCallee();
4691 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Callee))
4692 Callee = ICE->getSubExpr();
4693
4694 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee))
4695 Pieces = buildPieces(NameFlags, false, DRE->getNameInfo(),
4696 DRE->getQualifierLoc().getSourceRange());
4697 }
4698 break;
4699
4700 default:
4701 break;
4702 }
4703
4704 if (Pieces.empty()) {
4705 if (PieceIndex == 0)
4706 return clang_getCursorExtent(C);
4707 } else if (PieceIndex < Pieces.size()) {
4708 SourceRange R = Pieces[PieceIndex];
4709 if (R.isValid())
4710 return cxloc::translateSourceRange(getCursorContext(C), R);
4711 }
4712
4713 return clang_getNullRange();
4714}
4715
4716void clang_enableStackTraces(void) {
4717 llvm::sys::PrintStackTraceOnErrorSignal();
4718}
4719
4720void clang_executeOnThread(void (*fn)(void*), void *user_data,
4721 unsigned stack_size) {
4722 llvm::llvm_execute_on_thread(fn, user_data, stack_size);
4723}
4724
4725} // end: extern "C"
4726
4727//===----------------------------------------------------------------------===//
4728// Token-based Operations.
4729//===----------------------------------------------------------------------===//
4730
4731/* CXToken layout:
4732 * int_data[0]: a CXTokenKind
4733 * int_data[1]: starting token location
4734 * int_data[2]: token length
4735 * int_data[3]: reserved
4736 * ptr_data: for identifiers and keywords, an IdentifierInfo*.
4737 * otherwise unused.
4738 */
4739extern "C" {
4740
4741CXTokenKind clang_getTokenKind(CXToken CXTok) {
4742 return static_cast<CXTokenKind>(CXTok.int_data[0]);
4743}
4744
4745CXString clang_getTokenSpelling(CXTranslationUnit TU, CXToken CXTok) {
4746 switch (clang_getTokenKind(CXTok)) {
4747 case CXToken_Identifier:
4748 case CXToken_Keyword:
4749 // We know we have an IdentifierInfo*, so use that.
4750 return createCXString(static_cast<IdentifierInfo *>(CXTok.ptr_data)
4751 ->getNameStart());
4752
4753 case CXToken_Literal: {
4754 // We have stashed the starting pointer in the ptr_data field. Use it.
4755 const char *Text = static_cast<const char *>(CXTok.ptr_data);
4756 return createCXString(StringRef(Text, CXTok.int_data[2]));
4757 }
4758
4759 case CXToken_Punctuation:
4760 case CXToken_Comment:
4761 break;
4762 }
4763
4764 // We have to find the starting buffer pointer the hard way, by
4765 // deconstructing the source location.
4766 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4767 if (!CXXUnit)
4768 return createCXString("");
4769
4770 SourceLocation Loc = SourceLocation::getFromRawEncoding(CXTok.int_data[1]);
4771 std::pair<FileID, unsigned> LocInfo
4772 = CXXUnit->getSourceManager().getDecomposedSpellingLoc(Loc);
4773 bool Invalid = false;
4774 StringRef Buffer
4775 = CXXUnit->getSourceManager().getBufferData(LocInfo.first, &Invalid);
4776 if (Invalid)
4777 return createCXString("");
4778
4779 return createCXString(Buffer.substr(LocInfo.second, CXTok.int_data[2]));
4780}
4781
4782CXSourceLocation clang_getTokenLocation(CXTranslationUnit TU, CXToken CXTok) {
4783 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4784 if (!CXXUnit)
4785 return clang_getNullLocation();
4786
4787 return cxloc::translateSourceLocation(CXXUnit->getASTContext(),
4788 SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
4789}
4790
4791CXSourceRange clang_getTokenExtent(CXTranslationUnit TU, CXToken CXTok) {
4792 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4793 if (!CXXUnit)
4794 return clang_getNullRange();
4795
4796 return cxloc::translateSourceRange(CXXUnit->getASTContext(),
4797 SourceLocation::getFromRawEncoding(CXTok.int_data[1]));
4798}
4799
4800static void getTokens(ASTUnit *CXXUnit, SourceRange Range,
4801 SmallVectorImpl<CXToken> &CXTokens) {
4802 SourceManager &SourceMgr = CXXUnit->getSourceManager();
4803 std::pair<FileID, unsigned> BeginLocInfo
4804 = SourceMgr.getDecomposedLoc(Range.getBegin());
4805 std::pair<FileID, unsigned> EndLocInfo
4806 = SourceMgr.getDecomposedLoc(Range.getEnd());
4807
4808 // Cannot tokenize across files.
4809 if (BeginLocInfo.first != EndLocInfo.first)
4810 return;
4811
4812 // Create a lexer
4813 bool Invalid = false;
4814 StringRef Buffer
4815 = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
4816 if (Invalid)
4817 return;
4818
4819 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
4820 CXXUnit->getASTContext().getLangOpts(),
4821 Buffer.begin(), Buffer.data() + BeginLocInfo.second, Buffer.end());
4822 Lex.SetCommentRetentionState(true);
4823
4824 // Lex tokens until we hit the end of the range.
4825 const char *EffectiveBufferEnd = Buffer.data() + EndLocInfo.second;
4826 Token Tok;
4827 bool previousWasAt = false;
4828 do {
4829 // Lex the next token
4830 Lex.LexFromRawLexer(Tok);
4831 if (Tok.is(tok::eof))
4832 break;
4833
4834 // Initialize the CXToken.
4835 CXToken CXTok;
4836
4837 // - Common fields
4838 CXTok.int_data[1] = Tok.getLocation().getRawEncoding();
4839 CXTok.int_data[2] = Tok.getLength();
4840 CXTok.int_data[3] = 0;
4841
4842 // - Kind-specific fields
4843 if (Tok.isLiteral()) {
4844 CXTok.int_data[0] = CXToken_Literal;
4845 CXTok.ptr_data = (void *)Tok.getLiteralData();
4846 } else if (Tok.is(tok::raw_identifier)) {
4847 // Lookup the identifier to determine whether we have a keyword.
4848 IdentifierInfo *II
4849 = CXXUnit->getPreprocessor().LookUpIdentifierInfo(Tok);
4850
4851 if ((II->getObjCKeywordID() != tok::objc_not_keyword) && previousWasAt) {
4852 CXTok.int_data[0] = CXToken_Keyword;
4853 }
4854 else {
4855 CXTok.int_data[0] = Tok.is(tok::identifier)
4856 ? CXToken_Identifier
4857 : CXToken_Keyword;
4858 }
4859 CXTok.ptr_data = II;
4860 } else if (Tok.is(tok::comment)) {
4861 CXTok.int_data[0] = CXToken_Comment;
4862 CXTok.ptr_data = 0;
4863 } else {
4864 CXTok.int_data[0] = CXToken_Punctuation;
4865 CXTok.ptr_data = 0;
4866 }
4867 CXTokens.push_back(CXTok);
4868 previousWasAt = Tok.is(tok::at);
4869 } while (Lex.getBufferLocation() <= EffectiveBufferEnd);
4870}
4871
4872void clang_tokenize(CXTranslationUnit TU, CXSourceRange Range,
4873 CXToken **Tokens, unsigned *NumTokens) {
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00004874 LOG_FUNC_SECTION {
4875 *Log << TU << ' ' << Range;
4876 }
4877
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004878 if (Tokens)
4879 *Tokens = 0;
4880 if (NumTokens)
4881 *NumTokens = 0;
4882
4883 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
4884 if (!CXXUnit || !Tokens || !NumTokens)
4885 return;
4886
4887 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
4888
4889 SourceRange R = cxloc::translateCXSourceRange(Range);
4890 if (R.isInvalid())
4891 return;
4892
4893 SmallVector<CXToken, 32> CXTokens;
4894 getTokens(CXXUnit, R, CXTokens);
4895
4896 if (CXTokens.empty())
4897 return;
4898
4899 *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());
4900 memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());
4901 *NumTokens = CXTokens.size();
4902}
4903
4904void clang_disposeTokens(CXTranslationUnit TU,
4905 CXToken *Tokens, unsigned NumTokens) {
4906 free(Tokens);
4907}
4908
4909} // end: extern "C"
4910
4911//===----------------------------------------------------------------------===//
4912// Token annotation APIs.
4913//===----------------------------------------------------------------------===//
4914
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004915static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
4916 CXCursor parent,
4917 CXClientData client_data);
4918static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
4919 CXClientData client_data);
4920
4921namespace {
4922class AnnotateTokensWorker {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004923 CXToken *Tokens;
4924 CXCursor *Cursors;
4925 unsigned NumTokens;
4926 unsigned TokIdx;
4927 unsigned PreprocessingTokIdx;
4928 CursorVisitor AnnotateVis;
4929 SourceManager &SrcMgr;
4930 bool HasContextSensitiveKeywords;
4931
4932 struct PostChildrenInfo {
4933 CXCursor Cursor;
4934 SourceRange CursorRange;
4935 unsigned BeforeChildrenTokenIdx;
4936 };
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00004937 SmallVector<PostChildrenInfo, 8> PostChildrenInfos;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004938
4939 bool MoreTokens() const { return TokIdx < NumTokens; }
4940 unsigned NextToken() const { return TokIdx; }
4941 void AdvanceToken() { ++TokIdx; }
4942 SourceLocation GetTokenLoc(unsigned tokI) {
4943 return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
4944 }
4945 bool isFunctionMacroToken(unsigned tokI) const {
4946 return Tokens[tokI].int_data[3] != 0;
4947 }
4948 SourceLocation getFunctionMacroTokenLoc(unsigned tokI) const {
4949 return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[3]);
4950 }
4951
4952 void annotateAndAdvanceTokens(CXCursor, RangeComparisonResult, SourceRange);
4953 void annotateAndAdvanceFunctionMacroTokens(CXCursor, RangeComparisonResult,
4954 SourceRange);
4955
4956public:
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00004957 AnnotateTokensWorker(CXToken *tokens, CXCursor *cursors, unsigned numTokens,
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004958 CXTranslationUnit tu, SourceRange RegionOfInterest)
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00004959 : Tokens(tokens), Cursors(cursors),
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004960 NumTokens(numTokens), TokIdx(0), PreprocessingTokIdx(0),
4961 AnnotateVis(tu,
4962 AnnotateTokensVisitor, this,
4963 /*VisitPreprocessorLast=*/true,
4964 /*VisitIncludedEntities=*/false,
4965 RegionOfInterest,
4966 /*VisitDeclsOnly=*/false,
4967 AnnotateTokensPostChildrenVisitor),
4968 SrcMgr(static_cast<ASTUnit*>(tu->TUData)->getSourceManager()),
4969 HasContextSensitiveKeywords(false) { }
4970
4971 void VisitChildren(CXCursor C) { AnnotateVis.VisitChildren(C); }
4972 enum CXChildVisitResult Visit(CXCursor cursor, CXCursor parent);
4973 bool postVisitChildren(CXCursor cursor);
4974 void AnnotateTokens();
4975
4976 /// \brief Determine whether the annotator saw any cursors that have
4977 /// context-sensitive keywords.
4978 bool hasContextSensitiveKeywords() const {
4979 return HasContextSensitiveKeywords;
4980 }
4981
4982 ~AnnotateTokensWorker() {
4983 assert(PostChildrenInfos.empty());
4984 }
4985};
4986}
4987
4988void AnnotateTokensWorker::AnnotateTokens() {
4989 // Walk the AST within the region of interest, annotating tokens
4990 // along the way.
4991 AnnotateVis.visitFileRegion();
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00004992}
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004993
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00004994static inline void updateCursorAnnotation(CXCursor &Cursor,
4995 const CXCursor &updateC) {
4996 if (clang_isInvalid(updateC.kind) || clang_isPreprocessing(Cursor.kind))
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004997 return;
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00004998 Cursor = updateC;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00004999}
5000
5001/// \brief It annotates and advances tokens with a cursor until the comparison
5002//// between the cursor location and the source range is the same as
5003/// \arg compResult.
5004///
5005/// Pass RangeBefore to annotate tokens with a cursor until a range is reached.
5006/// Pass RangeOverlap to annotate tokens inside a range.
5007void AnnotateTokensWorker::annotateAndAdvanceTokens(CXCursor updateC,
5008 RangeComparisonResult compResult,
5009 SourceRange range) {
5010 while (MoreTokens()) {
5011 const unsigned I = NextToken();
5012 if (isFunctionMacroToken(I))
5013 return annotateAndAdvanceFunctionMacroTokens(updateC, compResult, range);
5014
5015 SourceLocation TokLoc = GetTokenLoc(I);
5016 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005017 updateCursorAnnotation(Cursors[I], updateC);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005018 AdvanceToken();
5019 continue;
5020 }
5021 break;
5022 }
5023}
5024
5025/// \brief Special annotation handling for macro argument tokens.
5026void AnnotateTokensWorker::annotateAndAdvanceFunctionMacroTokens(
5027 CXCursor updateC,
5028 RangeComparisonResult compResult,
5029 SourceRange range) {
5030 assert(MoreTokens());
5031 assert(isFunctionMacroToken(NextToken()) &&
5032 "Should be called only for macro arg tokens");
5033
5034 // This works differently than annotateAndAdvanceTokens; because expanded
5035 // macro arguments can have arbitrary translation-unit source order, we do not
5036 // advance the token index one by one until a token fails the range test.
5037 // We only advance once past all of the macro arg tokens if all of them
5038 // pass the range test. If one of them fails we keep the token index pointing
5039 // at the start of the macro arg tokens so that the failing token will be
5040 // annotated by a subsequent annotation try.
5041
5042 bool atLeastOneCompFail = false;
5043
5044 unsigned I = NextToken();
5045 for (; I < NumTokens && isFunctionMacroToken(I); ++I) {
5046 SourceLocation TokLoc = getFunctionMacroTokenLoc(I);
5047 if (TokLoc.isFileID())
5048 continue; // not macro arg token, it's parens or comma.
5049 if (LocationCompare(SrcMgr, TokLoc, range) == compResult) {
5050 if (clang_isInvalid(clang_getCursorKind(Cursors[I])))
5051 Cursors[I] = updateC;
5052 } else
5053 atLeastOneCompFail = true;
5054 }
5055
5056 if (!atLeastOneCompFail)
5057 TokIdx = I; // All of the tokens were handled, advance beyond all of them.
5058}
5059
5060enum CXChildVisitResult
5061AnnotateTokensWorker::Visit(CXCursor cursor, CXCursor parent) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005062 SourceRange cursorRange = getRawCursorExtent(cursor);
5063 if (cursorRange.isInvalid())
5064 return CXChildVisit_Recurse;
5065
5066 if (!HasContextSensitiveKeywords) {
5067 // Objective-C properties can have context-sensitive keywords.
5068 if (cursor.kind == CXCursor_ObjCPropertyDecl) {
5069 if (ObjCPropertyDecl *Property
5070 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(cursor)))
5071 HasContextSensitiveKeywords = Property->getPropertyAttributesAsWritten() != 0;
5072 }
5073 // Objective-C methods can have context-sensitive keywords.
5074 else if (cursor.kind == CXCursor_ObjCInstanceMethodDecl ||
5075 cursor.kind == CXCursor_ObjCClassMethodDecl) {
5076 if (ObjCMethodDecl *Method
5077 = dyn_cast_or_null<ObjCMethodDecl>(getCursorDecl(cursor))) {
5078 if (Method->getObjCDeclQualifier())
5079 HasContextSensitiveKeywords = true;
5080 else {
5081 for (ObjCMethodDecl::param_iterator P = Method->param_begin(),
5082 PEnd = Method->param_end();
5083 P != PEnd; ++P) {
5084 if ((*P)->getObjCDeclQualifier()) {
5085 HasContextSensitiveKeywords = true;
5086 break;
5087 }
5088 }
5089 }
5090 }
5091 }
5092 // C++ methods can have context-sensitive keywords.
5093 else if (cursor.kind == CXCursor_CXXMethod) {
5094 if (CXXMethodDecl *Method
5095 = dyn_cast_or_null<CXXMethodDecl>(getCursorDecl(cursor))) {
5096 if (Method->hasAttr<FinalAttr>() || Method->hasAttr<OverrideAttr>())
5097 HasContextSensitiveKeywords = true;
5098 }
5099 }
5100 // C++ classes can have context-sensitive keywords.
5101 else if (cursor.kind == CXCursor_StructDecl ||
5102 cursor.kind == CXCursor_ClassDecl ||
5103 cursor.kind == CXCursor_ClassTemplate ||
5104 cursor.kind == CXCursor_ClassTemplatePartialSpecialization) {
5105 if (Decl *D = getCursorDecl(cursor))
5106 if (D->hasAttr<FinalAttr>())
5107 HasContextSensitiveKeywords = true;
5108 }
5109 }
5110
5111 if (clang_isPreprocessing(cursor.kind)) {
5112 // Items in the preprocessing record are kept separate from items in
5113 // declarations, so we keep a separate token index.
5114 unsigned SavedTokIdx = TokIdx;
5115 TokIdx = PreprocessingTokIdx;
5116
5117 // Skip tokens up until we catch up to the beginning of the preprocessing
5118 // entry.
5119 while (MoreTokens()) {
5120 const unsigned I = NextToken();
5121 SourceLocation TokLoc = GetTokenLoc(I);
5122 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
5123 case RangeBefore:
5124 AdvanceToken();
5125 continue;
5126 case RangeAfter:
5127 case RangeOverlap:
5128 break;
5129 }
5130 break;
5131 }
5132
5133 // Look at all of the tokens within this range.
5134 while (MoreTokens()) {
5135 const unsigned I = NextToken();
5136 SourceLocation TokLoc = GetTokenLoc(I);
5137 switch (LocationCompare(SrcMgr, TokLoc, cursorRange)) {
5138 case RangeBefore:
5139 llvm_unreachable("Infeasible");
5140 case RangeAfter:
5141 break;
5142 case RangeOverlap:
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005143 // We may have already annotated macro names inside macro definitions.
5144 if (Cursors[I].kind != CXCursor_MacroExpansion)
5145 Cursors[I] = cursor;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005146 AdvanceToken();
5147 // For macro expansions, just note where the beginning of the macro
5148 // expansion occurs.
5149 if (cursor.kind == CXCursor_MacroExpansion)
5150 break;
5151 continue;
5152 }
5153 break;
5154 }
5155
5156 // Save the preprocessing token index; restore the non-preprocessing
5157 // token index.
5158 PreprocessingTokIdx = TokIdx;
5159 TokIdx = SavedTokIdx;
5160 return CXChildVisit_Recurse;
5161 }
5162
5163 if (cursorRange.isInvalid())
5164 return CXChildVisit_Continue;
5165
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005166 const enum CXCursorKind cursorK = clang_getCursorKind(cursor);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005167 const enum CXCursorKind K = clang_getCursorKind(parent);
5168 const CXCursor updateC =
5169 (clang_isInvalid(K) || K == CXCursor_TranslationUnit)
5170 ? clang_getNullCursor() : parent;
5171
5172 annotateAndAdvanceTokens(updateC, RangeBefore, cursorRange);
5173
5174 // Avoid having the cursor of an expression "overwrite" the annotation of the
5175 // variable declaration that it belongs to.
5176 // This can happen for C++ constructor expressions whose range generally
5177 // include the variable declaration, e.g.:
5178 // MyCXXClass foo; // Make sure we don't annotate 'foo' as a CallExpr cursor.
5179 if (clang_isExpression(cursorK)) {
5180 Expr *E = getCursorExpr(cursor);
5181 if (Decl *D = getCursorParentDecl(cursor)) {
5182 const unsigned I = NextToken();
5183 if (E->getLocStart().isValid() && D->getLocation().isValid() &&
5184 E->getLocStart() == D->getLocation() &&
5185 E->getLocStart() == GetTokenLoc(I)) {
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005186 updateCursorAnnotation(Cursors[I], updateC);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005187 AdvanceToken();
5188 }
5189 }
5190 }
5191
5192 // Before recursing into the children keep some state that we are going
5193 // to use in the AnnotateTokensWorker::postVisitChildren callback to do some
5194 // extra work after the child nodes are visited.
5195 // Note that we don't call VisitChildren here to avoid traversing statements
5196 // code-recursively which can blow the stack.
5197
5198 PostChildrenInfo Info;
5199 Info.Cursor = cursor;
5200 Info.CursorRange = cursorRange;
5201 Info.BeforeChildrenTokenIdx = NextToken();
5202 PostChildrenInfos.push_back(Info);
5203
5204 return CXChildVisit_Recurse;
5205}
5206
5207bool AnnotateTokensWorker::postVisitChildren(CXCursor cursor) {
5208 if (PostChildrenInfos.empty())
5209 return false;
5210 const PostChildrenInfo &Info = PostChildrenInfos.back();
5211 if (!clang_equalCursors(Info.Cursor, cursor))
5212 return false;
5213
5214 const unsigned BeforeChildren = Info.BeforeChildrenTokenIdx;
5215 const unsigned AfterChildren = NextToken();
5216 SourceRange cursorRange = Info.CursorRange;
5217
5218 // Scan the tokens that are at the end of the cursor, but are not captured
5219 // but the child cursors.
5220 annotateAndAdvanceTokens(cursor, RangeOverlap, cursorRange);
5221
5222 // Scan the tokens that are at the beginning of the cursor, but are not
5223 // capture by the child cursors.
5224 for (unsigned I = BeforeChildren; I != AfterChildren; ++I) {
5225 if (!clang_isInvalid(clang_getCursorKind(Cursors[I])))
5226 break;
5227
5228 Cursors[I] = cursor;
5229 }
5230
5231 PostChildrenInfos.pop_back();
5232 return false;
5233}
5234
5235static enum CXChildVisitResult AnnotateTokensVisitor(CXCursor cursor,
5236 CXCursor parent,
5237 CXClientData client_data) {
5238 return static_cast<AnnotateTokensWorker*>(client_data)->Visit(cursor, parent);
5239}
5240
5241static bool AnnotateTokensPostChildrenVisitor(CXCursor cursor,
5242 CXClientData client_data) {
5243 return static_cast<AnnotateTokensWorker*>(client_data)->
5244 postVisitChildren(cursor);
5245}
5246
5247namespace {
5248
5249/// \brief Uses the macro expansions in the preprocessing record to find
5250/// and mark tokens that are macro arguments. This info is used by the
5251/// AnnotateTokensWorker.
5252class MarkMacroArgTokensVisitor {
5253 SourceManager &SM;
5254 CXToken *Tokens;
5255 unsigned NumTokens;
5256 unsigned CurIdx;
5257
5258public:
5259 MarkMacroArgTokensVisitor(SourceManager &SM,
5260 CXToken *tokens, unsigned numTokens)
5261 : SM(SM), Tokens(tokens), NumTokens(numTokens), CurIdx(0) { }
5262
5263 CXChildVisitResult visit(CXCursor cursor, CXCursor parent) {
5264 if (cursor.kind != CXCursor_MacroExpansion)
5265 return CXChildVisit_Continue;
5266
Argyrios Kyrtzidis664b06f2013-01-07 19:16:25 +00005267 SourceRange macroRange = getCursorMacroExpansion(cursor).getSourceRange();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005268 if (macroRange.getBegin() == macroRange.getEnd())
5269 return CXChildVisit_Continue; // it's not a function macro.
5270
5271 for (; CurIdx < NumTokens; ++CurIdx) {
5272 if (!SM.isBeforeInTranslationUnit(getTokenLoc(CurIdx),
5273 macroRange.getBegin()))
5274 break;
5275 }
5276
5277 if (CurIdx == NumTokens)
5278 return CXChildVisit_Break;
5279
5280 for (; CurIdx < NumTokens; ++CurIdx) {
5281 SourceLocation tokLoc = getTokenLoc(CurIdx);
5282 if (!SM.isBeforeInTranslationUnit(tokLoc, macroRange.getEnd()))
5283 break;
5284
5285 setFunctionMacroTokenLoc(CurIdx, SM.getMacroArgExpandedLocation(tokLoc));
5286 }
5287
5288 if (CurIdx == NumTokens)
5289 return CXChildVisit_Break;
5290
5291 return CXChildVisit_Continue;
5292 }
5293
5294private:
5295 SourceLocation getTokenLoc(unsigned tokI) {
5296 return SourceLocation::getFromRawEncoding(Tokens[tokI].int_data[1]);
5297 }
5298
5299 void setFunctionMacroTokenLoc(unsigned tokI, SourceLocation loc) {
5300 // The third field is reserved and currently not used. Use it here
5301 // to mark macro arg expanded tokens with their expanded locations.
5302 Tokens[tokI].int_data[3] = loc.getRawEncoding();
5303 }
5304};
5305
5306} // end anonymous namespace
5307
5308static CXChildVisitResult
5309MarkMacroArgTokensVisitorDelegate(CXCursor cursor, CXCursor parent,
5310 CXClientData client_data) {
5311 return static_cast<MarkMacroArgTokensVisitor*>(client_data)->visit(cursor,
5312 parent);
5313}
5314
5315namespace {
5316 struct clang_annotateTokens_Data {
5317 CXTranslationUnit TU;
5318 ASTUnit *CXXUnit;
5319 CXToken *Tokens;
5320 unsigned NumTokens;
5321 CXCursor *Cursors;
5322 };
5323}
5324
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005325/// \brief Used by \c annotatePreprocessorTokens.
5326/// \returns true if lexing was finished, false otherwise.
5327static bool lexNext(Lexer &Lex, Token &Tok,
5328 unsigned &NextIdx, unsigned NumTokens) {
5329 if (NextIdx >= NumTokens)
5330 return true;
5331
5332 ++NextIdx;
5333 Lex.LexFromRawLexer(Tok);
5334 if (Tok.is(tok::eof))
5335 return true;
5336
5337 return false;
5338}
5339
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005340static void annotatePreprocessorTokens(CXTranslationUnit TU,
5341 SourceRange RegionOfInterest,
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005342 CXCursor *Cursors,
5343 CXToken *Tokens,
5344 unsigned NumTokens) {
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005345 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
5346
Argyrios Kyrtzidis3453bf72013-01-07 19:16:32 +00005347 Preprocessor &PP = CXXUnit->getPreprocessor();
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005348 SourceManager &SourceMgr = CXXUnit->getSourceManager();
5349 std::pair<FileID, unsigned> BeginLocInfo
5350 = SourceMgr.getDecomposedLoc(RegionOfInterest.getBegin());
5351 std::pair<FileID, unsigned> EndLocInfo
5352 = SourceMgr.getDecomposedLoc(RegionOfInterest.getEnd());
5353
5354 if (BeginLocInfo.first != EndLocInfo.first)
5355 return;
5356
5357 StringRef Buffer;
5358 bool Invalid = false;
5359 Buffer = SourceMgr.getBufferData(BeginLocInfo.first, &Invalid);
5360 if (Buffer.empty() || Invalid)
5361 return;
5362
5363 Lexer Lex(SourceMgr.getLocForStartOfFile(BeginLocInfo.first),
5364 CXXUnit->getASTContext().getLangOpts(),
5365 Buffer.begin(), Buffer.data() + BeginLocInfo.second,
5366 Buffer.end());
5367 Lex.SetCommentRetentionState(true);
5368
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005369 unsigned NextIdx = 0;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005370 // Lex tokens in raw mode until we hit the end of the range, to avoid
5371 // entering #includes or expanding macros.
5372 while (true) {
5373 Token Tok;
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005374 if (lexNext(Lex, Tok, NextIdx, NumTokens))
5375 break;
5376 unsigned TokIdx = NextIdx-1;
5377 assert(Tok.getLocation() ==
5378 SourceLocation::getFromRawEncoding(Tokens[TokIdx].int_data[1]));
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005379
5380 reprocess:
5381 if (Tok.is(tok::hash) && Tok.isAtStartOfLine()) {
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005382 // We have found a preprocessing directive. Annotate the tokens
5383 // appropriately.
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005384 //
5385 // FIXME: Some simple tests here could identify macro definitions and
5386 // #undefs, to provide specific cursor kinds for those.
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005387
5388 SourceLocation BeginLoc = Tok.getLocation();
Argyrios Kyrtzidis3453bf72013-01-07 19:16:32 +00005389 if (lexNext(Lex, Tok, NextIdx, NumTokens))
5390 break;
5391
5392 MacroInfo *MI = 0;
5393 if (Tok.is(tok::raw_identifier) &&
5394 StringRef(Tok.getRawIdentifierData(), Tok.getLength()) == "define") {
5395 if (lexNext(Lex, Tok, NextIdx, NumTokens))
5396 break;
5397
5398 if (Tok.is(tok::raw_identifier)) {
5399 StringRef Name(Tok.getRawIdentifierData(), Tok.getLength());
5400 IdentifierInfo &II = PP.getIdentifierTable().get(Name);
5401 SourceLocation MappedTokLoc =
5402 CXXUnit->mapLocationToPreamble(Tok.getLocation());
5403 MI = getMacroInfo(II, MappedTokLoc, TU);
5404 }
5405 }
5406
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005407 bool finished = false;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005408 do {
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005409 if (lexNext(Lex, Tok, NextIdx, NumTokens)) {
5410 finished = true;
5411 break;
5412 }
Argyrios Kyrtzidis3453bf72013-01-07 19:16:32 +00005413 // If we are in a macro definition, check if the token was ever a
5414 // macro name and annotate it if that's the case.
5415 if (MI) {
5416 SourceLocation SaveLoc = Tok.getLocation();
5417 Tok.setLocation(CXXUnit->mapLocationToPreamble(SaveLoc));
5418 MacroDefinition *MacroDef = checkForMacroInMacroDefinition(MI,Tok,TU);
5419 Tok.setLocation(SaveLoc);
5420 if (MacroDef)
5421 Cursors[NextIdx-1] = MakeMacroExpansionCursor(MacroDef,
5422 Tok.getLocation(), TU);
5423 }
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005424 } while (!Tok.isAtStartOfLine());
5425
5426 unsigned LastIdx = finished ? NextIdx-1 : NextIdx-2;
5427 assert(TokIdx <= LastIdx);
5428 SourceLocation EndLoc =
5429 SourceLocation::getFromRawEncoding(Tokens[LastIdx].int_data[1]);
5430 CXCursor Cursor =
5431 MakePreprocessingDirectiveCursor(SourceRange(BeginLoc, EndLoc), TU);
5432
5433 for (; TokIdx <= LastIdx; ++TokIdx)
Argyrios Kyrtzidis3453bf72013-01-07 19:16:32 +00005434 updateCursorAnnotation(Cursors[TokIdx], Cursor);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005435
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005436 if (finished)
5437 break;
5438 goto reprocess;
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005439 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005440 }
5441}
5442
5443// This gets run a separate thread to avoid stack blowout.
5444static void clang_annotateTokensImpl(void *UserData) {
5445 CXTranslationUnit TU = ((clang_annotateTokens_Data*)UserData)->TU;
5446 ASTUnit *CXXUnit = ((clang_annotateTokens_Data*)UserData)->CXXUnit;
5447 CXToken *Tokens = ((clang_annotateTokens_Data*)UserData)->Tokens;
5448 const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens;
5449 CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors;
5450
5451 CIndexer *CXXIdx = (CIndexer*)TU->CIdx;
5452 if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing))
5453 setThreadBackgroundPriority();
5454
5455 // Determine the region of interest, which contains all of the tokens.
5456 SourceRange RegionOfInterest;
5457 RegionOfInterest.setBegin(
5458 cxloc::translateSourceLocation(clang_getTokenLocation(TU, Tokens[0])));
5459 RegionOfInterest.setEnd(
5460 cxloc::translateSourceLocation(clang_getTokenLocation(TU,
5461 Tokens[NumTokens-1])));
5462
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005463 // Relex the tokens within the source range to look for preprocessing
5464 // directives.
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005465 annotatePreprocessorTokens(TU, RegionOfInterest, Cursors, Tokens, NumTokens);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005466
5467 if (CXXUnit->getPreprocessor().getPreprocessingRecord()) {
5468 // Search and mark tokens that are macro argument expansions.
5469 MarkMacroArgTokensVisitor Visitor(CXXUnit->getSourceManager(),
5470 Tokens, NumTokens);
5471 CursorVisitor MacroArgMarker(TU,
5472 MarkMacroArgTokensVisitorDelegate, &Visitor,
5473 /*VisitPreprocessorLast=*/true,
5474 /*VisitIncludedEntities=*/false,
5475 RegionOfInterest);
5476 MacroArgMarker.visitPreprocessedEntitiesInRegion();
5477 }
5478
5479 // Annotate all of the source locations in the region of interest that map to
5480 // a specific cursor.
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00005481 AnnotateTokensWorker W(Tokens, Cursors, NumTokens, TU, RegionOfInterest);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005482
5483 // FIXME: We use a ridiculous stack size here because the data-recursion
5484 // algorithm uses a large stack frame than the non-data recursive version,
5485 // and AnnotationTokensWorker currently transforms the data-recursion
5486 // algorithm back into a traditional recursion by explicitly calling
5487 // VisitChildren(). We will need to remove this explicit recursive call.
5488 W.AnnotateTokens();
5489
5490 // If we ran into any entities that involve context-sensitive keywords,
5491 // take another pass through the tokens to mark them as such.
5492 if (W.hasContextSensitiveKeywords()) {
5493 for (unsigned I = 0; I != NumTokens; ++I) {
5494 if (clang_getTokenKind(Tokens[I]) != CXToken_Identifier)
5495 continue;
5496
5497 if (Cursors[I].kind == CXCursor_ObjCPropertyDecl) {
5498 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
5499 if (ObjCPropertyDecl *Property
5500 = dyn_cast_or_null<ObjCPropertyDecl>(getCursorDecl(Cursors[I]))) {
5501 if (Property->getPropertyAttributesAsWritten() != 0 &&
5502 llvm::StringSwitch<bool>(II->getName())
5503 .Case("readonly", true)
5504 .Case("assign", true)
5505 .Case("unsafe_unretained", true)
5506 .Case("readwrite", true)
5507 .Case("retain", true)
5508 .Case("copy", true)
5509 .Case("nonatomic", true)
5510 .Case("atomic", true)
5511 .Case("getter", true)
5512 .Case("setter", true)
5513 .Case("strong", true)
5514 .Case("weak", true)
5515 .Default(false))
5516 Tokens[I].int_data[0] = CXToken_Keyword;
5517 }
5518 continue;
5519 }
5520
5521 if (Cursors[I].kind == CXCursor_ObjCInstanceMethodDecl ||
5522 Cursors[I].kind == CXCursor_ObjCClassMethodDecl) {
5523 IdentifierInfo *II = static_cast<IdentifierInfo *>(Tokens[I].ptr_data);
5524 if (llvm::StringSwitch<bool>(II->getName())
5525 .Case("in", true)
5526 .Case("out", true)
5527 .Case("inout", true)
5528 .Case("oneway", true)
5529 .Case("bycopy", true)
5530 .Case("byref", true)
5531 .Default(false))
5532 Tokens[I].int_data[0] = CXToken_Keyword;
5533 continue;
5534 }
5535
5536 if (Cursors[I].kind == CXCursor_CXXFinalAttr ||
5537 Cursors[I].kind == CXCursor_CXXOverrideAttr) {
5538 Tokens[I].int_data[0] = CXToken_Keyword;
5539 continue;
5540 }
5541 }
5542 }
5543}
5544
5545extern "C" {
5546
5547void clang_annotateTokens(CXTranslationUnit TU,
5548 CXToken *Tokens, unsigned NumTokens,
5549 CXCursor *Cursors) {
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00005550 if (NumTokens == 0 || !Tokens || !Cursors) {
5551 LOG_FUNC_SECTION { *Log << "<null input>"; }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005552 return;
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00005553 }
5554
5555 LOG_FUNC_SECTION {
5556 *Log << TU << ' ';
5557 CXSourceLocation bloc = clang_getTokenLocation(TU, Tokens[0]);
5558 CXSourceLocation eloc = clang_getTokenLocation(TU, Tokens[NumTokens-1]);
5559 *Log << clang_getRange(bloc, eloc);
5560 }
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005561
5562 // Any token we don't specifically annotate will have a NULL cursor.
5563 CXCursor C = clang_getNullCursor();
5564 for (unsigned I = 0; I != NumTokens; ++I)
5565 Cursors[I] = C;
5566
5567 ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData);
5568 if (!CXXUnit)
5569 return;
5570
5571 ASTUnit::ConcurrencyCheck Check(*CXXUnit);
5572
5573 clang_annotateTokens_Data data = { TU, CXXUnit, Tokens, NumTokens, Cursors };
5574 llvm::CrashRecoveryContext CRC;
5575 if (!RunSafely(CRC, clang_annotateTokensImpl, &data,
5576 GetSafetyThreadStackSize() * 2)) {
5577 fprintf(stderr, "libclang: crash detected while annotating tokens\n");
5578 }
5579}
5580
5581} // end: extern "C"
5582
5583//===----------------------------------------------------------------------===//
5584// Operations for querying linkage of a cursor.
5585//===----------------------------------------------------------------------===//
5586
5587extern "C" {
5588CXLinkageKind clang_getCursorLinkage(CXCursor cursor) {
5589 if (!clang_isDeclaration(cursor.kind))
5590 return CXLinkage_Invalid;
5591
5592 Decl *D = cxcursor::getCursorDecl(cursor);
5593 if (NamedDecl *ND = dyn_cast_or_null<NamedDecl>(D))
5594 switch (ND->getLinkage()) {
5595 case NoLinkage: return CXLinkage_NoLinkage;
5596 case InternalLinkage: return CXLinkage_Internal;
5597 case UniqueExternalLinkage: return CXLinkage_UniqueExternal;
5598 case ExternalLinkage: return CXLinkage_External;
5599 };
5600
5601 return CXLinkage_Invalid;
5602}
5603} // end: extern "C"
5604
5605//===----------------------------------------------------------------------===//
5606// Operations for querying language of a cursor.
5607//===----------------------------------------------------------------------===//
5608
5609static CXLanguageKind getDeclLanguage(const Decl *D) {
5610 if (!D)
5611 return CXLanguage_C;
5612
5613 switch (D->getKind()) {
5614 default:
5615 break;
5616 case Decl::ImplicitParam:
5617 case Decl::ObjCAtDefsField:
5618 case Decl::ObjCCategory:
5619 case Decl::ObjCCategoryImpl:
5620 case Decl::ObjCCompatibleAlias:
5621 case Decl::ObjCImplementation:
5622 case Decl::ObjCInterface:
5623 case Decl::ObjCIvar:
5624 case Decl::ObjCMethod:
5625 case Decl::ObjCProperty:
5626 case Decl::ObjCPropertyImpl:
5627 case Decl::ObjCProtocol:
5628 return CXLanguage_ObjC;
5629 case Decl::CXXConstructor:
5630 case Decl::CXXConversion:
5631 case Decl::CXXDestructor:
5632 case Decl::CXXMethod:
5633 case Decl::CXXRecord:
5634 case Decl::ClassTemplate:
5635 case Decl::ClassTemplatePartialSpecialization:
5636 case Decl::ClassTemplateSpecialization:
5637 case Decl::Friend:
5638 case Decl::FriendTemplate:
5639 case Decl::FunctionTemplate:
5640 case Decl::LinkageSpec:
5641 case Decl::Namespace:
5642 case Decl::NamespaceAlias:
5643 case Decl::NonTypeTemplateParm:
5644 case Decl::StaticAssert:
5645 case Decl::TemplateTemplateParm:
5646 case Decl::TemplateTypeParm:
5647 case Decl::UnresolvedUsingTypename:
5648 case Decl::UnresolvedUsingValue:
5649 case Decl::Using:
5650 case Decl::UsingDirective:
5651 case Decl::UsingShadow:
5652 return CXLanguage_CPlusPlus;
5653 }
5654
5655 return CXLanguage_C;
5656}
5657
5658extern "C" {
5659
5660enum CXAvailabilityKind clang_getCursorAvailability(CXCursor cursor) {
5661 if (clang_isDeclaration(cursor.kind))
5662 if (Decl *D = cxcursor::getCursorDecl(cursor)) {
5663 if (isa<FunctionDecl>(D) && cast<FunctionDecl>(D)->isDeleted())
5664 return CXAvailability_Available;
5665
5666 switch (D->getAvailability()) {
5667 case AR_Available:
5668 case AR_NotYetIntroduced:
5669 return CXAvailability_Available;
5670
5671 case AR_Deprecated:
5672 return CXAvailability_Deprecated;
5673
5674 case AR_Unavailable:
5675 return CXAvailability_NotAvailable;
5676 }
5677 }
5678
5679 return CXAvailability_Available;
5680}
5681
5682static CXVersion convertVersion(VersionTuple In) {
5683 CXVersion Out = { -1, -1, -1 };
5684 if (In.empty())
5685 return Out;
5686
5687 Out.Major = In.getMajor();
5688
5689 if (llvm::Optional<unsigned> Minor = In.getMinor())
5690 Out.Minor = *Minor;
5691 else
5692 return Out;
5693
5694 if (llvm::Optional<unsigned> Subminor = In.getSubminor())
5695 Out.Subminor = *Subminor;
5696
5697 return Out;
5698}
5699
5700int clang_getCursorPlatformAvailability(CXCursor cursor,
5701 int *always_deprecated,
5702 CXString *deprecated_message,
5703 int *always_unavailable,
5704 CXString *unavailable_message,
5705 CXPlatformAvailability *availability,
5706 int availability_size) {
5707 if (always_deprecated)
5708 *always_deprecated = 0;
5709 if (deprecated_message)
5710 *deprecated_message = cxstring::createCXString("", /*DupString=*/false);
5711 if (always_unavailable)
5712 *always_unavailable = 0;
5713 if (unavailable_message)
5714 *unavailable_message = cxstring::createCXString("", /*DupString=*/false);
5715
5716 if (!clang_isDeclaration(cursor.kind))
5717 return 0;
5718
5719 Decl *D = cxcursor::getCursorDecl(cursor);
5720 if (!D)
5721 return 0;
5722
5723 int N = 0;
5724 for (Decl::attr_iterator A = D->attr_begin(), AEnd = D->attr_end(); A != AEnd;
5725 ++A) {
5726 if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(*A)) {
5727 if (always_deprecated)
5728 *always_deprecated = 1;
5729 if (deprecated_message)
5730 *deprecated_message = cxstring::createCXString(Deprecated->getMessage());
5731 continue;
5732 }
5733
5734 if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(*A)) {
5735 if (always_unavailable)
5736 *always_unavailable = 1;
5737 if (unavailable_message) {
5738 *unavailable_message
5739 = cxstring::createCXString(Unavailable->getMessage());
5740 }
5741 continue;
5742 }
5743
5744 if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(*A)) {
5745 if (N < availability_size) {
5746 availability[N].Platform
5747 = cxstring::createCXString(Avail->getPlatform()->getName());
5748 availability[N].Introduced = convertVersion(Avail->getIntroduced());
5749 availability[N].Deprecated = convertVersion(Avail->getDeprecated());
5750 availability[N].Obsoleted = convertVersion(Avail->getObsoleted());
5751 availability[N].Unavailable = Avail->getUnavailable();
5752 availability[N].Message = cxstring::createCXString(Avail->getMessage());
5753 }
5754 ++N;
5755 }
5756 }
5757
5758 return N;
5759}
5760
5761void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) {
5762 clang_disposeString(availability->Platform);
5763 clang_disposeString(availability->Message);
5764}
5765
5766CXLanguageKind clang_getCursorLanguage(CXCursor cursor) {
5767 if (clang_isDeclaration(cursor.kind))
5768 return getDeclLanguage(cxcursor::getCursorDecl(cursor));
5769
5770 return CXLanguage_Invalid;
5771}
5772
5773 /// \brief If the given cursor is the "templated" declaration
5774 /// descibing a class or function template, return the class or
5775 /// function template.
5776static Decl *maybeGetTemplateCursor(Decl *D) {
5777 if (!D)
5778 return 0;
5779
5780 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
5781 if (FunctionTemplateDecl *FunTmpl = FD->getDescribedFunctionTemplate())
5782 return FunTmpl;
5783
5784 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
5785 if (ClassTemplateDecl *ClassTmpl = RD->getDescribedClassTemplate())
5786 return ClassTmpl;
5787
5788 return D;
5789}
5790
5791CXCursor clang_getCursorSemanticParent(CXCursor cursor) {
5792 if (clang_isDeclaration(cursor.kind)) {
5793 if (Decl *D = getCursorDecl(cursor)) {
5794 DeclContext *DC = D->getDeclContext();
5795 if (!DC)
5796 return clang_getNullCursor();
5797
5798 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
5799 getCursorTU(cursor));
5800 }
5801 }
5802
5803 if (clang_isStatement(cursor.kind) || clang_isExpression(cursor.kind)) {
5804 if (Decl *D = getCursorDecl(cursor))
5805 return MakeCXCursor(D, getCursorTU(cursor));
5806 }
5807
5808 return clang_getNullCursor();
5809}
5810
5811CXCursor clang_getCursorLexicalParent(CXCursor cursor) {
5812 if (clang_isDeclaration(cursor.kind)) {
5813 if (Decl *D = getCursorDecl(cursor)) {
5814 DeclContext *DC = D->getLexicalDeclContext();
5815 if (!DC)
5816 return clang_getNullCursor();
5817
5818 return MakeCXCursor(maybeGetTemplateCursor(cast<Decl>(DC)),
5819 getCursorTU(cursor));
5820 }
5821 }
5822
5823 // FIXME: Note that we can't easily compute the lexical context of a
5824 // statement or expression, so we return nothing.
5825 return clang_getNullCursor();
5826}
5827
5828CXFile clang_getIncludedFile(CXCursor cursor) {
5829 if (cursor.kind != CXCursor_InclusionDirective)
5830 return 0;
5831
Dmitri Gribenko67812b22013-01-11 21:01:49 +00005832 const InclusionDirective *ID = getCursorInclusionDirective(cursor);
Guy Benyei7f92f2d2012-12-18 14:30:41 +00005833 return (void *)ID->getFile();
5834}
5835
5836CXSourceRange clang_Cursor_getCommentRange(CXCursor C) {
5837 if (!clang_isDeclaration(C.kind))
5838 return clang_getNullRange();
5839
5840 const Decl *D = getCursorDecl(C);
5841 ASTContext &Context = getCursorContext(C);
5842 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
5843 if (!RC)
5844 return clang_getNullRange();
5845
5846 return cxloc::translateSourceRange(Context, RC->getSourceRange());
5847}
5848
5849CXString clang_Cursor_getRawCommentText(CXCursor C) {
5850 if (!clang_isDeclaration(C.kind))
5851 return createCXString((const char *) NULL);
5852
5853 const Decl *D = getCursorDecl(C);
5854 ASTContext &Context = getCursorContext(C);
5855 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
5856 StringRef RawText = RC ? RC->getRawText(Context.getSourceManager()) :
5857 StringRef();
5858
5859 // Don't duplicate the string because RawText points directly into source
5860 // code.
5861 return createCXString(RawText, false);
5862}
5863
5864CXString clang_Cursor_getBriefCommentText(CXCursor C) {
5865 if (!clang_isDeclaration(C.kind))
5866 return createCXString((const char *) NULL);
5867
5868 const Decl *D = getCursorDecl(C);
5869 const ASTContext &Context = getCursorContext(C);
5870 const RawComment *RC = Context.getRawCommentForAnyRedecl(D);
5871
5872 if (RC) {
5873 StringRef BriefText = RC->getBriefText(Context);
5874
5875 // Don't duplicate the string because RawComment ensures that this memory
5876 // will not go away.
5877 return createCXString(BriefText, false);
5878 }
5879
5880 return createCXString((const char *) NULL);
5881}
5882
5883CXComment clang_Cursor_getParsedComment(CXCursor C) {
5884 if (!clang_isDeclaration(C.kind))
5885 return cxcomment::createCXComment(NULL, NULL);
5886
5887 const Decl *D = getCursorDecl(C);
5888 const ASTContext &Context = getCursorContext(C);
5889 const comments::FullComment *FC = Context.getCommentForDecl(D, /*PP=*/ NULL);
5890
5891 return cxcomment::createCXComment(FC, getCursorTU(C));
5892}
5893
5894CXModule clang_Cursor_getModule(CXCursor C) {
5895 if (C.kind == CXCursor_ModuleImportDecl) {
5896 if (ImportDecl *ImportD = dyn_cast_or_null<ImportDecl>(getCursorDecl(C)))
5897 return ImportD->getImportedModule();
5898 }
5899
5900 return 0;
5901}
5902
5903CXModule clang_Module_getParent(CXModule CXMod) {
5904 if (!CXMod)
5905 return 0;
5906 Module *Mod = static_cast<Module*>(CXMod);
5907 return Mod->Parent;
5908}
5909
5910CXString clang_Module_getName(CXModule CXMod) {
5911 if (!CXMod)
5912 return createCXString("");
5913 Module *Mod = static_cast<Module*>(CXMod);
5914 return createCXString(Mod->Name);
5915}
5916
5917CXString clang_Module_getFullName(CXModule CXMod) {
5918 if (!CXMod)
5919 return createCXString("");
5920 Module *Mod = static_cast<Module*>(CXMod);
5921 return createCXString(Mod->getFullModuleName());
5922}
5923
5924unsigned clang_Module_getNumTopLevelHeaders(CXModule CXMod) {
5925 if (!CXMod)
5926 return 0;
5927 Module *Mod = static_cast<Module*>(CXMod);
5928 return Mod->TopHeaders.size();
5929}
5930
5931CXFile clang_Module_getTopLevelHeader(CXModule CXMod, unsigned Index) {
5932 if (!CXMod)
5933 return 0;
5934 Module *Mod = static_cast<Module*>(CXMod);
5935
5936 if (Index < Mod->TopHeaders.size())
5937 return const_cast<FileEntry *>(Mod->TopHeaders[Index]);
5938
5939 return 0;
5940}
5941
5942} // end: extern "C"
5943
5944//===----------------------------------------------------------------------===//
5945// C++ AST instrospection.
5946//===----------------------------------------------------------------------===//
5947
5948extern "C" {
5949unsigned clang_CXXMethod_isStatic(CXCursor C) {
5950 if (!clang_isDeclaration(C.kind))
5951 return 0;
5952
5953 CXXMethodDecl *Method = 0;
5954 Decl *D = cxcursor::getCursorDecl(C);
5955 if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D))
5956 Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
5957 else
5958 Method = dyn_cast_or_null<CXXMethodDecl>(D);
5959 return (Method && Method->isStatic()) ? 1 : 0;
5960}
5961
5962unsigned clang_CXXMethod_isVirtual(CXCursor C) {
5963 if (!clang_isDeclaration(C.kind))
5964 return 0;
5965
5966 CXXMethodDecl *Method = 0;
5967 Decl *D = cxcursor::getCursorDecl(C);
5968 if (FunctionTemplateDecl *FunTmpl = dyn_cast_or_null<FunctionTemplateDecl>(D))
5969 Method = dyn_cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl());
5970 else
5971 Method = dyn_cast_or_null<CXXMethodDecl>(D);
5972 return (Method && Method->isVirtual()) ? 1 : 0;
5973}
5974} // end: extern "C"
5975
5976//===----------------------------------------------------------------------===//
5977// Attribute introspection.
5978//===----------------------------------------------------------------------===//
5979
5980extern "C" {
5981CXType clang_getIBOutletCollectionType(CXCursor C) {
5982 if (C.kind != CXCursor_IBOutletCollectionAttr)
5983 return cxtype::MakeCXType(QualType(), cxcursor::getCursorTU(C));
5984
5985 IBOutletCollectionAttr *A =
5986 cast<IBOutletCollectionAttr>(cxcursor::getCursorAttr(C));
5987
5988 return cxtype::MakeCXType(A->getInterface(), cxcursor::getCursorTU(C));
5989}
5990} // end: extern "C"
5991
5992//===----------------------------------------------------------------------===//
5993// Inspecting memory usage.
5994//===----------------------------------------------------------------------===//
5995
5996typedef std::vector<CXTUResourceUsageEntry> MemUsageEntries;
5997
5998static inline void createCXTUResourceUsageEntry(MemUsageEntries &entries,
5999 enum CXTUResourceUsageKind k,
6000 unsigned long amount) {
6001 CXTUResourceUsageEntry entry = { k, amount };
6002 entries.push_back(entry);
6003}
6004
6005extern "C" {
6006
6007const char *clang_getTUResourceUsageName(CXTUResourceUsageKind kind) {
6008 const char *str = "";
6009 switch (kind) {
6010 case CXTUResourceUsage_AST:
6011 str = "ASTContext: expressions, declarations, and types";
6012 break;
6013 case CXTUResourceUsage_Identifiers:
6014 str = "ASTContext: identifiers";
6015 break;
6016 case CXTUResourceUsage_Selectors:
6017 str = "ASTContext: selectors";
6018 break;
6019 case CXTUResourceUsage_GlobalCompletionResults:
6020 str = "Code completion: cached global results";
6021 break;
6022 case CXTUResourceUsage_SourceManagerContentCache:
6023 str = "SourceManager: content cache allocator";
6024 break;
6025 case CXTUResourceUsage_AST_SideTables:
6026 str = "ASTContext: side tables";
6027 break;
6028 case CXTUResourceUsage_SourceManager_Membuffer_Malloc:
6029 str = "SourceManager: malloc'ed memory buffers";
6030 break;
6031 case CXTUResourceUsage_SourceManager_Membuffer_MMap:
6032 str = "SourceManager: mmap'ed memory buffers";
6033 break;
6034 case CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc:
6035 str = "ExternalASTSource: malloc'ed memory buffers";
6036 break;
6037 case CXTUResourceUsage_ExternalASTSource_Membuffer_MMap:
6038 str = "ExternalASTSource: mmap'ed memory buffers";
6039 break;
6040 case CXTUResourceUsage_Preprocessor:
6041 str = "Preprocessor: malloc'ed memory";
6042 break;
6043 case CXTUResourceUsage_PreprocessingRecord:
6044 str = "Preprocessor: PreprocessingRecord";
6045 break;
6046 case CXTUResourceUsage_SourceManager_DataStructures:
6047 str = "SourceManager: data structures and tables";
6048 break;
6049 case CXTUResourceUsage_Preprocessor_HeaderSearch:
6050 str = "Preprocessor: header search tables";
6051 break;
6052 }
6053 return str;
6054}
6055
6056CXTUResourceUsage clang_getCXTUResourceUsage(CXTranslationUnit TU) {
6057 if (!TU) {
6058 CXTUResourceUsage usage = { (void*) 0, 0, 0 };
6059 return usage;
6060 }
6061
6062 ASTUnit *astUnit = static_cast<ASTUnit*>(TU->TUData);
6063 OwningPtr<MemUsageEntries> entries(new MemUsageEntries());
6064 ASTContext &astContext = astUnit->getASTContext();
6065
6066 // How much memory is used by AST nodes and types?
6067 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST,
6068 (unsigned long) astContext.getASTAllocatedMemory());
6069
6070 // How much memory is used by identifiers?
6071 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Identifiers,
6072 (unsigned long) astContext.Idents.getAllocator().getTotalMemory());
6073
6074 // How much memory is used for selectors?
6075 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_Selectors,
6076 (unsigned long) astContext.Selectors.getTotalMemory());
6077
6078 // How much memory is used by ASTContext's side tables?
6079 createCXTUResourceUsageEntry(*entries, CXTUResourceUsage_AST_SideTables,
6080 (unsigned long) astContext.getSideTableAllocatedMemory());
6081
6082 // How much memory is used for caching global code completion results?
6083 unsigned long completionBytes = 0;
6084 if (GlobalCodeCompletionAllocator *completionAllocator =
6085 astUnit->getCachedCompletionAllocator().getPtr()) {
6086 completionBytes = completionAllocator->getTotalMemory();
6087 }
6088 createCXTUResourceUsageEntry(*entries,
6089 CXTUResourceUsage_GlobalCompletionResults,
6090 completionBytes);
6091
6092 // How much memory is being used by SourceManager's content cache?
6093 createCXTUResourceUsageEntry(*entries,
6094 CXTUResourceUsage_SourceManagerContentCache,
6095 (unsigned long) astContext.getSourceManager().getContentCacheSize());
6096
6097 // How much memory is being used by the MemoryBuffer's in SourceManager?
6098 const SourceManager::MemoryBufferSizes &srcBufs =
6099 astUnit->getSourceManager().getMemoryBufferSizes();
6100
6101 createCXTUResourceUsageEntry(*entries,
6102 CXTUResourceUsage_SourceManager_Membuffer_Malloc,
6103 (unsigned long) srcBufs.malloc_bytes);
6104 createCXTUResourceUsageEntry(*entries,
6105 CXTUResourceUsage_SourceManager_Membuffer_MMap,
6106 (unsigned long) srcBufs.mmap_bytes);
6107 createCXTUResourceUsageEntry(*entries,
6108 CXTUResourceUsage_SourceManager_DataStructures,
6109 (unsigned long) astContext.getSourceManager()
6110 .getDataStructureSizes());
6111
6112 // How much memory is being used by the ExternalASTSource?
6113 if (ExternalASTSource *esrc = astContext.getExternalSource()) {
6114 const ExternalASTSource::MemoryBufferSizes &sizes =
6115 esrc->getMemoryBufferSizes();
6116
6117 createCXTUResourceUsageEntry(*entries,
6118 CXTUResourceUsage_ExternalASTSource_Membuffer_Malloc,
6119 (unsigned long) sizes.malloc_bytes);
6120 createCXTUResourceUsageEntry(*entries,
6121 CXTUResourceUsage_ExternalASTSource_Membuffer_MMap,
6122 (unsigned long) sizes.mmap_bytes);
6123 }
6124
6125 // How much memory is being used by the Preprocessor?
6126 Preprocessor &pp = astUnit->getPreprocessor();
6127 createCXTUResourceUsageEntry(*entries,
6128 CXTUResourceUsage_Preprocessor,
6129 pp.getTotalMemory());
6130
6131 if (PreprocessingRecord *pRec = pp.getPreprocessingRecord()) {
6132 createCXTUResourceUsageEntry(*entries,
6133 CXTUResourceUsage_PreprocessingRecord,
6134 pRec->getTotalMemory());
6135 }
6136
6137 createCXTUResourceUsageEntry(*entries,
6138 CXTUResourceUsage_Preprocessor_HeaderSearch,
6139 pp.getHeaderSearchInfo().getTotalMemory());
6140
6141 CXTUResourceUsage usage = { (void*) entries.get(),
6142 (unsigned) entries->size(),
6143 entries->size() ? &(*entries)[0] : 0 };
6144 entries.take();
6145 return usage;
6146}
6147
6148void clang_disposeCXTUResourceUsage(CXTUResourceUsage usage) {
6149 if (usage.data)
6150 delete (MemUsageEntries*) usage.data;
6151}
6152
6153} // end extern "C"
6154
6155void clang::PrintLibclangResourceUsage(CXTranslationUnit TU) {
6156 CXTUResourceUsage Usage = clang_getCXTUResourceUsage(TU);
6157 for (unsigned I = 0; I != Usage.numEntries; ++I)
6158 fprintf(stderr, " %s: %lu\n",
6159 clang_getTUResourceUsageName(Usage.entries[I].kind),
6160 Usage.entries[I].amount);
6161
6162 clang_disposeCXTUResourceUsage(Usage);
6163}
6164
6165//===----------------------------------------------------------------------===//
6166// Misc. utility functions.
6167//===----------------------------------------------------------------------===//
6168
6169/// Default to using an 8 MB stack size on "safety" threads.
6170static unsigned SafetyStackThreadSize = 8 << 20;
6171
6172namespace clang {
6173
6174bool RunSafely(llvm::CrashRecoveryContext &CRC,
6175 void (*Fn)(void*), void *UserData,
6176 unsigned Size) {
6177 if (!Size)
6178 Size = GetSafetyThreadStackSize();
6179 if (Size)
6180 return CRC.RunSafelyOnThread(Fn, UserData, Size);
6181 return CRC.RunSafely(Fn, UserData);
6182}
6183
6184unsigned GetSafetyThreadStackSize() {
6185 return SafetyStackThreadSize;
6186}
6187
6188void SetSafetyThreadStackSize(unsigned Value) {
6189 SafetyStackThreadSize = Value;
6190}
6191
6192}
6193
6194void clang::setThreadBackgroundPriority() {
6195 if (getenv("LIBCLANG_BGPRIO_DISABLE"))
6196 return;
6197
6198 // FIXME: Move to llvm/Support and make it cross-platform.
6199#ifdef __APPLE__
6200 setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG);
6201#endif
6202}
6203
6204void cxindex::printDiagsToStderr(ASTUnit *Unit) {
6205 if (!Unit)
6206 return;
6207
6208 for (ASTUnit::stored_diag_iterator D = Unit->stored_diag_begin(),
6209 DEnd = Unit->stored_diag_end();
6210 D != DEnd; ++D) {
6211 CXStoredDiagnostic Diag(*D, Unit->getASTContext().getLangOpts());
6212 CXString Msg = clang_formatDiagnostic(&Diag,
6213 clang_defaultDiagnosticDisplayOptions());
6214 fprintf(stderr, "%s\n", clang_getCString(Msg));
6215 clang_disposeString(Msg);
6216 }
6217#ifdef LLVM_ON_WIN32
6218 // On Windows, force a flush, since there may be multiple copies of
6219 // stderr and stdout in the file system, all with different buffers
6220 // but writing to the same device.
6221 fflush(stderr);
6222#endif
6223}
6224
Argyrios Kyrtzidis664b06f2013-01-07 19:16:25 +00006225MacroInfo *cxindex::getMacroInfo(const IdentifierInfo &II,
6226 SourceLocation MacroDefLoc,
6227 CXTranslationUnit TU){
6228 if (MacroDefLoc.isInvalid() || !TU)
6229 return 0;
Argyrios Kyrtzidis664b06f2013-01-07 19:16:25 +00006230 if (!II.hadMacroDefinition())
6231 return 0;
6232
Argyrios Kyrtzidisc059f892013-01-07 19:16:30 +00006233 ASTUnit *Unit = static_cast<ASTUnit *>(TU->TUData);
6234 Preprocessor &PP = Unit->getPreprocessor();
Dmitri Gribenkob3958472013-01-14 00:36:42 +00006235 MacroInfo *MI = PP.getMacroInfoHistory(&II);
Argyrios Kyrtzidis664b06f2013-01-07 19:16:25 +00006236 while (MI) {
6237 if (MacroDefLoc == MI->getDefinitionLoc())
6238 return MI;
6239 MI = MI->getPreviousDefinition();
6240 }
6241
6242 return 0;
6243}
6244
Dmitri Gribenko67812b22013-01-11 21:01:49 +00006245const MacroInfo *cxindex::getMacroInfo(const MacroDefinition *MacroDef,
6246 CXTranslationUnit TU) {
Argyrios Kyrtzidis664b06f2013-01-07 19:16:25 +00006247 if (!MacroDef || !TU)
6248 return 0;
6249 const IdentifierInfo *II = MacroDef->getName();
6250 if (!II)
6251 return 0;
6252
6253 return getMacroInfo(*II, MacroDef->getLocation(), TU);
6254}
6255
6256MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI,
6257 const Token &Tok,
6258 CXTranslationUnit TU) {
6259 if (!MI || !TU)
6260 return 0;
6261 if (Tok.isNot(tok::raw_identifier))
6262 return 0;
6263
6264 if (MI->getNumTokens() == 0)
6265 return 0;
6266 SourceRange DefRange(MI->getReplacementToken(0).getLocation(),
6267 MI->getDefinitionEndLoc());
6268 ASTUnit *Unit = static_cast<ASTUnit *>(TU->TUData);
6269
6270 // Check that the token is inside the definition and not its argument list.
6271 SourceManager &SM = Unit->getSourceManager();
6272 if (SM.isBeforeInTranslationUnit(Tok.getLocation(), DefRange.getBegin()))
6273 return 0;
6274 if (SM.isBeforeInTranslationUnit(DefRange.getEnd(), Tok.getLocation()))
6275 return 0;
6276
6277 Preprocessor &PP = Unit->getPreprocessor();
6278 PreprocessingRecord *PPRec = PP.getPreprocessingRecord();
6279 if (!PPRec)
6280 return 0;
6281
6282 StringRef Name(Tok.getRawIdentifierData(), Tok.getLength());
6283 IdentifierInfo &II = PP.getIdentifierTable().get(Name);
6284 if (!II.hadMacroDefinition())
6285 return 0;
6286
6287 // Check that the identifier is not one of the macro arguments.
6288 if (std::find(MI->arg_begin(), MI->arg_end(), &II) != MI->arg_end())
6289 return 0;
6290
6291 MacroInfo *InnerMI = PP.getMacroInfoHistory(&II);
6292 if (!InnerMI)
6293 return 0;
6294
6295 return PPRec->findMacroDefinition(InnerMI);
6296}
6297
6298MacroDefinition *cxindex::checkForMacroInMacroDefinition(const MacroInfo *MI,
6299 SourceLocation Loc,
6300 CXTranslationUnit TU) {
6301 if (Loc.isInvalid() || !MI || !TU)
6302 return 0;
6303
6304 if (MI->getNumTokens() == 0)
6305 return 0;
6306 ASTUnit *Unit = static_cast<ASTUnit *>(TU->TUData);
6307 Preprocessor &PP = Unit->getPreprocessor();
6308 if (!PP.getPreprocessingRecord())
6309 return 0;
6310 Loc = Unit->getSourceManager().getSpellingLoc(Loc);
6311 Token Tok;
6312 if (PP.getRawToken(Loc, Tok))
6313 return 0;
6314
6315 return checkForMacroInMacroDefinition(MI, Tok, TU);
6316}
6317
Guy Benyei7f92f2d2012-12-18 14:30:41 +00006318extern "C" {
6319
6320CXString clang_getClangVersion() {
6321 return createCXString(getClangFullVersion());
6322}
6323
6324} // end: extern "C"
6325
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00006326Logger &cxindex::Logger::operator<<(CXTranslationUnit TU) {
6327 if (TU) {
6328 if (ASTUnit *Unit = static_cast<ASTUnit *>(TU->TUData)) {
6329 LogOS << '<' << Unit->getMainFileName() << '>';
6330 return *this;
6331 }
6332 }
6333
6334 LogOS << "<NULL TU>";
6335 return *this;
6336}
6337
6338Logger &cxindex::Logger::operator<<(CXSourceLocation Loc) {
6339 CXFile File;
6340 unsigned Line, Column;
6341 clang_getFileLocation(Loc, &File, &Line, &Column, 0);
6342 CXString FileName = clang_getFileName(File);
6343 *this << llvm::format("(%s:%d:%d)", clang_getCString(FileName), Line, Column);
6344 clang_disposeString(FileName);
6345 return *this;
6346}
6347
6348Logger &cxindex::Logger::operator<<(CXSourceRange range) {
6349 CXSourceLocation BLoc = clang_getRangeStart(range);
6350 CXSourceLocation ELoc = clang_getRangeEnd(range);
6351
6352 CXFile BFile;
6353 unsigned BLine, BColumn;
6354 clang_getFileLocation(BLoc, &BFile, &BLine, &BColumn, 0);
6355
6356 CXFile EFile;
6357 unsigned ELine, EColumn;
6358 clang_getFileLocation(ELoc, &EFile, &ELine, &EColumn, 0);
6359
6360 CXString BFileName = clang_getFileName(BFile);
6361 if (BFile == EFile) {
6362 *this << llvm::format("[%s %d:%d-%d:%d]", clang_getCString(BFileName),
6363 BLine, BColumn, ELine, EColumn);
6364 } else {
6365 CXString EFileName = clang_getFileName(EFile);
6366 *this << llvm::format("[%s:%d:%d - ", clang_getCString(BFileName),
6367 BLine, BColumn)
6368 << llvm::format("%s:%d:%d]", clang_getCString(EFileName),
6369 ELine, EColumn);
6370 clang_disposeString(EFileName);
6371 }
6372 clang_disposeString(BFileName);
6373 return *this;
6374}
6375
6376Logger &cxindex::Logger::operator<<(CXString Str) {
6377 *this << clang_getCString(Str);
6378 return *this;
6379}
6380
6381Logger &cxindex::Logger::operator<<(const llvm::format_object_base &Fmt) {
6382 LogOS << Fmt;
6383 return *this;
6384}
6385
6386cxindex::Logger::~Logger() {
6387 LogOS.flush();
6388
6389 llvm::sys::ScopedLock L(EnableMultithreadingMutex);
6390
6391 static llvm::TimeRecord sBeginTR = llvm::TimeRecord::getCurrentTime();
6392
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +00006393 raw_ostream &OS = llvm::errs();
Argyrios Kyrtzidisc6f5c6a2013-01-10 18:54:52 +00006394 OS << "[libclang:" << Name << ':';
6395
6396 // FIXME: Portability.
6397#if HAVE_PTHREAD_H && __APPLE__
6398 mach_port_t tid = pthread_mach_thread_np(pthread_self());
6399 OS << tid << ':';
6400#endif
6401
6402 llvm::TimeRecord TR = llvm::TimeRecord::getCurrentTime();
6403 OS << llvm::format("%7.4f] ", TR.getWallTime() - sBeginTR.getWallTime());
6404 OS << Msg.str() << '\n';
6405
6406 if (Trace) {
6407 llvm::sys::PrintStackTrace(stderr);
6408 OS << "--------------------------------------------------\n";
6409 }
6410}