1 //===--- ASTDumper.cpp - Dumping implementation for ASTs ------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the AST dump methods, which dump out the
11 // AST in a form that exposes type details and other fields.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/ASTDumperUtils.h"
17 #include "clang/AST/Attr.h"
18 #include "clang/AST/CommentVisitor.h"
19 #include "clang/AST/DeclCXX.h"
20 #include "clang/AST/DeclLookups.h"
21 #include "clang/AST/DeclObjC.h"
22 #include "clang/AST/DeclOpenMP.h"
23 #include "clang/AST/DeclVisitor.h"
24 #include "clang/AST/LocInfoType.h"
25 #include "clang/AST/StmtVisitor.h"
26 #include "clang/AST/TextNodeDumper.h"
27 #include "clang/AST/TypeVisitor.h"
28 #include "clang/Basic/Builtins.h"
29 #include "clang/Basic/Module.h"
30 #include "clang/Basic/SourceManager.h"
31 #include "llvm/Support/raw_ostream.h"
32 using namespace clang;
33 using namespace clang::comments;
34 
35 //===----------------------------------------------------------------------===//
36 // ASTDumper Visitor
37 //===----------------------------------------------------------------------===//
38 
39 namespace  {
40 
41   class ASTDumper
42       : public ConstDeclVisitor<ASTDumper>,
43         public ConstStmtVisitor<ASTDumper>,
44         public ConstCommentVisitor<ASTDumper, void, const FullComment *>,
45         public TypeVisitor<ASTDumper> {
46 
47     TextNodeDumper NodeDumper;
48 
49     raw_ostream &OS;
50 
51     /// The policy to use for printing; can be defaulted.
52     PrintingPolicy PrintPolicy;
53 
54     /// Indicates whether we should trigger deserialization of nodes that had
55     /// not already been loaded.
56     bool Deserialize = false;
57 
58     const bool ShowColors;
59 
60     /// Dump a child of the current node.
61     template<typename Fn> void dumpChild(Fn doDumpChild) {
62       NodeDumper.addChild(doDumpChild);
63     }
64 
65   public:
66     ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
67               const SourceManager *SM)
68         : ASTDumper(OS, Traits, SM,
69                     SM && SM->getDiagnostics().getShowColors()) {}
70 
71     ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
72               const SourceManager *SM, bool ShowColors)
73         : ASTDumper(OS, Traits, SM, ShowColors, LangOptions()) {}
74     ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
75               const SourceManager *SM, bool ShowColors,
76               const PrintingPolicy &PrintPolicy)
77         : NodeDumper(OS, ShowColors, SM, PrintPolicy, Traits), OS(OS),
78           PrintPolicy(PrintPolicy), ShowColors(ShowColors) {}
79 
80     void setDeserialize(bool D) { Deserialize = D; }
81 
82     void dumpDecl(const Decl *D);
83     void dumpStmt(const Stmt *S);
84 
85     // Utilities
86     void dumpType(QualType T) { NodeDumper.dumpType(T); }
87     void dumpTypeAsChild(QualType T);
88     void dumpTypeAsChild(const Type *T);
89     void dumpBareDeclRef(const Decl *Node) { NodeDumper.dumpBareDeclRef(Node); }
90     void dumpDeclContext(const DeclContext *DC);
91     void dumpLookups(const DeclContext *DC, bool DumpDecls);
92     void dumpAttr(const Attr *A);
93 
94     // C++ Utilities
95     void dumpCXXCtorInitializer(const CXXCtorInitializer *Init);
96     void dumpTemplateParameters(const TemplateParameterList *TPL);
97     void dumpTemplateArgumentListInfo(const TemplateArgumentListInfo &TALI);
98     void dumpTemplateArgumentLoc(const TemplateArgumentLoc &A,
99                                  const Decl *From = nullptr,
100                                  const char *Label = nullptr);
101     void dumpTemplateArgumentList(const TemplateArgumentList &TAL);
102     void dumpTemplateArgument(const TemplateArgument &A,
103                               SourceRange R = SourceRange(),
104                               const Decl *From = nullptr,
105                               const char *Label = nullptr);
106     template <typename SpecializationDecl>
107     void dumpTemplateDeclSpecialization(const SpecializationDecl *D,
108                                         bool DumpExplicitInst,
109                                         bool DumpRefOnly);
110     template <typename TemplateDecl>
111     void dumpTemplateDecl(const TemplateDecl *D, bool DumpExplicitInst);
112 
113     // Objective-C utilities.
114     void dumpObjCTypeParamList(const ObjCTypeParamList *typeParams);
115 
116     // Types
117     void VisitComplexType(const ComplexType *T) {
118       dumpTypeAsChild(T->getElementType());
119     }
120     void VisitPointerType(const PointerType *T) {
121       dumpTypeAsChild(T->getPointeeType());
122     }
123     void VisitBlockPointerType(const BlockPointerType *T) {
124       dumpTypeAsChild(T->getPointeeType());
125     }
126     void VisitReferenceType(const ReferenceType *T) {
127       dumpTypeAsChild(T->getPointeeType());
128     }
129     void VisitRValueReferenceType(const ReferenceType *T) {
130       if (T->isSpelledAsLValue())
131         OS << " written as lvalue reference";
132       VisitReferenceType(T);
133     }
134     void VisitMemberPointerType(const MemberPointerType *T) {
135       dumpTypeAsChild(T->getClass());
136       dumpTypeAsChild(T->getPointeeType());
137     }
138     void VisitArrayType(const ArrayType *T) {
139       switch (T->getSizeModifier()) {
140         case ArrayType::Normal: break;
141         case ArrayType::Static: OS << " static"; break;
142         case ArrayType::Star: OS << " *"; break;
143       }
144       OS << " " << T->getIndexTypeQualifiers().getAsString();
145       dumpTypeAsChild(T->getElementType());
146     }
147     void VisitConstantArrayType(const ConstantArrayType *T) {
148       OS << " " << T->getSize();
149       VisitArrayType(T);
150     }
151     void VisitVariableArrayType(const VariableArrayType *T) {
152       OS << " ";
153       NodeDumper.dumpSourceRange(T->getBracketsRange());
154       VisitArrayType(T);
155       dumpStmt(T->getSizeExpr());
156     }
157     void VisitDependentSizedArrayType(const DependentSizedArrayType *T) {
158       switch (T->getSizeModifier()) {
159         case ArrayType::Normal: break;
160         case ArrayType::Static: OS << " static"; break;
161         case ArrayType::Star: OS << " *"; break;
162       }
163       OS << " " << T->getIndexTypeQualifiers().getAsString();
164       OS << " ";
165       NodeDumper.dumpSourceRange(T->getBracketsRange());
166       dumpTypeAsChild(T->getElementType());
167       dumpStmt(T->getSizeExpr());
168     }
169     void VisitDependentSizedExtVectorType(
170         const DependentSizedExtVectorType *T) {
171       OS << " ";
172       NodeDumper.dumpLocation(T->getAttributeLoc());
173       dumpTypeAsChild(T->getElementType());
174       dumpStmt(T->getSizeExpr());
175     }
176     void VisitVectorType(const VectorType *T) {
177       switch (T->getVectorKind()) {
178         case VectorType::GenericVector: break;
179         case VectorType::AltiVecVector: OS << " altivec"; break;
180         case VectorType::AltiVecPixel: OS << " altivec pixel"; break;
181         case VectorType::AltiVecBool: OS << " altivec bool"; break;
182         case VectorType::NeonVector: OS << " neon"; break;
183         case VectorType::NeonPolyVector: OS << " neon poly"; break;
184       }
185       OS << " " << T->getNumElements();
186       dumpTypeAsChild(T->getElementType());
187     }
188     void VisitFunctionType(const FunctionType *T) {
189       auto EI = T->getExtInfo();
190       if (EI.getNoReturn()) OS << " noreturn";
191       if (EI.getProducesResult()) OS << " produces_result";
192       if (EI.getHasRegParm()) OS << " regparm " << EI.getRegParm();
193       OS << " " << FunctionType::getNameForCallConv(EI.getCC());
194       dumpTypeAsChild(T->getReturnType());
195     }
196     void VisitFunctionProtoType(const FunctionProtoType *T) {
197       auto EPI = T->getExtProtoInfo();
198       if (EPI.HasTrailingReturn) OS << " trailing_return";
199 
200       if (!T->getTypeQuals().empty())
201         OS << " " << T->getTypeQuals().getAsString();
202 
203       switch (EPI.RefQualifier) {
204         case RQ_None: break;
205         case RQ_LValue: OS << " &"; break;
206         case RQ_RValue: OS << " &&"; break;
207       }
208       // FIXME: Exception specification.
209       // FIXME: Consumed parameters.
210       VisitFunctionType(T);
211       for (QualType PT : T->getParamTypes())
212         dumpTypeAsChild(PT);
213       if (EPI.Variadic)
214         dumpChild([=] { OS << "..."; });
215     }
216     void VisitUnresolvedUsingType(const UnresolvedUsingType *T) {
217       NodeDumper.dumpDeclRef(T->getDecl());
218     }
219     void VisitTypedefType(const TypedefType *T) {
220       NodeDumper.dumpDeclRef(T->getDecl());
221     }
222     void VisitTypeOfExprType(const TypeOfExprType *T) {
223       dumpStmt(T->getUnderlyingExpr());
224     }
225     void VisitDecltypeType(const DecltypeType *T) {
226       dumpStmt(T->getUnderlyingExpr());
227     }
228     void VisitUnaryTransformType(const UnaryTransformType *T) {
229       switch (T->getUTTKind()) {
230       case UnaryTransformType::EnumUnderlyingType:
231         OS << " underlying_type";
232         break;
233       }
234       dumpTypeAsChild(T->getBaseType());
235     }
236     void VisitTagType(const TagType *T) {
237       NodeDumper.dumpDeclRef(T->getDecl());
238     }
239     void VisitAttributedType(const AttributedType *T) {
240       // FIXME: AttrKind
241       dumpTypeAsChild(T->getModifiedType());
242     }
243     void VisitTemplateTypeParmType(const TemplateTypeParmType *T) {
244       OS << " depth " << T->getDepth() << " index " << T->getIndex();
245       if (T->isParameterPack()) OS << " pack";
246       NodeDumper.dumpDeclRef(T->getDecl());
247     }
248     void VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType *T) {
249       dumpTypeAsChild(T->getReplacedParameter());
250     }
251     void VisitSubstTemplateTypeParmPackType(
252         const SubstTemplateTypeParmPackType *T) {
253       dumpTypeAsChild(T->getReplacedParameter());
254       dumpTemplateArgument(T->getArgumentPack());
255     }
256     void VisitAutoType(const AutoType *T) {
257       if (T->isDecltypeAuto()) OS << " decltype(auto)";
258       if (!T->isDeduced())
259         OS << " undeduced";
260     }
261     void VisitTemplateSpecializationType(const TemplateSpecializationType *T) {
262       if (T->isTypeAlias()) OS << " alias";
263       OS << " "; T->getTemplateName().dump(OS);
264       for (auto &Arg : *T)
265         dumpTemplateArgument(Arg);
266       if (T->isTypeAlias())
267         dumpTypeAsChild(T->getAliasedType());
268     }
269     void VisitInjectedClassNameType(const InjectedClassNameType *T) {
270       NodeDumper.dumpDeclRef(T->getDecl());
271     }
272     void VisitObjCInterfaceType(const ObjCInterfaceType *T) {
273       NodeDumper.dumpDeclRef(T->getDecl());
274     }
275     void VisitObjCObjectPointerType(const ObjCObjectPointerType *T) {
276       dumpTypeAsChild(T->getPointeeType());
277     }
278     void VisitAtomicType(const AtomicType *T) {
279       dumpTypeAsChild(T->getValueType());
280     }
281     void VisitPipeType(const PipeType *T) {
282       dumpTypeAsChild(T->getElementType());
283     }
284     void VisitAdjustedType(const AdjustedType *T) {
285       dumpTypeAsChild(T->getOriginalType());
286     }
287     void VisitPackExpansionType(const PackExpansionType *T) {
288       if (auto N = T->getNumExpansions()) OS << " expansions " << *N;
289       if (!T->isSugared())
290         dumpTypeAsChild(T->getPattern());
291     }
292     // FIXME: ElaboratedType, DependentNameType,
293     // DependentTemplateSpecializationType, ObjCObjectType
294 
295     // Decls
296     void VisitLabelDecl(const LabelDecl *D);
297     void VisitTypedefDecl(const TypedefDecl *D);
298     void VisitEnumDecl(const EnumDecl *D);
299     void VisitRecordDecl(const RecordDecl *D);
300     void VisitEnumConstantDecl(const EnumConstantDecl *D);
301     void VisitIndirectFieldDecl(const IndirectFieldDecl *D);
302     void VisitFunctionDecl(const FunctionDecl *D);
303     void VisitFieldDecl(const FieldDecl *D);
304     void VisitVarDecl(const VarDecl *D);
305     void VisitDecompositionDecl(const DecompositionDecl *D);
306     void VisitBindingDecl(const BindingDecl *D);
307     void VisitFileScopeAsmDecl(const FileScopeAsmDecl *D);
308     void VisitImportDecl(const ImportDecl *D);
309     void VisitPragmaCommentDecl(const PragmaCommentDecl *D);
310     void VisitPragmaDetectMismatchDecl(const PragmaDetectMismatchDecl *D);
311     void VisitCapturedDecl(const CapturedDecl *D);
312 
313     // OpenMP decls
314     void VisitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D);
315     void VisitOMPDeclareReductionDecl(const OMPDeclareReductionDecl *D);
316     void VisitOMPRequiresDecl(const OMPRequiresDecl *D);
317     void VisitOMPCapturedExprDecl(const OMPCapturedExprDecl *D);
318 
319     // C++ Decls
320     void VisitNamespaceDecl(const NamespaceDecl *D);
321     void VisitUsingDirectiveDecl(const UsingDirectiveDecl *D);
322     void VisitNamespaceAliasDecl(const NamespaceAliasDecl *D);
323     void VisitTypeAliasDecl(const TypeAliasDecl *D);
324     void VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D);
325     void VisitCXXRecordDecl(const CXXRecordDecl *D);
326     void VisitStaticAssertDecl(const StaticAssertDecl *D);
327     void VisitFunctionTemplateDecl(const FunctionTemplateDecl *D);
328     void VisitClassTemplateDecl(const ClassTemplateDecl *D);
329     void VisitClassTemplateSpecializationDecl(
330         const ClassTemplateSpecializationDecl *D);
331     void VisitClassTemplatePartialSpecializationDecl(
332         const ClassTemplatePartialSpecializationDecl *D);
333     void VisitClassScopeFunctionSpecializationDecl(
334         const ClassScopeFunctionSpecializationDecl *D);
335     void VisitBuiltinTemplateDecl(const BuiltinTemplateDecl *D);
336     void VisitVarTemplateDecl(const VarTemplateDecl *D);
337     void VisitVarTemplateSpecializationDecl(
338         const VarTemplateSpecializationDecl *D);
339     void VisitVarTemplatePartialSpecializationDecl(
340         const VarTemplatePartialSpecializationDecl *D);
341     void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D);
342     void VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D);
343     void VisitTemplateTemplateParmDecl(const TemplateTemplateParmDecl *D);
344     void VisitUsingDecl(const UsingDecl *D);
345     void VisitUnresolvedUsingTypenameDecl(const UnresolvedUsingTypenameDecl *D);
346     void VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D);
347     void VisitUsingShadowDecl(const UsingShadowDecl *D);
348     void VisitConstructorUsingShadowDecl(const ConstructorUsingShadowDecl *D);
349     void VisitLinkageSpecDecl(const LinkageSpecDecl *D);
350     void VisitAccessSpecDecl(const AccessSpecDecl *D);
351     void VisitFriendDecl(const FriendDecl *D);
352 
353     // ObjC Decls
354     void VisitObjCIvarDecl(const ObjCIvarDecl *D);
355     void VisitObjCMethodDecl(const ObjCMethodDecl *D);
356     void VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D);
357     void VisitObjCCategoryDecl(const ObjCCategoryDecl *D);
358     void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D);
359     void VisitObjCProtocolDecl(const ObjCProtocolDecl *D);
360     void VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D);
361     void VisitObjCImplementationDecl(const ObjCImplementationDecl *D);
362     void VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D);
363     void VisitObjCPropertyDecl(const ObjCPropertyDecl *D);
364     void VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D);
365     void VisitBlockDecl(const BlockDecl *D);
366 
367     // Stmts.
368     void VisitDeclStmt(const DeclStmt *Node);
369     void VisitAttributedStmt(const AttributedStmt *Node);
370     void VisitIfStmt(const IfStmt *Node);
371     void VisitSwitchStmt(const SwitchStmt *Node);
372     void VisitWhileStmt(const WhileStmt *Node);
373     void VisitLabelStmt(const LabelStmt *Node);
374     void VisitGotoStmt(const GotoStmt *Node);
375     void VisitCXXCatchStmt(const CXXCatchStmt *Node);
376     void VisitCaseStmt(const CaseStmt *Node);
377     void VisitCapturedStmt(const CapturedStmt *Node);
378 
379     // OpenMP
380     void VisitOMPExecutableDirective(const OMPExecutableDirective *Node);
381 
382     // Exprs
383     void VisitCallExpr(const CallExpr *Node);
384     void VisitCastExpr(const CastExpr *Node);
385     void VisitImplicitCastExpr(const ImplicitCastExpr *Node);
386     void VisitDeclRefExpr(const DeclRefExpr *Node);
387     void VisitPredefinedExpr(const PredefinedExpr *Node);
388     void VisitCharacterLiteral(const CharacterLiteral *Node);
389     void VisitIntegerLiteral(const IntegerLiteral *Node);
390     void VisitFixedPointLiteral(const FixedPointLiteral *Node);
391     void VisitFloatingLiteral(const FloatingLiteral *Node);
392     void VisitStringLiteral(const StringLiteral *Str);
393     void VisitInitListExpr(const InitListExpr *ILE);
394     void VisitUnaryOperator(const UnaryOperator *Node);
395     void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Node);
396     void VisitMemberExpr(const MemberExpr *Node);
397     void VisitExtVectorElementExpr(const ExtVectorElementExpr *Node);
398     void VisitBinaryOperator(const BinaryOperator *Node);
399     void VisitCompoundAssignOperator(const CompoundAssignOperator *Node);
400     void VisitAddrLabelExpr(const AddrLabelExpr *Node);
401     void VisitBlockExpr(const BlockExpr *Node);
402     void VisitOpaqueValueExpr(const OpaqueValueExpr *Node);
403     void VisitGenericSelectionExpr(const GenericSelectionExpr *E);
404 
405     // C++
406     void VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node);
407     void VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node);
408     void VisitCXXThisExpr(const CXXThisExpr *Node);
409     void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node);
410     void VisitCXXUnresolvedConstructExpr(const CXXUnresolvedConstructExpr *Node);
411     void VisitCXXConstructExpr(const CXXConstructExpr *Node);
412     void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node);
413     void VisitCXXNewExpr(const CXXNewExpr *Node);
414     void VisitCXXDeleteExpr(const CXXDeleteExpr *Node);
415     void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node);
416     void VisitExprWithCleanups(const ExprWithCleanups *Node);
417     void VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node);
418     void VisitLambdaExpr(const LambdaExpr *Node) {
419       dumpDecl(Node->getLambdaClass());
420     }
421     void VisitSizeOfPackExpr(const SizeOfPackExpr *Node);
422     void
423     VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr *Node);
424 
425     // ObjC
426     void VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node);
427     void VisitObjCEncodeExpr(const ObjCEncodeExpr *Node);
428     void VisitObjCMessageExpr(const ObjCMessageExpr *Node);
429     void VisitObjCBoxedExpr(const ObjCBoxedExpr *Node);
430     void VisitObjCSelectorExpr(const ObjCSelectorExpr *Node);
431     void VisitObjCProtocolExpr(const ObjCProtocolExpr *Node);
432     void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node);
433     void VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node);
434     void VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node);
435     void VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node);
436 
437     // Comments.
438     void dumpComment(const Comment *C, const FullComment *FC);
439   };
440 }
441 
442 //===----------------------------------------------------------------------===//
443 //  Utilities
444 //===----------------------------------------------------------------------===//
445 
446 void ASTDumper::dumpTypeAsChild(QualType T) {
447   SplitQualType SQT = T.split();
448   if (!SQT.Quals.hasQualifiers())
449     return dumpTypeAsChild(SQT.Ty);
450 
451   dumpChild([=] {
452     OS << "QualType";
453     NodeDumper.dumpPointer(T.getAsOpaquePtr());
454     OS << " ";
455     NodeDumper.dumpBareType(T, false);
456     OS << " " << T.split().Quals.getAsString();
457     dumpTypeAsChild(T.split().Ty);
458   });
459 }
460 
461 void ASTDumper::dumpTypeAsChild(const Type *T) {
462   dumpChild([=] {
463     if (!T) {
464       ColorScope Color(OS, ShowColors, NullColor);
465       OS << "<<<NULL>>>";
466       return;
467     }
468     if (const LocInfoType *LIT = llvm::dyn_cast<LocInfoType>(T)) {
469       {
470         ColorScope Color(OS, ShowColors, TypeColor);
471         OS << "LocInfo Type";
472       }
473       NodeDumper.dumpPointer(T);
474       dumpTypeAsChild(LIT->getTypeSourceInfo()->getType());
475       return;
476     }
477 
478     {
479       ColorScope Color(OS, ShowColors, TypeColor);
480       OS << T->getTypeClassName() << "Type";
481     }
482     NodeDumper.dumpPointer(T);
483     OS << " ";
484     NodeDumper.dumpBareType(QualType(T, 0), false);
485 
486     QualType SingleStepDesugar =
487         T->getLocallyUnqualifiedSingleStepDesugaredType();
488     if (SingleStepDesugar != QualType(T, 0))
489       OS << " sugar";
490     if (T->isDependentType())
491       OS << " dependent";
492     else if (T->isInstantiationDependentType())
493       OS << " instantiation_dependent";
494     if (T->isVariablyModifiedType())
495       OS << " variably_modified";
496     if (T->containsUnexpandedParameterPack())
497       OS << " contains_unexpanded_pack";
498     if (T->isFromAST())
499       OS << " imported";
500 
501     TypeVisitor<ASTDumper>::Visit(T);
502 
503     if (SingleStepDesugar != QualType(T, 0))
504       dumpTypeAsChild(SingleStepDesugar);
505   });
506 }
507 
508 void ASTDumper::dumpDeclContext(const DeclContext *DC) {
509   if (!DC)
510     return;
511 
512   for (auto *D : (Deserialize ? DC->decls() : DC->noload_decls()))
513     dumpDecl(D);
514 
515   if (DC->hasExternalLexicalStorage()) {
516     dumpChild([=] {
517       ColorScope Color(OS, ShowColors, UndeserializedColor);
518       OS << "<undeserialized declarations>";
519     });
520   }
521 }
522 
523 void ASTDumper::dumpLookups(const DeclContext *DC, bool DumpDecls) {
524   dumpChild([=] {
525     OS << "StoredDeclsMap ";
526     NodeDumper.dumpBareDeclRef(cast<Decl>(DC));
527 
528     const DeclContext *Primary = DC->getPrimaryContext();
529     if (Primary != DC) {
530       OS << " primary";
531       NodeDumper.dumpPointer(cast<Decl>(Primary));
532     }
533 
534     bool HasUndeserializedLookups = Primary->hasExternalVisibleStorage();
535 
536     auto Range = Deserialize
537                      ? Primary->lookups()
538                      : Primary->noload_lookups(/*PreserveInternalState=*/true);
539     for (auto I = Range.begin(), E = Range.end(); I != E; ++I) {
540       DeclarationName Name = I.getLookupName();
541       DeclContextLookupResult R = *I;
542 
543       dumpChild([=] {
544         OS << "DeclarationName ";
545         {
546           ColorScope Color(OS, ShowColors, DeclNameColor);
547           OS << '\'' << Name << '\'';
548         }
549 
550         for (DeclContextLookupResult::iterator RI = R.begin(), RE = R.end();
551              RI != RE; ++RI) {
552           dumpChild([=] {
553             NodeDumper.dumpBareDeclRef(*RI);
554 
555             if ((*RI)->isHidden())
556               OS << " hidden";
557 
558             // If requested, dump the redecl chain for this lookup.
559             if (DumpDecls) {
560               // Dump earliest decl first.
561               std::function<void(Decl *)> DumpWithPrev = [&](Decl *D) {
562                 if (Decl *Prev = D->getPreviousDecl())
563                   DumpWithPrev(Prev);
564                 dumpDecl(D);
565               };
566               DumpWithPrev(*RI);
567             }
568           });
569         }
570       });
571     }
572 
573     if (HasUndeserializedLookups) {
574       dumpChild([=] {
575         ColorScope Color(OS, ShowColors, UndeserializedColor);
576         OS << "<undeserialized lookups>";
577       });
578     }
579   });
580 }
581 
582 void ASTDumper::dumpAttr(const Attr *A) {
583   dumpChild([=] {
584     {
585       ColorScope Color(OS, ShowColors, AttrColor);
586 
587       switch (A->getKind()) {
588 #define ATTR(X) case attr::X: OS << #X; break;
589 #include "clang/Basic/AttrList.inc"
590       }
591       OS << "Attr";
592     }
593     NodeDumper.dumpPointer(A);
594     NodeDumper.dumpSourceRange(A->getRange());
595     if (A->isInherited())
596       OS << " Inherited";
597     if (A->isImplicit())
598       OS << " Implicit";
599 #include "clang/AST/AttrDump.inc"
600   });
601 }
602 
603 static void dumpPreviousDeclImpl(raw_ostream &OS, ...) {}
604 
605 template<typename T>
606 static void dumpPreviousDeclImpl(raw_ostream &OS, const Mergeable<T> *D) {
607   const T *First = D->getFirstDecl();
608   if (First != D)
609     OS << " first " << First;
610 }
611 
612 template<typename T>
613 static void dumpPreviousDeclImpl(raw_ostream &OS, const Redeclarable<T> *D) {
614   const T *Prev = D->getPreviousDecl();
615   if (Prev)
616     OS << " prev " << Prev;
617 }
618 
619 /// Dump the previous declaration in the redeclaration chain for a declaration,
620 /// if any.
621 static void dumpPreviousDecl(raw_ostream &OS, const Decl *D) {
622   switch (D->getKind()) {
623 #define DECL(DERIVED, BASE) \
624   case Decl::DERIVED: \
625     return dumpPreviousDeclImpl(OS, cast<DERIVED##Decl>(D));
626 #define ABSTRACT_DECL(DECL)
627 #include "clang/AST/DeclNodes.inc"
628   }
629   llvm_unreachable("Decl that isn't part of DeclNodes.inc!");
630 }
631 
632 //===----------------------------------------------------------------------===//
633 //  C++ Utilities
634 //===----------------------------------------------------------------------===//
635 
636 void ASTDumper::dumpCXXCtorInitializer(const CXXCtorInitializer *Init) {
637   dumpChild([=] {
638     OS << "CXXCtorInitializer";
639     if (Init->isAnyMemberInitializer()) {
640       OS << ' ';
641       NodeDumper.dumpBareDeclRef(Init->getAnyMember());
642     } else if (Init->isBaseInitializer()) {
643       NodeDumper.dumpType(QualType(Init->getBaseClass(), 0));
644     } else if (Init->isDelegatingInitializer()) {
645       NodeDumper.dumpType(Init->getTypeSourceInfo()->getType());
646     } else {
647       llvm_unreachable("Unknown initializer type");
648     }
649     dumpStmt(Init->getInit());
650   });
651 }
652 
653 void ASTDumper::dumpTemplateParameters(const TemplateParameterList *TPL) {
654   if (!TPL)
655     return;
656 
657   for (TemplateParameterList::const_iterator I = TPL->begin(), E = TPL->end();
658        I != E; ++I)
659     dumpDecl(*I);
660 }
661 
662 void ASTDumper::dumpTemplateArgumentListInfo(
663     const TemplateArgumentListInfo &TALI) {
664   for (unsigned i = 0, e = TALI.size(); i < e; ++i)
665     dumpTemplateArgumentLoc(TALI[i]);
666 }
667 
668 void ASTDumper::dumpTemplateArgumentLoc(const TemplateArgumentLoc &A,
669                                         const Decl *From, const char *Label) {
670   dumpTemplateArgument(A.getArgument(), A.getSourceRange(), From, Label);
671 }
672 
673 void ASTDumper::dumpTemplateArgumentList(const TemplateArgumentList &TAL) {
674   for (unsigned i = 0, e = TAL.size(); i < e; ++i)
675     dumpTemplateArgument(TAL[i]);
676 }
677 
678 void ASTDumper::dumpTemplateArgument(const TemplateArgument &A, SourceRange R,
679                                      const Decl *From, const char *Label) {
680   dumpChild([=] {
681     OS << "TemplateArgument";
682     if (R.isValid())
683       NodeDumper.dumpSourceRange(R);
684 
685     if (From)
686       NodeDumper.dumpDeclRef(From, Label);
687 
688     switch (A.getKind()) {
689     case TemplateArgument::Null:
690       OS << " null";
691       break;
692     case TemplateArgument::Type:
693       OS << " type";
694       NodeDumper.dumpType(A.getAsType());
695       break;
696     case TemplateArgument::Declaration:
697       OS << " decl";
698       NodeDumper.dumpDeclRef(A.getAsDecl());
699       break;
700     case TemplateArgument::NullPtr:
701       OS << " nullptr";
702       break;
703     case TemplateArgument::Integral:
704       OS << " integral " << A.getAsIntegral();
705       break;
706     case TemplateArgument::Template:
707       OS << " template ";
708       A.getAsTemplate().dump(OS);
709       break;
710     case TemplateArgument::TemplateExpansion:
711       OS << " template expansion ";
712       A.getAsTemplateOrTemplatePattern().dump(OS);
713       break;
714     case TemplateArgument::Expression:
715       OS << " expr";
716       dumpStmt(A.getAsExpr());
717       break;
718     case TemplateArgument::Pack:
719       OS << " pack";
720       for (TemplateArgument::pack_iterator I = A.pack_begin(), E = A.pack_end();
721            I != E; ++I)
722         dumpTemplateArgument(*I);
723       break;
724     }
725   });
726 }
727 
728 //===----------------------------------------------------------------------===//
729 //  Objective-C Utilities
730 //===----------------------------------------------------------------------===//
731 void ASTDumper::dumpObjCTypeParamList(const ObjCTypeParamList *typeParams) {
732   if (!typeParams)
733     return;
734 
735   for (auto typeParam : *typeParams) {
736     dumpDecl(typeParam);
737   }
738 }
739 
740 //===----------------------------------------------------------------------===//
741 //  Decl dumping methods.
742 //===----------------------------------------------------------------------===//
743 
744 void ASTDumper::dumpDecl(const Decl *D) {
745   dumpChild([=] {
746     if (!D) {
747       ColorScope Color(OS, ShowColors, NullColor);
748       OS << "<<<NULL>>>";
749       return;
750     }
751 
752     {
753       ColorScope Color(OS, ShowColors, DeclKindNameColor);
754       OS << D->getDeclKindName() << "Decl";
755     }
756     NodeDumper.dumpPointer(D);
757     if (D->getLexicalDeclContext() != D->getDeclContext())
758       OS << " parent " << cast<Decl>(D->getDeclContext());
759     dumpPreviousDecl(OS, D);
760     NodeDumper.dumpSourceRange(D->getSourceRange());
761     OS << ' ';
762     NodeDumper.dumpLocation(D->getLocation());
763     if (D->isFromASTFile())
764       OS << " imported";
765     if (Module *M = D->getOwningModule())
766       OS << " in " << M->getFullModuleName();
767     if (auto *ND = dyn_cast<NamedDecl>(D))
768       for (Module *M : D->getASTContext().getModulesWithMergedDefinition(
769                const_cast<NamedDecl *>(ND)))
770         dumpChild([=] { OS << "also in " << M->getFullModuleName(); });
771     if (const NamedDecl *ND = dyn_cast<NamedDecl>(D))
772       if (ND->isHidden())
773         OS << " hidden";
774     if (D->isImplicit())
775       OS << " implicit";
776     if (D->isUsed())
777       OS << " used";
778     else if (D->isThisDeclarationReferenced())
779       OS << " referenced";
780     if (D->isInvalidDecl())
781       OS << " invalid";
782     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
783       if (FD->isConstexpr())
784         OS << " constexpr";
785 
786 
787     ConstDeclVisitor<ASTDumper>::Visit(D);
788 
789     for (Decl::attr_iterator I = D->attr_begin(), E = D->attr_end(); I != E;
790          ++I)
791       dumpAttr(*I);
792 
793     if (const FullComment *Comment =
794             D->getASTContext().getLocalCommentForDeclUncached(D))
795       dumpComment(Comment, Comment);
796 
797     // Decls within functions are visited by the body.
798     if (!isa<FunctionDecl>(*D) && !isa<ObjCMethodDecl>(*D)) {
799       auto DC = dyn_cast<DeclContext>(D);
800       if (DC &&
801           (DC->hasExternalLexicalStorage() ||
802            (Deserialize ? DC->decls_begin() != DC->decls_end()
803                         : DC->noload_decls_begin() != DC->noload_decls_end())))
804         dumpDeclContext(DC);
805     }
806   });
807 }
808 
809 void ASTDumper::VisitLabelDecl(const LabelDecl *D) { NodeDumper.dumpName(D); }
810 
811 void ASTDumper::VisitTypedefDecl(const TypedefDecl *D) {
812   NodeDumper.dumpName(D);
813   NodeDumper.dumpType(D->getUnderlyingType());
814   if (D->isModulePrivate())
815     OS << " __module_private__";
816   dumpTypeAsChild(D->getUnderlyingType());
817 }
818 
819 void ASTDumper::VisitEnumDecl(const EnumDecl *D) {
820   if (D->isScoped()) {
821     if (D->isScopedUsingClassTag())
822       OS << " class";
823     else
824       OS << " struct";
825   }
826   NodeDumper.dumpName(D);
827   if (D->isModulePrivate())
828     OS << " __module_private__";
829   if (D->isFixed())
830     NodeDumper.dumpType(D->getIntegerType());
831 }
832 
833 void ASTDumper::VisitRecordDecl(const RecordDecl *D) {
834   OS << ' ' << D->getKindName();
835   NodeDumper.dumpName(D);
836   if (D->isModulePrivate())
837     OS << " __module_private__";
838   if (D->isCompleteDefinition())
839     OS << " definition";
840 }
841 
842 void ASTDumper::VisitEnumConstantDecl(const EnumConstantDecl *D) {
843   NodeDumper.dumpName(D);
844   NodeDumper.dumpType(D->getType());
845   if (const Expr *Init = D->getInitExpr())
846     dumpStmt(Init);
847 }
848 
849 void ASTDumper::VisitIndirectFieldDecl(const IndirectFieldDecl *D) {
850   NodeDumper.dumpName(D);
851   NodeDumper.dumpType(D->getType());
852 
853   for (auto *Child : D->chain())
854     NodeDumper.dumpDeclRef(Child);
855 }
856 
857 void ASTDumper::VisitFunctionDecl(const FunctionDecl *D) {
858   NodeDumper.dumpName(D);
859   NodeDumper.dumpType(D->getType());
860 
861   StorageClass SC = D->getStorageClass();
862   if (SC != SC_None)
863     OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
864   if (D->isInlineSpecified())
865     OS << " inline";
866   if (D->isVirtualAsWritten())
867     OS << " virtual";
868   if (D->isModulePrivate())
869     OS << " __module_private__";
870 
871   if (D->isPure())
872     OS << " pure";
873   if (D->isDefaulted()) {
874     OS << " default";
875     if (D->isDeleted())
876       OS << "_delete";
877   }
878   if (D->isDeletedAsWritten())
879     OS << " delete";
880   if (D->isTrivial())
881     OS << " trivial";
882 
883   if (const FunctionProtoType *FPT = D->getType()->getAs<FunctionProtoType>()) {
884     FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
885     switch (EPI.ExceptionSpec.Type) {
886     default: break;
887     case EST_Unevaluated:
888       OS << " noexcept-unevaluated " << EPI.ExceptionSpec.SourceDecl;
889       break;
890     case EST_Uninstantiated:
891       OS << " noexcept-uninstantiated " << EPI.ExceptionSpec.SourceTemplate;
892       break;
893     }
894   }
895 
896   if (const FunctionTemplateSpecializationInfo *FTSI =
897           D->getTemplateSpecializationInfo())
898     dumpTemplateArgumentList(*FTSI->TemplateArguments);
899 
900   if (!D->param_begin() && D->getNumParams())
901     dumpChild([=] { OS << "<<NULL params x " << D->getNumParams() << ">>"; });
902   else
903     for (const ParmVarDecl *Parameter : D->parameters())
904       dumpDecl(Parameter);
905 
906   if (const CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(D))
907     for (CXXConstructorDecl::init_const_iterator I = C->init_begin(),
908                                                  E = C->init_end();
909          I != E; ++I)
910       dumpCXXCtorInitializer(*I);
911 
912   if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) {
913     if (MD->size_overridden_methods() != 0) {
914       auto dumpOverride = [=](const CXXMethodDecl *D) {
915         SplitQualType T_split = D->getType().split();
916         OS << D << " " << D->getParent()->getName()
917            << "::" << D->getNameAsString() << " '"
918            << QualType::getAsString(T_split, PrintPolicy) << "'";
919       };
920 
921       dumpChild([=] {
922         auto Overrides = MD->overridden_methods();
923         OS << "Overrides: [ ";
924         dumpOverride(*Overrides.begin());
925         for (const auto *Override :
926              llvm::make_range(Overrides.begin() + 1, Overrides.end())) {
927           OS << ", ";
928           dumpOverride(Override);
929         }
930         OS << " ]";
931       });
932     }
933   }
934 
935   if (D->doesThisDeclarationHaveABody())
936     dumpStmt(D->getBody());
937 }
938 
939 void ASTDumper::VisitFieldDecl(const FieldDecl *D) {
940   NodeDumper.dumpName(D);
941   NodeDumper.dumpType(D->getType());
942   if (D->isMutable())
943     OS << " mutable";
944   if (D->isModulePrivate())
945     OS << " __module_private__";
946 
947   if (D->isBitField())
948     dumpStmt(D->getBitWidth());
949   if (Expr *Init = D->getInClassInitializer())
950     dumpStmt(Init);
951 }
952 
953 void ASTDumper::VisitVarDecl(const VarDecl *D) {
954   NodeDumper.dumpName(D);
955   NodeDumper.dumpType(D->getType());
956   StorageClass SC = D->getStorageClass();
957   if (SC != SC_None)
958     OS << ' ' << VarDecl::getStorageClassSpecifierString(SC);
959   switch (D->getTLSKind()) {
960   case VarDecl::TLS_None: break;
961   case VarDecl::TLS_Static: OS << " tls"; break;
962   case VarDecl::TLS_Dynamic: OS << " tls_dynamic"; break;
963   }
964   if (D->isModulePrivate())
965     OS << " __module_private__";
966   if (D->isNRVOVariable())
967     OS << " nrvo";
968   if (D->isInline())
969     OS << " inline";
970   if (D->isConstexpr())
971     OS << " constexpr";
972   if (D->hasInit()) {
973     switch (D->getInitStyle()) {
974     case VarDecl::CInit: OS << " cinit"; break;
975     case VarDecl::CallInit: OS << " callinit"; break;
976     case VarDecl::ListInit: OS << " listinit"; break;
977     }
978     dumpStmt(D->getInit());
979   }
980 }
981 
982 void ASTDumper::VisitDecompositionDecl(const DecompositionDecl *D) {
983   VisitVarDecl(D);
984   for (auto *B : D->bindings())
985     dumpDecl(B);
986 }
987 
988 void ASTDumper::VisitBindingDecl(const BindingDecl *D) {
989   NodeDumper.dumpName(D);
990   NodeDumper.dumpType(D->getType());
991   if (auto *E = D->getBinding())
992     dumpStmt(E);
993 }
994 
995 void ASTDumper::VisitFileScopeAsmDecl(const FileScopeAsmDecl *D) {
996   dumpStmt(D->getAsmString());
997 }
998 
999 void ASTDumper::VisitImportDecl(const ImportDecl *D) {
1000   OS << ' ' << D->getImportedModule()->getFullModuleName();
1001 }
1002 
1003 void ASTDumper::VisitPragmaCommentDecl(const PragmaCommentDecl *D) {
1004   OS << ' ';
1005   switch (D->getCommentKind()) {
1006   case PCK_Unknown:  llvm_unreachable("unexpected pragma comment kind");
1007   case PCK_Compiler: OS << "compiler"; break;
1008   case PCK_ExeStr:   OS << "exestr"; break;
1009   case PCK_Lib:      OS << "lib"; break;
1010   case PCK_Linker:   OS << "linker"; break;
1011   case PCK_User:     OS << "user"; break;
1012   }
1013   StringRef Arg = D->getArg();
1014   if (!Arg.empty())
1015     OS << " \"" << Arg << "\"";
1016 }
1017 
1018 void ASTDumper::VisitPragmaDetectMismatchDecl(
1019     const PragmaDetectMismatchDecl *D) {
1020   OS << " \"" << D->getName() << "\" \"" << D->getValue() << "\"";
1021 }
1022 
1023 void ASTDumper::VisitCapturedDecl(const CapturedDecl *D) {
1024   dumpStmt(D->getBody());
1025 }
1026 
1027 //===----------------------------------------------------------------------===//
1028 // OpenMP Declarations
1029 //===----------------------------------------------------------------------===//
1030 
1031 void ASTDumper::VisitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) {
1032   for (auto *E : D->varlists())
1033     dumpStmt(E);
1034 }
1035 
1036 void ASTDumper::VisitOMPDeclareReductionDecl(const OMPDeclareReductionDecl *D) {
1037   NodeDumper.dumpName(D);
1038   NodeDumper.dumpType(D->getType());
1039   OS << " combiner";
1040   NodeDumper.dumpPointer(D->getCombiner());
1041   if (const auto *Initializer = D->getInitializer()) {
1042     OS << " initializer";
1043     NodeDumper.dumpPointer(Initializer);
1044     switch (D->getInitializerKind()) {
1045     case OMPDeclareReductionDecl::DirectInit:
1046       OS << " omp_priv = ";
1047       break;
1048     case OMPDeclareReductionDecl::CopyInit:
1049       OS << " omp_priv ()";
1050       break;
1051     case OMPDeclareReductionDecl::CallInit:
1052       break;
1053     }
1054   }
1055 
1056   dumpStmt(D->getCombiner());
1057   if (const auto *Initializer = D->getInitializer())
1058     dumpStmt(Initializer);
1059 }
1060 
1061 void ASTDumper::VisitOMPRequiresDecl(const OMPRequiresDecl *D) {
1062   for (auto *C : D->clauselists()) {
1063     dumpChild([=] {
1064       if (!C) {
1065         ColorScope Color(OS, ShowColors, NullColor);
1066         OS << "<<<NULL>>> OMPClause";
1067         return;
1068       }
1069       {
1070         ColorScope Color(OS, ShowColors, AttrColor);
1071         StringRef ClauseName(getOpenMPClauseName(C->getClauseKind()));
1072         OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
1073            << ClauseName.drop_front() << "Clause";
1074       }
1075       NodeDumper.dumpPointer(C);
1076       NodeDumper.dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
1077     });
1078   }
1079 }
1080 
1081 void ASTDumper::VisitOMPCapturedExprDecl(const OMPCapturedExprDecl *D) {
1082   NodeDumper.dumpName(D);
1083   NodeDumper.dumpType(D->getType());
1084   dumpStmt(D->getInit());
1085 }
1086 
1087 //===----------------------------------------------------------------------===//
1088 // C++ Declarations
1089 //===----------------------------------------------------------------------===//
1090 
1091 void ASTDumper::VisitNamespaceDecl(const NamespaceDecl *D) {
1092   NodeDumper.dumpName(D);
1093   if (D->isInline())
1094     OS << " inline";
1095   if (!D->isOriginalNamespace())
1096     NodeDumper.dumpDeclRef(D->getOriginalNamespace(), "original");
1097 }
1098 
1099 void ASTDumper::VisitUsingDirectiveDecl(const UsingDirectiveDecl *D) {
1100   OS << ' ';
1101   NodeDumper.dumpBareDeclRef(D->getNominatedNamespace());
1102 }
1103 
1104 void ASTDumper::VisitNamespaceAliasDecl(const NamespaceAliasDecl *D) {
1105   NodeDumper.dumpName(D);
1106   NodeDumper.dumpDeclRef(D->getAliasedNamespace());
1107 }
1108 
1109 void ASTDumper::VisitTypeAliasDecl(const TypeAliasDecl *D) {
1110   NodeDumper.dumpName(D);
1111   NodeDumper.dumpType(D->getUnderlyingType());
1112   dumpTypeAsChild(D->getUnderlyingType());
1113 }
1114 
1115 void ASTDumper::VisitTypeAliasTemplateDecl(const TypeAliasTemplateDecl *D) {
1116   NodeDumper.dumpName(D);
1117   dumpTemplateParameters(D->getTemplateParameters());
1118   dumpDecl(D->getTemplatedDecl());
1119 }
1120 
1121 void ASTDumper::VisitCXXRecordDecl(const CXXRecordDecl *D) {
1122   VisitRecordDecl(D);
1123   if (!D->isCompleteDefinition())
1124     return;
1125 
1126   dumpChild([=] {
1127     {
1128       ColorScope Color(OS, ShowColors, DeclKindNameColor);
1129       OS << "DefinitionData";
1130     }
1131 #define FLAG(fn, name) if (D->fn()) OS << " " #name;
1132     FLAG(isParsingBaseSpecifiers, parsing_base_specifiers);
1133 
1134     FLAG(isGenericLambda, generic);
1135     FLAG(isLambda, lambda);
1136 
1137     FLAG(canPassInRegisters, pass_in_registers);
1138     FLAG(isEmpty, empty);
1139     FLAG(isAggregate, aggregate);
1140     FLAG(isStandardLayout, standard_layout);
1141     FLAG(isTriviallyCopyable, trivially_copyable);
1142     FLAG(isPOD, pod);
1143     FLAG(isTrivial, trivial);
1144     FLAG(isPolymorphic, polymorphic);
1145     FLAG(isAbstract, abstract);
1146     FLAG(isLiteral, literal);
1147 
1148     FLAG(hasUserDeclaredConstructor, has_user_declared_ctor);
1149     FLAG(hasConstexprNonCopyMoveConstructor, has_constexpr_non_copy_move_ctor);
1150     FLAG(hasMutableFields, has_mutable_fields);
1151     FLAG(hasVariantMembers, has_variant_members);
1152     FLAG(allowConstDefaultInit, can_const_default_init);
1153 
1154     dumpChild([=] {
1155       {
1156         ColorScope Color(OS, ShowColors, DeclKindNameColor);
1157         OS << "DefaultConstructor";
1158       }
1159       FLAG(hasDefaultConstructor, exists);
1160       FLAG(hasTrivialDefaultConstructor, trivial);
1161       FLAG(hasNonTrivialDefaultConstructor, non_trivial);
1162       FLAG(hasUserProvidedDefaultConstructor, user_provided);
1163       FLAG(hasConstexprDefaultConstructor, constexpr);
1164       FLAG(needsImplicitDefaultConstructor, needs_implicit);
1165       FLAG(defaultedDefaultConstructorIsConstexpr, defaulted_is_constexpr);
1166     });
1167 
1168     dumpChild([=] {
1169       {
1170         ColorScope Color(OS, ShowColors, DeclKindNameColor);
1171         OS << "CopyConstructor";
1172       }
1173       FLAG(hasSimpleCopyConstructor, simple);
1174       FLAG(hasTrivialCopyConstructor, trivial);
1175       FLAG(hasNonTrivialCopyConstructor, non_trivial);
1176       FLAG(hasUserDeclaredCopyConstructor, user_declared);
1177       FLAG(hasCopyConstructorWithConstParam, has_const_param);
1178       FLAG(needsImplicitCopyConstructor, needs_implicit);
1179       FLAG(needsOverloadResolutionForCopyConstructor,
1180            needs_overload_resolution);
1181       if (!D->needsOverloadResolutionForCopyConstructor())
1182         FLAG(defaultedCopyConstructorIsDeleted, defaulted_is_deleted);
1183       FLAG(implicitCopyConstructorHasConstParam, implicit_has_const_param);
1184     });
1185 
1186     dumpChild([=] {
1187       {
1188         ColorScope Color(OS, ShowColors, DeclKindNameColor);
1189         OS << "MoveConstructor";
1190       }
1191       FLAG(hasMoveConstructor, exists);
1192       FLAG(hasSimpleMoveConstructor, simple);
1193       FLAG(hasTrivialMoveConstructor, trivial);
1194       FLAG(hasNonTrivialMoveConstructor, non_trivial);
1195       FLAG(hasUserDeclaredMoveConstructor, user_declared);
1196       FLAG(needsImplicitMoveConstructor, needs_implicit);
1197       FLAG(needsOverloadResolutionForMoveConstructor,
1198            needs_overload_resolution);
1199       if (!D->needsOverloadResolutionForMoveConstructor())
1200         FLAG(defaultedMoveConstructorIsDeleted, defaulted_is_deleted);
1201     });
1202 
1203     dumpChild([=] {
1204       {
1205         ColorScope Color(OS, ShowColors, DeclKindNameColor);
1206         OS << "CopyAssignment";
1207       }
1208       FLAG(hasTrivialCopyAssignment, trivial);
1209       FLAG(hasNonTrivialCopyAssignment, non_trivial);
1210       FLAG(hasCopyAssignmentWithConstParam, has_const_param);
1211       FLAG(hasUserDeclaredCopyAssignment, user_declared);
1212       FLAG(needsImplicitCopyAssignment, needs_implicit);
1213       FLAG(needsOverloadResolutionForCopyAssignment, needs_overload_resolution);
1214       FLAG(implicitCopyAssignmentHasConstParam, implicit_has_const_param);
1215     });
1216 
1217     dumpChild([=] {
1218       {
1219         ColorScope Color(OS, ShowColors, DeclKindNameColor);
1220         OS << "MoveAssignment";
1221       }
1222       FLAG(hasMoveAssignment, exists);
1223       FLAG(hasSimpleMoveAssignment, simple);
1224       FLAG(hasTrivialMoveAssignment, trivial);
1225       FLAG(hasNonTrivialMoveAssignment, non_trivial);
1226       FLAG(hasUserDeclaredMoveAssignment, user_declared);
1227       FLAG(needsImplicitMoveAssignment, needs_implicit);
1228       FLAG(needsOverloadResolutionForMoveAssignment, needs_overload_resolution);
1229     });
1230 
1231     dumpChild([=] {
1232       {
1233         ColorScope Color(OS, ShowColors, DeclKindNameColor);
1234         OS << "Destructor";
1235       }
1236       FLAG(hasSimpleDestructor, simple);
1237       FLAG(hasIrrelevantDestructor, irrelevant);
1238       FLAG(hasTrivialDestructor, trivial);
1239       FLAG(hasNonTrivialDestructor, non_trivial);
1240       FLAG(hasUserDeclaredDestructor, user_declared);
1241       FLAG(needsImplicitDestructor, needs_implicit);
1242       FLAG(needsOverloadResolutionForDestructor, needs_overload_resolution);
1243       if (!D->needsOverloadResolutionForDestructor())
1244         FLAG(defaultedDestructorIsDeleted, defaulted_is_deleted);
1245     });
1246   });
1247 
1248   for (const auto &I : D->bases()) {
1249     dumpChild([=] {
1250       if (I.isVirtual())
1251         OS << "virtual ";
1252       NodeDumper.dumpAccessSpecifier(I.getAccessSpecifier());
1253       NodeDumper.dumpType(I.getType());
1254       if (I.isPackExpansion())
1255         OS << "...";
1256     });
1257   }
1258 }
1259 
1260 void ASTDumper::VisitStaticAssertDecl(const StaticAssertDecl *D) {
1261   dumpStmt(D->getAssertExpr());
1262   dumpStmt(D->getMessage());
1263 }
1264 
1265 template <typename SpecializationDecl>
1266 void ASTDumper::dumpTemplateDeclSpecialization(const SpecializationDecl *D,
1267                                                bool DumpExplicitInst,
1268                                                bool DumpRefOnly) {
1269   bool DumpedAny = false;
1270   for (auto *RedeclWithBadType : D->redecls()) {
1271     // FIXME: The redecls() range sometimes has elements of a less-specific
1272     // type. (In particular, ClassTemplateSpecializationDecl::redecls() gives
1273     // us TagDecls, and should give CXXRecordDecls).
1274     auto *Redecl = dyn_cast<SpecializationDecl>(RedeclWithBadType);
1275     if (!Redecl) {
1276       // Found the injected-class-name for a class template. This will be dumped
1277       // as part of its surrounding class so we don't need to dump it here.
1278       assert(isa<CXXRecordDecl>(RedeclWithBadType) &&
1279              "expected an injected-class-name");
1280       continue;
1281     }
1282 
1283     switch (Redecl->getTemplateSpecializationKind()) {
1284     case TSK_ExplicitInstantiationDeclaration:
1285     case TSK_ExplicitInstantiationDefinition:
1286       if (!DumpExplicitInst)
1287         break;
1288       LLVM_FALLTHROUGH;
1289     case TSK_Undeclared:
1290     case TSK_ImplicitInstantiation:
1291       if (DumpRefOnly)
1292         NodeDumper.dumpDeclRef(Redecl);
1293       else
1294         dumpDecl(Redecl);
1295       DumpedAny = true;
1296       break;
1297     case TSK_ExplicitSpecialization:
1298       break;
1299     }
1300   }
1301 
1302   // Ensure we dump at least one decl for each specialization.
1303   if (!DumpedAny)
1304     NodeDumper.dumpDeclRef(D);
1305 }
1306 
1307 template <typename TemplateDecl>
1308 void ASTDumper::dumpTemplateDecl(const TemplateDecl *D, bool DumpExplicitInst) {
1309   NodeDumper.dumpName(D);
1310   dumpTemplateParameters(D->getTemplateParameters());
1311 
1312   dumpDecl(D->getTemplatedDecl());
1313 
1314   for (auto *Child : D->specializations())
1315     dumpTemplateDeclSpecialization(Child, DumpExplicitInst,
1316                                    !D->isCanonicalDecl());
1317 }
1318 
1319 void ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) {
1320   // FIXME: We don't add a declaration of a function template specialization
1321   // to its context when it's explicitly instantiated, so dump explicit
1322   // instantiations when we dump the template itself.
1323   dumpTemplateDecl(D, true);
1324 }
1325 
1326 void ASTDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) {
1327   dumpTemplateDecl(D, false);
1328 }
1329 
1330 void ASTDumper::VisitClassTemplateSpecializationDecl(
1331     const ClassTemplateSpecializationDecl *D) {
1332   VisitCXXRecordDecl(D);
1333   dumpTemplateArgumentList(D->getTemplateArgs());
1334 }
1335 
1336 void ASTDumper::VisitClassTemplatePartialSpecializationDecl(
1337     const ClassTemplatePartialSpecializationDecl *D) {
1338   VisitClassTemplateSpecializationDecl(D);
1339   dumpTemplateParameters(D->getTemplateParameters());
1340 }
1341 
1342 void ASTDumper::VisitClassScopeFunctionSpecializationDecl(
1343     const ClassScopeFunctionSpecializationDecl *D) {
1344   dumpDecl(D->getSpecialization());
1345   if (D->hasExplicitTemplateArgs())
1346     dumpTemplateArgumentListInfo(D->templateArgs());
1347 }
1348 
1349 void ASTDumper::VisitVarTemplateDecl(const VarTemplateDecl *D) {
1350   dumpTemplateDecl(D, false);
1351 }
1352 
1353 void ASTDumper::VisitBuiltinTemplateDecl(const BuiltinTemplateDecl *D) {
1354   NodeDumper.dumpName(D);
1355   dumpTemplateParameters(D->getTemplateParameters());
1356 }
1357 
1358 void ASTDumper::VisitVarTemplateSpecializationDecl(
1359     const VarTemplateSpecializationDecl *D) {
1360   dumpTemplateArgumentList(D->getTemplateArgs());
1361   VisitVarDecl(D);
1362 }
1363 
1364 void ASTDumper::VisitVarTemplatePartialSpecializationDecl(
1365     const VarTemplatePartialSpecializationDecl *D) {
1366   dumpTemplateParameters(D->getTemplateParameters());
1367   VisitVarTemplateSpecializationDecl(D);
1368 }
1369 
1370 void ASTDumper::VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) {
1371   if (D->wasDeclaredWithTypename())
1372     OS << " typename";
1373   else
1374     OS << " class";
1375   OS << " depth " << D->getDepth() << " index " << D->getIndex();
1376   if (D->isParameterPack())
1377     OS << " ...";
1378   NodeDumper.dumpName(D);
1379   if (D->hasDefaultArgument())
1380     dumpTemplateArgument(D->getDefaultArgument(), SourceRange(),
1381                          D->getDefaultArgStorage().getInheritedFrom(),
1382                          D->defaultArgumentWasInherited() ? "inherited from"
1383                                                           : "previous");
1384 }
1385 
1386 void ASTDumper::VisitNonTypeTemplateParmDecl(const NonTypeTemplateParmDecl *D) {
1387   NodeDumper.dumpType(D->getType());
1388   OS << " depth " << D->getDepth() << " index " << D->getIndex();
1389   if (D->isParameterPack())
1390     OS << " ...";
1391   NodeDumper.dumpName(D);
1392   if (D->hasDefaultArgument())
1393     dumpTemplateArgument(D->getDefaultArgument(), SourceRange(),
1394                          D->getDefaultArgStorage().getInheritedFrom(),
1395                          D->defaultArgumentWasInherited() ? "inherited from"
1396                                                           : "previous");
1397 }
1398 
1399 void ASTDumper::VisitTemplateTemplateParmDecl(
1400     const TemplateTemplateParmDecl *D) {
1401   OS << " depth " << D->getDepth() << " index " << D->getIndex();
1402   if (D->isParameterPack())
1403     OS << " ...";
1404   NodeDumper.dumpName(D);
1405   dumpTemplateParameters(D->getTemplateParameters());
1406   if (D->hasDefaultArgument())
1407     dumpTemplateArgumentLoc(
1408         D->getDefaultArgument(), D->getDefaultArgStorage().getInheritedFrom(),
1409         D->defaultArgumentWasInherited() ? "inherited from" : "previous");
1410 }
1411 
1412 void ASTDumper::VisitUsingDecl(const UsingDecl *D) {
1413   OS << ' ';
1414   if (D->getQualifier())
1415     D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1416   OS << D->getNameAsString();
1417 }
1418 
1419 void ASTDumper::VisitUnresolvedUsingTypenameDecl(
1420     const UnresolvedUsingTypenameDecl *D) {
1421   OS << ' ';
1422   if (D->getQualifier())
1423     D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1424   OS << D->getNameAsString();
1425 }
1426 
1427 void ASTDumper::VisitUnresolvedUsingValueDecl(const UnresolvedUsingValueDecl *D) {
1428   OS << ' ';
1429   if (D->getQualifier())
1430     D->getQualifier()->print(OS, D->getASTContext().getPrintingPolicy());
1431   OS << D->getNameAsString();
1432   NodeDumper.dumpType(D->getType());
1433 }
1434 
1435 void ASTDumper::VisitUsingShadowDecl(const UsingShadowDecl *D) {
1436   OS << ' ';
1437   NodeDumper.dumpBareDeclRef(D->getTargetDecl());
1438   if (auto *TD = dyn_cast<TypeDecl>(D->getUnderlyingDecl()))
1439     dumpTypeAsChild(TD->getTypeForDecl());
1440 }
1441 
1442 void ASTDumper::VisitConstructorUsingShadowDecl(
1443     const ConstructorUsingShadowDecl *D) {
1444   if (D->constructsVirtualBase())
1445     OS << " virtual";
1446 
1447   dumpChild([=] {
1448     OS << "target ";
1449     NodeDumper.dumpBareDeclRef(D->getTargetDecl());
1450   });
1451 
1452   dumpChild([=] {
1453     OS << "nominated ";
1454     NodeDumper.dumpBareDeclRef(D->getNominatedBaseClass());
1455     OS << ' ';
1456     NodeDumper.dumpBareDeclRef(D->getNominatedBaseClassShadowDecl());
1457   });
1458 
1459   dumpChild([=] {
1460     OS << "constructed ";
1461     NodeDumper.dumpBareDeclRef(D->getConstructedBaseClass());
1462     OS << ' ';
1463     NodeDumper.dumpBareDeclRef(D->getConstructedBaseClassShadowDecl());
1464   });
1465 }
1466 
1467 void ASTDumper::VisitLinkageSpecDecl(const LinkageSpecDecl *D) {
1468   switch (D->getLanguage()) {
1469   case LinkageSpecDecl::lang_c: OS << " C"; break;
1470   case LinkageSpecDecl::lang_cxx: OS << " C++"; break;
1471   }
1472 }
1473 
1474 void ASTDumper::VisitAccessSpecDecl(const AccessSpecDecl *D) {
1475   OS << ' ';
1476   NodeDumper.dumpAccessSpecifier(D->getAccess());
1477 }
1478 
1479 void ASTDumper::VisitFriendDecl(const FriendDecl *D) {
1480   if (TypeSourceInfo *T = D->getFriendType())
1481     NodeDumper.dumpType(T->getType());
1482   else
1483     dumpDecl(D->getFriendDecl());
1484 }
1485 
1486 //===----------------------------------------------------------------------===//
1487 // Obj-C Declarations
1488 //===----------------------------------------------------------------------===//
1489 
1490 void ASTDumper::VisitObjCIvarDecl(const ObjCIvarDecl *D) {
1491   NodeDumper.dumpName(D);
1492   NodeDumper.dumpType(D->getType());
1493   if (D->getSynthesize())
1494     OS << " synthesize";
1495 
1496   switch (D->getAccessControl()) {
1497   case ObjCIvarDecl::None:
1498     OS << " none";
1499     break;
1500   case ObjCIvarDecl::Private:
1501     OS << " private";
1502     break;
1503   case ObjCIvarDecl::Protected:
1504     OS << " protected";
1505     break;
1506   case ObjCIvarDecl::Public:
1507     OS << " public";
1508     break;
1509   case ObjCIvarDecl::Package:
1510     OS << " package";
1511     break;
1512   }
1513 }
1514 
1515 void ASTDumper::VisitObjCMethodDecl(const ObjCMethodDecl *D) {
1516   if (D->isInstanceMethod())
1517     OS << " -";
1518   else
1519     OS << " +";
1520   NodeDumper.dumpName(D);
1521   NodeDumper.dumpType(D->getReturnType());
1522 
1523   if (D->isThisDeclarationADefinition()) {
1524     dumpDeclContext(D);
1525   } else {
1526     for (const ParmVarDecl *Parameter : D->parameters())
1527       dumpDecl(Parameter);
1528   }
1529 
1530   if (D->isVariadic())
1531     dumpChild([=] { OS << "..."; });
1532 
1533   if (D->hasBody())
1534     dumpStmt(D->getBody());
1535 }
1536 
1537 void ASTDumper::VisitObjCTypeParamDecl(const ObjCTypeParamDecl *D) {
1538   NodeDumper.dumpName(D);
1539   switch (D->getVariance()) {
1540   case ObjCTypeParamVariance::Invariant:
1541     break;
1542 
1543   case ObjCTypeParamVariance::Covariant:
1544     OS << " covariant";
1545     break;
1546 
1547   case ObjCTypeParamVariance::Contravariant:
1548     OS << " contravariant";
1549     break;
1550   }
1551 
1552   if (D->hasExplicitBound())
1553     OS << " bounded";
1554   NodeDumper.dumpType(D->getUnderlyingType());
1555 }
1556 
1557 void ASTDumper::VisitObjCCategoryDecl(const ObjCCategoryDecl *D) {
1558   NodeDumper.dumpName(D);
1559   NodeDumper.dumpDeclRef(D->getClassInterface());
1560   dumpObjCTypeParamList(D->getTypeParamList());
1561   NodeDumper.dumpDeclRef(D->getImplementation());
1562   for (ObjCCategoryDecl::protocol_iterator I = D->protocol_begin(),
1563                                            E = D->protocol_end();
1564        I != E; ++I)
1565     NodeDumper.dumpDeclRef(*I);
1566 }
1567 
1568 void ASTDumper::VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl *D) {
1569   NodeDumper.dumpName(D);
1570   NodeDumper.dumpDeclRef(D->getClassInterface());
1571   NodeDumper.dumpDeclRef(D->getCategoryDecl());
1572 }
1573 
1574 void ASTDumper::VisitObjCProtocolDecl(const ObjCProtocolDecl *D) {
1575   NodeDumper.dumpName(D);
1576 
1577   for (auto *Child : D->protocols())
1578     NodeDumper.dumpDeclRef(Child);
1579 }
1580 
1581 void ASTDumper::VisitObjCInterfaceDecl(const ObjCInterfaceDecl *D) {
1582   NodeDumper.dumpName(D);
1583   dumpObjCTypeParamList(D->getTypeParamListAsWritten());
1584   NodeDumper.dumpDeclRef(D->getSuperClass(), "super");
1585 
1586   NodeDumper.dumpDeclRef(D->getImplementation());
1587   for (auto *Child : D->protocols())
1588     NodeDumper.dumpDeclRef(Child);
1589 }
1590 
1591 void ASTDumper::VisitObjCImplementationDecl(const ObjCImplementationDecl *D) {
1592   NodeDumper.dumpName(D);
1593   NodeDumper.dumpDeclRef(D->getSuperClass(), "super");
1594   NodeDumper.dumpDeclRef(D->getClassInterface());
1595   for (ObjCImplementationDecl::init_const_iterator I = D->init_begin(),
1596                                                    E = D->init_end();
1597        I != E; ++I)
1598     dumpCXXCtorInitializer(*I);
1599 }
1600 
1601 void ASTDumper::VisitObjCCompatibleAliasDecl(const ObjCCompatibleAliasDecl *D) {
1602   NodeDumper.dumpName(D);
1603   NodeDumper.dumpDeclRef(D->getClassInterface());
1604 }
1605 
1606 void ASTDumper::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) {
1607   NodeDumper.dumpName(D);
1608   NodeDumper.dumpType(D->getType());
1609 
1610   if (D->getPropertyImplementation() == ObjCPropertyDecl::Required)
1611     OS << " required";
1612   else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
1613     OS << " optional";
1614 
1615   ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes();
1616   if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) {
1617     if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly)
1618       OS << " readonly";
1619     if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
1620       OS << " assign";
1621     if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite)
1622       OS << " readwrite";
1623     if (Attrs & ObjCPropertyDecl::OBJC_PR_retain)
1624       OS << " retain";
1625     if (Attrs & ObjCPropertyDecl::OBJC_PR_copy)
1626       OS << " copy";
1627     if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic)
1628       OS << " nonatomic";
1629     if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic)
1630       OS << " atomic";
1631     if (Attrs & ObjCPropertyDecl::OBJC_PR_weak)
1632       OS << " weak";
1633     if (Attrs & ObjCPropertyDecl::OBJC_PR_strong)
1634       OS << " strong";
1635     if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained)
1636       OS << " unsafe_unretained";
1637     if (Attrs & ObjCPropertyDecl::OBJC_PR_class)
1638       OS << " class";
1639     if (Attrs & ObjCPropertyDecl::OBJC_PR_getter)
1640       NodeDumper.dumpDeclRef(D->getGetterMethodDecl(), "getter");
1641     if (Attrs & ObjCPropertyDecl::OBJC_PR_setter)
1642       NodeDumper.dumpDeclRef(D->getSetterMethodDecl(), "setter");
1643   }
1644 }
1645 
1646 void ASTDumper::VisitObjCPropertyImplDecl(const ObjCPropertyImplDecl *D) {
1647   NodeDumper.dumpName(D->getPropertyDecl());
1648   if (D->getPropertyImplementation() == ObjCPropertyImplDecl::Synthesize)
1649     OS << " synthesize";
1650   else
1651     OS << " dynamic";
1652   NodeDumper.dumpDeclRef(D->getPropertyDecl());
1653   NodeDumper.dumpDeclRef(D->getPropertyIvarDecl());
1654 }
1655 
1656 void ASTDumper::VisitBlockDecl(const BlockDecl *D) {
1657   for (auto I : D->parameters())
1658     dumpDecl(I);
1659 
1660   if (D->isVariadic())
1661     dumpChild([=]{ OS << "..."; });
1662 
1663   if (D->capturesCXXThis())
1664     dumpChild([=]{ OS << "capture this"; });
1665 
1666   for (const auto &I : D->captures()) {
1667     dumpChild([=] {
1668       OS << "capture";
1669       if (I.isByRef())
1670         OS << " byref";
1671       if (I.isNested())
1672         OS << " nested";
1673       if (I.getVariable()) {
1674         OS << ' ';
1675         NodeDumper.dumpBareDeclRef(I.getVariable());
1676       }
1677       if (I.hasCopyExpr())
1678         dumpStmt(I.getCopyExpr());
1679     });
1680   }
1681   dumpStmt(D->getBody());
1682 }
1683 
1684 //===----------------------------------------------------------------------===//
1685 //  Stmt dumping methods.
1686 //===----------------------------------------------------------------------===//
1687 
1688 void ASTDumper::dumpStmt(const Stmt *S) {
1689   dumpChild([=] {
1690     if (!S) {
1691       ColorScope Color(OS, ShowColors, NullColor);
1692       OS << "<<<NULL>>>";
1693       return;
1694     }
1695     {
1696       ColorScope Color(OS, ShowColors, StmtColor);
1697       OS << S->getStmtClassName();
1698     }
1699     NodeDumper.dumpPointer(S);
1700     NodeDumper.dumpSourceRange(S->getSourceRange());
1701 
1702     if (const auto *E = dyn_cast<Expr>(S)) {
1703       NodeDumper.dumpType(E->getType());
1704 
1705       {
1706         ColorScope Color(OS, ShowColors, ValueKindColor);
1707         switch (E->getValueKind()) {
1708         case VK_RValue:
1709           break;
1710         case VK_LValue:
1711           OS << " lvalue";
1712           break;
1713         case VK_XValue:
1714           OS << " xvalue";
1715           break;
1716         }
1717       }
1718 
1719       {
1720         ColorScope Color(OS, ShowColors, ObjectKindColor);
1721         switch (E->getObjectKind()) {
1722         case OK_Ordinary:
1723           break;
1724         case OK_BitField:
1725           OS << " bitfield";
1726           break;
1727         case OK_ObjCProperty:
1728           OS << " objcproperty";
1729           break;
1730         case OK_ObjCSubscript:
1731           OS << " objcsubscript";
1732           break;
1733         case OK_VectorComponent:
1734           OS << " vectorcomponent";
1735           break;
1736         }
1737       }
1738     }
1739 
1740     ConstStmtVisitor<ASTDumper>::Visit(S);
1741 
1742     // Some statements have custom mechanisms for dumping their children.
1743     if (isa<DeclStmt>(S) || isa<GenericSelectionExpr>(S)) {
1744       return;
1745     }
1746 
1747     for (const Stmt *SubStmt : S->children())
1748       dumpStmt(SubStmt);
1749   });
1750 }
1751 
1752 void ASTDumper::VisitDeclStmt(const DeclStmt *Node) {
1753   for (DeclStmt::const_decl_iterator I = Node->decl_begin(),
1754                                      E = Node->decl_end();
1755        I != E; ++I)
1756     dumpDecl(*I);
1757 }
1758 
1759 void ASTDumper::VisitAttributedStmt(const AttributedStmt *Node) {
1760   for (ArrayRef<const Attr *>::iterator I = Node->getAttrs().begin(),
1761                                         E = Node->getAttrs().end();
1762        I != E; ++I)
1763     dumpAttr(*I);
1764 }
1765 
1766 void ASTDumper::VisitIfStmt(const IfStmt *Node) {
1767   if (Node->hasInitStorage())
1768     OS << " has_init";
1769   if (Node->hasVarStorage())
1770     OS << " has_var";
1771   if (Node->hasElseStorage())
1772     OS << " has_else";
1773 }
1774 
1775 void ASTDumper::VisitSwitchStmt(const SwitchStmt *Node) {
1776   if (Node->hasInitStorage())
1777     OS << " has_init";
1778   if (Node->hasVarStorage())
1779     OS << " has_var";
1780 }
1781 
1782 void ASTDumper::VisitWhileStmt(const WhileStmt *Node) {
1783   if (Node->hasVarStorage())
1784     OS << " has_var";
1785 }
1786 
1787 void ASTDumper::VisitLabelStmt(const LabelStmt *Node) {
1788   OS << " '" << Node->getName() << "'";
1789 }
1790 
1791 void ASTDumper::VisitGotoStmt(const GotoStmt *Node) {
1792   OS << " '" << Node->getLabel()->getName() << "'";
1793   NodeDumper.dumpPointer(Node->getLabel());
1794 }
1795 
1796 void ASTDumper::VisitCXXCatchStmt(const CXXCatchStmt *Node) {
1797   dumpDecl(Node->getExceptionDecl());
1798 }
1799 
1800 void ASTDumper::VisitCaseStmt(const CaseStmt *Node) {
1801   if (Node->caseStmtIsGNURange())
1802     OS << " gnu_range";
1803 }
1804 
1805 void ASTDumper::VisitCapturedStmt(const CapturedStmt *Node) {
1806   dumpDecl(Node->getCapturedDecl());
1807 }
1808 
1809 //===----------------------------------------------------------------------===//
1810 //  OpenMP dumping methods.
1811 //===----------------------------------------------------------------------===//
1812 
1813 void ASTDumper::VisitOMPExecutableDirective(
1814     const OMPExecutableDirective *Node) {
1815   for (auto *C : Node->clauses()) {
1816     dumpChild([=] {
1817       if (!C) {
1818         ColorScope Color(OS, ShowColors, NullColor);
1819         OS << "<<<NULL>>> OMPClause";
1820         return;
1821       }
1822       {
1823         ColorScope Color(OS, ShowColors, AttrColor);
1824         StringRef ClauseName(getOpenMPClauseName(C->getClauseKind()));
1825         OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
1826            << ClauseName.drop_front() << "Clause";
1827       }
1828       NodeDumper.dumpPointer(C);
1829       NodeDumper.dumpSourceRange(SourceRange(C->getBeginLoc(), C->getEndLoc()));
1830       if (C->isImplicit())
1831         OS << " <implicit>";
1832       for (auto *S : C->children())
1833         dumpStmt(S);
1834     });
1835   }
1836 }
1837 
1838 //===----------------------------------------------------------------------===//
1839 //  Expr dumping methods.
1840 //===----------------------------------------------------------------------===//
1841 
1842 static void dumpBasePath(raw_ostream &OS, const CastExpr *Node) {
1843   if (Node->path_empty())
1844     return;
1845 
1846   OS << " (";
1847   bool First = true;
1848   for (CastExpr::path_const_iterator I = Node->path_begin(),
1849                                      E = Node->path_end();
1850        I != E; ++I) {
1851     const CXXBaseSpecifier *Base = *I;
1852     if (!First)
1853       OS << " -> ";
1854 
1855     const CXXRecordDecl *RD =
1856     cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
1857 
1858     if (Base->isVirtual())
1859       OS << "virtual ";
1860     OS << RD->getName();
1861     First = false;
1862   }
1863 
1864   OS << ')';
1865 }
1866 
1867 void ASTDumper::VisitCallExpr(const CallExpr *Node) {
1868   if (Node->usesADL())
1869     OS << " adl";
1870 }
1871 
1872 void ASTDumper::VisitCastExpr(const CastExpr *Node) {
1873   OS << " <";
1874   {
1875     ColorScope Color(OS, ShowColors, CastColor);
1876     OS << Node->getCastKindName();
1877   }
1878   dumpBasePath(OS, Node);
1879   OS << ">";
1880 }
1881 
1882 void ASTDumper::VisitImplicitCastExpr(const ImplicitCastExpr *Node) {
1883   VisitCastExpr(Node);
1884   if (Node->isPartOfExplicitCast())
1885     OS << " part_of_explicit_cast";
1886 }
1887 
1888 void ASTDumper::VisitDeclRefExpr(const DeclRefExpr *Node) {
1889   OS << " ";
1890   NodeDumper.dumpBareDeclRef(Node->getDecl());
1891   if (Node->getDecl() != Node->getFoundDecl()) {
1892     OS << " (";
1893     NodeDumper.dumpBareDeclRef(Node->getFoundDecl());
1894     OS << ")";
1895   }
1896 }
1897 
1898 void ASTDumper::VisitUnresolvedLookupExpr(const UnresolvedLookupExpr *Node) {
1899   OS << " (";
1900   if (!Node->requiresADL())
1901     OS << "no ";
1902   OS << "ADL) = '" << Node->getName() << '\'';
1903 
1904   UnresolvedLookupExpr::decls_iterator
1905     I = Node->decls_begin(), E = Node->decls_end();
1906   if (I == E)
1907     OS << " empty";
1908   for (; I != E; ++I)
1909     NodeDumper.dumpPointer(*I);
1910 }
1911 
1912 void ASTDumper::VisitObjCIvarRefExpr(const ObjCIvarRefExpr *Node) {
1913   {
1914     ColorScope Color(OS, ShowColors, DeclKindNameColor);
1915     OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
1916   }
1917   OS << "='" << *Node->getDecl() << "'";
1918   NodeDumper.dumpPointer(Node->getDecl());
1919   if (Node->isFreeIvar())
1920     OS << " isFreeIvar";
1921 }
1922 
1923 void ASTDumper::VisitPredefinedExpr(const PredefinedExpr *Node) {
1924   OS << " " << PredefinedExpr::getIdentKindName(Node->getIdentKind());
1925 }
1926 
1927 void ASTDumper::VisitCharacterLiteral(const CharacterLiteral *Node) {
1928   ColorScope Color(OS, ShowColors, ValueColor);
1929   OS << " " << Node->getValue();
1930 }
1931 
1932 void ASTDumper::VisitIntegerLiteral(const IntegerLiteral *Node) {
1933   bool isSigned = Node->getType()->isSignedIntegerType();
1934   ColorScope Color(OS, ShowColors, ValueColor);
1935   OS << " " << Node->getValue().toString(10, isSigned);
1936 }
1937 
1938 void ASTDumper::VisitFixedPointLiteral(const FixedPointLiteral *Node) {
1939   ColorScope Color(OS, ShowColors, ValueColor);
1940   OS << " " << Node->getValueAsString(/*Radix=*/10);
1941 }
1942 
1943 void ASTDumper::VisitFloatingLiteral(const FloatingLiteral *Node) {
1944   ColorScope Color(OS, ShowColors, ValueColor);
1945   OS << " " << Node->getValueAsApproximateDouble();
1946 }
1947 
1948 void ASTDumper::VisitStringLiteral(const StringLiteral *Str) {
1949   ColorScope Color(OS, ShowColors, ValueColor);
1950   OS << " ";
1951   Str->outputString(OS);
1952 }
1953 
1954 void ASTDumper::VisitInitListExpr(const InitListExpr *ILE) {
1955   if (auto *Field = ILE->getInitializedFieldInUnion()) {
1956     OS << " field ";
1957     NodeDumper.dumpBareDeclRef(Field);
1958   }
1959   if (auto *Filler = ILE->getArrayFiller()) {
1960     dumpChild([=] {
1961       OS << "array filler";
1962       dumpStmt(Filler);
1963     });
1964   }
1965 }
1966 
1967 void ASTDumper::VisitUnaryOperator(const UnaryOperator *Node) {
1968   OS << " " << (Node->isPostfix() ? "postfix" : "prefix")
1969      << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
1970   if (!Node->canOverflow())
1971     OS << " cannot overflow";
1972 }
1973 
1974 void ASTDumper::VisitUnaryExprOrTypeTraitExpr(
1975     const UnaryExprOrTypeTraitExpr *Node) {
1976   switch(Node->getKind()) {
1977   case UETT_SizeOf:
1978     OS << " sizeof";
1979     break;
1980   case UETT_AlignOf:
1981     OS << " alignof";
1982     break;
1983   case UETT_VecStep:
1984     OS << " vec_step";
1985     break;
1986   case UETT_OpenMPRequiredSimdAlign:
1987     OS << " __builtin_omp_required_simd_align";
1988     break;
1989   case UETT_PreferredAlignOf:
1990     OS << " __alignof";
1991     break;
1992   }
1993   if (Node->isArgumentType())
1994     NodeDumper.dumpType(Node->getArgumentType());
1995 }
1996 
1997 void ASTDumper::VisitMemberExpr(const MemberExpr *Node) {
1998   OS << " " << (Node->isArrow() ? "->" : ".") << *Node->getMemberDecl();
1999   NodeDumper.dumpPointer(Node->getMemberDecl());
2000 }
2001 
2002 void ASTDumper::VisitExtVectorElementExpr(const ExtVectorElementExpr *Node) {
2003   OS << " " << Node->getAccessor().getNameStart();
2004 }
2005 
2006 void ASTDumper::VisitBinaryOperator(const BinaryOperator *Node) {
2007   OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
2008 }
2009 
2010 void ASTDumper::VisitCompoundAssignOperator(
2011     const CompoundAssignOperator *Node) {
2012   OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
2013      << "' ComputeLHSTy=";
2014   NodeDumper.dumpBareType(Node->getComputationLHSType());
2015   OS << " ComputeResultTy=";
2016   NodeDumper.dumpBareType(Node->getComputationResultType());
2017 }
2018 
2019 void ASTDumper::VisitBlockExpr(const BlockExpr *Node) {
2020   dumpDecl(Node->getBlockDecl());
2021 }
2022 
2023 void ASTDumper::VisitOpaqueValueExpr(const OpaqueValueExpr *Node) {
2024   if (Expr *Source = Node->getSourceExpr())
2025     dumpStmt(Source);
2026 }
2027 
2028 void ASTDumper::VisitGenericSelectionExpr(const GenericSelectionExpr *E) {
2029   if (E->isResultDependent())
2030     OS << " result_dependent";
2031   dumpStmt(E->getControllingExpr());
2032   dumpTypeAsChild(E->getControllingExpr()->getType()); // FIXME: remove
2033 
2034   for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
2035     dumpChild([=] {
2036       if (const TypeSourceInfo *TSI = E->getAssocTypeSourceInfo(I)) {
2037         OS << "case ";
2038         NodeDumper.dumpType(TSI->getType());
2039       } else {
2040         OS << "default";
2041       }
2042 
2043       if (!E->isResultDependent() && E->getResultIndex() == I)
2044         OS << " selected";
2045 
2046       if (const TypeSourceInfo *TSI = E->getAssocTypeSourceInfo(I))
2047         dumpTypeAsChild(TSI->getType());
2048       dumpStmt(E->getAssocExpr(I));
2049     });
2050   }
2051 }
2052 
2053 // GNU extensions.
2054 
2055 void ASTDumper::VisitAddrLabelExpr(const AddrLabelExpr *Node) {
2056   OS << " " << Node->getLabel()->getName();
2057   NodeDumper.dumpPointer(Node->getLabel());
2058 }
2059 
2060 //===----------------------------------------------------------------------===//
2061 // C++ Expressions
2062 //===----------------------------------------------------------------------===//
2063 
2064 void ASTDumper::VisitCXXNamedCastExpr(const CXXNamedCastExpr *Node) {
2065   OS << " " << Node->getCastName()
2066      << "<" << Node->getTypeAsWritten().getAsString() << ">"
2067      << " <" << Node->getCastKindName();
2068   dumpBasePath(OS, Node);
2069   OS << ">";
2070 }
2071 
2072 void ASTDumper::VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *Node) {
2073   OS << " " << (Node->getValue() ? "true" : "false");
2074 }
2075 
2076 void ASTDumper::VisitCXXThisExpr(const CXXThisExpr *Node) {
2077   OS << " this";
2078 }
2079 
2080 void ASTDumper::VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *Node) {
2081   OS << " functional cast to " << Node->getTypeAsWritten().getAsString()
2082      << " <" << Node->getCastKindName() << ">";
2083 }
2084 
2085 void ASTDumper::VisitCXXUnresolvedConstructExpr(
2086     const CXXUnresolvedConstructExpr *Node) {
2087   NodeDumper.dumpType(Node->getTypeAsWritten());
2088   if (Node->isListInitialization())
2089     OS << " list";
2090 }
2091 
2092 void ASTDumper::VisitCXXConstructExpr(const CXXConstructExpr *Node) {
2093   CXXConstructorDecl *Ctor = Node->getConstructor();
2094   NodeDumper.dumpType(Ctor->getType());
2095   if (Node->isElidable())
2096     OS << " elidable";
2097   if (Node->isListInitialization())
2098     OS << " list";
2099   if (Node->isStdInitListInitialization())
2100     OS << " std::initializer_list";
2101   if (Node->requiresZeroInitialization())
2102     OS << " zeroing";
2103 }
2104 
2105 void ASTDumper::VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *Node) {
2106   OS << " ";
2107   NodeDumper.dumpCXXTemporary(Node->getTemporary());
2108 }
2109 
2110 void ASTDumper::VisitCXXNewExpr(const CXXNewExpr *Node) {
2111   if (Node->isGlobalNew())
2112     OS << " global";
2113   if (Node->isArray())
2114     OS << " array";
2115   if (Node->getOperatorNew()) {
2116     OS << ' ';
2117     NodeDumper.dumpBareDeclRef(Node->getOperatorNew());
2118   }
2119   // We could dump the deallocation function used in case of error, but it's
2120   // usually not that interesting.
2121 }
2122 
2123 void ASTDumper::VisitCXXDeleteExpr(const CXXDeleteExpr *Node) {
2124   if (Node->isGlobalDelete())
2125     OS << " global";
2126   if (Node->isArrayForm())
2127     OS << " array";
2128   if (Node->getOperatorDelete()) {
2129     OS << ' ';
2130     NodeDumper.dumpBareDeclRef(Node->getOperatorDelete());
2131   }
2132 }
2133 
2134 void
2135 ASTDumper::VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Node) {
2136   if (const ValueDecl *VD = Node->getExtendingDecl()) {
2137     OS << " extended by ";
2138     NodeDumper.dumpBareDeclRef(VD);
2139   }
2140 }
2141 
2142 void ASTDumper::VisitExprWithCleanups(const ExprWithCleanups *Node) {
2143   for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i)
2144     NodeDumper.dumpDeclRef(Node->getObject(i), "cleanup");
2145 }
2146 
2147 void ASTDumper::VisitSizeOfPackExpr(const SizeOfPackExpr *Node) {
2148   NodeDumper.dumpPointer(Node->getPack());
2149   NodeDumper.dumpName(Node->getPack());
2150   if (Node->isPartiallySubstituted())
2151     for (const auto &A : Node->getPartialArguments())
2152       dumpTemplateArgument(A);
2153 }
2154 
2155 void ASTDumper::VisitCXXDependentScopeMemberExpr(
2156     const CXXDependentScopeMemberExpr *Node) {
2157   OS << " " << (Node->isArrow() ? "->" : ".") << Node->getMember();
2158 }
2159 
2160 //===----------------------------------------------------------------------===//
2161 // Obj-C Expressions
2162 //===----------------------------------------------------------------------===//
2163 
2164 void ASTDumper::VisitObjCMessageExpr(const ObjCMessageExpr *Node) {
2165   OS << " selector=";
2166   Node->getSelector().print(OS);
2167   switch (Node->getReceiverKind()) {
2168   case ObjCMessageExpr::Instance:
2169     break;
2170 
2171   case ObjCMessageExpr::Class:
2172     OS << " class=";
2173     NodeDumper.dumpBareType(Node->getClassReceiver());
2174     break;
2175 
2176   case ObjCMessageExpr::SuperInstance:
2177     OS << " super (instance)";
2178     break;
2179 
2180   case ObjCMessageExpr::SuperClass:
2181     OS << " super (class)";
2182     break;
2183   }
2184 }
2185 
2186 void ASTDumper::VisitObjCBoxedExpr(const ObjCBoxedExpr *Node) {
2187   if (auto *BoxingMethod = Node->getBoxingMethod()) {
2188     OS << " selector=";
2189     BoxingMethod->getSelector().print(OS);
2190   }
2191 }
2192 
2193 void ASTDumper::VisitObjCAtCatchStmt(const ObjCAtCatchStmt *Node) {
2194   if (const VarDecl *CatchParam = Node->getCatchParamDecl())
2195     dumpDecl(CatchParam);
2196   else
2197     OS << " catch all";
2198 }
2199 
2200 void ASTDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *Node) {
2201   NodeDumper.dumpType(Node->getEncodedType());
2202 }
2203 
2204 void ASTDumper::VisitObjCSelectorExpr(const ObjCSelectorExpr *Node) {
2205   OS << " ";
2206   Node->getSelector().print(OS);
2207 }
2208 
2209 void ASTDumper::VisitObjCProtocolExpr(const ObjCProtocolExpr *Node) {
2210   OS << ' ' << *Node->getProtocol();
2211 }
2212 
2213 void ASTDumper::VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr *Node) {
2214   if (Node->isImplicitProperty()) {
2215     OS << " Kind=MethodRef Getter=\"";
2216     if (Node->getImplicitPropertyGetter())
2217       Node->getImplicitPropertyGetter()->getSelector().print(OS);
2218     else
2219       OS << "(null)";
2220 
2221     OS << "\" Setter=\"";
2222     if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
2223       Setter->getSelector().print(OS);
2224     else
2225       OS << "(null)";
2226     OS << "\"";
2227   } else {
2228     OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"';
2229   }
2230 
2231   if (Node->isSuperReceiver())
2232     OS << " super";
2233 
2234   OS << " Messaging=";
2235   if (Node->isMessagingGetter() && Node->isMessagingSetter())
2236     OS << "Getter&Setter";
2237   else if (Node->isMessagingGetter())
2238     OS << "Getter";
2239   else if (Node->isMessagingSetter())
2240     OS << "Setter";
2241 }
2242 
2243 void ASTDumper::VisitObjCSubscriptRefExpr(const ObjCSubscriptRefExpr *Node) {
2244   if (Node->isArraySubscriptRefExpr())
2245     OS << " Kind=ArraySubscript GetterForArray=\"";
2246   else
2247     OS << " Kind=DictionarySubscript GetterForDictionary=\"";
2248   if (Node->getAtIndexMethodDecl())
2249     Node->getAtIndexMethodDecl()->getSelector().print(OS);
2250   else
2251     OS << "(null)";
2252 
2253   if (Node->isArraySubscriptRefExpr())
2254     OS << "\" SetterForArray=\"";
2255   else
2256     OS << "\" SetterForDictionary=\"";
2257   if (Node->setAtIndexMethodDecl())
2258     Node->setAtIndexMethodDecl()->getSelector().print(OS);
2259   else
2260     OS << "(null)";
2261 }
2262 
2263 void ASTDumper::VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *Node) {
2264   OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
2265 }
2266 
2267 //===----------------------------------------------------------------------===//
2268 // Comments
2269 //===----------------------------------------------------------------------===//
2270 
2271 void ASTDumper::dumpComment(const Comment *C, const FullComment *FC) {
2272   dumpChild([=] {
2273     NodeDumper.Visit(C, FC);
2274     if (!C) {
2275       return;
2276     }
2277     ConstCommentVisitor<ASTDumper, void, const FullComment *>::visit(C, FC);
2278     for (Comment::child_iterator I = C->child_begin(), E = C->child_end();
2279          I != E; ++I)
2280       dumpComment(*I, FC);
2281   });
2282 }
2283 
2284 //===----------------------------------------------------------------------===//
2285 // Type method implementations
2286 //===----------------------------------------------------------------------===//
2287 
2288 void QualType::dump(const char *msg) const {
2289   if (msg)
2290     llvm::errs() << msg << ": ";
2291   dump();
2292 }
2293 
2294 LLVM_DUMP_METHOD void QualType::dump() const { dump(llvm::errs()); }
2295 
2296 LLVM_DUMP_METHOD void QualType::dump(llvm::raw_ostream &OS) const {
2297   ASTDumper Dumper(OS, nullptr, nullptr);
2298   Dumper.dumpTypeAsChild(*this);
2299 }
2300 
2301 LLVM_DUMP_METHOD void Type::dump() const { dump(llvm::errs()); }
2302 
2303 LLVM_DUMP_METHOD void Type::dump(llvm::raw_ostream &OS) const {
2304   QualType(this, 0).dump(OS);
2305 }
2306 
2307 //===----------------------------------------------------------------------===//
2308 // Decl method implementations
2309 //===----------------------------------------------------------------------===//
2310 
2311 LLVM_DUMP_METHOD void Decl::dump() const { dump(llvm::errs()); }
2312 
2313 LLVM_DUMP_METHOD void Decl::dump(raw_ostream &OS, bool Deserialize) const {
2314   const ASTContext &Ctx = getASTContext();
2315   const SourceManager &SM = Ctx.getSourceManager();
2316   ASTDumper P(OS, &Ctx.getCommentCommandTraits(), &SM,
2317               SM.getDiagnostics().getShowColors(), Ctx.getPrintingPolicy());
2318   P.setDeserialize(Deserialize);
2319   P.dumpDecl(this);
2320 }
2321 
2322 LLVM_DUMP_METHOD void Decl::dumpColor() const {
2323   const ASTContext &Ctx = getASTContext();
2324   ASTDumper P(llvm::errs(), &Ctx.getCommentCommandTraits(),
2325               &Ctx.getSourceManager(), /*ShowColors*/ true,
2326               Ctx.getPrintingPolicy());
2327   P.dumpDecl(this);
2328 }
2329 
2330 LLVM_DUMP_METHOD void DeclContext::dumpLookups() const {
2331   dumpLookups(llvm::errs());
2332 }
2333 
2334 LLVM_DUMP_METHOD void DeclContext::dumpLookups(raw_ostream &OS,
2335                                                bool DumpDecls,
2336                                                bool Deserialize) const {
2337   const DeclContext *DC = this;
2338   while (!DC->isTranslationUnit())
2339     DC = DC->getParent();
2340   ASTContext &Ctx = cast<TranslationUnitDecl>(DC)->getASTContext();
2341   const SourceManager &SM = Ctx.getSourceManager();
2342   ASTDumper P(OS, &Ctx.getCommentCommandTraits(), &Ctx.getSourceManager(),
2343               SM.getDiagnostics().getShowColors(), Ctx.getPrintingPolicy());
2344   P.setDeserialize(Deserialize);
2345   P.dumpLookups(this, DumpDecls);
2346 }
2347 
2348 //===----------------------------------------------------------------------===//
2349 // Stmt method implementations
2350 //===----------------------------------------------------------------------===//
2351 
2352 LLVM_DUMP_METHOD void Stmt::dump(SourceManager &SM) const {
2353   dump(llvm::errs(), SM);
2354 }
2355 
2356 LLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS, SourceManager &SM) const {
2357   ASTDumper P(OS, nullptr, &SM);
2358   P.dumpStmt(this);
2359 }
2360 
2361 LLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS) const {
2362   ASTDumper P(OS, nullptr, nullptr);
2363   P.dumpStmt(this);
2364 }
2365 
2366 LLVM_DUMP_METHOD void Stmt::dump() const {
2367   ASTDumper P(llvm::errs(), nullptr, nullptr);
2368   P.dumpStmt(this);
2369 }
2370 
2371 LLVM_DUMP_METHOD void Stmt::dumpColor() const {
2372   ASTDumper P(llvm::errs(), nullptr, nullptr, /*ShowColors*/true);
2373   P.dumpStmt(this);
2374 }
2375 
2376 //===----------------------------------------------------------------------===//
2377 // Comment method implementations
2378 //===----------------------------------------------------------------------===//
2379 
2380 LLVM_DUMP_METHOD void Comment::dump() const {
2381   dump(llvm::errs(), nullptr, nullptr);
2382 }
2383 
2384 LLVM_DUMP_METHOD void Comment::dump(const ASTContext &Context) const {
2385   dump(llvm::errs(), &Context.getCommentCommandTraits(),
2386        &Context.getSourceManager());
2387 }
2388 
2389 void Comment::dump(raw_ostream &OS, const CommandTraits *Traits,
2390                    const SourceManager *SM) const {
2391   const FullComment *FC = dyn_cast<FullComment>(this);
2392   if (!FC)
2393     return;
2394   ASTDumper D(OS, Traits, SM);
2395   D.dumpComment(FC, FC);
2396 }
2397 
2398 LLVM_DUMP_METHOD void Comment::dumpColor() const {
2399   const FullComment *FC = dyn_cast<FullComment>(this);
2400   if (!FC)
2401     return;
2402   ASTDumper D(llvm::errs(), nullptr, nullptr, /*ShowColors*/true);
2403   D.dumpComment(FC, FC);
2404 }
2405