14
14
//
15
15
// ===----------------------------------------------------------------------===//
16
16
17
+ #include " swift/AST/ASTDumper.h"
17
18
#include " swift/AST/ASTContext.h"
18
19
#include " swift/AST/ASTPrinter.h"
19
20
#include " swift/AST/ASTVisitor.h"
@@ -984,20 +985,21 @@ namespace {
984
985
protected:
985
986
PrintWriterBase &Writer;
986
987
public:
987
- bool ParseIfNeeded ;
988
+ ASTDumpMemberLoading MemberLoading ;
988
989
llvm::function_ref<Type(Expr *)> GetTypeOfExpr;
989
990
llvm::function_ref<Type(TypeRepr *)> GetTypeOfTypeRepr;
990
991
llvm::function_ref<Type(KeyPathExpr *E, unsigned index)>
991
992
GetTypeOfKeyPathComponent;
992
993
char quote = ' "' ;
993
994
994
995
explicit PrintBase (
995
- PrintWriterBase &writer, bool parseIfNeeded = false ,
996
+ PrintWriterBase &writer,
997
+ ASTDumpMemberLoading memberLoading = ASTDumpMemberLoading::None,
996
998
llvm::function_ref<Type(Expr *)> getTypeOfExpr = defaultGetTypeOfExpr,
997
999
llvm::function_ref<Type(TypeRepr *)> getTypeOfTypeRepr = nullptr,
998
1000
llvm::function_ref<Type(KeyPathExpr *E, unsigned index)>
999
1001
getTypeOfKeyPathComponent = defaultGetTypeOfKeyPathComponent)
1000
- : Writer(writer), ParseIfNeeded(parseIfNeeded ),
1002
+ : Writer(writer), MemberLoading(memberLoading ),
1001
1003
GetTypeOfExpr(getTypeOfExpr), GetTypeOfTypeRepr(getTypeOfTypeRepr),
1002
1004
GetTypeOfKeyPathComponent(getTypeOfKeyPathComponent) {}
1003
1005
@@ -2224,18 +2226,26 @@ namespace {
2224
2226
2225
2227
printAttributes (IDC->getDecl ());
2226
2228
2227
- if (Writer.isParsable ()) {
2228
- // Parsable outputs are meant to be used for semantic analysis, so we
2229
- // want the full list of members, including macro-generated ones.
2230
- printList (IDC->getAllMembers (), [&](Decl *D, Label label) {
2231
- printRec (D, label);
2232
- }, Label::optional (" members" ));
2233
- } else {
2234
- auto members = ParseIfNeeded ? IDC->getMembers ()
2235
- : IDC->getCurrentMembersWithoutLoading ();
2229
+ switch (MemberLoading) {
2230
+ case ASTDumpMemberLoading::None:
2231
+ case ASTDumpMemberLoading::Parsed: {
2232
+ auto members = (MemberLoading == ASTDumpMemberLoading::Parsed)
2233
+ ? IDC->getMembers ()
2234
+ : IDC->getCurrentMembersWithoutLoading ();
2236
2235
printList (members, [&](Decl *D, Label label) {
2237
2236
printRec (D, label);
2238
2237
}, Label::optional (" members" ));
2238
+ break ;
2239
+ }
2240
+
2241
+ case ASTDumpMemberLoading::TypeChecked:
2242
+ // This mode is used for semantic analysis, so we want the full list of
2243
+ // members, including macro-generated ones.
2244
+ printList (
2245
+ IDC->getAllMembers (),
2246
+ [&](Decl *D, Label label) { printRec (D, label); },
2247
+ Label::optional (" members" ));
2248
+ break ;
2239
2249
}
2240
2250
printFoot ();
2241
2251
}
@@ -2264,8 +2274,16 @@ namespace {
2264
2274
}, Label::always (" compiler_version" ));
2265
2275
}
2266
2276
2267
- auto items =
2268
- ParseIfNeeded ? SF.getTopLevelItems () : SF.getCachedTopLevelItems ();
2277
+ std::optional<std::vector<ASTNode>> items;
2278
+ switch (MemberLoading) {
2279
+ case ASTDumpMemberLoading::None:
2280
+ items = SF.getCachedTopLevelItems ();
2281
+ break ;
2282
+ case ASTDumpMemberLoading::Parsed:
2283
+ case ASTDumpMemberLoading::TypeChecked:
2284
+ items = SF.getTopLevelItems ();
2285
+ break ;
2286
+ }
2269
2287
if (items) {
2270
2288
printList (*items, [&](ASTNode item, Label label) {
2271
2289
if (item.isImplicit ())
@@ -2531,7 +2549,8 @@ namespace {
2531
2549
}, Label::optional (" foreign_error_convention" ));
2532
2550
}
2533
2551
2534
- auto canParse = ParseIfNeeded && !D->isBodySkipped ();
2552
+ auto canParse =
2553
+ (MemberLoading != ASTDumpMemberLoading::None) && !D->isBodySkipped ();
2535
2554
if (auto Body = D->getBody (canParse)) {
2536
2555
printRec (Body, &D->getASTContext (), Label::optional (" body" ));
2537
2556
}
@@ -2845,15 +2864,16 @@ void SourceFile::dump() const {
2845
2864
dump (llvm::errs ());
2846
2865
}
2847
2866
2848
- void SourceFile::dump (llvm::raw_ostream &OS, bool parseIfNeeded) const {
2867
+ void SourceFile::dump (llvm::raw_ostream &OS,
2868
+ ASTDumpMemberLoading memberLoading) const {
2849
2869
DefaultWriter writer (OS, /* indent*/ 0 );
2850
- PrintDecl (writer, parseIfNeeded ).visitSourceFile (*this );
2870
+ PrintDecl (writer, memberLoading ).visitSourceFile (*this );
2851
2871
llvm::errs () << ' \n ' ;
2852
2872
}
2853
2873
2854
2874
void SourceFile::dumpJSON (llvm::raw_ostream &OS) const {
2855
2875
JSONWriter writer (OS, /* indent*/ 0 );
2856
- PrintDecl (writer, /* parseIfNeeded */ true ).visitSourceFile (*this );
2876
+ PrintDecl (writer, ASTDumpMemberLoading::TypeChecked ).visitSourceFile (*this );
2857
2877
}
2858
2878
2859
2879
void Pattern::dump () const {
@@ -2880,12 +2900,12 @@ class PrintStmt : public StmtVisitor<PrintStmt, void, Label>,
2880
2900
2881
2901
PrintStmt (
2882
2902
PrintWriterBase &writer, const ASTContext *ctx,
2883
- bool parseIfNeeded = false ,
2903
+ ASTDumpMemberLoading memberLoading = ASTDumpMemberLoading::None ,
2884
2904
llvm::function_ref<Type(Expr *)> getTypeOfExpr = defaultGetTypeOfExpr,
2885
2905
llvm::function_ref<Type(TypeRepr *)> getTypeOfTypeRepr = nullptr ,
2886
2906
llvm::function_ref<Type(KeyPathExpr *E, unsigned index)>
2887
2907
getTypeOfKeyPathComponent = defaultGetTypeOfKeyPathComponent)
2888
- : PrintBase(writer, parseIfNeeded , getTypeOfExpr, getTypeOfTypeRepr,
2908
+ : PrintBase(writer, memberLoading , getTypeOfExpr, getTypeOfTypeRepr,
2889
2909
getTypeOfKeyPathComponent),
2890
2910
Ctx (ctx) {}
2891
2911
@@ -4328,7 +4348,7 @@ void Expr::dump(raw_ostream &OS, llvm::function_ref<Type(Expr *)> getTypeOfExpr,
4328
4348
getTypeOfKeyPathComponent,
4329
4349
unsigned Indent) const {
4330
4350
DefaultWriter writer (OS, Indent);
4331
- PrintExpr (writer, /* parseIfNeeded */ false , getTypeOfExpr,
4351
+ PrintExpr (writer, ASTDumpMemberLoading::None , getTypeOfExpr,
4332
4352
getTypeOfTypeRepr, getTypeOfKeyPathComponent)
4333
4353
.visit (const_cast <Expr *>(this ), Label::optional (" " ));
4334
4354
}
@@ -4652,12 +4672,12 @@ class PrintAttribute : public AttributeVisitor<PrintAttribute, void, Label>,
4652
4672
public:
4653
4673
PrintAttribute (
4654
4674
PrintWriterBase &writer, const ASTContext *ctx, DeclContext *dc,
4655
- bool parseIfNeeded = false ,
4675
+ ASTDumpMemberLoading memberLoading = ASTDumpMemberLoading::None ,
4656
4676
llvm::function_ref<Type(Expr *)> getTypeOfExpr = defaultGetTypeOfExpr,
4657
4677
llvm::function_ref<Type(TypeRepr *)> getTypeOfTypeRepr = nullptr ,
4658
4678
llvm::function_ref<Type(KeyPathExpr *E, unsigned index)>
4659
4679
getTypeOfKeyPathComponent = defaultGetTypeOfKeyPathComponent)
4660
- : PrintBase(writer, parseIfNeeded , getTypeOfExpr, getTypeOfTypeRepr,
4680
+ : PrintBase(writer, memberLoading , getTypeOfExpr, getTypeOfTypeRepr,
4661
4681
getTypeOfKeyPathComponent),
4662
4682
Ctx (ctx), DC(dc) {}
4663
4683
@@ -5224,7 +5244,7 @@ void PrintBase::printRec(Decl *D, Label label) {
5224
5244
printHead (" <null decl>" , DeclColor, label);
5225
5245
printFoot ();
5226
5246
} else {
5227
- PrintDecl (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
5247
+ PrintDecl (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
5228
5248
GetTypeOfKeyPathComponent)
5229
5249
.visit (D, label);
5230
5250
}
@@ -5236,7 +5256,7 @@ void PrintBase::printRec(Expr *E, Label label) {
5236
5256
printHead (" <null expr>" , ExprColor, label);
5237
5257
printFoot ();
5238
5258
} else {
5239
- PrintExpr (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
5259
+ PrintExpr (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
5240
5260
GetTypeOfKeyPathComponent)
5241
5261
.visit (E, label);
5242
5262
}
@@ -5248,8 +5268,8 @@ void PrintBase::printRec(Stmt *S, const ASTContext *Ctx, Label label) {
5248
5268
printHead (" <null stmt>" , ExprColor, label);
5249
5269
printFoot ();
5250
5270
} else {
5251
- PrintStmt (Writer, Ctx, ParseIfNeeded , GetTypeOfExpr,
5252
- GetTypeOfTypeRepr, GetTypeOfKeyPathComponent)
5271
+ PrintStmt (Writer, Ctx, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr ,
5272
+ GetTypeOfKeyPathComponent)
5253
5273
.visit (S, label);
5254
5274
}
5255
5275
}, label);
@@ -5260,7 +5280,7 @@ void PrintBase::printRec(TypeRepr *T, Label label) {
5260
5280
printHead (" <null typerepr>" , TypeReprColor, label);
5261
5281
printFoot ();
5262
5282
} else {
5263
- PrintTypeRepr (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
5283
+ PrintTypeRepr (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
5264
5284
GetTypeOfKeyPathComponent)
5265
5285
.visit (T, label);
5266
5286
}
@@ -5272,7 +5292,7 @@ void PrintBase::printRec(const Pattern *P, Label label) {
5272
5292
printHead (" <null pattern>" , PatternColor, label);
5273
5293
printFoot ();
5274
5294
} else {
5275
- PrintPattern (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
5295
+ PrintPattern (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
5276
5296
GetTypeOfKeyPathComponent)
5277
5297
.visit (const_cast <Pattern *>(P), label);
5278
5298
}
@@ -5286,7 +5306,7 @@ void PrintBase::printRec(const DeclAttribute *Attr, const ASTContext *Ctx,
5286
5306
printHead (" <null attribute>" , DeclAttributeColor, label);
5287
5307
printFoot ();
5288
5308
} else {
5289
- PrintAttribute (Writer, Ctx, DC, ParseIfNeeded , GetTypeOfExpr,
5309
+ PrintAttribute (Writer, Ctx, DC, MemberLoading , GetTypeOfExpr,
5290
5310
GetTypeOfTypeRepr, GetTypeOfKeyPathComponent)
5291
5311
.visit (const_cast <DeclAttribute *>(Attr), label);
5292
5312
}
@@ -6292,7 +6312,7 @@ namespace {
6292
6312
printHead (" <null type>" , DeclColor, label);
6293
6313
printFoot ();
6294
6314
} else {
6295
- PrintType (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
6315
+ PrintType (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
6296
6316
GetTypeOfKeyPathComponent)
6297
6317
.visit (type, label);
6298
6318
}
0 commit comments