@@ -26,7 +26,7 @@ using namespace swift;
2626size_t GenericEnvironment::numTrailingObjects (
2727 OverloadToken<OpaqueTypeDecl *>) const {
2828 switch (getKind ()) {
29- case Kind::Normal :
29+ case Kind::Primary :
3030 case Kind::OpenedExistential:
3131 return 0 ;
3232
@@ -38,7 +38,7 @@ size_t GenericEnvironment::numTrailingObjects(
3838size_t GenericEnvironment::numTrailingObjects (
3939 OverloadToken<SubstitutionMap>) const {
4040 switch (getKind ()) {
41- case Kind::Normal :
41+ case Kind::Primary :
4242 case Kind::OpenedExistential:
4343 return 0 ;
4444
@@ -50,7 +50,7 @@ size_t GenericEnvironment::numTrailingObjects(
5050size_t GenericEnvironment::numTrailingObjects (
5151 OverloadToken<OpenedGenericEnvironmentData>) const {
5252 switch (getKind ()) {
53- case Kind::Normal :
53+ case Kind::Primary :
5454 case Kind::Opaque:
5555 return 0 ;
5656
@@ -104,20 +104,27 @@ UUID GenericEnvironment::getOpenedExistentialUUID() const {
104104 return getTrailingObjects<OpenedGenericEnvironmentData>()->uuid ;
105105}
106106
107+ GenericSignature
108+ GenericEnvironment::getOpenedExistentialParentSignature () const {
109+ assert (getKind () == Kind::OpenedExistential);
110+ return getTrailingObjects<OpenedGenericEnvironmentData>()->parentSig ;
111+ }
112+
107113GenericEnvironment::GenericEnvironment (GenericSignature signature)
108- : SignatureAndKind(signature, Kind::Normal )
114+ : SignatureAndKind(signature, Kind::Primary )
109115{
110116 // Clear out the memory that holds the context types.
111117 std::uninitialized_fill (getContextTypes ().begin (), getContextTypes ().end (),
112118 Type ());
113119}
114120
115121GenericEnvironment::GenericEnvironment (
116- GenericSignature signature, Type existential, UUID uuid)
122+ GenericSignature signature,
123+ Type existential, GenericSignature parentSig, UUID uuid)
117124 : SignatureAndKind(signature, Kind::OpenedExistential)
118125{
119126 new (getTrailingObjects<OpenedGenericEnvironmentData>())
120- OpenedGenericEnvironmentData{ existential, uuid };
127+ OpenedGenericEnvironmentData{ existential, parentSig, uuid };
121128
122129 // Clear out the memory that holds the context types.
123130 std::uninitialized_fill (getContextTypes ().begin (), getContextTypes ().end (),
@@ -209,7 +216,7 @@ struct SubstituteOuterFromSubstitutionMap {
209216
210217Type GenericEnvironment::maybeApplyOpaqueTypeSubstitutions (Type type) const {
211218 switch (getKind ()) {
212- case Kind::Normal :
219+ case Kind::Primary :
213220 case Kind::OpenedExistential:
214221 return type;
215222
@@ -273,15 +280,6 @@ auto GenericEnvironment::getOrCreateNestedTypeStorage() -> NestedTypeStorage & {
273280 return *nestedTypeStorage;
274281}
275282
276- static Type stripBoundDependentMemberTypes (Type t) {
277- if (auto *depMemTy = t->getAs <DependentMemberType>()) {
278- return DependentMemberType::get (
279- stripBoundDependentMemberTypes (depMemTy->getBase ()),
280- depMemTy->getName ());
281- }
282-
283- return t;
284- }
285283Type
286284GenericEnvironment::getOrCreateArchetypeFromInterfaceType (Type depType) {
287285 auto genericSig = getGenericSignature ();
@@ -292,7 +290,7 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
292290 // / Substitute a type for the purpose of requirements.
293291 auto substForRequirements = [&](Type type) {
294292 switch (getKind ()) {
295- case Kind::Normal :
293+ case Kind::Primary :
296294 case Kind::OpenedExistential:
297295 if (type->hasTypeParameter ()) {
298296 return mapTypeIntoContext (type, conformanceLookupFn);
@@ -315,12 +313,11 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
315313 // First, write an ErrorType to the location where this type is cached,
316314 // to catch re-entrant lookups that might arise from an invalid generic
317315 // signature (eg, <X where X == Array<X>>).
318- CanDependentMemberType nestedDependentMemberType ;
316+ CanDependentMemberType nestedType ;
319317 GenericTypeParamType *genericParam = nullptr ;
320318 if (auto depMemTy = requirements.anchor ->getAs <DependentMemberType>()) {
321- nestedDependentMemberType = cast<DependentMemberType>(
322- stripBoundDependentMemberTypes (depMemTy)->getCanonicalType ());
323- auto &entry = getOrCreateNestedTypeStorage ()[nestedDependentMemberType];
319+ nestedType = cast<DependentMemberType>(depMemTy->getCanonicalType ());
320+ auto &entry = getOrCreateNestedTypeStorage ()[nestedType];
324321 if (entry)
325322 return entry;
326323
@@ -342,13 +339,15 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
342339
343340 Type result;
344341
345- if (requirements.anchor ->getRootGenericParam ()->isTypeSequence ()) {
342+ auto rootGP = requirements.anchor ->getRootGenericParam ();
343+ if (rootGP->isTypeSequence ()) {
344+ assert (getKind () == Kind::Primary);
346345 result = SequenceArchetypeType::get (ctx, this , requirements.anchor ,
347346 requirements.protos , superclass,
348347 requirements.layout );
349348 } else {
350349 switch (getKind ()) {
351- case Kind::Normal :
350+ case Kind::Primary :
352351 result = PrimaryArchetypeType::getNew (ctx, this , requirements.anchor ,
353352 requirements.protos , superclass,
354353 requirements.layout );
@@ -384,7 +383,6 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
384383 // If the anchor type isn't rooted in a generic parameter that
385384 // represents an opaque declaration, then apply the outer substitutions.
386385 // It would be incorrect to build an opaque type archetype here.
387- auto rootGP = requirements.anchor ->getRootGenericParam ();
388386 unsigned opaqueDepth =
389387 getOpaqueTypeDecl ()->getOpaqueGenericParams ().front ()->getDepth ();
390388 if (rootGP->getDepth () < opaqueDepth) {
@@ -403,7 +401,7 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
403401 if (genericParam)
404402 addMapping (genericParam, result);
405403 else
406- getOrCreateNestedTypeStorage ()[nestedDependentMemberType ] = result;
404+ getOrCreateNestedTypeStorage ()[nestedType ] = result;
407405
408406 return result;
409407}
0 commit comments