Skip to content

Commit 3804110

Browse files
committed
Change parseIfNeeded to an enum to control member loading behavior.
1 parent 5fe10ce commit 3804110

File tree

4 files changed

+99
-34
lines changed

4 files changed

+99
-34
lines changed

include/swift/AST/ASTDumper.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//===--- ASTDumper.h - Swift AST Dumper flags -------------------*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2025 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
//
13+
// This file defines types that are used to control the level of detail printed
14+
// by the AST dumper.
15+
//
16+
//===----------------------------------------------------------------------===//
17+
18+
#ifndef SWIFT_AST_AST_DUMPER_H
19+
#define SWIFT_AST_AST_DUMPER_H
20+
21+
namespace swift {
22+
23+
/// Describes the nature of requests that should be kicked off, if any, to
24+
/// compute members and top-level decls when dumping an AST.
25+
enum class ASTDumpMemberLoading {
26+
/// Dump cached members if available; if they are not, do not kick off any
27+
/// parsing or type-checking requests.
28+
None,
29+
30+
/// Dump parsed members, kicking off a parsing request if necessary to compute
31+
/// them, but not performing additional type-checking.
32+
Parsed,
33+
34+
/// Dump all fully-type checked members, kicking off any requests necessary to
35+
/// compute them.
36+
TypeChecked,
37+
};
38+
39+
} // namespace swift
40+
41+
#endif // SWIFT_AST_AST_DUMPER_H

include/swift/AST/SourceFile.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@
1313
#ifndef SWIFT_AST_SOURCEFILE_H
1414
#define SWIFT_AST_SOURCEFILE_H
1515

16+
#include "swift/AST/ASTDumper.h"
1617
#include "swift/AST/ASTNode.h"
1718
#include "swift/AST/FileUnit.h"
1819
#include "swift/AST/IfConfigClauseRangeInfo.h"
1920
#include "swift/AST/Import.h"
2021
#include "swift/AST/SynthesizedFileUnit.h"
2122
#include "swift/Basic/Debug.h"
2223
#include "llvm/ADT/Hashing.h"
24+
#include "llvm/ADT/STLExtras.h"
2325
#include "llvm/ADT/SetVector.h"
2426
#include "llvm/ADT/SmallPtrSet.h"
25-
#include "llvm/ADT/STLExtras.h"
2627

2728
namespace swift {
2829

@@ -684,7 +685,9 @@ class SourceFile final : public FileUnit {
684685
}
685686

686687
SWIFT_DEBUG_DUMP;
687-
void dump(raw_ostream &os, bool parseIfNeeded = false) const;
688+
void
689+
dump(raw_ostream &os,
690+
ASTDumpMemberLoading memberLoading = ASTDumpMemberLoading::None) const;
688691

689692
/// Dumps this source file's AST in JSON format to the given output stream.
690693
void dumpJSON(raw_ostream &os) const;

lib/AST/ASTDumper.cpp

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
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

28542874
void 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

28592879
void 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>,
46524672
public:
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
}

lib/FrontendTool/FrontendTool.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "swift/FrontendTool/FrontendTool.h"
2424
#include "Dependencies.h"
2525
#include "TBD.h"
26+
#include "swift/AST/ASTDumper.h"
2627
#include "swift/AST/ASTMangler.h"
2728
#include "swift/AST/AvailabilityScope.h"
2829
#include "swift/AST/DiagnosticsFrontend.h"
@@ -468,7 +469,7 @@ static bool dumpAST(CompilerInstance &Instance) {
468469
auto dumpAST = [&](SourceFile *SF, raw_ostream &out) {
469470
switch (opts.DumpASTFormat) {
470471
case FrontendOptions::ASTFormat::Default:
471-
SF->dump(out, /*parseIfNeeded*/ true);
472+
SF->dump(out, ASTDumpMemberLoading::Parsed);
472473
break;
473474
case FrontendOptions::ASTFormat::JSON:
474475
SF->dumpJSON(out);

0 commit comments

Comments
 (0)