@@ -1489,10 +1489,12 @@ std::string GenericSignatureBuilder::PotentialArchetype::getDebugName() const {
1489
1489
1490
1490
auto parent = getParent ();
1491
1491
if (!parent) {
1492
- return GenericTypeParamType::get (getGenericParamKey ().Depth ,
1493
- getGenericParamKey ().Index ,
1494
- getBuilder ()->getASTContext ())->getName ()
1495
- .str ();
1492
+ static const char *tau = u8" \u03C4 _" ;
1493
+
1494
+ llvm::raw_svector_ostream os (result);
1495
+ os << tau << getGenericParamKey ().Depth << ' _'
1496
+ << getGenericParamKey ().Index ;
1497
+ return os.str ().str ();
1496
1498
}
1497
1499
1498
1500
// Nested types.
@@ -1616,11 +1618,10 @@ class GenericSignatureBuilder::ResolvedType {
1616
1618
};
1617
1619
1618
1620
bool EquivalenceClass::recordConformanceConstraint (
1621
+ GenericSignatureBuilder &builder,
1619
1622
ResolvedType type,
1620
1623
ProtocolDecl *proto,
1621
1624
FloatingRequirementSource source) {
1622
- auto &builder = *members.front ()->getBuilder ();
1623
-
1624
1625
// If we haven't seen a conformance to this protocol yet, add it.
1625
1626
bool inserted = false ;
1626
1627
auto known = conformsTo.find (proto);
@@ -1641,7 +1642,7 @@ bool EquivalenceClass::recordConformanceConstraint(
1641
1642
// Resolve any associated type members.
1642
1643
for (auto assocType : proto->getAssociatedTypeMembers ()) {
1643
1644
type.realizePotentialArchetype (builder)->updateNestedTypeForConformance (
1644
- assocType,
1645
+ builder, assocType,
1645
1646
ArchetypeResolutionKind::AlreadyKnown);
1646
1647
}
1647
1648
}
@@ -1783,6 +1784,7 @@ static int compareAssociatedTypes(AssociatedTypeDecl *assocType1,
1783
1784
}
1784
1785
1785
1786
TypeDecl *EquivalenceClass::lookupNestedType (
1787
+ GenericSignatureBuilder &builder,
1786
1788
Identifier name,
1787
1789
SmallVectorImpl<TypeDecl *> *otherConcreteTypes) {
1788
1790
// Populates the result structures from the given cache entry.
@@ -1892,8 +1894,7 @@ TypeDecl *EquivalenceClass::lookupNestedType(
1892
1894
1893
1895
// Infer same-type constraints among same-named associated type anchors.
1894
1896
if (assocTypeAnchors.size () > 1 ) {
1895
- auto &builder = *members.front ()->getBuilder ();
1896
- auto anchorType = getAnchor ({ });
1897
+ auto anchorType = getAnchor (builder, { });
1897
1898
auto inferredSource = FloatingRequirementSource::forInferred (nullptr );
1898
1899
for (auto assocType : assocTypeAnchors) {
1899
1900
if (assocType == bestAssocType) continue ;
@@ -1937,9 +1938,9 @@ TypeDecl *EquivalenceClass::lookupNestedType(
1937
1938
}
1938
1939
1939
1940
Type EquivalenceClass::getAnchor (
1941
+ GenericSignatureBuilder &builder,
1940
1942
ArrayRef<GenericTypeParamType *> genericParams) {
1941
- auto anchorPA =
1942
- members.front ()->getArchetypeAnchor (*members.front ()->getBuilder ());
1943
+ auto anchorPA = members.front ()->getArchetypeAnchor (builder);
1943
1944
return anchorPA->getDependentType (genericParams);
1944
1945
}
1945
1946
@@ -1949,7 +1950,7 @@ Type EquivalenceClass::getTypeInContext(GenericSignatureBuilder &builder,
1949
1950
genericEnv->getGenericParams ();
1950
1951
1951
1952
// The anchor descr
1952
- Type anchor = getAnchor (genericParams);
1953
+ Type anchor = getAnchor (builder, genericParams);
1953
1954
1954
1955
// If this equivalence class is mapped to a concrete type, produce that
1955
1956
// type.
@@ -2271,7 +2272,7 @@ GenericSignatureBuilder::resolveConcreteConformance(ResolvedType type,
2271
2272
}
2272
2273
2273
2274
concreteSource = concreteSource->viaConcrete (*this , *conformance);
2274
- equivClass->recordConformanceConstraint (type, proto, concreteSource);
2275
+ equivClass->recordConformanceConstraint (* this , type, proto, concreteSource);
2275
2276
addConditionalRequirements (*this , *conformance);
2276
2277
return concreteSource;
2277
2278
}
@@ -2302,7 +2303,7 @@ const RequirementSource *GenericSignatureBuilder::resolveSuperConformance(
2302
2303
2303
2304
superclassSource =
2304
2305
superclassSource->viaSuperclass (*this , *conformance);
2305
- equivClass->recordConformanceConstraint (type, proto, superclassSource);
2306
+ equivClass->recordConformanceConstraint (* this , type, proto, superclassSource);
2306
2307
addConditionalRequirements (*this , *conformance);
2307
2308
return superclassSource;
2308
2309
}
@@ -2653,7 +2654,7 @@ static void concretizeNestedTypeFromConcreteParent(
2653
2654
// add it now; it was elided earlier.
2654
2655
if (parentEquiv->conformsTo .count (proto) == 0 ) {
2655
2656
auto source = parentEquiv->concreteTypeConstraints .front ().source ;
2656
- parentEquiv->recordConformanceConstraint (parent, proto, source);
2657
+ parentEquiv->recordConformanceConstraint (builder, parent, proto, source);
2657
2658
}
2658
2659
2659
2660
assert (parentEquiv->conformsTo .count (proto) > 0 &&
@@ -2695,18 +2696,19 @@ PotentialArchetype *PotentialArchetype::getNestedArchetypeAnchor(
2695
2696
ArchetypeResolutionKind kind) {
2696
2697
SmallVector<TypeDecl *, 4 > concreteDecls;
2697
2698
auto bestType =
2698
- getOrCreateEquivalenceClass ()->lookupNestedType (name, &concreteDecls);
2699
+ getOrCreateEquivalenceClass ()->lookupNestedType (builder, name,
2700
+ &concreteDecls);
2699
2701
2700
2702
// We didn't find any type with this name.
2701
2703
if (!bestType) return nullptr ;
2702
2704
2703
2705
// Resolve the nested type.
2704
- auto resultPA = updateNestedTypeForConformance (bestType, kind);
2706
+ auto resultPA = updateNestedTypeForConformance (builder, bestType, kind);
2705
2707
2706
2708
// Update for all of the concrete decls with this name, which will introduce
2707
2709
// various same-type constraints.
2708
2710
for (auto concreteDecl : concreteDecls) {
2709
- (void )updateNestedTypeForConformance (concreteDecl,
2711
+ (void )updateNestedTypeForConformance (builder, concreteDecl,
2710
2712
ArchetypeResolutionKind::WellFormed);
2711
2713
}
2712
2714
@@ -2715,6 +2717,7 @@ PotentialArchetype *PotentialArchetype::getNestedArchetypeAnchor(
2715
2717
2716
2718
2717
2719
PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance (
2720
+ GenericSignatureBuilder &builder,
2718
2721
TypeDecl *type,
2719
2722
ArchetypeResolutionKind kind) {
2720
2723
if (!type) return nullptr ;
@@ -2731,7 +2734,7 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
2731
2734
// process delayed requirements if anything changed.
2732
2735
SWIFT_DEFER {
2733
2736
if (kind == ArchetypeResolutionKind::CompleteWellFormed)
2734
- getBuilder ()-> processDelayedRequirements ();
2737
+ builder. processDelayedRequirements ();
2735
2738
};
2736
2739
2737
2740
Identifier name = assocType ? assocType->getName () : concreteDecl->getName ();
@@ -2746,7 +2749,6 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
2746
2749
PotentialArchetype *resultPA = nullptr ;
2747
2750
auto knownNestedTypes = NestedTypes.find (name);
2748
2751
bool shouldUpdatePA = false ;
2749
- auto &builder = *getBuilder ();
2750
2752
if (knownNestedTypes != NestedTypes.end ()) {
2751
2753
for (auto existingPA : knownNestedTypes->second ) {
2752
2754
// Do we have an associated-type match?
@@ -3091,7 +3093,8 @@ static Type resolveDependentMemberTypes(GenericSignatureBuilder &builder,
3091
3093
if (!parentEquivClass)
3092
3094
return ErrorType::get (depTy);
3093
3095
3094
- auto memberType = parentEquivClass->lookupNestedType (depTy->getName ());
3096
+ auto memberType =
3097
+ parentEquivClass->lookupNestedType (builder, depTy->getName ());
3095
3098
if (!memberType)
3096
3099
return ErrorType::get (depTy);
3097
3100
@@ -3137,7 +3140,8 @@ ResolvedType GenericSignatureBuilder::maybeResolveEquivalenceClass(
3137
3140
if (auto assocType = depMemTy->getAssocType ()) {
3138
3141
nestedTypeDecl = assocType;
3139
3142
} else {
3140
- nestedTypeDecl = baseEquivClass->lookupNestedType (depMemTy->getName ());
3143
+ nestedTypeDecl =
3144
+ baseEquivClass->lookupNestedType (*this , depMemTy->getName ());
3141
3145
if (!nestedTypeDecl) {
3142
3146
return ResolvedType::forUnresolved (baseEquivClass);
3143
3147
}
@@ -3155,7 +3159,8 @@ ResolvedType GenericSignatureBuilder::maybeResolveEquivalenceClass(
3155
3159
}
3156
3160
3157
3161
auto nestedPA =
3158
- basePA->updateNestedTypeForConformance (nestedTypeDecl, resolutionKind);
3162
+ basePA->updateNestedTypeForConformance (*this , nestedTypeDecl,
3163
+ resolutionKind);
3159
3164
if (!nestedPA)
3160
3165
return ResolvedType::forUnresolved (baseEquivClass);
3161
3166
@@ -3613,7 +3618,7 @@ ConstraintResult GenericSignatureBuilder::addConformanceRequirement(
3613
3618
// Add the conformance requirement, bailing out earlier if we've already
3614
3619
// seen it.
3615
3620
auto equivClass = type.getEquivalenceClass ();
3616
- if (!equivClass->recordConformanceConstraint (type, proto, source))
3621
+ if (!equivClass->recordConformanceConstraint (* this , type, proto, source))
3617
3622
return ConstraintResult::Resolved;
3618
3623
3619
3624
auto resolvedSource = source.getSource (*this , type.getDependentType ());
@@ -3960,6 +3965,7 @@ void GenericSignatureBuilder::addedNestedType(PotentialArchetype *nestedPA) {
3960
3965
3961
3966
PotentialArchetype *existingPA =
3962
3967
parentRepPA->updateNestedTypeForConformance (
3968
+ *this ,
3963
3969
nestedPA->getResolvedType (),
3964
3970
ArchetypeResolutionKind::WellFormed);
3965
3971
@@ -4071,7 +4077,7 @@ GenericSignatureBuilder::addSameTypeRequirementBetweenArchetypes(
4071
4077
// Add all of the protocol conformance requirements of T2 to T1.
4072
4078
if (equivClass2) {
4073
4079
for (const auto &entry : equivClass2->conformsTo ) {
4074
- equivClass->recordConformanceConstraint (T1, entry.first ,
4080
+ equivClass->recordConformanceConstraint (* this , T1, entry.first ,
4075
4081
entry.second .front ().source );
4076
4082
4077
4083
auto &constraints1 = equivClass->conformsTo [entry.first ];
0 commit comments