Skip to content

Commit 7c5a113

Browse files
committed
[ASTDumper] Update requirement/conformance dumps
Make dumps for Requirement, ProtocolConformance, SubstitionMap, etc. use PrintBase and its helpers.
1 parent 4f4da2d commit 7c5a113

File tree

4 files changed

+115
-100
lines changed

4 files changed

+115
-100
lines changed

lib/AST/ASTDumper.cpp

Lines changed: 87 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,17 @@ static StringRef getDumpString(ForeignErrorConvention::IsOwned_t owned) {
399399

400400
llvm_unreachable("Unhandled ForeignErrorConvention::IsOwned_t in switch.");
401401
}
402+
static StringRef getDumpString(RequirementKind kind) {
403+
switch (kind) {
404+
case RequirementKind::SameShape: return "same_shape";
405+
case RequirementKind::Conformance: return "conforms_to";
406+
case RequirementKind::Layout: return "has_layout";
407+
case RequirementKind::Superclass: return "subclass_of";
408+
case RequirementKind::SameType: return "same_type";
409+
}
410+
411+
llvm_unreachable("Unhandled RequirementKind in switch.");
412+
}
402413
static unsigned getDumpString(unsigned value) {
403414
return value;
404415
}
@@ -638,23 +649,51 @@ class PrintBase {
638649
}, Label);
639650
}
640651

641-
void printRec(SubstitutionMap map) {
652+
void printRec(SubstitutionMap map, StringRef label = "") {
642653
SmallPtrSet<const ProtocolConformance *, 4> Dumped;
643-
printRec(map, Dumped);
654+
printRec(map, Dumped, label);
644655
}
645656

646-
void printRec(SubstitutionMap map, VisitedConformances &visited);
657+
void printRec(const ProtocolConformanceRef &conf, StringRef label = "") {
658+
SmallPtrSet<const ProtocolConformance *, 4> Dumped;
659+
printRec(conf, Dumped, label);
660+
}
647661

648-
void printRec(ProtocolConformanceRef conf, StringRef label = "") {
649-
printRecRaw([&](StringRef label) {
650-
conf.dump(OS, Indent);
651-
}, label);
662+
void printRec(SubstitutionMap map, VisitedConformances &visited,
663+
StringRef label = "");
664+
665+
void printRec(const ProtocolConformanceRef &conf,
666+
VisitedConformances &visited, StringRef label = "");
667+
668+
void printRec(const ProtocolConformance *conformance,
669+
VisitedConformances &visited, StringRef label = "");
670+
671+
void visitRequirement(const Requirement &requirement, StringRef label = "") {
672+
printHead("requirement", ASTNodeColor, label);
673+
674+
PrintOptions opts;
675+
opts.ProtocolQualifiedDependentMemberTypes = true;
676+
677+
printFieldQuotedRaw([&](raw_ostream &out) {
678+
requirement.getFirstType().print(out, opts);
679+
}, "");
680+
681+
printField(requirement.getKind(), "");
682+
683+
if (requirement.getKind() != RequirementKind::Layout
684+
&& requirement.getSecondType())
685+
printFieldQuotedRaw([&](raw_ostream &out) {
686+
requirement.getSecondType().print(out, opts);
687+
}, "");
688+
else if (requirement.getLayoutConstraint())
689+
printFieldQuoted(requirement.getLayoutConstraint(), "");
690+
691+
printFoot();
652692
}
653693

654694
void printRec(const Requirement &requirement, StringRef label = "") {
655695
printRecRaw([&](StringRef label) {
656-
OS.indent(Indent);
657-
requirement.dump(OS);
696+
visitRequirement(requirement);
658697
});
659698
}
660699

@@ -3352,49 +3391,34 @@ class PrintConformance : public PrintBase {
33523391
public:
33533392
using PrintBase::PrintBase;
33543393

3355-
using PrintBase::printRec;
3356-
3357-
void printRec(const ProtocolConformanceRef &conf,
3358-
VisitedConformances &visited, StringRef label = "") {
3359-
printRecRaw([&](StringRef label) {
3360-
visitProtocolConformanceRef(conf, visited);
3361-
}, label);
3362-
}
3363-
3364-
void printRec(const ProtocolConformance *conformance,
3365-
VisitedConformances &visited, StringRef label = "") {
3366-
printRecRaw([&](StringRef label) {
3367-
visitProtocolConformance(conformance, visited);
3368-
}, label);
3369-
}
3370-
33713394
void visitProtocolConformanceRef(const ProtocolConformanceRef conformance,
3372-
VisitedConformances &visited) {
3395+
VisitedConformances &visited,
3396+
StringRef label) {
33733397
if (conformance.isInvalid()) {
3374-
printHead("invalid_conformance", ASTNodeColor);
3398+
printHead("invalid_conformance", ASTNodeColor, label);
33753399
printFoot();
33763400
} else if (conformance.isConcrete()) {
3377-
visitProtocolConformance(conformance.getConcrete(), visited);
3401+
visitProtocolConformance(conformance.getConcrete(), visited, label);
33783402
} else if (conformance.isPack()) {
3379-
visitPackConformance(conformance.getPack(), visited);
3403+
visitPackConformance(conformance.getPack(), visited, label);
33803404
} else {
33813405
assert(conformance.isAbstract());
33823406

3383-
printHead("abstract_conformance", ASTNodeColor);
3407+
printHead("abstract_conformance", ASTNodeColor, label);
33843408
printFieldQuoted(conformance.getAbstract()->getName(), "protocol");
33853409
printFoot();
33863410
}
33873411
}
33883412

33893413
void visitProtocolConformance(const ProtocolConformance *conformance,
3390-
VisitedConformances &visited) {
3414+
VisitedConformances &visited, StringRef label) {
33913415
// A recursive conformance shouldn't have its contents printed, or there's
33923416
// infinite recursion. (This also avoids printing things that occur multiple
33933417
// times in a conformance hierarchy.)
33943418
auto shouldPrintDetails = visited.insert(conformance).second;
33953419

33963420
auto printCommon = [&](StringRef kind) {
3397-
printHead(kind, ASTNodeColor);
3421+
printHead(kind, ASTNodeColor, label);
33983422
printFieldQuoted(conformance->getType(), "type");
33993423
printFieldQuoted(conformance->getProtocol()->getName(), "protocol");
34003424
printFlag(!shouldPrintDetails, "<details printed above>");
@@ -3504,8 +3528,8 @@ class PrintConformance : public PrintBase {
35043528
}
35053529

35063530
void visitPackConformance(const PackConformance *conformance,
3507-
VisitedConformances &visited) {
3508-
printHead("pack_conformance", ASTNodeColor);
3531+
VisitedConformances &visited, StringRef label) {
3532+
printHead("pack_conformance", ASTNodeColor, label);
35093533

35103534
printFieldQuoted(Type(conformance->getType()), "type");
35113535
printFieldQuoted(conformance->getProtocol()->getName(), "protocol");
@@ -3519,15 +3543,15 @@ class PrintConformance : public PrintBase {
35193543

35203544
void visitSubstitutionMap(SubstitutionMap map,
35213545
SubstitutionMap::DumpStyle style,
3522-
VisitedConformances &visited) {
3546+
VisitedConformances &visited, StringRef label) {
35233547
// In Minimal style, use single quote so this dump can appear in
35243548
// double-quoted fields without escaping.
35253549
std::optional<llvm::SaveAndRestore<char>> restoreQuote;
35263550
if (style == SubstitutionMap::DumpStyle::Minimal)
35273551
restoreQuote.emplace(quote, '\'');
35283552

35293553
auto genericSig = map.getGenericSignature();
3530-
printHead("substitution_map", ASTNodeColor);
3554+
printHead("substitution_map", ASTNodeColor, label);
35313555
SWIFT_DEFER { printFoot(); };
35323556

35333557
if (genericSig.isNull()) {
@@ -3590,11 +3614,29 @@ class PrintConformance : public PrintBase {
35903614
}
35913615
};
35923616

3593-
void PrintBase::printRec(SubstitutionMap map, VisitedConformances &visited) {
3617+
void PrintBase::printRec(SubstitutionMap map, VisitedConformances &visited,
3618+
StringRef label) {
35943619
printRecRaw([&](StringRef label) {
35953620
PrintConformance(OS, Indent)
3596-
.visitSubstitutionMap(map, SubstitutionMap::DumpStyle::Full, visited);
3597-
});
3621+
.visitSubstitutionMap(map, SubstitutionMap::DumpStyle::Full, visited,
3622+
label);
3623+
}, label);
3624+
}
3625+
3626+
void PrintBase::printRec(const ProtocolConformanceRef &ref,
3627+
VisitedConformances &visited, StringRef label) {
3628+
printRecRaw([&](StringRef label) {
3629+
PrintConformance(OS, Indent)
3630+
.visitProtocolConformanceRef(ref, visited, label);
3631+
}, label);
3632+
}
3633+
3634+
void PrintBase::printRec(const ProtocolConformance *conformance,
3635+
VisitedConformances &visited, StringRef label) {
3636+
printRecRaw([&](StringRef label) {
3637+
PrintConformance(OS, Indent)
3638+
.visitProtocolConformance(conformance, visited, label);
3639+
}, label);
35983640
}
35993641

36003642
} // end anonymous namespace
@@ -3610,12 +3652,12 @@ void ProtocolConformanceRef::dump(llvm::raw_ostream &out, unsigned indent,
36103652
if (!details && isConcrete())
36113653
visited.insert(getConcrete());
36123654

3613-
PrintConformance(out, indent).visitProtocolConformanceRef(*this, visited);
3655+
PrintConformance(out, indent).visitProtocolConformanceRef(*this, visited, "");
36143656
}
36153657

36163658
void ProtocolConformanceRef::print(llvm::raw_ostream &out) const {
36173659
llvm::SmallPtrSet<const ProtocolConformance *, 8> visited;
3618-
PrintConformance(out, 0).visitProtocolConformanceRef(*this, visited);
3660+
PrintConformance(out, 0).visitProtocolConformanceRef(*this, visited, "");
36193661
}
36203662

36213663
void ProtocolConformance::dump() const {
@@ -3626,18 +3668,18 @@ void ProtocolConformance::dump() const {
36263668

36273669
void ProtocolConformance::dump(llvm::raw_ostream &out, unsigned indent) const {
36283670
llvm::SmallPtrSet<const ProtocolConformance *, 8> visited;
3629-
PrintConformance(out, indent).visitProtocolConformance(this, visited);
3671+
PrintConformance(out, indent).visitProtocolConformance(this, visited, "");
36303672
}
36313673

36323674
void PackConformance::dump(llvm::raw_ostream &out, unsigned indent) const {
36333675
llvm::SmallPtrSet<const ProtocolConformance *, 8> visited;
3634-
PrintConformance(out, indent).visitPackConformance(this, visited);
3676+
PrintConformance(out, indent).visitPackConformance(this, visited, "");
36353677
}
36363678

36373679
void SubstitutionMap::dump(llvm::raw_ostream &out, DumpStyle style,
36383680
unsigned indent) const {
36393681
llvm::SmallPtrSet<const ProtocolConformance *, 8> visited;
3640-
PrintConformance(out, indent).visitSubstitutionMap(*this, style, visited);
3682+
PrintConformance(out, indent).visitSubstitutionMap(*this, style, visited, "");
36413683
}
36423684

36433685
void SubstitutionMap::dump() const {
@@ -4348,34 +4390,7 @@ void Requirement::dump() const {
43484390
llvm::errs() << '\n';
43494391
}
43504392
void Requirement::dump(raw_ostream &out) const {
4351-
switch (getKind()) {
4352-
case RequirementKind::SameShape:
4353-
out << "same_shape: ";
4354-
break;
4355-
case RequirementKind::Conformance:
4356-
out << "conforms_to: ";
4357-
break;
4358-
case RequirementKind::Layout:
4359-
out << "layout: ";
4360-
break;
4361-
case RequirementKind::Superclass:
4362-
out << "superclass: ";
4363-
break;
4364-
case RequirementKind::SameType:
4365-
out << "same_type: ";
4366-
break;
4367-
}
4368-
4369-
PrintOptions opts;
4370-
opts.ProtocolQualifiedDependentMemberTypes = true;
4371-
4372-
getFirstType().print(out, opts);
4373-
out << " ";
4374-
4375-
if (getKind() != RequirementKind::Layout && getSecondType())
4376-
getSecondType().print(out, opts);
4377-
else if (getLayoutConstraint())
4378-
out << getLayoutConstraint();
4393+
PrintBase(out, 0).visitRequirement(*this);
43794394
}
43804395

43814396
void SILParameterInfo::dump() const {

test/Frontend/debug-generic-signatures.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ struct Generic<T> {}
8080
// CHECK-NEXT: (normal_conformance type="Generic<T>" protocol="P1"
8181
// CHECK-NEXT: (assoc_type req="A" type="T")
8282
// CHECK-NEXT: (value req="f()" witness="main.(file).Generic extension.f()@{{.*}}")
83-
// CHECK-NEXT: conforms_to: T P1)
83+
// CHECK-NEXT: (requirement "T" conforms_to "P1")
8484
extension Generic: P1 where T: P1 {
8585
typealias A = T
8686
func f() -> T { fatalError() }
@@ -99,8 +99,8 @@ class Super<T, U> {}
9999
// CHECK-NEXT: (assoc_type req="B" type="T")
100100
// CHECK-NEXT: (abstract_conformance protocol="P2")
101101
// CHECK-NEXT: (abstract_conformance protocol="P2")
102-
// CHECK-NEXT: conforms_to: T P2
103-
// CHECK-NEXT: conforms_to: U P2)
102+
// CHECK-NEXT: (requirement "T" conforms_to "P2")
103+
// CHECK-NEXT: (requirement "U" conforms_to "P2"))
104104
extension Super: P2 where T: P2, U: P2 {
105105
typealias A = T
106106
typealias B = T
@@ -131,8 +131,8 @@ extension Super: P2 where T: P2, U: P2 {
131131
// CHECK-NEXT: (assoc_type req="B" type="T")
132132
// CHECK-NEXT: (abstract_conformance protocol="P2")
133133
// CHECK-NEXT: (abstract_conformance protocol="P2")
134-
// CHECK-NEXT: conforms_to: T P2
135-
// CHECK-NEXT: conforms_to: U P2)))
134+
// CHECK-NEXT: (requirement "T" conforms_to "P2")
135+
// CHECK-NEXT: (requirement "U" conforms_to "P2"))))
136136
class Sub: Super<NonRecur, Recur> {}
137137

138138
// Specialization of a recursive conformance should be okay: recursion detection

0 commit comments

Comments
 (0)