Skip to content

Commit 2adfb5a

Browse files
committed
[GSB] Factor out the addition of a conformance to an equivalence class.
NFC refactoring to simplify the code.
1 parent 770912e commit 2adfb5a

File tree

3 files changed

+34
-21
lines changed

3 files changed

+34
-21
lines changed

include/swift/AST/GenericSignatureBuilder.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,15 @@ class GenericSignatureBuilder {
203203
EquivalenceClass &operator=(const EquivalenceClass &) = delete;
204204
EquivalenceClass &operator=(EquivalenceClass &&) = delete;
205205

206+
/// Record the conformance of this equivalence class to the given
207+
/// protocol as found via the given requirement source.
208+
///
209+
/// \returns true if this conformance is new to the equivalence class,
210+
/// and false otherwise.
211+
bool recordConformanceConstraint(PotentialArchetype *pa,
212+
ProtocolDecl *proto,
213+
const RequirementSource *source);
214+
206215
/// Find a source of the same-type constraint that maps a potential
207216
/// archetype in this equivalence class to a concrete type along with
208217
/// that concrete type as written.

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,6 +1549,27 @@ unsigned GenericSignatureBuilder::PotentialArchetype::getNestingDepth() const {
15491549
return Depth;
15501550
}
15511551

1552+
bool EquivalenceClass::recordConformanceConstraint(
1553+
PotentialArchetype *pa,
1554+
ProtocolDecl *proto,
1555+
const RequirementSource *source) {
1556+
// If we haven't seen a conformance to this protocol yet, add it.
1557+
bool inserted = false;
1558+
auto known = conformsTo.find(proto);
1559+
if (known == conformsTo.end()) {
1560+
known = conformsTo.insert({ proto, { }}).first;
1561+
inserted = true;
1562+
modified(*pa->getBuilder());
1563+
++NumConformances;
1564+
}
1565+
1566+
// Record this conformance source.
1567+
known->second.push_back({pa, proto, source});
1568+
++NumConformanceConstraints;
1569+
1570+
return inserted;
1571+
}
1572+
15521573
Optional<ConcreteConstraint>
15531574
EquivalenceClass::findAnyConcreteConstraintAsWritten(
15541575
PotentialArchetype *preferredPA) const {
@@ -2119,11 +2140,8 @@ GenericSignatureBuilder::resolveConcreteConformance(PotentialArchetype *pa,
21192140
}
21202141

21212142
concreteSource = concreteSource->viaConcrete(*this, *conformance);
2122-
paEquivClass->conformsTo[proto].push_back({pa, proto, concreteSource});
2123-
++NumConformanceConstraints;
2124-
2143+
paEquivClass->recordConformanceConstraint(pa, proto, concreteSource);
21252144
addConditionalRequirements(*this, *conformance);
2126-
21272145
return concreteSource;
21282146
}
21292147

@@ -2154,11 +2172,8 @@ const RequirementSource *GenericSignatureBuilder::resolveSuperConformance(
21542172

21552173
superclassSource =
21562174
superclassSource->viaSuperclass(*this, *conformance);
2157-
paEquivClass->conformsTo[proto].push_back({pa, proto, superclassSource});
2158-
++NumConformanceConstraints;
2159-
2175+
paEquivClass->recordConformanceConstraint(pa, proto, superclassSource);
21602176
addConditionalRequirements(*this, *conformance);
2161-
21622177
return superclassSource;
21632178
}
21642179

@@ -2261,19 +2276,8 @@ bool PotentialArchetype::addConformance(ProtocolDecl *proto,
22612276
GenericSignatureBuilder &builder) {
22622277
// Check whether we already knew about this conformance.
22632278
auto equivClass = getOrCreateEquivalenceClass();
2264-
auto known = equivClass->conformsTo.find(proto);
2265-
if (known != equivClass->conformsTo.end()) {
2266-
// We already knew about this conformance; record this specific constraint.
2267-
known->second.push_back({this, proto, source});
2268-
++NumConformanceConstraints;
2279+
if (!equivClass->recordConformanceConstraint(this, proto, source))
22692280
return false;
2270-
}
2271-
2272-
// Add the conformance along with this constraint.
2273-
equivClass->conformsTo[proto].push_back({this, proto, source});
2274-
equivClass->modified(builder);
2275-
++NumConformanceConstraints;
2276-
++NumConformances;
22772281

22782282
// If there is a concrete type that resolves this conformance requirement,
22792283
// record the conformance.
@@ -3913,6 +3917,7 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
39133917
T1->addConformance(entry.first, entry.second.front().source, *this);
39143918

39153919
auto &constraints1 = equivClass->conformsTo[entry.first];
3920+
// FIXME: Go through recordConformanceConstraint()?
39163921
constraints1.insert(constraints1.end(),
39173922
entry.second.begin() + 1,
39183923
entry.second.end());

lib/AST/ProtocolConformance.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,6 @@ void NormalProtocolConformance::differenceAndStoreConditionalRequirements() {
333333
// change.)
334334
assert(canTypeSig.getGenericParams() == canExtensionSig.getGenericParams());
335335

336-
auto mod = DC->getParentModule();
337336
// Find the requirements in the extension that aren't proved by the original
338337
// type, these are the ones that make the conformance conditional.
339338
SmallVector<Requirement, 4> reqs;

0 commit comments

Comments
 (0)