annotate clang/lib/AST/TextNodeDumper.cpp @ 176:de4ac79aef9d

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