Skip to content

Commit c90b8e6

Browse files
committed
ASTDumper: Improve conformance dumping and use forEachAssociatedConformance()
1 parent 2a0fac5 commit c90b8e6

File tree

3 files changed

+62
-34
lines changed

3 files changed

+62
-34
lines changed

lib/AST/ASTDumper.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3550,6 +3550,7 @@ class PrintConformance : public PrintBase {
35503550
});
35513551
return false;
35523552
});
3553+
35533554
normal->forEachValueWitness([&](const ValueDecl *req,
35543555
Witness witness) {
35553556
printRecArbitrary([&](StringRef label) {
@@ -3567,9 +3568,17 @@ class PrintConformance : public PrintBase {
35673568
});
35683569
});
35693570

3570-
for (auto sigConf : normal->getSignatureConformances()) {
3571-
printRec(sigConf, visited);
3572-
}
3571+
normal->forEachAssociatedConformance(
3572+
[&](Type t, ProtocolDecl *proto, unsigned index) {
3573+
printRecArbitrary([&](StringRef label) {
3574+
printHead("assoc_conformance", ASTNodeColor, label);
3575+
printFieldQuoted(t, "type", TypeColor);
3576+
printFieldQuoted(proto->getName(), "proto");
3577+
printRec(normal->getAssociatedConformance(t, proto), visited);
3578+
printFoot();
3579+
});
3580+
return false;
3581+
});
35733582
}
35743583

35753584
if (auto condReqs = normal->getConditionalRequirementsIfAvailable()) {

test/Frontend/debug-generic-signatures.swift

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ struct Basic: P1 {
4646
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2"
4747
// CHECK-NEXT: (assoc_type req="A" type="Recur")
4848
// CHECK-NEXT: (assoc_type req="B" type="Recur")
49-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>)
50-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))
49+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P2"
50+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))
51+
// CHECK-NEXT: (assoc_conformance type="Self.B" proto="P2"
52+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>)))
5153
struct Recur: P2 {
5254
typealias A = Recur
5355
typealias B = Recur
@@ -59,12 +61,16 @@ struct Recur: P2 {
5961
// CHECK-NEXT: (normal_conformance type="NonRecur" protocol="P2"
6062
// CHECK-NEXT: (assoc_type req="A" type="Recur")
6163
// CHECK-NEXT: (assoc_type req="B" type="Recur")
62-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2"
63-
// CHECK-NEXT: (assoc_type req="A" type="Recur")
64-
// CHECK-NEXT: (assoc_type req="B" type="Recur")
65-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>)
66-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))
67-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))
64+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P2"
65+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2"
66+
// CHECK-NEXT: (assoc_type req="A" type="Recur")
67+
// CHECK-NEXT: (assoc_type req="B" type="Recur")
68+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P2"
69+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))
70+
// CHECK-NEXT: (assoc_conformance type="Self.B" proto="P2"
71+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))))
72+
// CHECK-NEXT: (assoc_conformance type="Self.B" proto="P2"
73+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>)))
6874
struct NonRecur: P2 {
6975
typealias A = Recur
7076
typealias B = Recur
@@ -97,8 +103,10 @@ class Super<T, U> {}
97103
// CHECK-NEXT: (normal_conformance type="Super<T, U>" protocol="P2"
98104
// CHECK-NEXT: (assoc_type req="A" type="T")
99105
// CHECK-NEXT: (assoc_type req="B" type="T")
100-
// CHECK-NEXT: (abstract_conformance protocol="P2")
101-
// CHECK-NEXT: (abstract_conformance protocol="P2")
106+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P2"
107+
// CHECK-NEXT: (abstract_conformance protocol="P2"))
108+
// CHECK-NEXT: (assoc_conformance type="Self.B" proto="P2"
109+
// CHECK-NEXT: (abstract_conformance protocol="P2"))
102110
// CHECK-NEXT: (requirement "T" conforms_to "P2")
103111
// CHECK-NEXT: (requirement "U" conforms_to "P2"))
104112
extension Super: P2 where T: P2, U: P2 {
@@ -117,20 +125,26 @@ extension Super: P2 where T: P2, U: P2 {
117125
// CHECK-NEXT: (normal_conformance type="NonRecur" protocol="P2"
118126
// CHECK-NEXT: (assoc_type req="A" type="Recur")
119127
// CHECK-NEXT: (assoc_type req="B" type="Recur")
120-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2"
121-
// CHECK-NEXT: (assoc_type req="A" type="Recur")
122-
// CHECK-NEXT: (assoc_type req="B" type="Recur")
123-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>)
124-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))
125-
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>)))
128+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P2"
129+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2"
130+
// CHECK-NEXT: (assoc_type req="A" type="Recur")
131+
// CHECK-NEXT: (assoc_type req="B" type="Recur")
132+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P2"
133+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))
134+
// CHECK-NEXT: (assoc_conformance type="Self.B" proto="P2"
135+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))))
136+
// CHECK-NEXT: (assoc_conformance type="Self.B" proto="P2"
137+
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>))))
126138
// CHECK-NEXT: (conformance type="U"
127139
// CHECK-NEXT: (normal_conformance type="Recur" protocol="P2" <details printed above>)))
128140
// CHECK-NEXT: (<conditional requirements unable to be computed>)
129141
// CHECK-NEXT: (normal_conformance type="Super<T, U>" protocol="P2"
130142
// CHECK-NEXT: (assoc_type req="A" type="T")
131143
// CHECK-NEXT: (assoc_type req="B" type="T")
132-
// CHECK-NEXT: (abstract_conformance protocol="P2")
133-
// CHECK-NEXT: (abstract_conformance protocol="P2")
144+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P2"
145+
// CHECK-NEXT: (abstract_conformance protocol="P2"))
146+
// CHECK-NEXT: (assoc_conformance type="Self.B" proto="P2"
147+
// CHECK-NEXT: (abstract_conformance protocol="P2"))
134148
// CHECK-NEXT: (requirement "T" conforms_to "P2")
135149
// CHECK-NEXT: (requirement "U" conforms_to "P2"))))
136150
class Sub: Super<NonRecur, Recur> {}
@@ -141,22 +155,25 @@ class Sub: Super<NonRecur, Recur> {}
141155
// CHECK-LABEL: StructDecl name=RecurGeneric
142156
// CHECK-NEXT: (normal_conformance type="RecurGeneric<T>" protocol="P3"
143157
// CHECK-NEXT: (assoc_type req="A" type="RecurGeneric<T>")
144-
// CHECK-NEXT: (normal_conformance type="RecurGeneric<T>" protocol="P3" <details printed above>))
158+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P3"
159+
// CHECK-NEXT: (normal_conformance type="RecurGeneric<T>" protocol="P3" <details printed above>)))
145160
struct RecurGeneric<T: P3>: P3 {
146161
typealias A = RecurGeneric<T>
147162
}
148163

149164
// CHECK-LABEL: StructDecl name=Specialize
150165
// CHECK-NEXT: (normal_conformance type="Specialize" protocol="P3"
151166
// CHECK-NEXT: (assoc_type req="A" type="RecurGeneric<Specialize>")
152-
// CHECK-NEXT: (specialized_conformance type="Specialize.A" protocol="P3"
153-
// CHECK-NEXT: (substitution_map generic_signature="<T where T : P3>"
154-
// CHECK-NEXT: (substitution "T -> Specialize")
155-
// CHECK-NEXT: (conformance type="T"
156-
// CHECK-NEXT: (normal_conformance type="Specialize" protocol="P3" <details printed above>)))
157-
// CHECK-NEXT: (normal_conformance type="RecurGeneric<T>" protocol="P3"
158-
// CHECK-NEXT: (assoc_type req="A" type="RecurGeneric<T>")
159-
// CHECK-NEXT: (normal_conformance type="RecurGeneric<T>" protocol="P3" <details printed above>))))
167+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P3"
168+
// CHECK-NEXT: (specialized_conformance type="Specialize.A" protocol="P3"
169+
// CHECK-NEXT: (substitution_map generic_signature="<T where T : P3>"
170+
// CHECK-NEXT: (substitution "T -> Specialize")
171+
// CHECK-NEXT: (conformance type="T"
172+
// CHECK-NEXT: (normal_conformance type="Specialize" protocol="P3" <details printed above>)))
173+
// CHECK-NEXT: (normal_conformance type="RecurGeneric<T>" protocol="P3"
174+
// CHECK-NEXT: (assoc_type req="A" type="RecurGeneric<T>")
175+
// CHECK-NEXT: (assoc_conformance type="Self.A" proto="P3"
176+
// CHECK-NEXT: (normal_conformance type="RecurGeneric<T>" protocol="P3" <details printed above>))))))
160177
struct Specialize: P3 {
161178
typealias A = RecurGeneric<Specialize>
162179
}

test/Generics/conditional_conformances.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,9 @@ extension InheritEqual: P2 where T: P1 {} // expected-note {{requirement from co
219219
// CHECK-LABEL: ExtensionDecl line={{.*}} base=InheritEqual
220220
// CHECK-LABEL: ExtensionDecl line={{.*}} base=InheritEqual
221221
// CHECK-NEXT: (normal_conformance type="InheritEqual<T>" protocol="P5"
222-
// CHECK-NEXT: (normal_conformance type="InheritEqual<T>" protocol="P2"
223-
// CHECK-NEXT: (requirement "T" conforms_to "P1"))
222+
// CHECK-NEXT: (assoc_conformance type="Self" proto="P2"
223+
// CHECK-NEXT: (normal_conformance type="InheritEqual<T>" protocol="P2"
224+
// CHECK-NEXT: (requirement "T" conforms_to "P1")))
224225
// CHECK-NEXT: (requirement "T" conforms_to "P1"))
225226
extension InheritEqual: P5 where T: P1 {} // expected-note {{requirement from conditional conformance of 'InheritEqual<U>' to 'P5'}}
226227
func inheritequal_good<U: P1>(_: U) {
@@ -251,8 +252,9 @@ extension InheritMore: P2 where T: P1 {} // expected-note {{requirement from con
251252
// CHECK-LABEL: ExtensionDecl line={{.*}} base=InheritMore
252253
// CHECK-LABEL: ExtensionDecl line={{.*}} base=InheritMore
253254
// CHECK-NEXT: (normal_conformance type="InheritMore<T>" protocol="P5"
254-
// CHECK-NEXT: (normal_conformance type="InheritMore<T>" protocol="P2"
255-
// CHECK-NEXT: (requirement "T" conforms_to "P1"))
255+
// CHECK-NEXT: (assoc_conformance type="Self" proto="P2"
256+
// CHECK-NEXT: (normal_conformance type="InheritMore<T>" protocol="P2"
257+
// CHECK-NEXT: (requirement "T" conforms_to "P1")))
256258
// CHECK-NEXT: (requirement "T" conforms_to "P4"))
257259
extension InheritMore: P5 where T: P4 {} // expected-note 2 {{requirement from conditional conformance of 'InheritMore<U>' to 'P5'}}
258260
func inheritequal_good_good<U: P4>(_: U) {

0 commit comments

Comments
 (0)