Bug Summary

File:tools/clang/tools/libclang/CIndex.cpp
Warning:line 3538, column 3
Branch condition evaluates to a garbage value

Annotated Source Code

Press '?' to see keyboard shortcuts

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