TextNodeDumper.cpp revision 1.1.1.2 1 1.1 joerg //===--- TextNodeDumper.cpp - Printing of AST nodes -----------------------===//
2 1.1 joerg //
3 1.1 joerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 1.1 joerg // See https://llvm.org/LICENSE.txt for license information.
5 1.1 joerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 1.1 joerg //
7 1.1 joerg //===----------------------------------------------------------------------===//
8 1.1 joerg //
9 1.1 joerg // This file implements AST dumping of components of individual AST nodes.
10 1.1 joerg //
11 1.1 joerg //===----------------------------------------------------------------------===//
12 1.1 joerg
13 1.1 joerg #include "clang/AST/TextNodeDumper.h"
14 1.1.1.2 joerg #include "clang/AST/APValue.h"
15 1.1 joerg #include "clang/AST/DeclFriend.h"
16 1.1 joerg #include "clang/AST/DeclOpenMP.h"
17 1.1 joerg #include "clang/AST/DeclTemplate.h"
18 1.1 joerg #include "clang/AST/LocInfoType.h"
19 1.1.1.2 joerg #include "clang/AST/Type.h"
20 1.1.1.2 joerg #include "clang/Basic/Module.h"
21 1.1.1.2 joerg #include "clang/Basic/SourceManager.h"
22 1.1.1.2 joerg #include "clang/Basic/Specifiers.h"
23 1.1.1.2 joerg #include "clang/Basic/TypeTraits.h"
24 1.1.1.2 joerg
25 1.1.1.2 joerg #include <algorithm>
26 1.1.1.2 joerg #include <utility>
27 1.1 joerg
28 1.1 joerg using namespace clang;
29 1.1 joerg
30 1.1 joerg static void dumpPreviousDeclImpl(raw_ostream &OS, ...) {}
31 1.1 joerg
32 1.1 joerg template <typename T>
33 1.1 joerg static void dumpPreviousDeclImpl(raw_ostream &OS, const Mergeable<T> *D) {
34 1.1 joerg const T *First = D->getFirstDecl();
35 1.1 joerg if (First != D)
36 1.1 joerg OS << " first " << First;
37 1.1 joerg }
38 1.1 joerg
39 1.1 joerg template <typename T>
40 1.1 joerg static void dumpPreviousDeclImpl(raw_ostream &OS, const Redeclarable<T> *D) {
41 1.1 joerg const T *Prev = D->getPreviousDecl();
42 1.1 joerg if (Prev)
43 1.1 joerg OS << " prev " << Prev;
44 1.1 joerg }
45 1.1 joerg
46 1.1 joerg /// Dump the previous declaration in the redeclaration chain for a declaration,
47 1.1 joerg /// if any.
48 1.1 joerg static void dumpPreviousDecl(raw_ostream &OS, const Decl *D) {
49 1.1 joerg switch (D->getKind()) {
50 1.1 joerg #define DECL(DERIVED, BASE) \
51 1.1 joerg case Decl::DERIVED: \
52 1.1 joerg return dumpPreviousDeclImpl(OS, cast<DERIVED##Decl>(D));
53 1.1 joerg #define ABSTRACT_DECL(DECL)
54 1.1 joerg #include "clang/AST/DeclNodes.inc"
55 1.1 joerg }
56 1.1 joerg llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
57 1.1 joerg }
58 1.1 joerg
59 1.1.1.2 joerg TextNodeDumper::TextNodeDumper(raw_ostream &OS, const ASTContext &Context,
60 1.1.1.2 joerg bool ShowColors)
61 1.1.1.2 joerg : TextTreeStructure(OS, ShowColors), OS(OS), ShowColors(ShowColors),
62 1.1.1.2 joerg Context(&Context), SM(&Context.getSourceManager()),
63 1.1.1.2 joerg PrintPolicy(Context.getPrintingPolicy()),
64 1.1.1.2 joerg Traits(&Context.getCommentCommandTraits()) {}
65 1.1.1.2 joerg
66 1.1.1.2 joerg TextNodeDumper::TextNodeDumper(raw_ostream &OS, bool ShowColors)
67 1.1.1.2 joerg : TextTreeStructure(OS, ShowColors), OS(OS), ShowColors(ShowColors) {}
68 1.1 joerg
69 1.1 joerg void TextNodeDumper::Visit(const comments::Comment *C,
70 1.1 joerg const comments::FullComment *FC) {
71 1.1 joerg if (!C) {
72 1.1 joerg ColorScope Color(OS, ShowColors, NullColor);
73 1.1 joerg OS << "<<<NULL>>>";
74 1.1 joerg return;
75 1.1 joerg }
76 1.1 joerg
77 1.1 joerg {
78 1.1 joerg ColorScope Color(OS, ShowColors, CommentColor);
79 1.1 joerg OS << C->getCommentKindName();
80 1.1 joerg }
81 1.1 joerg dumpPointer(C);
82 1.1 joerg dumpSourceRange(C->getSourceRange());
83 1.1 joerg
84 1.1 joerg ConstCommentVisitor<TextNodeDumper, void,
85 1.1 joerg const comments::FullComment *>::visit(C, FC);
86 1.1 joerg }
87 1.1 joerg
88 1.1 joerg void TextNodeDumper::Visit(const Attr *A) {
89 1.1 joerg {
90 1.1 joerg ColorScope Color(OS, ShowColors, AttrColor);
91 1.1 joerg
92 1.1 joerg switch (A->getKind()) {
93 1.1 joerg #define ATTR(X) \
94 1.1 joerg case attr::X: \
95 1.1 joerg OS << #X; \
96 1.1 joerg break;
97 1.1 joerg #include "clang/Basic/AttrList.inc"
98 1.1 joerg }
99 1.1 joerg OS << "Attr";
100 1.1 joerg }
101 1.1 joerg dumpPointer(A);
102 1.1 joerg dumpSourceRange(A->getRange());
103 1.1 joerg if (A->isInherited())
104 1.1 joerg OS << " Inherited";
105 1.1 joerg if (A->isImplicit())
106 1.1 joerg OS << " Implicit";
107 1.1 joerg
108 1.1 joerg ConstAttrVisitor<TextNodeDumper>::Visit(A);
109 1.1 joerg }
110 1.1 joerg
111 1.1 joerg void TextNodeDumper::Visit(const TemplateArgument &TA, SourceRange R,
112 1.1 joerg const Decl *From, StringRef Label) {
113 1.1 joerg OS << "TemplateArgument";
114 1.1 joerg if (R.isValid())
115 1.1 joerg dumpSourceRange(R);
116 1.1 joerg
117 1.1 joerg if (From)
118 1.1 joerg dumpDeclRef(From, Label);
119 1.1 joerg
120 1.1 joerg ConstTemplateArgumentVisitor<TextNodeDumper>::Visit(TA);
121 1.1 joerg }
122 1.1 joerg
123 1.1 joerg void TextNodeDumper::Visit(const Stmt *Node) {
124 1.1 joerg if (!Node) {
125 1.1 joerg ColorScope Color(OS, ShowColors, NullColor);
126 1.1 joerg OS << "<<<NULL>>>";
127 1.1 joerg return;
128 1.1 joerg }
129 1.1 joerg {
130 1.1 joerg ColorScope Color(OS, ShowColors, StmtColor);
131 1.1 joerg OS << Node->getStmtClassName();
132 1.1 joerg }
133 1.1 joerg dumpPointer(Node);
134 1.1 joerg dumpSourceRange(Node->getSourceRange());
135 1.1 joerg
136 1.1 joerg if (const auto *E = dyn_cast<Expr>(Node)) {
137 1.1 joerg dumpType(E->getType());
138 1.1 joerg
139 1.1.1.2 joerg if (E->containsErrors()) {
140 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ErrorsColor);
141 1.1.1.2 joerg OS << " contains-errors";
142 1.1.1.2 joerg }
143 1.1.1.2 joerg
144 1.1 joerg {
145 1.1 joerg ColorScope Color(OS, ShowColors, ValueKindColor);
146 1.1 joerg switch (E->getValueKind()) {
147 1.1 joerg case VK_RValue:
148 1.1 joerg break;
149 1.1 joerg case VK_LValue:
150 1.1 joerg OS << " lvalue";
151 1.1 joerg break;
152 1.1 joerg case VK_XValue:
153 1.1 joerg OS << " xvalue";
154 1.1 joerg break;
155 1.1 joerg }
156 1.1 joerg }
157 1.1 joerg
158 1.1 joerg {
159 1.1 joerg ColorScope Color(OS, ShowColors, ObjectKindColor);
160 1.1 joerg switch (E->getObjectKind()) {
161 1.1 joerg case OK_Ordinary:
162 1.1 joerg break;
163 1.1 joerg case OK_BitField:
164 1.1 joerg OS << " bitfield";
165 1.1 joerg break;
166 1.1 joerg case OK_ObjCProperty:
167 1.1 joerg OS << " objcproperty";
168 1.1 joerg break;
169 1.1 joerg case OK_ObjCSubscript:
170 1.1 joerg OS << " objcsubscript";
171 1.1 joerg break;
172 1.1 joerg case OK_VectorComponent:
173 1.1 joerg OS << " vectorcomponent";
174 1.1 joerg break;
175 1.1.1.2 joerg case OK_MatrixComponent:
176 1.1.1.2 joerg OS << " matrixcomponent";
177 1.1.1.2 joerg break;
178 1.1 joerg }
179 1.1 joerg }
180 1.1 joerg }
181 1.1 joerg
182 1.1 joerg ConstStmtVisitor<TextNodeDumper>::Visit(Node);
183 1.1 joerg }
184 1.1 joerg
185 1.1 joerg void TextNodeDumper::Visit(const Type *T) {
186 1.1 joerg if (!T) {
187 1.1 joerg ColorScope Color(OS, ShowColors, NullColor);
188 1.1 joerg OS << "<<<NULL>>>";
189 1.1 joerg return;
190 1.1 joerg }
191 1.1 joerg if (isa<LocInfoType>(T)) {
192 1.1 joerg {
193 1.1 joerg ColorScope Color(OS, ShowColors, TypeColor);
194 1.1 joerg OS << "LocInfo Type";
195 1.1 joerg }
196 1.1 joerg dumpPointer(T);
197 1.1 joerg return;
198 1.1 joerg }
199 1.1 joerg
200 1.1 joerg {
201 1.1 joerg ColorScope Color(OS, ShowColors, TypeColor);
202 1.1 joerg OS << T->getTypeClassName() << "Type";
203 1.1 joerg }
204 1.1 joerg dumpPointer(T);
205 1.1 joerg OS << " ";
206 1.1 joerg dumpBareType(QualType(T, 0), false);
207 1.1 joerg
208 1.1 joerg QualType SingleStepDesugar =
209 1.1 joerg T->getLocallyUnqualifiedSingleStepDesugaredType();
210 1.1 joerg if (SingleStepDesugar != QualType(T, 0))
211 1.1 joerg OS << " sugar";
212 1.1 joerg
213 1.1.1.2 joerg if (T->containsErrors()) {
214 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ErrorsColor);
215 1.1.1.2 joerg OS << " contains-errors";
216 1.1.1.2 joerg }
217 1.1.1.2 joerg
218 1.1 joerg if (T->isDependentType())
219 1.1 joerg OS << " dependent";
220 1.1 joerg else if (T->isInstantiationDependentType())
221 1.1 joerg OS << " instantiation_dependent";
222 1.1 joerg
223 1.1 joerg if (T->isVariablyModifiedType())
224 1.1 joerg OS << " variably_modified";
225 1.1 joerg if (T->containsUnexpandedParameterPack())
226 1.1 joerg OS << " contains_unexpanded_pack";
227 1.1 joerg if (T->isFromAST())
228 1.1 joerg OS << " imported";
229 1.1 joerg
230 1.1 joerg TypeVisitor<TextNodeDumper>::Visit(T);
231 1.1 joerg }
232 1.1 joerg
233 1.1 joerg void TextNodeDumper::Visit(QualType T) {
234 1.1 joerg OS << "QualType";
235 1.1 joerg dumpPointer(T.getAsOpaquePtr());
236 1.1 joerg OS << " ";
237 1.1 joerg dumpBareType(T, false);
238 1.1 joerg OS << " " << T.split().Quals.getAsString();
239 1.1 joerg }
240 1.1 joerg
241 1.1 joerg void TextNodeDumper::Visit(const Decl *D) {
242 1.1 joerg if (!D) {
243 1.1 joerg ColorScope Color(OS, ShowColors, NullColor);
244 1.1 joerg OS << "<<<NULL>>>";
245 1.1 joerg return;
246 1.1 joerg }
247 1.1 joerg
248 1.1 joerg {
249 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
250 1.1 joerg OS << D->getDeclKindName() << "Decl";
251 1.1 joerg }
252 1.1 joerg dumpPointer(D);
253 1.1 joerg if (D->getLexicalDeclContext() != D->getDeclContext())
254 1.1 joerg OS << " parent " << cast<Decl>(D->getDeclContext());
255 1.1 joerg dumpPreviousDecl(OS, D);
256 1.1 joerg dumpSourceRange(D->getSourceRange());
257 1.1 joerg OS << ' ';
258 1.1 joerg dumpLocation(D->getLocation());
259 1.1 joerg if (D->isFromASTFile())
260 1.1 joerg OS << " imported";
261 1.1 joerg if (Module *M = D->getOwningModule())
262 1.1 joerg OS << " in " << M->getFullModuleName();
263 1.1 joerg if (auto *ND = dyn_cast<NamedDecl>(D))
264 1.1 joerg for (Module *M : D->getASTContext().getModulesWithMergedDefinition(
265 1.1 joerg const_cast<NamedDecl *>(ND)))
266 1.1 joerg AddChild([=] { OS << "also in " << M->getFullModuleName(); });
267 1.1 joerg if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
268 1.1.1.2 joerg if (!ND->isUnconditionallyVisible())
269 1.1 joerg OS << " hidden";
270 1.1 joerg if (D->isImplicit())
271 1.1 joerg OS << " implicit";
272 1.1 joerg
273 1.1 joerg if (D->isUsed())
274 1.1 joerg OS << " used";
275 1.1 joerg else if (D->isThisDeclarationReferenced())
276 1.1 joerg OS << " referenced";
277 1.1 joerg
278 1.1 joerg if (D->isInvalidDecl())
279 1.1 joerg OS << " invalid";
280 1.1 joerg if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
281 1.1 joerg if (FD->isConstexprSpecified())
282 1.1 joerg OS << " constexpr";
283 1.1 joerg if (FD->isConsteval())
284 1.1 joerg OS << " consteval";
285 1.1 joerg }
286 1.1 joerg
287 1.1 joerg if (!isa<FunctionDecl>(*D)) {
288 1.1 joerg const auto *MD = dyn_cast<ObjCMethodDecl>(D);
289 1.1 joerg if (!MD || !MD->isThisDeclarationADefinition()) {
290 1.1 joerg const auto *DC = dyn_cast<DeclContext>(D);
291 1.1 joerg if (DC && DC->hasExternalLexicalStorage()) {
292 1.1 joerg ColorScope Color(OS, ShowColors, UndeserializedColor);
293 1.1 joerg OS << " <undeserialized declarations>";
294 1.1 joerg }
295 1.1 joerg }
296 1.1 joerg }
297 1.1 joerg
298 1.1 joerg ConstDeclVisitor<TextNodeDumper>::Visit(D);
299 1.1 joerg }
300 1.1 joerg
301 1.1 joerg void TextNodeDumper::Visit(const CXXCtorInitializer *Init) {
302 1.1 joerg OS << "CXXCtorInitializer";
303 1.1 joerg if (Init->isAnyMemberInitializer()) {
304 1.1 joerg OS << ' ';
305 1.1 joerg dumpBareDeclRef(Init->getAnyMember());
306 1.1 joerg } else if (Init->isBaseInitializer()) {
307 1.1 joerg dumpType(QualType(Init->getBaseClass(), 0));
308 1.1 joerg } else if (Init->isDelegatingInitializer()) {
309 1.1 joerg dumpType(Init->getTypeSourceInfo()->getType());
310 1.1 joerg } else {
311 1.1 joerg llvm_unreachable("Unknown initializer type");
312 1.1 joerg }
313 1.1 joerg }
314 1.1 joerg
315 1.1 joerg void TextNodeDumper::Visit(const BlockDecl::Capture &C) {
316 1.1 joerg OS << "capture";
317 1.1 joerg if (C.isByRef())
318 1.1 joerg OS << " byref";
319 1.1 joerg if (C.isNested())
320 1.1 joerg OS << " nested";
321 1.1 joerg if (C.getVariable()) {
322 1.1 joerg OS << ' ';
323 1.1 joerg dumpBareDeclRef(C.getVariable());
324 1.1 joerg }
325 1.1 joerg }
326 1.1 joerg
327 1.1 joerg void TextNodeDumper::Visit(const OMPClause *C) {
328 1.1 joerg if (!C) {
329 1.1 joerg ColorScope Color(OS, ShowColors, NullColor);
330 1.1 joerg OS << "<<<NULL>>> OMPClause";
331 1.1 joerg return;
332 1.1 joerg }
333 1.1 joerg {
334 1.1 joerg ColorScope Color(OS, ShowColors, AttrColor);
335 1.1.1.2 joerg StringRef ClauseName(llvm::omp::getOpenMPClauseName(C->getClauseKind()));
336 1.1 joerg OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
337 1.1 joerg << ClauseName.drop_front() << "Clause";
338 1.1 joerg }
339 1.1 joerg dumpPointer(C);
340 1.1 joerg dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
341 1.1 joerg if (C->isImplicit())
342 1.1 joerg OS << " <implicit>";
343 1.1 joerg }
344 1.1 joerg
345 1.1 joerg void TextNodeDumper::Visit(const GenericSelectionExpr::ConstAssociation &A) {
346 1.1 joerg const TypeSourceInfo *TSI = A.getTypeSourceInfo();
347 1.1 joerg if (TSI) {
348 1.1 joerg OS << "case ";
349 1.1 joerg dumpType(TSI->getType());
350 1.1 joerg } else {
351 1.1 joerg OS << "default";
352 1.1 joerg }
353 1.1 joerg
354 1.1 joerg if (A.isSelected())
355 1.1 joerg OS << " selected";
356 1.1 joerg }
357 1.1 joerg
358 1.1.1.2 joerg static double GetApproxValue(const llvm::APFloat &F) {
359 1.1.1.2 joerg llvm::APFloat V = F;
360 1.1.1.2 joerg bool ignored;
361 1.1.1.2 joerg V.convert(llvm::APFloat::IEEEdouble(), llvm::APFloat::rmNearestTiesToEven,
362 1.1.1.2 joerg &ignored);
363 1.1.1.2 joerg return V.convertToDouble();
364 1.1.1.2 joerg }
365 1.1.1.2 joerg
366 1.1.1.2 joerg /// True if the \p APValue \p Value can be folded onto the current line.
367 1.1.1.2 joerg static bool isSimpleAPValue(const APValue &Value) {
368 1.1.1.2 joerg switch (Value.getKind()) {
369 1.1.1.2 joerg case APValue::None:
370 1.1.1.2 joerg case APValue::Indeterminate:
371 1.1.1.2 joerg case APValue::Int:
372 1.1.1.2 joerg case APValue::Float:
373 1.1.1.2 joerg case APValue::FixedPoint:
374 1.1.1.2 joerg case APValue::ComplexInt:
375 1.1.1.2 joerg case APValue::ComplexFloat:
376 1.1.1.2 joerg case APValue::LValue:
377 1.1.1.2 joerg case APValue::MemberPointer:
378 1.1.1.2 joerg case APValue::AddrLabelDiff:
379 1.1.1.2 joerg return true;
380 1.1.1.2 joerg case APValue::Vector:
381 1.1.1.2 joerg case APValue::Array:
382 1.1.1.2 joerg case APValue::Struct:
383 1.1.1.2 joerg return false;
384 1.1.1.2 joerg case APValue::Union:
385 1.1.1.2 joerg return isSimpleAPValue(Value.getUnionValue());
386 1.1.1.2 joerg }
387 1.1.1.2 joerg llvm_unreachable("unexpected APValue kind!");
388 1.1.1.2 joerg }
389 1.1.1.2 joerg
390 1.1.1.2 joerg /// Dump the children of the \p APValue \p Value.
391 1.1.1.2 joerg ///
392 1.1.1.2 joerg /// \param[in] Value The \p APValue to visit
393 1.1.1.2 joerg /// \param[in] Ty The \p QualType passed to \p Visit
394 1.1.1.2 joerg ///
395 1.1.1.2 joerg /// \param[in] IdxToChildFun A function mapping an \p APValue and an index
396 1.1.1.2 joerg /// to one of the child of the \p APValue
397 1.1.1.2 joerg ///
398 1.1.1.2 joerg /// \param[in] NumChildren \p IdxToChildFun will be called on \p Value with
399 1.1.1.2 joerg /// the indices in the range \p [0,NumChildren(
400 1.1.1.2 joerg ///
401 1.1.1.2 joerg /// \param[in] LabelSingular The label to use on a line with a single child
402 1.1.1.2 joerg /// \param[in] LabelPlurial The label to use on a line with multiple children
403 1.1.1.2 joerg void TextNodeDumper::dumpAPValueChildren(
404 1.1.1.2 joerg const APValue &Value, QualType Ty,
405 1.1.1.2 joerg const APValue &(*IdxToChildFun)(const APValue &, unsigned),
406 1.1.1.2 joerg unsigned NumChildren, StringRef LabelSingular, StringRef LabelPlurial) {
407 1.1.1.2 joerg // To save some vertical space we print up to MaxChildrenPerLine APValues
408 1.1.1.2 joerg // considered to be simple (by isSimpleAPValue) on a single line.
409 1.1.1.2 joerg constexpr unsigned MaxChildrenPerLine = 4;
410 1.1.1.2 joerg unsigned I = 0;
411 1.1.1.2 joerg while (I < NumChildren) {
412 1.1.1.2 joerg unsigned J = I;
413 1.1.1.2 joerg while (J < NumChildren) {
414 1.1.1.2 joerg if (isSimpleAPValue(IdxToChildFun(Value, J)) &&
415 1.1.1.2 joerg (J - I < MaxChildrenPerLine)) {
416 1.1.1.2 joerg ++J;
417 1.1.1.2 joerg continue;
418 1.1.1.2 joerg }
419 1.1.1.2 joerg break;
420 1.1.1.2 joerg }
421 1.1.1.2 joerg
422 1.1.1.2 joerg J = std::max(I + 1, J);
423 1.1.1.2 joerg
424 1.1.1.2 joerg // Print [I,J) on a single line.
425 1.1.1.2 joerg AddChild(J - I > 1 ? LabelPlurial : LabelSingular, [=]() {
426 1.1.1.2 joerg for (unsigned X = I; X < J; ++X) {
427 1.1.1.2 joerg Visit(IdxToChildFun(Value, X), Ty);
428 1.1.1.2 joerg if (X + 1 != J)
429 1.1.1.2 joerg OS << ", ";
430 1.1.1.2 joerg }
431 1.1.1.2 joerg });
432 1.1.1.2 joerg I = J;
433 1.1.1.2 joerg }
434 1.1.1.2 joerg }
435 1.1.1.2 joerg
436 1.1.1.2 joerg void TextNodeDumper::Visit(const APValue &Value, QualType Ty) {
437 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueKindColor);
438 1.1.1.2 joerg switch (Value.getKind()) {
439 1.1.1.2 joerg case APValue::None:
440 1.1.1.2 joerg OS << "None";
441 1.1.1.2 joerg return;
442 1.1.1.2 joerg case APValue::Indeterminate:
443 1.1.1.2 joerg OS << "Indeterminate";
444 1.1.1.2 joerg return;
445 1.1.1.2 joerg case APValue::Int:
446 1.1.1.2 joerg OS << "Int ";
447 1.1.1.2 joerg {
448 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueColor);
449 1.1.1.2 joerg OS << Value.getInt();
450 1.1.1.2 joerg }
451 1.1.1.2 joerg return;
452 1.1.1.2 joerg case APValue::Float:
453 1.1.1.2 joerg OS << "Float ";
454 1.1.1.2 joerg {
455 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueColor);
456 1.1.1.2 joerg OS << GetApproxValue(Value.getFloat());
457 1.1.1.2 joerg }
458 1.1.1.2 joerg return;
459 1.1.1.2 joerg case APValue::FixedPoint:
460 1.1.1.2 joerg OS << "FixedPoint ";
461 1.1.1.2 joerg {
462 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueColor);
463 1.1.1.2 joerg OS << Value.getFixedPoint();
464 1.1.1.2 joerg }
465 1.1.1.2 joerg return;
466 1.1.1.2 joerg case APValue::Vector: {
467 1.1.1.2 joerg unsigned VectorLength = Value.getVectorLength();
468 1.1.1.2 joerg OS << "Vector length=" << VectorLength;
469 1.1.1.2 joerg
470 1.1.1.2 joerg dumpAPValueChildren(
471 1.1.1.2 joerg Value, Ty,
472 1.1.1.2 joerg [](const APValue &Value, unsigned Index) -> const APValue & {
473 1.1.1.2 joerg return Value.getVectorElt(Index);
474 1.1.1.2 joerg },
475 1.1.1.2 joerg VectorLength, "element", "elements");
476 1.1.1.2 joerg return;
477 1.1.1.2 joerg }
478 1.1.1.2 joerg case APValue::ComplexInt:
479 1.1.1.2 joerg OS << "ComplexInt ";
480 1.1.1.2 joerg {
481 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueColor);
482 1.1.1.2 joerg OS << Value.getComplexIntReal() << " + " << Value.getComplexIntImag()
483 1.1.1.2 joerg << 'i';
484 1.1.1.2 joerg }
485 1.1.1.2 joerg return;
486 1.1.1.2 joerg case APValue::ComplexFloat:
487 1.1.1.2 joerg OS << "ComplexFloat ";
488 1.1.1.2 joerg {
489 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueColor);
490 1.1.1.2 joerg OS << GetApproxValue(Value.getComplexFloatReal()) << " + "
491 1.1.1.2 joerg << GetApproxValue(Value.getComplexFloatImag()) << 'i';
492 1.1.1.2 joerg }
493 1.1.1.2 joerg return;
494 1.1.1.2 joerg case APValue::LValue:
495 1.1.1.2 joerg (void)Context;
496 1.1.1.2 joerg OS << "LValue <todo>";
497 1.1.1.2 joerg return;
498 1.1.1.2 joerg case APValue::Array: {
499 1.1.1.2 joerg unsigned ArraySize = Value.getArraySize();
500 1.1.1.2 joerg unsigned NumInitializedElements = Value.getArrayInitializedElts();
501 1.1.1.2 joerg OS << "Array size=" << ArraySize;
502 1.1.1.2 joerg
503 1.1.1.2 joerg dumpAPValueChildren(
504 1.1.1.2 joerg Value, Ty,
505 1.1.1.2 joerg [](const APValue &Value, unsigned Index) -> const APValue & {
506 1.1.1.2 joerg return Value.getArrayInitializedElt(Index);
507 1.1.1.2 joerg },
508 1.1.1.2 joerg NumInitializedElements, "element", "elements");
509 1.1.1.2 joerg
510 1.1.1.2 joerg if (Value.hasArrayFiller()) {
511 1.1.1.2 joerg AddChild("filler", [=] {
512 1.1.1.2 joerg {
513 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueColor);
514 1.1.1.2 joerg OS << ArraySize - NumInitializedElements << " x ";
515 1.1.1.2 joerg }
516 1.1.1.2 joerg Visit(Value.getArrayFiller(), Ty);
517 1.1.1.2 joerg });
518 1.1.1.2 joerg }
519 1.1.1.2 joerg
520 1.1.1.2 joerg return;
521 1.1.1.2 joerg }
522 1.1.1.2 joerg case APValue::Struct: {
523 1.1.1.2 joerg OS << "Struct";
524 1.1.1.2 joerg
525 1.1.1.2 joerg dumpAPValueChildren(
526 1.1.1.2 joerg Value, Ty,
527 1.1.1.2 joerg [](const APValue &Value, unsigned Index) -> const APValue & {
528 1.1.1.2 joerg return Value.getStructBase(Index);
529 1.1.1.2 joerg },
530 1.1.1.2 joerg Value.getStructNumBases(), "base", "bases");
531 1.1.1.2 joerg
532 1.1.1.2 joerg dumpAPValueChildren(
533 1.1.1.2 joerg Value, Ty,
534 1.1.1.2 joerg [](const APValue &Value, unsigned Index) -> const APValue & {
535 1.1.1.2 joerg return Value.getStructField(Index);
536 1.1.1.2 joerg },
537 1.1.1.2 joerg Value.getStructNumFields(), "field", "fields");
538 1.1.1.2 joerg
539 1.1.1.2 joerg return;
540 1.1.1.2 joerg }
541 1.1.1.2 joerg case APValue::Union: {
542 1.1.1.2 joerg OS << "Union";
543 1.1.1.2 joerg {
544 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueColor);
545 1.1.1.2 joerg if (const FieldDecl *FD = Value.getUnionField())
546 1.1.1.2 joerg OS << " ." << *cast<NamedDecl>(FD);
547 1.1.1.2 joerg }
548 1.1.1.2 joerg // If the union value is considered to be simple, fold it into the
549 1.1.1.2 joerg // current line to save some vertical space.
550 1.1.1.2 joerg const APValue &UnionValue = Value.getUnionValue();
551 1.1.1.2 joerg if (isSimpleAPValue(UnionValue)) {
552 1.1.1.2 joerg OS << ' ';
553 1.1.1.2 joerg Visit(UnionValue, Ty);
554 1.1.1.2 joerg } else {
555 1.1.1.2 joerg AddChild([=] { Visit(UnionValue, Ty); });
556 1.1.1.2 joerg }
557 1.1.1.2 joerg
558 1.1.1.2 joerg return;
559 1.1.1.2 joerg }
560 1.1.1.2 joerg case APValue::MemberPointer:
561 1.1.1.2 joerg OS << "MemberPointer <todo>";
562 1.1.1.2 joerg return;
563 1.1.1.2 joerg case APValue::AddrLabelDiff:
564 1.1.1.2 joerg OS << "AddrLabelDiff <todo>";
565 1.1.1.2 joerg return;
566 1.1.1.2 joerg }
567 1.1.1.2 joerg llvm_unreachable("Unknown APValue kind!");
568 1.1.1.2 joerg }
569 1.1.1.2 joerg
570 1.1 joerg void TextNodeDumper::dumpPointer(const void *Ptr) {
571 1.1 joerg ColorScope Color(OS, ShowColors, AddressColor);
572 1.1 joerg OS << ' ' << Ptr;
573 1.1 joerg }
574 1.1 joerg
575 1.1 joerg void TextNodeDumper::dumpLocation(SourceLocation Loc) {
576 1.1 joerg if (!SM)
577 1.1 joerg return;
578 1.1 joerg
579 1.1 joerg ColorScope Color(OS, ShowColors, LocationColor);
580 1.1 joerg SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
581 1.1 joerg
582 1.1 joerg // The general format we print out is filename:line:col, but we drop pieces
583 1.1 joerg // that haven't changed since the last loc printed.
584 1.1 joerg PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
585 1.1 joerg
586 1.1 joerg if (PLoc.isInvalid()) {
587 1.1 joerg OS << "<invalid sloc>";
588 1.1 joerg return;
589 1.1 joerg }
590 1.1 joerg
591 1.1 joerg if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
592 1.1 joerg OS << PLoc.getFilename() << ':' << PLoc.getLine() << ':'
593 1.1 joerg << PLoc.getColumn();
594 1.1 joerg LastLocFilename = PLoc.getFilename();
595 1.1 joerg LastLocLine = PLoc.getLine();
596 1.1 joerg } else if (PLoc.getLine() != LastLocLine) {
597 1.1 joerg OS << "line" << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
598 1.1 joerg LastLocLine = PLoc.getLine();
599 1.1 joerg } else {
600 1.1 joerg OS << "col" << ':' << PLoc.getColumn();
601 1.1 joerg }
602 1.1 joerg }
603 1.1 joerg
604 1.1 joerg void TextNodeDumper::dumpSourceRange(SourceRange R) {
605 1.1 joerg // Can't translate locations if a SourceManager isn't available.
606 1.1 joerg if (!SM)
607 1.1 joerg return;
608 1.1 joerg
609 1.1 joerg OS << " <";
610 1.1 joerg dumpLocation(R.getBegin());
611 1.1 joerg if (R.getBegin() != R.getEnd()) {
612 1.1 joerg OS << ", ";
613 1.1 joerg dumpLocation(R.getEnd());
614 1.1 joerg }
615 1.1 joerg OS << ">";
616 1.1 joerg
617 1.1 joerg // <t2.c:123:421[blah], t2.c:412:321>
618 1.1 joerg }
619 1.1 joerg
620 1.1 joerg void TextNodeDumper::dumpBareType(QualType T, bool Desugar) {
621 1.1 joerg ColorScope Color(OS, ShowColors, TypeColor);
622 1.1 joerg
623 1.1 joerg SplitQualType T_split = T.split();
624 1.1 joerg OS << "'" << QualType::getAsString(T_split, PrintPolicy) << "'";
625 1.1 joerg
626 1.1 joerg if (Desugar && !T.isNull()) {
627 1.1 joerg // If the type is sugared, also dump a (shallow) desugared type.
628 1.1 joerg SplitQualType D_split = T.getSplitDesugaredType();
629 1.1 joerg if (T_split != D_split)
630 1.1 joerg OS << ":'" << QualType::getAsString(D_split, PrintPolicy) << "'";
631 1.1 joerg }
632 1.1 joerg }
633 1.1 joerg
634 1.1 joerg void TextNodeDumper::dumpType(QualType T) {
635 1.1 joerg OS << ' ';
636 1.1 joerg dumpBareType(T);
637 1.1 joerg }
638 1.1 joerg
639 1.1 joerg void TextNodeDumper::dumpBareDeclRef(const Decl *D) {
640 1.1 joerg if (!D) {
641 1.1 joerg ColorScope Color(OS, ShowColors, NullColor);
642 1.1 joerg OS << "<<<NULL>>>";
643 1.1 joerg return;
644 1.1 joerg }
645 1.1 joerg
646 1.1 joerg {
647 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
648 1.1 joerg OS << D->getDeclKindName();
649 1.1 joerg }
650 1.1 joerg dumpPointer(D);
651 1.1 joerg
652 1.1 joerg if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
653 1.1 joerg ColorScope Color(OS, ShowColors, DeclNameColor);
654 1.1 joerg OS << " '" << ND->getDeclName() << '\'';
655 1.1 joerg }
656 1.1 joerg
657 1.1 joerg if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
658 1.1 joerg dumpType(VD->getType());
659 1.1 joerg }
660 1.1 joerg
661 1.1 joerg void TextNodeDumper::dumpName(const NamedDecl *ND) {
662 1.1 joerg if (ND->getDeclName()) {
663 1.1 joerg ColorScope Color(OS, ShowColors, DeclNameColor);
664 1.1.1.2 joerg OS << ' ' << ND->getDeclName();
665 1.1 joerg }
666 1.1 joerg }
667 1.1 joerg
668 1.1 joerg void TextNodeDumper::dumpAccessSpecifier(AccessSpecifier AS) {
669 1.1.1.2 joerg const auto AccessSpelling = getAccessSpelling(AS);
670 1.1.1.2 joerg if (AccessSpelling.empty())
671 1.1.1.2 joerg return;
672 1.1.1.2 joerg OS << AccessSpelling;
673 1.1.1.2 joerg }
674 1.1.1.2 joerg
675 1.1.1.2 joerg void TextNodeDumper::dumpCleanupObject(
676 1.1.1.2 joerg const ExprWithCleanups::CleanupObject &C) {
677 1.1.1.2 joerg if (auto *BD = C.dyn_cast<BlockDecl *>())
678 1.1.1.2 joerg dumpDeclRef(BD, "cleanup");
679 1.1.1.2 joerg else if (auto *CLE = C.dyn_cast<CompoundLiteralExpr *>())
680 1.1.1.2 joerg AddChild([=] {
681 1.1.1.2 joerg OS << "cleanup ";
682 1.1.1.2 joerg {
683 1.1.1.2 joerg ColorScope Color(OS, ShowColors, StmtColor);
684 1.1.1.2 joerg OS << CLE->getStmtClassName();
685 1.1.1.2 joerg }
686 1.1.1.2 joerg dumpPointer(CLE);
687 1.1.1.2 joerg });
688 1.1.1.2 joerg else
689 1.1.1.2 joerg llvm_unreachable("unexpected cleanup type");
690 1.1 joerg }
691 1.1 joerg
692 1.1 joerg void TextNodeDumper::dumpDeclRef(const Decl *D, StringRef Label) {
693 1.1 joerg if (!D)
694 1.1 joerg return;
695 1.1 joerg
696 1.1 joerg AddChild([=] {
697 1.1 joerg if (!Label.empty())
698 1.1 joerg OS << Label << ' ';
699 1.1 joerg dumpBareDeclRef(D);
700 1.1 joerg });
701 1.1 joerg }
702 1.1 joerg
703 1.1 joerg const char *TextNodeDumper::getCommandName(unsigned CommandID) {
704 1.1 joerg if (Traits)
705 1.1 joerg return Traits->getCommandInfo(CommandID)->Name;
706 1.1 joerg const comments::CommandInfo *Info =
707 1.1 joerg comments::CommandTraits::getBuiltinCommandInfo(CommandID);
708 1.1 joerg if (Info)
709 1.1 joerg return Info->Name;
710 1.1 joerg return "<not a builtin command>";
711 1.1 joerg }
712 1.1 joerg
713 1.1.1.2 joerg void TextNodeDumper::printFPOptions(FPOptionsOverride FPO) {
714 1.1.1.2 joerg #define OPTION(NAME, TYPE, WIDTH, PREVIOUS) \
715 1.1.1.2 joerg if (FPO.has##NAME##Override()) \
716 1.1.1.2 joerg OS << " " #NAME "=" << FPO.get##NAME##Override();
717 1.1.1.2 joerg #include "clang/Basic/FPOptions.def"
718 1.1.1.2 joerg }
719 1.1.1.2 joerg
720 1.1 joerg void TextNodeDumper::visitTextComment(const comments::TextComment *C,
721 1.1 joerg const comments::FullComment *) {
722 1.1 joerg OS << " Text=\"" << C->getText() << "\"";
723 1.1 joerg }
724 1.1 joerg
725 1.1 joerg void TextNodeDumper::visitInlineCommandComment(
726 1.1 joerg const comments::InlineCommandComment *C, const comments::FullComment *) {
727 1.1 joerg OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
728 1.1 joerg switch (C->getRenderKind()) {
729 1.1 joerg case comments::InlineCommandComment::RenderNormal:
730 1.1 joerg OS << " RenderNormal";
731 1.1 joerg break;
732 1.1 joerg case comments::InlineCommandComment::RenderBold:
733 1.1 joerg OS << " RenderBold";
734 1.1 joerg break;
735 1.1 joerg case comments::InlineCommandComment::RenderMonospaced:
736 1.1 joerg OS << " RenderMonospaced";
737 1.1 joerg break;
738 1.1 joerg case comments::InlineCommandComment::RenderEmphasized:
739 1.1 joerg OS << " RenderEmphasized";
740 1.1 joerg break;
741 1.1.1.2 joerg case comments::InlineCommandComment::RenderAnchor:
742 1.1.1.2 joerg OS << " RenderAnchor";
743 1.1.1.2 joerg break;
744 1.1 joerg }
745 1.1 joerg
746 1.1 joerg for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
747 1.1 joerg OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
748 1.1 joerg }
749 1.1 joerg
750 1.1 joerg void TextNodeDumper::visitHTMLStartTagComment(
751 1.1 joerg const comments::HTMLStartTagComment *C, const comments::FullComment *) {
752 1.1 joerg OS << " Name=\"" << C->getTagName() << "\"";
753 1.1 joerg if (C->getNumAttrs() != 0) {
754 1.1 joerg OS << " Attrs: ";
755 1.1 joerg for (unsigned i = 0, e = C->getNumAttrs(); i != e; ++i) {
756 1.1 joerg const comments::HTMLStartTagComment::Attribute &Attr = C->getAttr(i);
757 1.1 joerg OS << " \"" << Attr.Name << "=\"" << Attr.Value << "\"";
758 1.1 joerg }
759 1.1 joerg }
760 1.1 joerg if (C->isSelfClosing())
761 1.1 joerg OS << " SelfClosing";
762 1.1 joerg }
763 1.1 joerg
764 1.1 joerg void TextNodeDumper::visitHTMLEndTagComment(
765 1.1 joerg const comments::HTMLEndTagComment *C, const comments::FullComment *) {
766 1.1 joerg OS << " Name=\"" << C->getTagName() << "\"";
767 1.1 joerg }
768 1.1 joerg
769 1.1 joerg void TextNodeDumper::visitBlockCommandComment(
770 1.1 joerg const comments::BlockCommandComment *C, const comments::FullComment *) {
771 1.1 joerg OS << " Name=\"" << getCommandName(C->getCommandID()) << "\"";
772 1.1 joerg for (unsigned i = 0, e = C->getNumArgs(); i != e; ++i)
773 1.1 joerg OS << " Arg[" << i << "]=\"" << C->getArgText(i) << "\"";
774 1.1 joerg }
775 1.1 joerg
776 1.1 joerg void TextNodeDumper::visitParamCommandComment(
777 1.1 joerg const comments::ParamCommandComment *C, const comments::FullComment *FC) {
778 1.1 joerg OS << " "
779 1.1 joerg << comments::ParamCommandComment::getDirectionAsString(C->getDirection());
780 1.1 joerg
781 1.1 joerg if (C->isDirectionExplicit())
782 1.1 joerg OS << " explicitly";
783 1.1 joerg else
784 1.1 joerg OS << " implicitly";
785 1.1 joerg
786 1.1 joerg if (C->hasParamName()) {
787 1.1 joerg if (C->isParamIndexValid())
788 1.1 joerg OS << " Param=\"" << C->getParamName(FC) << "\"";
789 1.1 joerg else
790 1.1 joerg OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
791 1.1 joerg }
792 1.1 joerg
793 1.1 joerg if (C->isParamIndexValid() && !C->isVarArgParam())
794 1.1 joerg OS << " ParamIndex=" << C->getParamIndex();
795 1.1 joerg }
796 1.1 joerg
797 1.1 joerg void TextNodeDumper::visitTParamCommandComment(
798 1.1 joerg const comments::TParamCommandComment *C, const comments::FullComment *FC) {
799 1.1 joerg if (C->hasParamName()) {
800 1.1 joerg if (C->isPositionValid())
801 1.1 joerg OS << " Param=\"" << C->getParamName(FC) << "\"";
802 1.1 joerg else
803 1.1 joerg OS << " Param=\"" << C->getParamNameAsWritten() << "\"";
804 1.1 joerg }
805 1.1 joerg
806 1.1 joerg if (C->isPositionValid()) {
807 1.1 joerg OS << " Position=<";
808 1.1 joerg for (unsigned i = 0, e = C->getDepth(); i != e; ++i) {
809 1.1 joerg OS << C->getIndex(i);
810 1.1 joerg if (i != e - 1)
811 1.1 joerg OS << ", ";
812 1.1 joerg }
813 1.1 joerg OS << ">";
814 1.1 joerg }
815 1.1 joerg }
816 1.1 joerg
817 1.1 joerg void TextNodeDumper::visitVerbatimBlockComment(
818 1.1 joerg const comments::VerbatimBlockComment *C, const comments::FullComment *) {
819 1.1 joerg OS << " Name=\"" << getCommandName(C->getCommandID())
820 1.1 joerg << "\""
821 1.1 joerg " CloseName=\""
822 1.1 joerg << C->getCloseName() << "\"";
823 1.1 joerg }
824 1.1 joerg
825 1.1 joerg void TextNodeDumper::visitVerbatimBlockLineComment(
826 1.1 joerg const comments::VerbatimBlockLineComment *C,
827 1.1 joerg const comments::FullComment *) {
828 1.1 joerg OS << " Text=\"" << C->getText() << "\"";
829 1.1 joerg }
830 1.1 joerg
831 1.1 joerg void TextNodeDumper::visitVerbatimLineComment(
832 1.1 joerg const comments::VerbatimLineComment *C, const comments::FullComment *) {
833 1.1 joerg OS << " Text=\"" << C->getText() << "\"";
834 1.1 joerg }
835 1.1 joerg
836 1.1 joerg void TextNodeDumper::VisitNullTemplateArgument(const TemplateArgument &) {
837 1.1 joerg OS << " null";
838 1.1 joerg }
839 1.1 joerg
840 1.1 joerg void TextNodeDumper::VisitTypeTemplateArgument(const TemplateArgument &TA) {
841 1.1 joerg OS << " type";
842 1.1 joerg dumpType(TA.getAsType());
843 1.1 joerg }
844 1.1 joerg
845 1.1 joerg void TextNodeDumper::VisitDeclarationTemplateArgument(
846 1.1 joerg const TemplateArgument &TA) {
847 1.1 joerg OS << " decl";
848 1.1 joerg dumpDeclRef(TA.getAsDecl());
849 1.1 joerg }
850 1.1 joerg
851 1.1 joerg void TextNodeDumper::VisitNullPtrTemplateArgument(const TemplateArgument &) {
852 1.1 joerg OS << " nullptr";
853 1.1 joerg }
854 1.1 joerg
855 1.1 joerg void TextNodeDumper::VisitIntegralTemplateArgument(const TemplateArgument &TA) {
856 1.1 joerg OS << " integral " << TA.getAsIntegral();
857 1.1 joerg }
858 1.1 joerg
859 1.1 joerg void TextNodeDumper::VisitTemplateTemplateArgument(const TemplateArgument &TA) {
860 1.1 joerg OS << " template ";
861 1.1 joerg TA.getAsTemplate().dump(OS);
862 1.1 joerg }
863 1.1 joerg
864 1.1 joerg void TextNodeDumper::VisitTemplateExpansionTemplateArgument(
865 1.1 joerg const TemplateArgument &TA) {
866 1.1 joerg OS << " template expansion ";
867 1.1 joerg TA.getAsTemplateOrTemplatePattern().dump(OS);
868 1.1 joerg }
869 1.1 joerg
870 1.1 joerg void TextNodeDumper::VisitExpressionTemplateArgument(const TemplateArgument &) {
871 1.1 joerg OS << " expr";
872 1.1 joerg }
873 1.1 joerg
874 1.1 joerg void TextNodeDumper::VisitPackTemplateArgument(const TemplateArgument &) {
875 1.1 joerg OS << " pack";
876 1.1 joerg }
877 1.1 joerg
878 1.1 joerg static void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
879 1.1 joerg if (Node->path_empty())
880 1.1 joerg return;
881 1.1 joerg
882 1.1 joerg OS << " (";
883 1.1 joerg bool First = true;
884 1.1 joerg for (CastExpr::path_const_iterator I = Node->path_begin(),
885 1.1 joerg E = Node->path_end();
886 1.1 joerg I != E; ++I) {
887 1.1 joerg const CXXBaseSpecifier *Base = *I;
888 1.1 joerg if (!First)
889 1.1 joerg OS << " -> ";
890 1.1 joerg
891 1.1 joerg const auto *RD =
892 1.1 joerg cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl());
893 1.1 joerg
894 1.1 joerg if (Base->isVirtual())
895 1.1 joerg OS << "virtual ";
896 1.1 joerg OS << RD->getName();
897 1.1 joerg First = false;
898 1.1 joerg }
899 1.1 joerg
900 1.1 joerg OS << ')';
901 1.1 joerg }
902 1.1 joerg
903 1.1 joerg void TextNodeDumper::VisitIfStmt(const IfStmt *Node) {
904 1.1 joerg if (Node->hasInitStorage())
905 1.1 joerg OS << " has_init";
906 1.1 joerg if (Node->hasVarStorage())
907 1.1 joerg OS << " has_var";
908 1.1 joerg if (Node->hasElseStorage())
909 1.1 joerg OS << " has_else";
910 1.1 joerg }
911 1.1 joerg
912 1.1 joerg void TextNodeDumper::VisitSwitchStmt(const SwitchStmt *Node) {
913 1.1 joerg if (Node->hasInitStorage())
914 1.1 joerg OS << " has_init";
915 1.1 joerg if (Node->hasVarStorage())
916 1.1 joerg OS << " has_var";
917 1.1 joerg }
918 1.1 joerg
919 1.1 joerg void TextNodeDumper::VisitWhileStmt(const WhileStmt *Node) {
920 1.1 joerg if (Node->hasVarStorage())
921 1.1 joerg OS << " has_var";
922 1.1 joerg }
923 1.1 joerg
924 1.1 joerg void TextNodeDumper::VisitLabelStmt(const LabelStmt *Node) {
925 1.1 joerg OS << " '" << Node->getName() << "'";
926 1.1.1.2 joerg if (Node->isSideEntry())
927 1.1.1.2 joerg OS << " side_entry";
928 1.1 joerg }
929 1.1 joerg
930 1.1 joerg void TextNodeDumper::VisitGotoStmt(const GotoStmt *Node) {
931 1.1 joerg OS << " '" << Node->getLabel()->getName() << "'";
932 1.1 joerg dumpPointer(Node->getLabel());
933 1.1 joerg }
934 1.1 joerg
935 1.1 joerg void TextNodeDumper::VisitCaseStmt(const CaseStmt *Node) {
936 1.1 joerg if (Node->caseStmtIsGNURange())
937 1.1 joerg OS << " gnu_range";
938 1.1 joerg }
939 1.1 joerg
940 1.1 joerg void TextNodeDumper::VisitConstantExpr(const ConstantExpr *Node) {
941 1.1.1.2 joerg if (Node->hasAPValueResult())
942 1.1.1.2 joerg AddChild("value",
943 1.1.1.2 joerg [=] { Visit(Node->getAPValueResult(), Node->getType()); });
944 1.1 joerg }
945 1.1 joerg
946 1.1 joerg void TextNodeDumper::VisitCallExpr(const CallExpr *Node) {
947 1.1 joerg if (Node->usesADL())
948 1.1 joerg OS << " adl";
949 1.1.1.2 joerg if (Node->hasStoredFPFeatures())
950 1.1.1.2 joerg printFPOptions(Node->getFPFeatures());
951 1.1.1.2 joerg }
952 1.1.1.2 joerg
953 1.1.1.2 joerg void TextNodeDumper::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *Node) {
954 1.1.1.2 joerg const char *OperatorSpelling = clang::getOperatorSpelling(Node->getOperator());
955 1.1.1.2 joerg if (OperatorSpelling)
956 1.1.1.2 joerg OS << " '" << OperatorSpelling << "'";
957 1.1.1.2 joerg
958 1.1.1.2 joerg VisitCallExpr(Node);
959 1.1 joerg }
960 1.1 joerg
961 1.1 joerg void TextNodeDumper::VisitCastExpr(const CastExpr *Node) {
962 1.1 joerg OS << " <";
963 1.1 joerg {
964 1.1 joerg ColorScope Color(OS, ShowColors, CastColor);
965 1.1 joerg OS << Node->getCastKindName();
966 1.1 joerg }
967 1.1 joerg dumpBasePath(OS, Node);
968 1.1 joerg OS << ">";
969 1.1.1.2 joerg if (Node->hasStoredFPFeatures())
970 1.1.1.2 joerg printFPOptions(Node->getFPFeatures());
971 1.1 joerg }
972 1.1 joerg
973 1.1 joerg void TextNodeDumper::VisitImplicitCastExpr(const ImplicitCastExpr *Node) {
974 1.1 joerg VisitCastExpr(Node);
975 1.1 joerg if (Node->isPartOfExplicitCast())
976 1.1 joerg OS << " part_of_explicit_cast";
977 1.1 joerg }
978 1.1 joerg
979 1.1 joerg void TextNodeDumper::VisitDeclRefExpr(const DeclRefExpr *Node) {
980 1.1 joerg OS << " ";
981 1.1 joerg dumpBareDeclRef(Node->getDecl());
982 1.1 joerg if (Node->getDecl() != Node->getFoundDecl()) {
983 1.1 joerg OS << " (";
984 1.1 joerg dumpBareDeclRef(Node->getFoundDecl());
985 1.1 joerg OS << ")";
986 1.1 joerg }
987 1.1 joerg switch (Node->isNonOdrUse()) {
988 1.1 joerg case NOUR_None: break;
989 1.1 joerg case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
990 1.1 joerg case NOUR_Constant: OS << " non_odr_use_constant"; break;
991 1.1 joerg case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
992 1.1 joerg }
993 1.1 joerg }
994 1.1 joerg
995 1.1 joerg void TextNodeDumper::VisitUnresolvedLookupExpr(
996 1.1 joerg const UnresolvedLookupExpr *Node) {
997 1.1 joerg OS << " (";
998 1.1 joerg if (!Node->requiresADL())
999 1.1 joerg OS << "no ";
1000 1.1 joerg OS << "ADL) = '" << Node->getName() << '\'';
1001 1.1 joerg
1002 1.1 joerg UnresolvedLookupExpr::decls_iterator I = Node->decls_begin(),
1003 1.1 joerg E = Node->decls_end();
1004 1.1 joerg if (I == E)
1005 1.1 joerg OS << " empty";
1006 1.1 joerg for (; I != E; ++I)
1007 1.1 joerg dumpPointer(*I);
1008 1.1 joerg }
1009 1.1 joerg
1010 1.1 joerg void TextNodeDumper::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node) {
1011 1.1 joerg {
1012 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
1013 1.1 joerg OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
1014 1.1 joerg }
1015 1.1 joerg OS << "='" << *Node->getDecl() << "'";
1016 1.1 joerg dumpPointer(Node->getDecl());
1017 1.1 joerg if (Node->isFreeIvar())
1018 1.1 joerg OS << " isFreeIvar";
1019 1.1 joerg }
1020 1.1 joerg
1021 1.1 joerg void TextNodeDumper::VisitPredefinedExpr(const PredefinedExpr *Node) {
1022 1.1 joerg OS << " " << PredefinedExpr::getIdentKindName(Node->getIdentKind());
1023 1.1 joerg }
1024 1.1 joerg
1025 1.1 joerg void TextNodeDumper::VisitCharacterLiteral(const CharacterLiteral *Node) {
1026 1.1 joerg ColorScope Color(OS, ShowColors, ValueColor);
1027 1.1 joerg OS << " " << Node->getValue();
1028 1.1 joerg }
1029 1.1 joerg
1030 1.1 joerg void TextNodeDumper::VisitIntegerLiteral(const IntegerLiteral *Node) {
1031 1.1 joerg bool isSigned = Node->getType()->isSignedIntegerType();
1032 1.1 joerg ColorScope Color(OS, ShowColors, ValueColor);
1033 1.1 joerg OS << " " << Node->getValue().toString(10, isSigned);
1034 1.1 joerg }
1035 1.1 joerg
1036 1.1 joerg void TextNodeDumper::VisitFixedPointLiteral(const FixedPointLiteral *Node) {
1037 1.1 joerg ColorScope Color(OS, ShowColors, ValueColor);
1038 1.1 joerg OS << " " << Node->getValueAsString(/*Radix=*/10);
1039 1.1 joerg }
1040 1.1 joerg
1041 1.1 joerg void TextNodeDumper::VisitFloatingLiteral(const FloatingLiteral *Node) {
1042 1.1 joerg ColorScope Color(OS, ShowColors, ValueColor);
1043 1.1 joerg OS << " " << Node->getValueAsApproximateDouble();
1044 1.1 joerg }
1045 1.1 joerg
1046 1.1 joerg void TextNodeDumper::VisitStringLiteral(const StringLiteral *Str) {
1047 1.1 joerg ColorScope Color(OS, ShowColors, ValueColor);
1048 1.1 joerg OS << " ";
1049 1.1 joerg Str->outputString(OS);
1050 1.1 joerg }
1051 1.1 joerg
1052 1.1 joerg void TextNodeDumper::VisitInitListExpr(const InitListExpr *ILE) {
1053 1.1 joerg if (auto *Field = ILE->getInitializedFieldInUnion()) {
1054 1.1 joerg OS << " field ";
1055 1.1 joerg dumpBareDeclRef(Field);
1056 1.1 joerg }
1057 1.1 joerg }
1058 1.1 joerg
1059 1.1 joerg void TextNodeDumper::VisitGenericSelectionExpr(const GenericSelectionExpr *E) {
1060 1.1 joerg if (E->isResultDependent())
1061 1.1 joerg OS << " result_dependent";
1062 1.1 joerg }
1063 1.1 joerg
1064 1.1 joerg void TextNodeDumper::VisitUnaryOperator(const UnaryOperator *Node) {
1065 1.1 joerg OS << " " << (Node->isPostfix() ? "postfix" : "prefix") << " '"
1066 1.1 joerg << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1067 1.1 joerg if (!Node->canOverflow())
1068 1.1 joerg OS << " cannot overflow";
1069 1.1.1.2 joerg if (Node->hasStoredFPFeatures())
1070 1.1.1.2 joerg printFPOptions(Node->getStoredFPFeatures());
1071 1.1 joerg }
1072 1.1 joerg
1073 1.1 joerg void TextNodeDumper::VisitUnaryExprOrTypeTraitExpr(
1074 1.1 joerg const UnaryExprOrTypeTraitExpr *Node) {
1075 1.1.1.2 joerg OS << " " << getTraitSpelling(Node->getKind());
1076 1.1.1.2 joerg
1077 1.1 joerg if (Node->isArgumentType())
1078 1.1 joerg dumpType(Node->getArgumentType());
1079 1.1 joerg }
1080 1.1 joerg
1081 1.1 joerg void TextNodeDumper::VisitMemberExpr(const MemberExpr *Node) {
1082 1.1 joerg OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1083 1.1 joerg dumpPointer(Node->getMemberDecl());
1084 1.1 joerg switch (Node->isNonOdrUse()) {
1085 1.1 joerg case NOUR_None: break;
1086 1.1 joerg case NOUR_Unevaluated: OS << " non_odr_use_unevaluated"; break;
1087 1.1 joerg case NOUR_Constant: OS << " non_odr_use_constant"; break;
1088 1.1 joerg case NOUR_Discarded: OS << " non_odr_use_discarded"; break;
1089 1.1 joerg }
1090 1.1 joerg }
1091 1.1 joerg
1092 1.1 joerg void TextNodeDumper::VisitExtVectorElementExpr(
1093 1.1 joerg const ExtVectorElementExpr *Node) {
1094 1.1 joerg OS << " " << Node->getAccessor().getNameStart();
1095 1.1 joerg }
1096 1.1 joerg
1097 1.1 joerg void TextNodeDumper::VisitBinaryOperator(const BinaryOperator *Node) {
1098 1.1 joerg OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1099 1.1.1.2 joerg if (Node->hasStoredFPFeatures())
1100 1.1.1.2 joerg printFPOptions(Node->getStoredFPFeatures());
1101 1.1 joerg }
1102 1.1 joerg
1103 1.1 joerg void TextNodeDumper::VisitCompoundAssignOperator(
1104 1.1 joerg const CompoundAssignOperator *Node) {
1105 1.1 joerg OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
1106 1.1 joerg << "' ComputeLHSTy=";
1107 1.1 joerg dumpBareType(Node->getComputationLHSType());
1108 1.1 joerg OS << " ComputeResultTy=";
1109 1.1 joerg dumpBareType(Node->getComputationResultType());
1110 1.1.1.2 joerg if (Node->hasStoredFPFeatures())
1111 1.1.1.2 joerg printFPOptions(Node->getStoredFPFeatures());
1112 1.1 joerg }
1113 1.1 joerg
1114 1.1 joerg void TextNodeDumper::VisitAddrLabelExpr(const AddrLabelExpr *Node) {
1115 1.1 joerg OS << " " << Node->getLabel()->getName();
1116 1.1 joerg dumpPointer(Node->getLabel());
1117 1.1 joerg }
1118 1.1 joerg
1119 1.1 joerg void TextNodeDumper::VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node) {
1120 1.1 joerg OS << " " << Node->getCastName() << "<"
1121 1.1 joerg << Node->getTypeAsWritten().getAsString() << ">"
1122 1.1 joerg << " <" << Node->getCastKindName();
1123 1.1 joerg dumpBasePath(OS, Node);
1124 1.1 joerg OS << ">";
1125 1.1 joerg }
1126 1.1 joerg
1127 1.1 joerg void TextNodeDumper::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node) {
1128 1.1 joerg OS << " " << (Node->getValue() ? "true" : "false");
1129 1.1 joerg }
1130 1.1 joerg
1131 1.1 joerg void TextNodeDumper::VisitCXXThisExpr(const CXXThisExpr *Node) {
1132 1.1 joerg if (Node->isImplicit())
1133 1.1 joerg OS << " implicit";
1134 1.1 joerg OS << " this";
1135 1.1 joerg }
1136 1.1 joerg
1137 1.1 joerg void TextNodeDumper::VisitCXXFunctionalCastExpr(
1138 1.1 joerg const CXXFunctionalCastExpr *Node) {
1139 1.1 joerg OS << " functional cast to " << Node->getTypeAsWritten().getAsString() << " <"
1140 1.1 joerg << Node->getCastKindName() << ">";
1141 1.1.1.2 joerg if (Node->hasStoredFPFeatures())
1142 1.1.1.2 joerg printFPOptions(Node->getFPFeatures());
1143 1.1.1.2 joerg }
1144 1.1.1.2 joerg
1145 1.1.1.2 joerg void TextNodeDumper::VisitCXXStaticCastExpr(const CXXStaticCastExpr *Node) {
1146 1.1.1.2 joerg VisitCXXNamedCastExpr(Node);
1147 1.1.1.2 joerg if (Node->hasStoredFPFeatures())
1148 1.1.1.2 joerg printFPOptions(Node->getFPFeatures());
1149 1.1 joerg }
1150 1.1 joerg
1151 1.1 joerg void TextNodeDumper::VisitCXXUnresolvedConstructExpr(
1152 1.1 joerg const CXXUnresolvedConstructExpr *Node) {
1153 1.1 joerg dumpType(Node->getTypeAsWritten());
1154 1.1 joerg if (Node->isListInitialization())
1155 1.1 joerg OS << " list";
1156 1.1 joerg }
1157 1.1 joerg
1158 1.1 joerg void TextNodeDumper::VisitCXXConstructExpr(const CXXConstructExpr *Node) {
1159 1.1 joerg CXXConstructorDecl *Ctor = Node->getConstructor();
1160 1.1 joerg dumpType(Ctor->getType());
1161 1.1 joerg if (Node->isElidable())
1162 1.1 joerg OS << " elidable";
1163 1.1 joerg if (Node->isListInitialization())
1164 1.1 joerg OS << " list";
1165 1.1 joerg if (Node->isStdInitListInitialization())
1166 1.1 joerg OS << " std::initializer_list";
1167 1.1 joerg if (Node->requiresZeroInitialization())
1168 1.1 joerg OS << " zeroing";
1169 1.1 joerg }
1170 1.1 joerg
1171 1.1 joerg void TextNodeDumper::VisitCXXBindTemporaryExpr(
1172 1.1 joerg const CXXBindTemporaryExpr *Node) {
1173 1.1 joerg OS << " (CXXTemporary";
1174 1.1 joerg dumpPointer(Node);
1175 1.1 joerg OS << ")";
1176 1.1 joerg }
1177 1.1 joerg
1178 1.1 joerg void TextNodeDumper::VisitCXXNewExpr(const CXXNewExpr *Node) {
1179 1.1 joerg if (Node->isGlobalNew())
1180 1.1 joerg OS << " global";
1181 1.1 joerg if (Node->isArray())
1182 1.1 joerg OS << " array";
1183 1.1 joerg if (Node->getOperatorNew()) {
1184 1.1 joerg OS << ' ';
1185 1.1 joerg dumpBareDeclRef(Node->getOperatorNew());
1186 1.1 joerg }
1187 1.1 joerg // We could dump the deallocation function used in case of error, but it's
1188 1.1 joerg // usually not that interesting.
1189 1.1 joerg }
1190 1.1 joerg
1191 1.1 joerg void TextNodeDumper::VisitCXXDeleteExpr(const CXXDeleteExpr *Node) {
1192 1.1 joerg if (Node->isGlobalDelete())
1193 1.1 joerg OS << " global";
1194 1.1 joerg if (Node->isArrayForm())
1195 1.1 joerg OS << " array";
1196 1.1 joerg if (Node->getOperatorDelete()) {
1197 1.1 joerg OS << ' ';
1198 1.1 joerg dumpBareDeclRef(Node->getOperatorDelete());
1199 1.1 joerg }
1200 1.1 joerg }
1201 1.1 joerg
1202 1.1.1.2 joerg void TextNodeDumper::VisitTypeTraitExpr(const TypeTraitExpr *Node) {
1203 1.1.1.2 joerg OS << " " << getTraitSpelling(Node->getTrait());
1204 1.1.1.2 joerg }
1205 1.1.1.2 joerg
1206 1.1.1.2 joerg void TextNodeDumper::VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *Node) {
1207 1.1.1.2 joerg OS << " " << getTraitSpelling(Node->getTrait());
1208 1.1.1.2 joerg }
1209 1.1.1.2 joerg
1210 1.1.1.2 joerg void TextNodeDumper::VisitExpressionTraitExpr(const ExpressionTraitExpr *Node) {
1211 1.1.1.2 joerg OS << " " << getTraitSpelling(Node->getTrait());
1212 1.1.1.2 joerg }
1213 1.1.1.2 joerg
1214 1.1 joerg void TextNodeDumper::VisitMaterializeTemporaryExpr(
1215 1.1 joerg const MaterializeTemporaryExpr *Node) {
1216 1.1 joerg if (const ValueDecl *VD = Node->getExtendingDecl()) {
1217 1.1 joerg OS << " extended by ";
1218 1.1 joerg dumpBareDeclRef(VD);
1219 1.1 joerg }
1220 1.1 joerg }
1221 1.1 joerg
1222 1.1 joerg void TextNodeDumper::VisitExprWithCleanups(const ExprWithCleanups *Node) {
1223 1.1 joerg for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
1224 1.1.1.2 joerg dumpCleanupObject(Node->getObject(i));
1225 1.1 joerg }
1226 1.1 joerg
1227 1.1 joerg void TextNodeDumper::VisitSizeOfPackExpr(const SizeOfPackExpr *Node) {
1228 1.1 joerg dumpPointer(Node->getPack());
1229 1.1 joerg dumpName(Node->getPack());
1230 1.1 joerg }
1231 1.1 joerg
1232 1.1 joerg void TextNodeDumper::VisitCXXDependentScopeMemberExpr(
1233 1.1 joerg const CXXDependentScopeMemberExpr *Node) {
1234 1.1 joerg OS << " " << (Node->isArrow() ? "->" : ".") << Node->getMember();
1235 1.1 joerg }
1236 1.1 joerg
1237 1.1 joerg void TextNodeDumper::VisitObjCMessageExpr(const ObjCMessageExpr *Node) {
1238 1.1 joerg OS << " selector=";
1239 1.1 joerg Node->getSelector().print(OS);
1240 1.1 joerg switch (Node->getReceiverKind()) {
1241 1.1 joerg case ObjCMessageExpr::Instance:
1242 1.1 joerg break;
1243 1.1 joerg
1244 1.1 joerg case ObjCMessageExpr::Class:
1245 1.1 joerg OS << " class=";
1246 1.1 joerg dumpBareType(Node->getClassReceiver());
1247 1.1 joerg break;
1248 1.1 joerg
1249 1.1 joerg case ObjCMessageExpr::SuperInstance:
1250 1.1 joerg OS << " super (instance)";
1251 1.1 joerg break;
1252 1.1 joerg
1253 1.1 joerg case ObjCMessageExpr::SuperClass:
1254 1.1 joerg OS << " super (class)";
1255 1.1 joerg break;
1256 1.1 joerg }
1257 1.1 joerg }
1258 1.1 joerg
1259 1.1 joerg void TextNodeDumper::VisitObjCBoxedExpr(const ObjCBoxedExpr *Node) {
1260 1.1 joerg if (auto *BoxingMethod = Node->getBoxingMethod()) {
1261 1.1 joerg OS << " selector=";
1262 1.1 joerg BoxingMethod->getSelector().print(OS);
1263 1.1 joerg }
1264 1.1 joerg }
1265 1.1 joerg
1266 1.1 joerg void TextNodeDumper::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node) {
1267 1.1 joerg if (!Node->getCatchParamDecl())
1268 1.1 joerg OS << " catch all";
1269 1.1 joerg }
1270 1.1 joerg
1271 1.1 joerg void TextNodeDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *Node) {
1272 1.1 joerg dumpType(Node->getEncodedType());
1273 1.1 joerg }
1274 1.1 joerg
1275 1.1 joerg void TextNodeDumper::VisitObjCSelectorExpr(const ObjCSelectorExpr *Node) {
1276 1.1 joerg OS << " ";
1277 1.1 joerg Node->getSelector().print(OS);
1278 1.1 joerg }
1279 1.1 joerg
1280 1.1 joerg void TextNodeDumper::VisitObjCProtocolExpr(const ObjCProtocolExpr *Node) {
1281 1.1 joerg OS << ' ' << *Node->getProtocol();
1282 1.1 joerg }
1283 1.1 joerg
1284 1.1 joerg void TextNodeDumper::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node) {
1285 1.1 joerg if (Node->isImplicitProperty()) {
1286 1.1 joerg OS << " Kind=MethodRef Getter=\"";
1287 1.1 joerg if (Node->getImplicitPropertyGetter())
1288 1.1 joerg Node->getImplicitPropertyGetter()->getSelector().print(OS);
1289 1.1 joerg else
1290 1.1 joerg OS << "(null)";
1291 1.1 joerg
1292 1.1 joerg OS << "\" Setter=\"";
1293 1.1 joerg if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
1294 1.1 joerg Setter->getSelector().print(OS);
1295 1.1 joerg else
1296 1.1 joerg OS << "(null)";
1297 1.1 joerg OS << "\"";
1298 1.1 joerg } else {
1299 1.1 joerg OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty()
1300 1.1 joerg << '"';
1301 1.1 joerg }
1302 1.1 joerg
1303 1.1 joerg if (Node->isSuperReceiver())
1304 1.1 joerg OS << " super";
1305 1.1 joerg
1306 1.1 joerg OS << " Messaging=";
1307 1.1 joerg if (Node->isMessagingGetter() && Node->isMessagingSetter())
1308 1.1 joerg OS << "Getter&Setter";
1309 1.1 joerg else if (Node->isMessagingGetter())
1310 1.1 joerg OS << "Getter";
1311 1.1 joerg else if (Node->isMessagingSetter())
1312 1.1 joerg OS << "Setter";
1313 1.1 joerg }
1314 1.1 joerg
1315 1.1 joerg void TextNodeDumper::VisitObjCSubscriptRefExpr(
1316 1.1 joerg const ObjCSubscriptRefExpr *Node) {
1317 1.1 joerg if (Node->isArraySubscriptRefExpr())
1318 1.1 joerg OS << " Kind=ArraySubscript GetterForArray=\"";
1319 1.1 joerg else
1320 1.1 joerg OS << " Kind=DictionarySubscript GetterForDictionary=\"";
1321 1.1 joerg if (Node->getAtIndexMethodDecl())
1322 1.1 joerg Node->getAtIndexMethodDecl()->getSelector().print(OS);
1323 1.1 joerg else
1324 1.1 joerg OS << "(null)";
1325 1.1 joerg
1326 1.1 joerg if (Node->isArraySubscriptRefExpr())
1327 1.1 joerg OS << "\" SetterForArray=\"";
1328 1.1 joerg else
1329 1.1 joerg OS << "\" SetterForDictionary=\"";
1330 1.1 joerg if (Node->setAtIndexMethodDecl())
1331 1.1 joerg Node->setAtIndexMethodDecl()->getSelector().print(OS);
1332 1.1 joerg else
1333 1.1 joerg OS << "(null)";
1334 1.1 joerg }
1335 1.1 joerg
1336 1.1 joerg void TextNodeDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node) {
1337 1.1 joerg OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
1338 1.1 joerg }
1339 1.1 joerg
1340 1.1.1.2 joerg void TextNodeDumper::VisitOMPIteratorExpr(const OMPIteratorExpr *Node) {
1341 1.1.1.2 joerg OS << " ";
1342 1.1.1.2 joerg for (unsigned I = 0, E = Node->numOfIterators(); I < E; ++I) {
1343 1.1.1.2 joerg Visit(Node->getIteratorDecl(I));
1344 1.1.1.2 joerg OS << " = ";
1345 1.1.1.2 joerg const OMPIteratorExpr::IteratorRange Range = Node->getIteratorRange(I);
1346 1.1.1.2 joerg OS << " begin ";
1347 1.1.1.2 joerg Visit(Range.Begin);
1348 1.1.1.2 joerg OS << " end ";
1349 1.1.1.2 joerg Visit(Range.End);
1350 1.1.1.2 joerg if (Range.Step) {
1351 1.1.1.2 joerg OS << " step ";
1352 1.1.1.2 joerg Visit(Range.Step);
1353 1.1.1.2 joerg }
1354 1.1.1.2 joerg }
1355 1.1.1.2 joerg }
1356 1.1.1.2 joerg
1357 1.1.1.2 joerg void TextNodeDumper::VisitConceptSpecializationExpr(
1358 1.1.1.2 joerg const ConceptSpecializationExpr *Node) {
1359 1.1.1.2 joerg OS << " ";
1360 1.1.1.2 joerg dumpBareDeclRef(Node->getFoundDecl());
1361 1.1.1.2 joerg }
1362 1.1.1.2 joerg
1363 1.1 joerg void TextNodeDumper::VisitRValueReferenceType(const ReferenceType *T) {
1364 1.1 joerg if (T->isSpelledAsLValue())
1365 1.1 joerg OS << " written as lvalue reference";
1366 1.1 joerg }
1367 1.1 joerg
1368 1.1 joerg void TextNodeDumper::VisitArrayType(const ArrayType *T) {
1369 1.1 joerg switch (T->getSizeModifier()) {
1370 1.1 joerg case ArrayType::Normal:
1371 1.1 joerg break;
1372 1.1 joerg case ArrayType::Static:
1373 1.1 joerg OS << " static";
1374 1.1 joerg break;
1375 1.1 joerg case ArrayType::Star:
1376 1.1 joerg OS << " *";
1377 1.1 joerg break;
1378 1.1 joerg }
1379 1.1 joerg OS << " " << T->getIndexTypeQualifiers().getAsString();
1380 1.1 joerg }
1381 1.1 joerg
1382 1.1 joerg void TextNodeDumper::VisitConstantArrayType(const ConstantArrayType *T) {
1383 1.1 joerg OS << " " << T->getSize();
1384 1.1 joerg VisitArrayType(T);
1385 1.1 joerg }
1386 1.1 joerg
1387 1.1 joerg void TextNodeDumper::VisitVariableArrayType(const VariableArrayType *T) {
1388 1.1 joerg OS << " ";
1389 1.1 joerg dumpSourceRange(T->getBracketsRange());
1390 1.1 joerg VisitArrayType(T);
1391 1.1 joerg }
1392 1.1 joerg
1393 1.1 joerg void TextNodeDumper::VisitDependentSizedArrayType(
1394 1.1 joerg const DependentSizedArrayType *T) {
1395 1.1 joerg VisitArrayType(T);
1396 1.1 joerg OS << " ";
1397 1.1 joerg dumpSourceRange(T->getBracketsRange());
1398 1.1 joerg }
1399 1.1 joerg
1400 1.1 joerg void TextNodeDumper::VisitDependentSizedExtVectorType(
1401 1.1 joerg const DependentSizedExtVectorType *T) {
1402 1.1 joerg OS << " ";
1403 1.1 joerg dumpLocation(T->getAttributeLoc());
1404 1.1 joerg }
1405 1.1 joerg
1406 1.1 joerg void TextNodeDumper::VisitVectorType(const VectorType *T) {
1407 1.1 joerg switch (T->getVectorKind()) {
1408 1.1 joerg case VectorType::GenericVector:
1409 1.1 joerg break;
1410 1.1 joerg case VectorType::AltiVecVector:
1411 1.1 joerg OS << " altivec";
1412 1.1 joerg break;
1413 1.1 joerg case VectorType::AltiVecPixel:
1414 1.1 joerg OS << " altivec pixel";
1415 1.1 joerg break;
1416 1.1 joerg case VectorType::AltiVecBool:
1417 1.1 joerg OS << " altivec bool";
1418 1.1 joerg break;
1419 1.1 joerg case VectorType::NeonVector:
1420 1.1 joerg OS << " neon";
1421 1.1 joerg break;
1422 1.1 joerg case VectorType::NeonPolyVector:
1423 1.1 joerg OS << " neon poly";
1424 1.1 joerg break;
1425 1.1.1.2 joerg case VectorType::SveFixedLengthDataVector:
1426 1.1.1.2 joerg OS << " fixed-length sve data vector";
1427 1.1.1.2 joerg break;
1428 1.1.1.2 joerg case VectorType::SveFixedLengthPredicateVector:
1429 1.1.1.2 joerg OS << " fixed-length sve predicate vector";
1430 1.1.1.2 joerg break;
1431 1.1 joerg }
1432 1.1 joerg OS << " " << T->getNumElements();
1433 1.1 joerg }
1434 1.1 joerg
1435 1.1 joerg void TextNodeDumper::VisitFunctionType(const FunctionType *T) {
1436 1.1 joerg auto EI = T->getExtInfo();
1437 1.1 joerg if (EI.getNoReturn())
1438 1.1 joerg OS << " noreturn";
1439 1.1 joerg if (EI.getProducesResult())
1440 1.1 joerg OS << " produces_result";
1441 1.1 joerg if (EI.getHasRegParm())
1442 1.1 joerg OS << " regparm " << EI.getRegParm();
1443 1.1 joerg OS << " " << FunctionType::getNameForCallConv(EI.getCC());
1444 1.1 joerg }
1445 1.1 joerg
1446 1.1 joerg void TextNodeDumper::VisitFunctionProtoType(const FunctionProtoType *T) {
1447 1.1 joerg auto EPI = T->getExtProtoInfo();
1448 1.1 joerg if (EPI.HasTrailingReturn)
1449 1.1 joerg OS << " trailing_return";
1450 1.1 joerg if (T->isConst())
1451 1.1 joerg OS << " const";
1452 1.1 joerg if (T->isVolatile())
1453 1.1 joerg OS << " volatile";
1454 1.1 joerg if (T->isRestrict())
1455 1.1 joerg OS << " restrict";
1456 1.1 joerg if (T->getExtProtoInfo().Variadic)
1457 1.1 joerg OS << " variadic";
1458 1.1 joerg switch (EPI.RefQualifier) {
1459 1.1 joerg case RQ_None:
1460 1.1 joerg break;
1461 1.1 joerg case RQ_LValue:
1462 1.1 joerg OS << " &";
1463 1.1 joerg break;
1464 1.1 joerg case RQ_RValue:
1465 1.1 joerg OS << " &&";
1466 1.1 joerg break;
1467 1.1 joerg }
1468 1.1 joerg // FIXME: Exception specification.
1469 1.1 joerg // FIXME: Consumed parameters.
1470 1.1 joerg VisitFunctionType(T);
1471 1.1 joerg }
1472 1.1 joerg
1473 1.1 joerg void TextNodeDumper::VisitUnresolvedUsingType(const UnresolvedUsingType *T) {
1474 1.1 joerg dumpDeclRef(T->getDecl());
1475 1.1 joerg }
1476 1.1 joerg
1477 1.1 joerg void TextNodeDumper::VisitTypedefType(const TypedefType *T) {
1478 1.1 joerg dumpDeclRef(T->getDecl());
1479 1.1 joerg }
1480 1.1 joerg
1481 1.1 joerg void TextNodeDumper::VisitUnaryTransformType(const UnaryTransformType *T) {
1482 1.1 joerg switch (T->getUTTKind()) {
1483 1.1 joerg case UnaryTransformType::EnumUnderlyingType:
1484 1.1 joerg OS << " underlying_type";
1485 1.1 joerg break;
1486 1.1 joerg }
1487 1.1 joerg }
1488 1.1 joerg
1489 1.1 joerg void TextNodeDumper::VisitTagType(const TagType *T) {
1490 1.1 joerg dumpDeclRef(T->getDecl());
1491 1.1 joerg }
1492 1.1 joerg
1493 1.1 joerg void TextNodeDumper::VisitTemplateTypeParmType(const TemplateTypeParmType *T) {
1494 1.1 joerg OS << " depth " << T->getDepth() << " index " << T->getIndex();
1495 1.1 joerg if (T->isParameterPack())
1496 1.1 joerg OS << " pack";
1497 1.1 joerg dumpDeclRef(T->getDecl());
1498 1.1 joerg }
1499 1.1 joerg
1500 1.1 joerg void TextNodeDumper::VisitAutoType(const AutoType *T) {
1501 1.1 joerg if (T->isDecltypeAuto())
1502 1.1 joerg OS << " decltype(auto)";
1503 1.1 joerg if (!T->isDeduced())
1504 1.1 joerg OS << " undeduced";
1505 1.1.1.2 joerg if (T->isConstrained()) {
1506 1.1.1.2 joerg dumpDeclRef(T->getTypeConstraintConcept());
1507 1.1.1.2 joerg for (const auto &Arg : T->getTypeConstraintArguments())
1508 1.1.1.2 joerg VisitTemplateArgument(Arg);
1509 1.1.1.2 joerg }
1510 1.1 joerg }
1511 1.1 joerg
1512 1.1 joerg void TextNodeDumper::VisitTemplateSpecializationType(
1513 1.1 joerg const TemplateSpecializationType *T) {
1514 1.1 joerg if (T->isTypeAlias())
1515 1.1 joerg OS << " alias";
1516 1.1 joerg OS << " ";
1517 1.1 joerg T->getTemplateName().dump(OS);
1518 1.1 joerg }
1519 1.1 joerg
1520 1.1 joerg void TextNodeDumper::VisitInjectedClassNameType(
1521 1.1 joerg const InjectedClassNameType *T) {
1522 1.1 joerg dumpDeclRef(T->getDecl());
1523 1.1 joerg }
1524 1.1 joerg
1525 1.1 joerg void TextNodeDumper::VisitObjCInterfaceType(const ObjCInterfaceType *T) {
1526 1.1 joerg dumpDeclRef(T->getDecl());
1527 1.1 joerg }
1528 1.1 joerg
1529 1.1 joerg void TextNodeDumper::VisitPackExpansionType(const PackExpansionType *T) {
1530 1.1 joerg if (auto N = T->getNumExpansions())
1531 1.1 joerg OS << " expansions " << *N;
1532 1.1 joerg }
1533 1.1 joerg
1534 1.1 joerg void TextNodeDumper::VisitLabelDecl(const LabelDecl *D) { dumpName(D); }
1535 1.1 joerg
1536 1.1 joerg void TextNodeDumper::VisitTypedefDecl(const TypedefDecl *D) {
1537 1.1 joerg dumpName(D);
1538 1.1 joerg dumpType(D->getUnderlyingType());
1539 1.1 joerg if (D->isModulePrivate())
1540 1.1 joerg OS << " __module_private__";
1541 1.1 joerg }
1542 1.1 joerg
1543 1.1 joerg void TextNodeDumper::VisitEnumDecl(const EnumDecl *D) {
1544 1.1 joerg if (D->isScoped()) {
1545 1.1 joerg if (D->isScopedUsingClassTag())
1546 1.1 joerg OS << " class";
1547 1.1 joerg else
1548 1.1 joerg OS << " struct";
1549 1.1 joerg }
1550 1.1 joerg dumpName(D);
1551 1.1 joerg if (D->isModulePrivate())
1552 1.1 joerg OS << " __module_private__";
1553 1.1 joerg if (D->isFixed())
1554 1.1 joerg dumpType(D->getIntegerType());
1555 1.1 joerg }
1556 1.1 joerg
1557 1.1 joerg void TextNodeDumper::VisitRecordDecl(const RecordDecl *D) {
1558 1.1 joerg OS << ' ' << D->getKindName();
1559 1.1 joerg dumpName(D);
1560 1.1 joerg if (D->isModulePrivate())
1561 1.1 joerg OS << " __module_private__";
1562 1.1 joerg if (D->isCompleteDefinition())
1563 1.1 joerg OS << " definition";
1564 1.1 joerg }
1565 1.1 joerg
1566 1.1 joerg void TextNodeDumper::VisitEnumConstantDecl(const EnumConstantDecl *D) {
1567 1.1 joerg dumpName(D);
1568 1.1 joerg dumpType(D->getType());
1569 1.1 joerg }
1570 1.1 joerg
1571 1.1 joerg void TextNodeDumper::VisitIndirectFieldDecl(const IndirectFieldDecl *D) {
1572 1.1 joerg dumpName(D);
1573 1.1 joerg dumpType(D->getType());
1574 1.1 joerg
1575 1.1 joerg for (const auto *Child : D->chain())
1576 1.1 joerg dumpDeclRef(Child);
1577 1.1 joerg }
1578 1.1 joerg
1579 1.1 joerg void TextNodeDumper::VisitFunctionDecl(const FunctionDecl *D) {
1580 1.1 joerg dumpName(D);
1581 1.1 joerg dumpType(D->getType());
1582 1.1 joerg
1583 1.1 joerg StorageClass SC = D->getStorageClass();
1584 1.1 joerg if (SC != SC_None)
1585 1.1 joerg OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
1586 1.1 joerg if (D->isInlineSpecified())
1587 1.1 joerg OS << " inline";
1588 1.1 joerg if (D->isVirtualAsWritten())
1589 1.1 joerg OS << " virtual";
1590 1.1 joerg if (D->isModulePrivate())
1591 1.1 joerg OS << " __module_private__";
1592 1.1 joerg
1593 1.1 joerg if (D->isPure())
1594 1.1 joerg OS << " pure";
1595 1.1 joerg if (D->isDefaulted()) {
1596 1.1 joerg OS << " default";
1597 1.1 joerg if (D->isDeleted())
1598 1.1 joerg OS << "_delete";
1599 1.1 joerg }
1600 1.1 joerg if (D->isDeletedAsWritten())
1601 1.1 joerg OS << " delete";
1602 1.1 joerg if (D->isTrivial())
1603 1.1 joerg OS << " trivial";
1604 1.1 joerg
1605 1.1 joerg if (const auto *FPT = D->getType()->getAs<FunctionProtoType>()) {
1606 1.1 joerg FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
1607 1.1 joerg switch (EPI.ExceptionSpec.Type) {
1608 1.1 joerg default:
1609 1.1 joerg break;
1610 1.1 joerg case EST_Unevaluated:
1611 1.1 joerg OS << " noexcept-unevaluated " << EPI.ExceptionSpec.SourceDecl;
1612 1.1 joerg break;
1613 1.1 joerg case EST_Uninstantiated:
1614 1.1 joerg OS << " noexcept-uninstantiated " << EPI.ExceptionSpec.SourceTemplate;
1615 1.1 joerg break;
1616 1.1 joerg }
1617 1.1 joerg }
1618 1.1 joerg
1619 1.1 joerg if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
1620 1.1 joerg if (MD->size_overridden_methods() != 0) {
1621 1.1 joerg auto dumpOverride = [=](const CXXMethodDecl *D) {
1622 1.1 joerg SplitQualType T_split = D->getType().split();
1623 1.1.1.2 joerg OS << D << " " << D->getParent()->getName() << "::" << D->getDeclName()
1624 1.1.1.2 joerg << " '" << QualType::getAsString(T_split, PrintPolicy) << "'";
1625 1.1 joerg };
1626 1.1 joerg
1627 1.1 joerg AddChild([=] {
1628 1.1 joerg auto Overrides = MD->overridden_methods();
1629 1.1 joerg OS << "Overrides: [ ";
1630 1.1 joerg dumpOverride(*Overrides.begin());
1631 1.1 joerg for (const auto *Override :
1632 1.1 joerg llvm::make_range(Overrides.begin() + 1, Overrides.end())) {
1633 1.1 joerg OS << ", ";
1634 1.1 joerg dumpOverride(Override);
1635 1.1 joerg }
1636 1.1 joerg OS << " ]";
1637 1.1 joerg });
1638 1.1 joerg }
1639 1.1 joerg }
1640 1.1 joerg
1641 1.1 joerg // Since NumParams comes from the FunctionProtoType of the FunctionDecl and
1642 1.1 joerg // the Params are set later, it is possible for a dump during debugging to
1643 1.1 joerg // encounter a FunctionDecl that has been created but hasn't been assigned
1644 1.1 joerg // ParmVarDecls yet.
1645 1.1 joerg if (!D->param_empty() && !D->param_begin())
1646 1.1 joerg OS << " <<<NULL params x " << D->getNumParams() << ">>>";
1647 1.1 joerg }
1648 1.1 joerg
1649 1.1.1.2 joerg void TextNodeDumper::VisitLifetimeExtendedTemporaryDecl(
1650 1.1.1.2 joerg const LifetimeExtendedTemporaryDecl *D) {
1651 1.1.1.2 joerg OS << " extended by ";
1652 1.1.1.2 joerg dumpBareDeclRef(D->getExtendingDecl());
1653 1.1.1.2 joerg OS << " mangling ";
1654 1.1.1.2 joerg {
1655 1.1.1.2 joerg ColorScope Color(OS, ShowColors, ValueColor);
1656 1.1.1.2 joerg OS << D->getManglingNumber();
1657 1.1.1.2 joerg }
1658 1.1.1.2 joerg }
1659 1.1.1.2 joerg
1660 1.1 joerg void TextNodeDumper::VisitFieldDecl(const FieldDecl *D) {
1661 1.1 joerg dumpName(D);
1662 1.1 joerg dumpType(D->getType());
1663 1.1 joerg if (D->isMutable())
1664 1.1 joerg OS << " mutable";
1665 1.1 joerg if (D->isModulePrivate())
1666 1.1 joerg OS << " __module_private__";
1667 1.1 joerg }
1668 1.1 joerg
1669 1.1 joerg void TextNodeDumper::VisitVarDecl(const VarDecl *D) {
1670 1.1 joerg dumpName(D);
1671 1.1 joerg dumpType(D->getType());
1672 1.1 joerg StorageClass SC = D->getStorageClass();
1673 1.1 joerg if (SC != SC_None)
1674 1.1 joerg OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
1675 1.1 joerg switch (D->getTLSKind()) {
1676 1.1 joerg case VarDecl::TLS_None:
1677 1.1 joerg break;
1678 1.1 joerg case VarDecl::TLS_Static:
1679 1.1 joerg OS << " tls";
1680 1.1 joerg break;
1681 1.1 joerg case VarDecl::TLS_Dynamic:
1682 1.1 joerg OS << " tls_dynamic";
1683 1.1 joerg break;
1684 1.1 joerg }
1685 1.1 joerg if (D->isModulePrivate())
1686 1.1 joerg OS << " __module_private__";
1687 1.1 joerg if (D->isNRVOVariable())
1688 1.1 joerg OS << " nrvo";
1689 1.1 joerg if (D->isInline())
1690 1.1 joerg OS << " inline";
1691 1.1 joerg if (D->isConstexpr())
1692 1.1 joerg OS << " constexpr";
1693 1.1 joerg if (D->hasInit()) {
1694 1.1 joerg switch (D->getInitStyle()) {
1695 1.1 joerg case VarDecl::CInit:
1696 1.1 joerg OS << " cinit";
1697 1.1 joerg break;
1698 1.1 joerg case VarDecl::CallInit:
1699 1.1 joerg OS << " callinit";
1700 1.1 joerg break;
1701 1.1 joerg case VarDecl::ListInit:
1702 1.1 joerg OS << " listinit";
1703 1.1 joerg break;
1704 1.1 joerg }
1705 1.1 joerg }
1706 1.1 joerg if (D->needsDestruction(D->getASTContext()))
1707 1.1 joerg OS << " destroyed";
1708 1.1 joerg if (D->isParameterPack())
1709 1.1 joerg OS << " pack";
1710 1.1.1.2 joerg
1711 1.1.1.2 joerg if (D->hasInit()) {
1712 1.1.1.2 joerg const Expr *E = D->getInit();
1713 1.1.1.2 joerg // Only dump the value of constexpr VarDecls for now.
1714 1.1.1.2 joerg if (E && !E->isValueDependent() && D->isConstexpr()) {
1715 1.1.1.2 joerg const APValue *Value = D->evaluateValue();
1716 1.1.1.2 joerg if (Value)
1717 1.1.1.2 joerg AddChild("value", [=] { Visit(*Value, E->getType()); });
1718 1.1.1.2 joerg }
1719 1.1.1.2 joerg }
1720 1.1 joerg }
1721 1.1 joerg
1722 1.1 joerg void TextNodeDumper::VisitBindingDecl(const BindingDecl *D) {
1723 1.1 joerg dumpName(D);
1724 1.1 joerg dumpType(D->getType());
1725 1.1 joerg }
1726 1.1 joerg
1727 1.1 joerg void TextNodeDumper::VisitCapturedDecl(const CapturedDecl *D) {
1728 1.1 joerg if (D->isNothrow())
1729 1.1 joerg OS << " nothrow";
1730 1.1 joerg }
1731 1.1 joerg
1732 1.1 joerg void TextNodeDumper::VisitImportDecl(const ImportDecl *D) {
1733 1.1 joerg OS << ' ' << D->getImportedModule()->getFullModuleName();
1734 1.1 joerg
1735 1.1 joerg for (Decl *InitD :
1736 1.1 joerg D->getASTContext().getModuleInitializers(D->getImportedModule()))
1737 1.1 joerg dumpDeclRef(InitD, "initializer");
1738 1.1 joerg }
1739 1.1 joerg
1740 1.1 joerg void TextNodeDumper::VisitPragmaCommentDecl(const PragmaCommentDecl *D) {
1741 1.1 joerg OS << ' ';
1742 1.1 joerg switch (D->getCommentKind()) {
1743 1.1 joerg case PCK_Unknown:
1744 1.1 joerg llvm_unreachable("unexpected pragma comment kind");
1745 1.1 joerg case PCK_Compiler:
1746 1.1 joerg OS << "compiler";
1747 1.1 joerg break;
1748 1.1 joerg case PCK_ExeStr:
1749 1.1 joerg OS << "exestr";
1750 1.1 joerg break;
1751 1.1 joerg case PCK_Lib:
1752 1.1 joerg OS << "lib";
1753 1.1 joerg break;
1754 1.1 joerg case PCK_Linker:
1755 1.1 joerg OS << "linker";
1756 1.1 joerg break;
1757 1.1 joerg case PCK_User:
1758 1.1 joerg OS << "user";
1759 1.1 joerg break;
1760 1.1 joerg }
1761 1.1 joerg StringRef Arg = D->getArg();
1762 1.1 joerg if (!Arg.empty())
1763 1.1 joerg OS << " \"" << Arg << "\"";
1764 1.1 joerg }
1765 1.1 joerg
1766 1.1 joerg void TextNodeDumper::VisitPragmaDetectMismatchDecl(
1767 1.1 joerg const PragmaDetectMismatchDecl *D) {
1768 1.1 joerg OS << " \"" << D->getName() << "\" \"" << D->getValue() << "\"";
1769 1.1 joerg }
1770 1.1 joerg
1771 1.1 joerg void TextNodeDumper::VisitOMPExecutableDirective(
1772 1.1 joerg const OMPExecutableDirective *D) {
1773 1.1 joerg if (D->isStandaloneDirective())
1774 1.1 joerg OS << " openmp_standalone_directive";
1775 1.1 joerg }
1776 1.1 joerg
1777 1.1 joerg void TextNodeDumper::VisitOMPDeclareReductionDecl(
1778 1.1 joerg const OMPDeclareReductionDecl *D) {
1779 1.1 joerg dumpName(D);
1780 1.1 joerg dumpType(D->getType());
1781 1.1 joerg OS << " combiner";
1782 1.1 joerg dumpPointer(D->getCombiner());
1783 1.1 joerg if (const auto *Initializer = D->getInitializer()) {
1784 1.1 joerg OS << " initializer";
1785 1.1 joerg dumpPointer(Initializer);
1786 1.1 joerg switch (D->getInitializerKind()) {
1787 1.1 joerg case OMPDeclareReductionDecl::DirectInit:
1788 1.1 joerg OS << " omp_priv = ";
1789 1.1 joerg break;
1790 1.1 joerg case OMPDeclareReductionDecl::CopyInit:
1791 1.1 joerg OS << " omp_priv ()";
1792 1.1 joerg break;
1793 1.1 joerg case OMPDeclareReductionDecl::CallInit:
1794 1.1 joerg break;
1795 1.1 joerg }
1796 1.1 joerg }
1797 1.1 joerg }
1798 1.1 joerg
1799 1.1 joerg void TextNodeDumper::VisitOMPRequiresDecl(const OMPRequiresDecl *D) {
1800 1.1 joerg for (const auto *C : D->clauselists()) {
1801 1.1 joerg AddChild([=] {
1802 1.1 joerg if (!C) {
1803 1.1 joerg ColorScope Color(OS, ShowColors, NullColor);
1804 1.1 joerg OS << "<<<NULL>>> OMPClause";
1805 1.1 joerg return;
1806 1.1 joerg }
1807 1.1 joerg {
1808 1.1 joerg ColorScope Color(OS, ShowColors, AttrColor);
1809 1.1.1.2 joerg StringRef ClauseName(
1810 1.1.1.2 joerg llvm::omp::getOpenMPClauseName(C->getClauseKind()));
1811 1.1 joerg OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
1812 1.1 joerg << ClauseName.drop_front() << "Clause";
1813 1.1 joerg }
1814 1.1 joerg dumpPointer(C);
1815 1.1 joerg dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
1816 1.1 joerg });
1817 1.1 joerg }
1818 1.1 joerg }
1819 1.1 joerg
1820 1.1 joerg void TextNodeDumper::VisitOMPCapturedExprDecl(const OMPCapturedExprDecl *D) {
1821 1.1 joerg dumpName(D);
1822 1.1 joerg dumpType(D->getType());
1823 1.1 joerg }
1824 1.1 joerg
1825 1.1 joerg void TextNodeDumper::VisitNamespaceDecl(const NamespaceDecl *D) {
1826 1.1 joerg dumpName(D);
1827 1.1 joerg if (D->isInline())
1828 1.1 joerg OS << " inline";
1829 1.1 joerg if (!D->isOriginalNamespace())
1830 1.1 joerg dumpDeclRef(D->getOriginalNamespace(), "original");
1831 1.1 joerg }
1832 1.1 joerg
1833 1.1 joerg void TextNodeDumper::VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) {
1834 1.1 joerg OS << ' ';
1835 1.1 joerg dumpBareDeclRef(D->getNominatedNamespace());
1836 1.1 joerg }
1837 1.1 joerg
1838 1.1 joerg void TextNodeDumper::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) {
1839 1.1 joerg dumpName(D);
1840 1.1 joerg dumpDeclRef(D->getAliasedNamespace());
1841 1.1 joerg }
1842 1.1 joerg
1843 1.1 joerg void TextNodeDumper::VisitTypeAliasDecl(const TypeAliasDecl *D) {
1844 1.1 joerg dumpName(D);
1845 1.1 joerg dumpType(D->getUnderlyingType());
1846 1.1 joerg }
1847 1.1 joerg
1848 1.1 joerg void TextNodeDumper::VisitTypeAliasTemplateDecl(
1849 1.1 joerg const TypeAliasTemplateDecl *D) {
1850 1.1 joerg dumpName(D);
1851 1.1 joerg }
1852 1.1 joerg
1853 1.1 joerg void TextNodeDumper::VisitCXXRecordDecl(const CXXRecordDecl *D) {
1854 1.1 joerg VisitRecordDecl(D);
1855 1.1 joerg if (!D->isCompleteDefinition())
1856 1.1 joerg return;
1857 1.1 joerg
1858 1.1 joerg AddChild([=] {
1859 1.1 joerg {
1860 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
1861 1.1 joerg OS << "DefinitionData";
1862 1.1 joerg }
1863 1.1 joerg #define FLAG(fn, name) \
1864 1.1 joerg if (D->fn()) \
1865 1.1 joerg OS << " " #name;
1866 1.1 joerg FLAG(isParsingBaseSpecifiers, parsing_base_specifiers);
1867 1.1 joerg
1868 1.1 joerg FLAG(isGenericLambda, generic);
1869 1.1 joerg FLAG(isLambda, lambda);
1870 1.1 joerg
1871 1.1 joerg FLAG(isAnonymousStructOrUnion, is_anonymous);
1872 1.1 joerg FLAG(canPassInRegisters, pass_in_registers);
1873 1.1 joerg FLAG(isEmpty, empty);
1874 1.1 joerg FLAG(isAggregate, aggregate);
1875 1.1 joerg FLAG(isStandardLayout, standard_layout);
1876 1.1 joerg FLAG(isTriviallyCopyable, trivially_copyable);
1877 1.1 joerg FLAG(isPOD, pod);
1878 1.1 joerg FLAG(isTrivial, trivial);
1879 1.1 joerg FLAG(isPolymorphic, polymorphic);
1880 1.1 joerg FLAG(isAbstract, abstract);
1881 1.1 joerg FLAG(isLiteral, literal);
1882 1.1 joerg
1883 1.1 joerg FLAG(hasUserDeclaredConstructor, has_user_declared_ctor);
1884 1.1 joerg FLAG(hasConstexprNonCopyMoveConstructor, has_constexpr_non_copy_move_ctor);
1885 1.1 joerg FLAG(hasMutableFields, has_mutable_fields);
1886 1.1 joerg FLAG(hasVariantMembers, has_variant_members);
1887 1.1 joerg FLAG(allowConstDefaultInit, can_const_default_init);
1888 1.1 joerg
1889 1.1 joerg AddChild([=] {
1890 1.1 joerg {
1891 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
1892 1.1 joerg OS << "DefaultConstructor";
1893 1.1 joerg }
1894 1.1 joerg FLAG(hasDefaultConstructor, exists);
1895 1.1 joerg FLAG(hasTrivialDefaultConstructor, trivial);
1896 1.1 joerg FLAG(hasNonTrivialDefaultConstructor, non_trivial);
1897 1.1 joerg FLAG(hasUserProvidedDefaultConstructor, user_provided);
1898 1.1 joerg FLAG(hasConstexprDefaultConstructor, constexpr);
1899 1.1 joerg FLAG(needsImplicitDefaultConstructor, needs_implicit);
1900 1.1 joerg FLAG(defaultedDefaultConstructorIsConstexpr, defaulted_is_constexpr);
1901 1.1 joerg });
1902 1.1 joerg
1903 1.1 joerg AddChild([=] {
1904 1.1 joerg {
1905 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
1906 1.1 joerg OS << "CopyConstructor";
1907 1.1 joerg }
1908 1.1 joerg FLAG(hasSimpleCopyConstructor, simple);
1909 1.1 joerg FLAG(hasTrivialCopyConstructor, trivial);
1910 1.1 joerg FLAG(hasNonTrivialCopyConstructor, non_trivial);
1911 1.1 joerg FLAG(hasUserDeclaredCopyConstructor, user_declared);
1912 1.1 joerg FLAG(hasCopyConstructorWithConstParam, has_const_param);
1913 1.1 joerg FLAG(needsImplicitCopyConstructor, needs_implicit);
1914 1.1 joerg FLAG(needsOverloadResolutionForCopyConstructor,
1915 1.1 joerg needs_overload_resolution);
1916 1.1 joerg if (!D->needsOverloadResolutionForCopyConstructor())
1917 1.1 joerg FLAG(defaultedCopyConstructorIsDeleted, defaulted_is_deleted);
1918 1.1 joerg FLAG(implicitCopyConstructorHasConstParam, implicit_has_const_param);
1919 1.1 joerg });
1920 1.1 joerg
1921 1.1 joerg AddChild([=] {
1922 1.1 joerg {
1923 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
1924 1.1 joerg OS << "MoveConstructor";
1925 1.1 joerg }
1926 1.1 joerg FLAG(hasMoveConstructor, exists);
1927 1.1 joerg FLAG(hasSimpleMoveConstructor, simple);
1928 1.1 joerg FLAG(hasTrivialMoveConstructor, trivial);
1929 1.1 joerg FLAG(hasNonTrivialMoveConstructor, non_trivial);
1930 1.1 joerg FLAG(hasUserDeclaredMoveConstructor, user_declared);
1931 1.1 joerg FLAG(needsImplicitMoveConstructor, needs_implicit);
1932 1.1 joerg FLAG(needsOverloadResolutionForMoveConstructor,
1933 1.1 joerg needs_overload_resolution);
1934 1.1 joerg if (!D->needsOverloadResolutionForMoveConstructor())
1935 1.1 joerg FLAG(defaultedMoveConstructorIsDeleted, defaulted_is_deleted);
1936 1.1 joerg });
1937 1.1 joerg
1938 1.1 joerg AddChild([=] {
1939 1.1 joerg {
1940 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
1941 1.1 joerg OS << "CopyAssignment";
1942 1.1 joerg }
1943 1.1.1.2 joerg FLAG(hasSimpleCopyAssignment, simple);
1944 1.1 joerg FLAG(hasTrivialCopyAssignment, trivial);
1945 1.1 joerg FLAG(hasNonTrivialCopyAssignment, non_trivial);
1946 1.1 joerg FLAG(hasCopyAssignmentWithConstParam, has_const_param);
1947 1.1 joerg FLAG(hasUserDeclaredCopyAssignment, user_declared);
1948 1.1 joerg FLAG(needsImplicitCopyAssignment, needs_implicit);
1949 1.1 joerg FLAG(needsOverloadResolutionForCopyAssignment, needs_overload_resolution);
1950 1.1 joerg FLAG(implicitCopyAssignmentHasConstParam, implicit_has_const_param);
1951 1.1 joerg });
1952 1.1 joerg
1953 1.1 joerg AddChild([=] {
1954 1.1 joerg {
1955 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
1956 1.1 joerg OS << "MoveAssignment";
1957 1.1 joerg }
1958 1.1 joerg FLAG(hasMoveAssignment, exists);
1959 1.1 joerg FLAG(hasSimpleMoveAssignment, simple);
1960 1.1 joerg FLAG(hasTrivialMoveAssignment, trivial);
1961 1.1 joerg FLAG(hasNonTrivialMoveAssignment, non_trivial);
1962 1.1 joerg FLAG(hasUserDeclaredMoveAssignment, user_declared);
1963 1.1 joerg FLAG(needsImplicitMoveAssignment, needs_implicit);
1964 1.1 joerg FLAG(needsOverloadResolutionForMoveAssignment, needs_overload_resolution);
1965 1.1 joerg });
1966 1.1 joerg
1967 1.1 joerg AddChild([=] {
1968 1.1 joerg {
1969 1.1 joerg ColorScope Color(OS, ShowColors, DeclKindNameColor);
1970 1.1 joerg OS << "Destructor";
1971 1.1 joerg }
1972 1.1 joerg FLAG(hasSimpleDestructor, simple);
1973 1.1 joerg FLAG(hasIrrelevantDestructor, irrelevant);
1974 1.1 joerg FLAG(hasTrivialDestructor, trivial);
1975 1.1 joerg FLAG(hasNonTrivialDestructor, non_trivial);
1976 1.1 joerg FLAG(hasUserDeclaredDestructor, user_declared);
1977 1.1 joerg FLAG(hasConstexprDestructor, constexpr);
1978 1.1 joerg FLAG(needsImplicitDestructor, needs_implicit);
1979 1.1 joerg FLAG(needsOverloadResolutionForDestructor, needs_overload_resolution);
1980 1.1 joerg if (!D->needsOverloadResolutionForDestructor())
1981 1.1 joerg FLAG(defaultedDestructorIsDeleted, defaulted_is_deleted);
1982 1.1 joerg });
1983 1.1 joerg });
1984 1.1 joerg
1985 1.1 joerg for (const auto &I : D->bases()) {
1986 1.1 joerg AddChild([=] {
1987 1.1 joerg if (I.isVirtual())
1988 1.1 joerg OS << "virtual ";
1989 1.1 joerg dumpAccessSpecifier(I.getAccessSpecifier());
1990 1.1 joerg dumpType(I.getType());
1991 1.1 joerg if (I.isPackExpansion())
1992 1.1 joerg OS << "...";
1993 1.1 joerg });
1994 1.1 joerg }
1995 1.1 joerg }
1996 1.1 joerg
1997 1.1 joerg void TextNodeDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) {
1998 1.1 joerg dumpName(D);
1999 1.1 joerg }
2000 1.1 joerg
2001 1.1 joerg void TextNodeDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) {
2002 1.1 joerg dumpName(D);
2003 1.1 joerg }
2004 1.1 joerg
2005 1.1 joerg void TextNodeDumper::VisitVarTemplateDecl(const VarTemplateDecl *D) {
2006 1.1 joerg dumpName(D);
2007 1.1 joerg }
2008 1.1 joerg
2009 1.1 joerg void TextNodeDumper::VisitBuiltinTemplateDecl(const BuiltinTemplateDecl *D) {
2010 1.1 joerg dumpName(D);
2011 1.1 joerg }
2012 1.1 joerg
2013 1.1 joerg void TextNodeDumper::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) {
2014 1.1.1.2 joerg if (const auto *TC = D->getTypeConstraint()) {
2015 1.1.1.2 joerg OS << " ";
2016 1.1.1.2 joerg dumpBareDeclRef(TC->getNamedConcept());
2017 1.1.1.2 joerg if (TC->getNamedConcept() != TC->getFoundDecl()) {
2018 1.1.1.2 joerg OS << " (";
2019 1.1.1.2 joerg dumpBareDeclRef(TC->getFoundDecl());
2020 1.1.1.2 joerg OS << ")";
2021 1.1.1.2 joerg }
2022 1.1.1.2 joerg } else if (D->wasDeclaredWithTypename())
2023 1.1 joerg OS << " typename";
2024 1.1 joerg else
2025 1.1 joerg OS << " class";
2026 1.1 joerg OS << " depth " << D->getDepth() << " index " << D->getIndex();
2027 1.1 joerg if (D->isParameterPack())
2028 1.1 joerg OS << " ...";
2029 1.1 joerg dumpName(D);
2030 1.1 joerg }
2031 1.1 joerg
2032 1.1 joerg void TextNodeDumper::VisitNonTypeTemplateParmDecl(
2033 1.1 joerg const NonTypeTemplateParmDecl *D) {
2034 1.1 joerg dumpType(D->getType());
2035 1.1 joerg OS << " depth " << D->getDepth() << " index " << D->getIndex();
2036 1.1 joerg if (D->isParameterPack())
2037 1.1 joerg OS << " ...";
2038 1.1 joerg dumpName(D);
2039 1.1 joerg }
2040 1.1 joerg
2041 1.1 joerg void TextNodeDumper::VisitTemplateTemplateParmDecl(
2042 1.1 joerg const TemplateTemplateParmDecl *D) {
2043 1.1 joerg OS << " depth " << D->getDepth() << " index " << D->getIndex();
2044 1.1 joerg if (D->isParameterPack())
2045 1.1 joerg OS << " ...";
2046 1.1 joerg dumpName(D);
2047 1.1 joerg }
2048 1.1 joerg
2049 1.1 joerg void TextNodeDumper::VisitUsingDecl(const UsingDecl *D) {
2050 1.1 joerg OS << ' ';
2051 1.1 joerg if (D->getQualifier())
2052 1.1 joerg D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2053 1.1.1.2 joerg OS << D->getDeclName();
2054 1.1 joerg }
2055 1.1 joerg
2056 1.1 joerg void TextNodeDumper::VisitUnresolvedUsingTypenameDecl(
2057 1.1 joerg const UnresolvedUsingTypenameDecl *D) {
2058 1.1 joerg OS << ' ';
2059 1.1 joerg if (D->getQualifier())
2060 1.1 joerg D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2061 1.1.1.2 joerg OS << D->getDeclName();
2062 1.1 joerg }
2063 1.1 joerg
2064 1.1 joerg void TextNodeDumper::VisitUnresolvedUsingValueDecl(
2065 1.1 joerg const UnresolvedUsingValueDecl *D) {
2066 1.1 joerg OS << ' ';
2067 1.1 joerg if (D->getQualifier())
2068 1.1 joerg D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
2069 1.1.1.2 joerg OS << D->getDeclName();
2070 1.1 joerg dumpType(D->getType());
2071 1.1 joerg }
2072 1.1 joerg
2073 1.1 joerg void TextNodeDumper::VisitUsingShadowDecl(const UsingShadowDecl *D) {
2074 1.1 joerg OS << ' ';
2075 1.1 joerg dumpBareDeclRef(D->getTargetDecl());
2076 1.1 joerg }
2077 1.1 joerg
2078 1.1 joerg void TextNodeDumper::VisitConstructorUsingShadowDecl(
2079 1.1 joerg const ConstructorUsingShadowDecl *D) {
2080 1.1 joerg if (D->constructsVirtualBase())
2081 1.1 joerg OS << " virtual";
2082 1.1 joerg
2083 1.1 joerg AddChild([=] {
2084 1.1 joerg OS << "target ";
2085 1.1 joerg dumpBareDeclRef(D->getTargetDecl());
2086 1.1 joerg });
2087 1.1 joerg
2088 1.1 joerg AddChild([=] {
2089 1.1 joerg OS << "nominated ";
2090 1.1 joerg dumpBareDeclRef(D->getNominatedBaseClass());
2091 1.1 joerg OS << ' ';
2092 1.1 joerg dumpBareDeclRef(D->getNominatedBaseClassShadowDecl());
2093 1.1 joerg });
2094 1.1 joerg
2095 1.1 joerg AddChild([=] {
2096 1.1 joerg OS << "constructed ";
2097 1.1 joerg dumpBareDeclRef(D->getConstructedBaseClass());
2098 1.1 joerg OS << ' ';
2099 1.1 joerg dumpBareDeclRef(D->getConstructedBaseClassShadowDecl());
2100 1.1 joerg });
2101 1.1 joerg }
2102 1.1 joerg
2103 1.1 joerg void TextNodeDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *D) {
2104 1.1 joerg switch (D->getLanguage()) {
2105 1.1 joerg case LinkageSpecDecl::lang_c:
2106 1.1 joerg OS << " C";
2107 1.1 joerg break;
2108 1.1 joerg case LinkageSpecDecl::lang_cxx:
2109 1.1 joerg OS << " C++";
2110 1.1 joerg break;
2111 1.1 joerg }
2112 1.1 joerg }
2113 1.1 joerg
2114 1.1 joerg void TextNodeDumper::VisitAccessSpecDecl(const AccessSpecDecl *D) {
2115 1.1 joerg OS << ' ';
2116 1.1 joerg dumpAccessSpecifier(D->getAccess());
2117 1.1 joerg }
2118 1.1 joerg
2119 1.1 joerg void TextNodeDumper::VisitFriendDecl(const FriendDecl *D) {
2120 1.1 joerg if (TypeSourceInfo *T = D->getFriendType())
2121 1.1 joerg dumpType(T->getType());
2122 1.1 joerg }
2123 1.1 joerg
2124 1.1 joerg void TextNodeDumper::VisitObjCIvarDecl(const ObjCIvarDecl *D) {
2125 1.1 joerg dumpName(D);
2126 1.1 joerg dumpType(D->getType());
2127 1.1 joerg if (D->getSynthesize())
2128 1.1 joerg OS << " synthesize";
2129 1.1 joerg
2130 1.1 joerg switch (D->getAccessControl()) {
2131 1.1 joerg case ObjCIvarDecl::None:
2132 1.1 joerg OS << " none";
2133 1.1 joerg break;
2134 1.1 joerg case ObjCIvarDecl::Private:
2135 1.1 joerg OS << " private";
2136 1.1 joerg break;
2137 1.1 joerg case ObjCIvarDecl::Protected:
2138 1.1 joerg OS << " protected";
2139 1.1 joerg break;
2140 1.1 joerg case ObjCIvarDecl::Public:
2141 1.1 joerg OS << " public";
2142 1.1 joerg break;
2143 1.1 joerg case ObjCIvarDecl::Package:
2144 1.1 joerg OS << " package";
2145 1.1 joerg break;
2146 1.1 joerg }
2147 1.1 joerg }
2148 1.1 joerg
2149 1.1 joerg void TextNodeDumper::VisitObjCMethodDecl(const ObjCMethodDecl *D) {
2150 1.1 joerg if (D->isInstanceMethod())
2151 1.1 joerg OS << " -";
2152 1.1 joerg else
2153 1.1 joerg OS << " +";
2154 1.1 joerg dumpName(D);
2155 1.1 joerg dumpType(D->getReturnType());
2156 1.1 joerg
2157 1.1 joerg if (D->isVariadic())
2158 1.1 joerg OS << " variadic";
2159 1.1 joerg }
2160 1.1 joerg
2161 1.1 joerg void TextNodeDumper::VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D) {
2162 1.1 joerg dumpName(D);
2163 1.1 joerg switch (D->getVariance()) {
2164 1.1 joerg case ObjCTypeParamVariance::Invariant:
2165 1.1 joerg break;
2166 1.1 joerg
2167 1.1 joerg case ObjCTypeParamVariance::Covariant:
2168 1.1 joerg OS << " covariant";
2169 1.1 joerg break;
2170 1.1 joerg
2171 1.1 joerg case ObjCTypeParamVariance::Contravariant:
2172 1.1 joerg OS << " contravariant";
2173 1.1 joerg break;
2174 1.1 joerg }
2175 1.1 joerg
2176 1.1 joerg if (D->hasExplicitBound())
2177 1.1 joerg OS << " bounded";
2178 1.1 joerg dumpType(D->getUnderlyingType());
2179 1.1 joerg }
2180 1.1 joerg
2181 1.1 joerg void TextNodeDumper::VisitObjCCategoryDecl(const ObjCCategoryDecl *D) {
2182 1.1 joerg dumpName(D);
2183 1.1 joerg dumpDeclRef(D->getClassInterface());
2184 1.1 joerg dumpDeclRef(D->getImplementation());
2185 1.1 joerg for (const auto *P : D->protocols())
2186 1.1 joerg dumpDeclRef(P);
2187 1.1 joerg }
2188 1.1 joerg
2189 1.1 joerg void TextNodeDumper::VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D) {
2190 1.1 joerg dumpName(D);
2191 1.1 joerg dumpDeclRef(D->getClassInterface());
2192 1.1 joerg dumpDeclRef(D->getCategoryDecl());
2193 1.1 joerg }
2194 1.1 joerg
2195 1.1 joerg void TextNodeDumper::VisitObjCProtocolDecl(const ObjCProtocolDecl *D) {
2196 1.1 joerg dumpName(D);
2197 1.1 joerg
2198 1.1 joerg for (const auto *Child : D->protocols())
2199 1.1 joerg dumpDeclRef(Child);
2200 1.1 joerg }
2201 1.1 joerg
2202 1.1 joerg void TextNodeDumper::VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D) {
2203 1.1 joerg dumpName(D);
2204 1.1 joerg dumpDeclRef(D->getSuperClass(), "super");
2205 1.1 joerg
2206 1.1 joerg dumpDeclRef(D->getImplementation());
2207 1.1 joerg for (const auto *Child : D->protocols())
2208 1.1 joerg dumpDeclRef(Child);
2209 1.1 joerg }
2210 1.1 joerg
2211 1.1 joerg void TextNodeDumper::VisitObjCImplementationDecl(
2212 1.1 joerg const ObjCImplementationDecl *D) {
2213 1.1 joerg dumpName(D);
2214 1.1 joerg dumpDeclRef(D->getSuperClass(), "super");
2215 1.1 joerg dumpDeclRef(D->getClassInterface());
2216 1.1 joerg }
2217 1.1 joerg
2218 1.1 joerg void TextNodeDumper::VisitObjCCompatibleAliasDecl(
2219 1.1 joerg const ObjCCompatibleAliasDecl *D) {
2220 1.1 joerg dumpName(D);
2221 1.1 joerg dumpDeclRef(D->getClassInterface());
2222 1.1 joerg }
2223 1.1 joerg
2224 1.1 joerg void TextNodeDumper::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) {
2225 1.1 joerg dumpName(D);
2226 1.1 joerg dumpType(D->getType());
2227 1.1 joerg
2228 1.1 joerg if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
2229 1.1 joerg OS << " required";
2230 1.1 joerg else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
2231 1.1 joerg OS << " optional";
2232 1.1 joerg
2233 1.1.1.2 joerg ObjCPropertyAttribute::Kind Attrs = D->getPropertyAttributes();
2234 1.1.1.2 joerg if (Attrs != ObjCPropertyAttribute::kind_noattr) {
2235 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_readonly)
2236 1.1 joerg OS << " readonly";
2237 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_assign)
2238 1.1 joerg OS << " assign";
2239 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_readwrite)
2240 1.1 joerg OS << " readwrite";
2241 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_retain)
2242 1.1 joerg OS << " retain";
2243 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_copy)
2244 1.1 joerg OS << " copy";
2245 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_nonatomic)
2246 1.1 joerg OS << " nonatomic";
2247 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_atomic)
2248 1.1 joerg OS << " atomic";
2249 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_weak)
2250 1.1 joerg OS << " weak";
2251 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_strong)
2252 1.1 joerg OS << " strong";
2253 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_unsafe_unretained)
2254 1.1 joerg OS << " unsafe_unretained";
2255 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_class)
2256 1.1 joerg OS << " class";
2257 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_direct)
2258 1.1.1.2 joerg OS << " direct";
2259 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_getter)
2260 1.1 joerg dumpDeclRef(D->getGetterMethodDecl(), "getter");
2261 1.1.1.2 joerg if (Attrs & ObjCPropertyAttribute::kind_setter)
2262 1.1 joerg dumpDeclRef(D->getSetterMethodDecl(), "setter");
2263 1.1 joerg }
2264 1.1 joerg }
2265 1.1 joerg
2266 1.1 joerg void TextNodeDumper::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) {
2267 1.1 joerg dumpName(D->getPropertyDecl());
2268 1.1 joerg if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
2269 1.1 joerg OS << " synthesize";
2270 1.1 joerg else
2271 1.1 joerg OS << " dynamic";
2272 1.1 joerg dumpDeclRef(D->getPropertyDecl());
2273 1.1 joerg dumpDeclRef(D->getPropertyIvarDecl());
2274 1.1 joerg }
2275 1.1 joerg
2276 1.1 joerg void TextNodeDumper::VisitBlockDecl(const BlockDecl *D) {
2277 1.1 joerg if (D->isVariadic())
2278 1.1 joerg OS << " variadic";
2279 1.1 joerg
2280 1.1 joerg if (D->capturesCXXThis())
2281 1.1 joerg OS << " captures_this";
2282 1.1 joerg }
2283 1.1 joerg
2284 1.1 joerg void TextNodeDumper::VisitConceptDecl(const ConceptDecl *D) {
2285 1.1 joerg dumpName(D);
2286 1.1 joerg }
2287