1414//
1515// ===----------------------------------------------------------------------===//
1616
17+ #include " swift/AST/ASTDumper.h"
1718#include " swift/AST/ASTContext.h"
1819#include " swift/AST/ASTPrinter.h"
1920#include " swift/AST/ASTVisitor.h"
@@ -984,20 +985,21 @@ namespace {
984985 protected:
985986 PrintWriterBase &Writer;
986987 public:
987- bool ParseIfNeeded ;
988+ ASTDumpMemberLoading MemberLoading ;
988989 llvm::function_ref<Type(Expr *)> GetTypeOfExpr;
989990 llvm::function_ref<Type(TypeRepr *)> GetTypeOfTypeRepr;
990991 llvm::function_ref<Type(KeyPathExpr *E, unsigned index)>
991992 GetTypeOfKeyPathComponent;
992993 char quote = ' "' ;
993994
994995 explicit PrintBase (
995- PrintWriterBase &writer, bool parseIfNeeded = false ,
996+ PrintWriterBase &writer,
997+ ASTDumpMemberLoading memberLoading = ASTDumpMemberLoading::None,
996998 llvm::function_ref<Type(Expr *)> getTypeOfExpr = defaultGetTypeOfExpr,
997999 llvm::function_ref<Type(TypeRepr *)> getTypeOfTypeRepr = nullptr,
9981000 llvm::function_ref<Type(KeyPathExpr *E, unsigned index)>
9991001 getTypeOfKeyPathComponent = defaultGetTypeOfKeyPathComponent)
1000- : Writer(writer), ParseIfNeeded(parseIfNeeded ),
1002+ : Writer(writer), MemberLoading(memberLoading ),
10011003 GetTypeOfExpr(getTypeOfExpr), GetTypeOfTypeRepr(getTypeOfTypeRepr),
10021004 GetTypeOfKeyPathComponent(getTypeOfKeyPathComponent) {}
10031005
@@ -2224,18 +2226,26 @@ namespace {
22242226
22252227 printAttributes (IDC->getDecl ());
22262228
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 ();
22362235 printList (members, [&](Decl *D, Label label) {
22372236 printRec (D, label);
22382237 }, 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 ;
22392249 }
22402250 printFoot ();
22412251 }
@@ -2264,8 +2274,16 @@ namespace {
22642274 }, Label::always (" compiler_version" ));
22652275 }
22662276
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+ }
22692287 if (items) {
22702288 printList (*items, [&](ASTNode item, Label label) {
22712289 if (item.isImplicit ())
@@ -2531,7 +2549,8 @@ namespace {
25312549 }, Label::optional (" foreign_error_convention" ));
25322550 }
25332551
2534- auto canParse = ParseIfNeeded && !D->isBodySkipped ();
2552+ auto canParse =
2553+ (MemberLoading != ASTDumpMemberLoading::None) && !D->isBodySkipped ();
25352554 if (auto Body = D->getBody (canParse)) {
25362555 printRec (Body, &D->getASTContext (), Label::optional (" body" ));
25372556 }
@@ -2845,15 +2864,16 @@ void SourceFile::dump() const {
28452864 dump (llvm::errs ());
28462865}
28472866
2848- void SourceFile::dump (llvm::raw_ostream &OS, bool parseIfNeeded) const {
2867+ void SourceFile::dump (llvm::raw_ostream &OS,
2868+ ASTDumpMemberLoading memberLoading) const {
28492869 DefaultWriter writer (OS, /* indent*/ 0 );
2850- PrintDecl (writer, parseIfNeeded ).visitSourceFile (*this );
2870+ PrintDecl (writer, memberLoading ).visitSourceFile (*this );
28512871 llvm::errs () << ' \n ' ;
28522872}
28532873
28542874void SourceFile::dumpJSON (llvm::raw_ostream &OS) const {
28552875 JSONWriter writer (OS, /* indent*/ 0 );
2856- PrintDecl (writer, /* parseIfNeeded */ true ).visitSourceFile (*this );
2876+ PrintDecl (writer, ASTDumpMemberLoading::TypeChecked ).visitSourceFile (*this );
28572877}
28582878
28592879void Pattern::dump () const {
@@ -2880,12 +2900,12 @@ class PrintStmt : public StmtVisitor<PrintStmt, void, Label>,
28802900
28812901 PrintStmt (
28822902 PrintWriterBase &writer, const ASTContext *ctx,
2883- bool parseIfNeeded = false ,
2903+ ASTDumpMemberLoading memberLoading = ASTDumpMemberLoading::None ,
28842904 llvm::function_ref<Type(Expr *)> getTypeOfExpr = defaultGetTypeOfExpr,
28852905 llvm::function_ref<Type(TypeRepr *)> getTypeOfTypeRepr = nullptr ,
28862906 llvm::function_ref<Type(KeyPathExpr *E, unsigned index)>
28872907 getTypeOfKeyPathComponent = defaultGetTypeOfKeyPathComponent)
2888- : PrintBase(writer, parseIfNeeded , getTypeOfExpr, getTypeOfTypeRepr,
2908+ : PrintBase(writer, memberLoading , getTypeOfExpr, getTypeOfTypeRepr,
28892909 getTypeOfKeyPathComponent),
28902910 Ctx (ctx) {}
28912911
@@ -4328,7 +4348,7 @@ void Expr::dump(raw_ostream &OS, llvm::function_ref<Type(Expr *)> getTypeOfExpr,
43284348 getTypeOfKeyPathComponent,
43294349 unsigned Indent) const {
43304350 DefaultWriter writer (OS, Indent);
4331- PrintExpr (writer, /* parseIfNeeded */ false , getTypeOfExpr,
4351+ PrintExpr (writer, ASTDumpMemberLoading::None , getTypeOfExpr,
43324352 getTypeOfTypeRepr, getTypeOfKeyPathComponent)
43334353 .visit (const_cast <Expr *>(this ), Label::optional (" " ));
43344354}
@@ -4652,12 +4672,12 @@ class PrintAttribute : public AttributeVisitor<PrintAttribute, void, Label>,
46524672public:
46534673 PrintAttribute (
46544674 PrintWriterBase &writer, const ASTContext *ctx, DeclContext *dc,
4655- bool parseIfNeeded = false ,
4675+ ASTDumpMemberLoading memberLoading = ASTDumpMemberLoading::None ,
46564676 llvm::function_ref<Type(Expr *)> getTypeOfExpr = defaultGetTypeOfExpr,
46574677 llvm::function_ref<Type(TypeRepr *)> getTypeOfTypeRepr = nullptr ,
46584678 llvm::function_ref<Type(KeyPathExpr *E, unsigned index)>
46594679 getTypeOfKeyPathComponent = defaultGetTypeOfKeyPathComponent)
4660- : PrintBase(writer, parseIfNeeded , getTypeOfExpr, getTypeOfTypeRepr,
4680+ : PrintBase(writer, memberLoading , getTypeOfExpr, getTypeOfTypeRepr,
46614681 getTypeOfKeyPathComponent),
46624682 Ctx (ctx), DC(dc) {}
46634683
@@ -5224,7 +5244,7 @@ void PrintBase::printRec(Decl *D, Label label) {
52245244 printHead (" <null decl>" , DeclColor, label);
52255245 printFoot ();
52265246 } else {
5227- PrintDecl (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
5247+ PrintDecl (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
52285248 GetTypeOfKeyPathComponent)
52295249 .visit (D, label);
52305250 }
@@ -5236,7 +5256,7 @@ void PrintBase::printRec(Expr *E, Label label) {
52365256 printHead (" <null expr>" , ExprColor, label);
52375257 printFoot ();
52385258 } else {
5239- PrintExpr (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
5259+ PrintExpr (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
52405260 GetTypeOfKeyPathComponent)
52415261 .visit (E, label);
52425262 }
@@ -5248,8 +5268,8 @@ void PrintBase::printRec(Stmt *S, const ASTContext *Ctx, Label label) {
52485268 printHead (" <null stmt>" , ExprColor, label);
52495269 printFoot ();
52505270 } else {
5251- PrintStmt (Writer, Ctx, ParseIfNeeded , GetTypeOfExpr,
5252- GetTypeOfTypeRepr, GetTypeOfKeyPathComponent)
5271+ PrintStmt (Writer, Ctx, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr ,
5272+ GetTypeOfKeyPathComponent)
52535273 .visit (S, label);
52545274 }
52555275 }, label);
@@ -5260,7 +5280,7 @@ void PrintBase::printRec(TypeRepr *T, Label label) {
52605280 printHead (" <null typerepr>" , TypeReprColor, label);
52615281 printFoot ();
52625282 } else {
5263- PrintTypeRepr (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
5283+ PrintTypeRepr (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
52645284 GetTypeOfKeyPathComponent)
52655285 .visit (T, label);
52665286 }
@@ -5272,7 +5292,7 @@ void PrintBase::printRec(const Pattern *P, Label label) {
52725292 printHead (" <null pattern>" , PatternColor, label);
52735293 printFoot ();
52745294 } else {
5275- PrintPattern (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
5295+ PrintPattern (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
52765296 GetTypeOfKeyPathComponent)
52775297 .visit (const_cast <Pattern *>(P), label);
52785298 }
@@ -5286,7 +5306,7 @@ void PrintBase::printRec(const DeclAttribute *Attr, const ASTContext *Ctx,
52865306 printHead (" <null attribute>" , DeclAttributeColor, label);
52875307 printFoot ();
52885308 } else {
5289- PrintAttribute (Writer, Ctx, DC, ParseIfNeeded , GetTypeOfExpr,
5309+ PrintAttribute (Writer, Ctx, DC, MemberLoading , GetTypeOfExpr,
52905310 GetTypeOfTypeRepr, GetTypeOfKeyPathComponent)
52915311 .visit (const_cast <DeclAttribute *>(Attr), label);
52925312 }
@@ -6292,7 +6312,7 @@ namespace {
62926312 printHead (" <null type>" , DeclColor, label);
62936313 printFoot ();
62946314 } else {
6295- PrintType (Writer, ParseIfNeeded , GetTypeOfExpr, GetTypeOfTypeRepr,
6315+ PrintType (Writer, MemberLoading , GetTypeOfExpr, GetTypeOfTypeRepr,
62966316 GetTypeOfKeyPathComponent)
62976317 .visit (type, label);
62986318 }
0 commit comments