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

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- ASTDumper.cpp - Dumping implementation for ASTs ------------------===//
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 the AST dump methods, which dump out the
anatofuz
parents:
diff changeset
10 // AST in a form that exposes type details and other fields.
anatofuz
parents:
diff changeset
11 //
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 #include "clang/AST/ASTDumper.h"
anatofuz
parents:
diff changeset
15 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
16 #include "clang/AST/DeclLookups.h"
anatofuz
parents:
diff changeset
17 #include "clang/AST/JSONNodeDumper.h"
anatofuz
parents:
diff changeset
18 #include "clang/Basic/Builtins.h"
anatofuz
parents:
diff changeset
19 #include "clang/Basic/Module.h"
anatofuz
parents:
diff changeset
20 #include "clang/Basic/SourceManager.h"
anatofuz
parents:
diff changeset
21 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
22 using namespace clang;
anatofuz
parents:
diff changeset
23 using namespace clang::comments;
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 void ASTDumper::dumpLookups(const DeclContext *DC, bool DumpDecls) {
anatofuz
parents:
diff changeset
26 NodeDumper.AddChild([=] {
anatofuz
parents:
diff changeset
27 OS << "StoredDeclsMap ";
anatofuz
parents:
diff changeset
28 NodeDumper.dumpBareDeclRef(cast<Decl>(DC));
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 const DeclContext *Primary = DC->getPrimaryContext();
anatofuz
parents:
diff changeset
31 if (Primary != DC) {
anatofuz
parents:
diff changeset
32 OS << " primary";
anatofuz
parents:
diff changeset
33 NodeDumper.dumpPointer(cast<Decl>(Primary));
anatofuz
parents:
diff changeset
34 }
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 bool HasUndeserializedLookups = Primary->hasExternalVisibleStorage();
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 auto Range = getDeserialize()
anatofuz
parents:
diff changeset
39 ? Primary->lookups()
anatofuz
parents:
diff changeset
40 : Primary->noload_lookups(/*PreserveInternalState=*/true);
anatofuz
parents:
diff changeset
41 for (auto I = Range.begin(), E = Range.end(); I != E; ++I) {
anatofuz
parents:
diff changeset
42 DeclarationName Name = I.getLookupName();
anatofuz
parents:
diff changeset
43 DeclContextLookupResult R = *I;
anatofuz
parents:
diff changeset
44
anatofuz
parents:
diff changeset
45 NodeDumper.AddChild([=] {
anatofuz
parents:
diff changeset
46 OS << "DeclarationName ";
anatofuz
parents:
diff changeset
47 {
anatofuz
parents:
diff changeset
48 ColorScope Color(OS, ShowColors, DeclNameColor);
anatofuz
parents:
diff changeset
49 OS << '\'' << Name << '\'';
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 for (DeclContextLookupResult::iterator RI = R.begin(), RE = R.end();
anatofuz
parents:
diff changeset
53 RI != RE; ++RI) {
anatofuz
parents:
diff changeset
54 NodeDumper.AddChild([=] {
anatofuz
parents:
diff changeset
55 NodeDumper.dumpBareDeclRef(*RI);
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 if ((*RI)->isHidden())
anatofuz
parents:
diff changeset
58 OS << " hidden";
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 // If requested, dump the redecl chain for this lookup.
anatofuz
parents:
diff changeset
61 if (DumpDecls) {
anatofuz
parents:
diff changeset
62 // Dump earliest decl first.
anatofuz
parents:
diff changeset
63 std::function<void(Decl *)> DumpWithPrev = [&](Decl *D) {
anatofuz
parents:
diff changeset
64 if (Decl *Prev = D->getPreviousDecl())
anatofuz
parents:
diff changeset
65 DumpWithPrev(Prev);
anatofuz
parents:
diff changeset
66 Visit(D);
anatofuz
parents:
diff changeset
67 };
anatofuz
parents:
diff changeset
68 DumpWithPrev(*RI);
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70 });
anatofuz
parents:
diff changeset
71 }
anatofuz
parents:
diff changeset
72 });
anatofuz
parents:
diff changeset
73 }
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 if (HasUndeserializedLookups) {
anatofuz
parents:
diff changeset
76 NodeDumper.AddChild([=] {
anatofuz
parents:
diff changeset
77 ColorScope Color(OS, ShowColors, UndeserializedColor);
anatofuz
parents:
diff changeset
78 OS << "<undeserialized lookups>";
anatofuz
parents:
diff changeset
79 });
anatofuz
parents:
diff changeset
80 }
anatofuz
parents:
diff changeset
81 });
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 template <typename SpecializationDecl>
anatofuz
parents:
diff changeset
85 void ASTDumper::dumpTemplateDeclSpecialization(const SpecializationDecl *D,
anatofuz
parents:
diff changeset
86 bool DumpExplicitInst,
anatofuz
parents:
diff changeset
87 bool DumpRefOnly) {
anatofuz
parents:
diff changeset
88 bool DumpedAny = false;
anatofuz
parents:
diff changeset
89 for (const auto *RedeclWithBadType : D->redecls()) {
anatofuz
parents:
diff changeset
90 // FIXME: The redecls() range sometimes has elements of a less-specific
anatofuz
parents:
diff changeset
91 // type. (In particular, ClassTemplateSpecializationDecl::redecls() gives
anatofuz
parents:
diff changeset
92 // us TagDecls, and should give CXXRecordDecls).
anatofuz
parents:
diff changeset
93 auto *Redecl = dyn_cast<SpecializationDecl>(RedeclWithBadType);
anatofuz
parents:
diff changeset
94 if (!Redecl) {
anatofuz
parents:
diff changeset
95 // Found the injected-class-name for a class template. This will be dumped
anatofuz
parents:
diff changeset
96 // as part of its surrounding class so we don't need to dump it here.
anatofuz
parents:
diff changeset
97 assert(isa<CXXRecordDecl>(RedeclWithBadType) &&
anatofuz
parents:
diff changeset
98 "expected an injected-class-name");
anatofuz
parents:
diff changeset
99 continue;
anatofuz
parents:
diff changeset
100 }
anatofuz
parents:
diff changeset
101
anatofuz
parents:
diff changeset
102 switch (Redecl->getTemplateSpecializationKind()) {
anatofuz
parents:
diff changeset
103 case TSK_ExplicitInstantiationDeclaration:
anatofuz
parents:
diff changeset
104 case TSK_ExplicitInstantiationDefinition:
anatofuz
parents:
diff changeset
105 if (!DumpExplicitInst)
anatofuz
parents:
diff changeset
106 break;
anatofuz
parents:
diff changeset
107 LLVM_FALLTHROUGH;
anatofuz
parents:
diff changeset
108 case TSK_Undeclared:
anatofuz
parents:
diff changeset
109 case TSK_ImplicitInstantiation:
anatofuz
parents:
diff changeset
110 if (DumpRefOnly)
anatofuz
parents:
diff changeset
111 NodeDumper.dumpDeclRef(Redecl);
anatofuz
parents:
diff changeset
112 else
anatofuz
parents:
diff changeset
113 Visit(Redecl);
anatofuz
parents:
diff changeset
114 DumpedAny = true;
anatofuz
parents:
diff changeset
115 break;
anatofuz
parents:
diff changeset
116 case TSK_ExplicitSpecialization:
anatofuz
parents:
diff changeset
117 break;
anatofuz
parents:
diff changeset
118 }
anatofuz
parents:
diff changeset
119 }
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 // Ensure we dump at least one decl for each specialization.
anatofuz
parents:
diff changeset
122 if (!DumpedAny)
anatofuz
parents:
diff changeset
123 NodeDumper.dumpDeclRef(D);
anatofuz
parents:
diff changeset
124 }
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 template <typename TemplateDecl>
anatofuz
parents:
diff changeset
127 void ASTDumper::dumpTemplateDecl(const TemplateDecl *D, bool DumpExplicitInst) {
anatofuz
parents:
diff changeset
128 dumpTemplateParameters(D->getTemplateParameters());
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 Visit(D->getTemplatedDecl());
anatofuz
parents:
diff changeset
131
anatofuz
parents:
diff changeset
132 for (const auto *Child : D->specializations())
anatofuz
parents:
diff changeset
133 dumpTemplateDeclSpecialization(Child, DumpExplicitInst,
anatofuz
parents:
diff changeset
134 !D->isCanonicalDecl());
anatofuz
parents:
diff changeset
135 }
anatofuz
parents:
diff changeset
136
anatofuz
parents:
diff changeset
137 void ASTDumper::VisitFunctionTemplateDecl(const FunctionTemplateDecl *D) {
anatofuz
parents:
diff changeset
138 // FIXME: We don't add a declaration of a function template specialization
anatofuz
parents:
diff changeset
139 // to its context when it's explicitly instantiated, so dump explicit
anatofuz
parents:
diff changeset
140 // instantiations when we dump the template itself.
anatofuz
parents:
diff changeset
141 dumpTemplateDecl(D, true);
anatofuz
parents:
diff changeset
142 }
anatofuz
parents:
diff changeset
143
anatofuz
parents:
diff changeset
144 void ASTDumper::VisitClassTemplateDecl(const ClassTemplateDecl *D) {
anatofuz
parents:
diff changeset
145 dumpTemplateDecl(D, false);
anatofuz
parents:
diff changeset
146 }
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 void ASTDumper::VisitVarTemplateDecl(const VarTemplateDecl *D) {
anatofuz
parents:
diff changeset
149 dumpTemplateDecl(D, false);
anatofuz
parents:
diff changeset
150 }
anatofuz
parents:
diff changeset
151
anatofuz
parents:
diff changeset
152 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
153 // Type method implementations
anatofuz
parents:
diff changeset
154 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
155
anatofuz
parents:
diff changeset
156 void QualType::dump(const char *msg) const {
anatofuz
parents:
diff changeset
157 if (msg)
anatofuz
parents:
diff changeset
158 llvm::errs() << msg << ": ";
anatofuz
parents:
diff changeset
159 dump();
anatofuz
parents:
diff changeset
160 }
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 LLVM_DUMP_METHOD void QualType::dump() const { dump(llvm::errs()); }
anatofuz
parents:
diff changeset
163
anatofuz
parents:
diff changeset
164 LLVM_DUMP_METHOD void QualType::dump(llvm::raw_ostream &OS) const {
anatofuz
parents:
diff changeset
165 ASTDumper Dumper(OS, nullptr, nullptr);
anatofuz
parents:
diff changeset
166 Dumper.Visit(*this);
anatofuz
parents:
diff changeset
167 }
anatofuz
parents:
diff changeset
168
anatofuz
parents:
diff changeset
169 LLVM_DUMP_METHOD void Type::dump() const { dump(llvm::errs()); }
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 LLVM_DUMP_METHOD void Type::dump(llvm::raw_ostream &OS) const {
anatofuz
parents:
diff changeset
172 QualType(this, 0).dump(OS);
anatofuz
parents:
diff changeset
173 }
anatofuz
parents:
diff changeset
174
anatofuz
parents:
diff changeset
175 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
176 // Decl method implementations
anatofuz
parents:
diff changeset
177 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 LLVM_DUMP_METHOD void Decl::dump() const { dump(llvm::errs()); }
anatofuz
parents:
diff changeset
180
anatofuz
parents:
diff changeset
181 LLVM_DUMP_METHOD void Decl::dump(raw_ostream &OS, bool Deserialize,
anatofuz
parents:
diff changeset
182 ASTDumpOutputFormat Format) const {
anatofuz
parents:
diff changeset
183 ASTContext &Ctx = getASTContext();
anatofuz
parents:
diff changeset
184 const SourceManager &SM = Ctx.getSourceManager();
anatofuz
parents:
diff changeset
185
anatofuz
parents:
diff changeset
186 if (ADOF_JSON == Format) {
anatofuz
parents:
diff changeset
187 JSONDumper P(OS, SM, Ctx, Ctx.getPrintingPolicy(),
anatofuz
parents:
diff changeset
188 &Ctx.getCommentCommandTraits());
anatofuz
parents:
diff changeset
189 (void)Deserialize; // FIXME?
anatofuz
parents:
diff changeset
190 P.Visit(this);
anatofuz
parents:
diff changeset
191 } else {
anatofuz
parents:
diff changeset
192 ASTDumper P(OS, &Ctx.getCommentCommandTraits(), &SM,
anatofuz
parents:
diff changeset
193 SM.getDiagnostics().getShowColors(), Ctx.getPrintingPolicy());
anatofuz
parents:
diff changeset
194 P.setDeserialize(Deserialize);
anatofuz
parents:
diff changeset
195 P.Visit(this);
anatofuz
parents:
diff changeset
196 }
anatofuz
parents:
diff changeset
197 }
anatofuz
parents:
diff changeset
198
anatofuz
parents:
diff changeset
199 LLVM_DUMP_METHOD void Decl::dumpColor() const {
anatofuz
parents:
diff changeset
200 const ASTContext &Ctx = getASTContext();
anatofuz
parents:
diff changeset
201 ASTDumper P(llvm::errs(), &Ctx.getCommentCommandTraits(),
anatofuz
parents:
diff changeset
202 &Ctx.getSourceManager(), /*ShowColors*/ true,
anatofuz
parents:
diff changeset
203 Ctx.getPrintingPolicy());
anatofuz
parents:
diff changeset
204 P.Visit(this);
anatofuz
parents:
diff changeset
205 }
anatofuz
parents:
diff changeset
206
anatofuz
parents:
diff changeset
207 LLVM_DUMP_METHOD void DeclContext::dumpLookups() const {
anatofuz
parents:
diff changeset
208 dumpLookups(llvm::errs());
anatofuz
parents:
diff changeset
209 }
anatofuz
parents:
diff changeset
210
anatofuz
parents:
diff changeset
211 LLVM_DUMP_METHOD void DeclContext::dumpLookups(raw_ostream &OS,
anatofuz
parents:
diff changeset
212 bool DumpDecls,
anatofuz
parents:
diff changeset
213 bool Deserialize) const {
anatofuz
parents:
diff changeset
214 const DeclContext *DC = this;
anatofuz
parents:
diff changeset
215 while (!DC->isTranslationUnit())
anatofuz
parents:
diff changeset
216 DC = DC->getParent();
anatofuz
parents:
diff changeset
217 ASTContext &Ctx = cast<TranslationUnitDecl>(DC)->getASTContext();
anatofuz
parents:
diff changeset
218 const SourceManager &SM = Ctx.getSourceManager();
anatofuz
parents:
diff changeset
219 ASTDumper P(OS, &Ctx.getCommentCommandTraits(), &Ctx.getSourceManager(),
anatofuz
parents:
diff changeset
220 SM.getDiagnostics().getShowColors(), Ctx.getPrintingPolicy());
anatofuz
parents:
diff changeset
221 P.setDeserialize(Deserialize);
anatofuz
parents:
diff changeset
222 P.dumpLookups(this, DumpDecls);
anatofuz
parents:
diff changeset
223 }
anatofuz
parents:
diff changeset
224
anatofuz
parents:
diff changeset
225 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
226 // Stmt method implementations
anatofuz
parents:
diff changeset
227 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
228
anatofuz
parents:
diff changeset
229 LLVM_DUMP_METHOD void Stmt::dump(SourceManager &SM) const {
anatofuz
parents:
diff changeset
230 dump(llvm::errs(), SM);
anatofuz
parents:
diff changeset
231 }
anatofuz
parents:
diff changeset
232
anatofuz
parents:
diff changeset
233 LLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS, SourceManager &SM) const {
anatofuz
parents:
diff changeset
234 ASTDumper P(OS, nullptr, &SM);
anatofuz
parents:
diff changeset
235 P.Visit(this);
anatofuz
parents:
diff changeset
236 }
anatofuz
parents:
diff changeset
237
anatofuz
parents:
diff changeset
238 LLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS) const {
anatofuz
parents:
diff changeset
239 ASTDumper P(OS, nullptr, nullptr);
anatofuz
parents:
diff changeset
240 P.Visit(this);
anatofuz
parents:
diff changeset
241 }
anatofuz
parents:
diff changeset
242
anatofuz
parents:
diff changeset
243 LLVM_DUMP_METHOD void Stmt::dump() const {
anatofuz
parents:
diff changeset
244 ASTDumper P(llvm::errs(), nullptr, nullptr);
anatofuz
parents:
diff changeset
245 P.Visit(this);
anatofuz
parents:
diff changeset
246 }
anatofuz
parents:
diff changeset
247
anatofuz
parents:
diff changeset
248 LLVM_DUMP_METHOD void Stmt::dumpColor() const {
anatofuz
parents:
diff changeset
249 ASTDumper P(llvm::errs(), nullptr, nullptr, /*ShowColors*/true);
anatofuz
parents:
diff changeset
250 P.Visit(this);
anatofuz
parents:
diff changeset
251 }
anatofuz
parents:
diff changeset
252
anatofuz
parents:
diff changeset
253 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
254 // Comment method implementations
anatofuz
parents:
diff changeset
255 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
256
anatofuz
parents:
diff changeset
257 LLVM_DUMP_METHOD void Comment::dump() const {
anatofuz
parents:
diff changeset
258 dump(llvm::errs(), nullptr, nullptr);
anatofuz
parents:
diff changeset
259 }
anatofuz
parents:
diff changeset
260
anatofuz
parents:
diff changeset
261 LLVM_DUMP_METHOD void Comment::dump(const ASTContext &Context) const {
anatofuz
parents:
diff changeset
262 dump(llvm::errs(), &Context.getCommentCommandTraits(),
anatofuz
parents:
diff changeset
263 &Context.getSourceManager());
anatofuz
parents:
diff changeset
264 }
anatofuz
parents:
diff changeset
265
anatofuz
parents:
diff changeset
266 void Comment::dump(raw_ostream &OS, const CommandTraits *Traits,
anatofuz
parents:
diff changeset
267 const SourceManager *SM) const {
anatofuz
parents:
diff changeset
268 const FullComment *FC = dyn_cast<FullComment>(this);
anatofuz
parents:
diff changeset
269 if (!FC)
anatofuz
parents:
diff changeset
270 return;
anatofuz
parents:
diff changeset
271 ASTDumper D(OS, Traits, SM);
anatofuz
parents:
diff changeset
272 D.Visit(FC, FC);
anatofuz
parents:
diff changeset
273 }
anatofuz
parents:
diff changeset
274
anatofuz
parents:
diff changeset
275 LLVM_DUMP_METHOD void Comment::dumpColor() const {
anatofuz
parents:
diff changeset
276 const FullComment *FC = dyn_cast<FullComment>(this);
anatofuz
parents:
diff changeset
277 if (!FC)
anatofuz
parents:
diff changeset
278 return;
anatofuz
parents:
diff changeset
279 ASTDumper D(llvm::errs(), nullptr, nullptr, /*ShowColors*/true);
anatofuz
parents:
diff changeset
280 D.Visit(FC, FC);
anatofuz
parents:
diff changeset
281 }