Skip to content

Commit 929c642

Browse files
committed
[GSB] Make resolveEquivalenceClass() not build extra potential archetypes.
When we're only resolving the equivalence class in which a dependent type occurs, always use the archetype anchor for the equivalence class to find the equivalence class of the next nested type. This means that, for example, determining the equivalence class of C.SubSequence.SubSequence.SubSequence.SubSequence for a Collection C will only resolve potential archetypes up to C.SubSequence.SubSequence. Not much benefit from this because the GenericSignatureBuilder itself isn't using resolveEquivalenceClass() when expanding requirements.
1 parent f4135f9 commit 929c642

File tree

1 file changed

+39
-4
lines changed

1 file changed

+39
-4
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3012,11 +3012,46 @@ auto GenericSignatureBuilder::resolvePotentialArchetype(
30123012
EquivalenceClass *GenericSignatureBuilder::resolveEquivalenceClass(
30133013
Type type,
30143014
ArchetypeResolutionKind resolutionKind) {
3015-
auto pa = resolvePotentialArchetype(type, resolutionKind)
3016-
.dyn_cast<PotentialArchetype *>();
3017-
if (!pa) return nullptr;
3015+
// The equivalence class of a generic type is known directly.
3016+
if (auto genericParam = type->getAs<GenericTypeParamType>()) {
3017+
unsigned index = GenericParamKey(genericParam).findIndexIn(
3018+
Impl->GenericParams);
3019+
if (index < Impl->GenericParams.size())
3020+
return Impl->PotentialArchetypes[index]->getOrCreateEquivalenceClass();
3021+
3022+
return nullptr;
3023+
}
3024+
3025+
// The equivalence class of a dependent member type is determined by its
3026+
// base equivalence class.
3027+
if (auto depMemTy = type->getAs<DependentMemberType>()) {
3028+
// Find the equivalence class of the base.
3029+
auto baseEquivClass = resolveEquivalenceClass(depMemTy->getBase(),
3030+
resolutionKind);
3031+
if (!baseEquivClass) return nullptr;
30183032

3019-
return pa->getOrCreateEquivalenceClass();
3033+
// Find the nested type declaration for this.
3034+
TypeDecl *nestedTypeDecl;
3035+
if (auto assocType = depMemTy->getAssocType()) {
3036+
nestedTypeDecl = assocType;
3037+
} else {
3038+
nestedTypeDecl = baseEquivClass->lookupNestedType(depMemTy->getName());
3039+
if (!nestedTypeDecl) return nullptr;
3040+
}
3041+
3042+
// Retrieve the anchor of the base equivalence class.
3043+
auto baseAnchorPA =
3044+
baseEquivClass->members.front()->getArchetypeAnchor(*this);
3045+
auto nestedPA =
3046+
baseAnchorPA->updateNestedTypeForConformance(nestedTypeDecl,
3047+
resolutionKind);
3048+
if (!nestedPA)
3049+
return nullptr;
3050+
3051+
return nestedPA->getOrCreateEquivalenceClass();
3052+
}
3053+
3054+
return nullptr;
30203055
}
30213056

30223057
/// Resolve any unresolved dependent member types using the given builder.

0 commit comments

Comments
 (0)