@@ -3185,9 +3185,11 @@ ArchetypeType::ArchetypeType(TypeKind Kind,
3185
3185
RecursiveTypeProperties properties,
3186
3186
Type InterfaceType,
3187
3187
ArrayRef<ProtocolDecl *> ConformsTo,
3188
- Type Superclass, LayoutConstraint Layout)
3188
+ Type Superclass, LayoutConstraint Layout,
3189
+ GenericEnvironment *Environment)
3189
3190
: SubstitutableType(Kind, &Ctx, properties),
3190
- InterfaceType(InterfaceType)
3191
+ InterfaceType(InterfaceType),
3192
+ Environment(Environment)
3191
3193
{
3192
3194
// Set up the bits we need for trailing objects to work.
3193
3195
Bits.ArchetypeType .ExpandedNestedTypes = false ;
@@ -3209,20 +3211,21 @@ ArchetypeType::ArchetypeType(TypeKind Kind,
3209
3211
}
3210
3212
3211
3213
GenericEnvironment *ArchetypeType::getGenericEnvironment () const {
3212
- auto root = getRoot ();
3213
- if (auto primary = dyn_cast<PrimaryArchetypeType>(root)) {
3214
- return primary->getGenericEnvironment ();
3214
+ if (Environment) {
3215
+ return Environment;
3215
3216
}
3216
- if (auto opened = dyn_cast<OpenedArchetypeType>(root)) {
3217
- return opened->getGenericEnvironment ();
3218
- }
3219
- if (auto opaque = dyn_cast<OpaqueTypeArchetypeType>(root)) {
3220
- return opaque->getGenericEnvironment ();
3217
+
3218
+ // Opened archetypes lazily create their generic environment.
3219
+ if (auto opened = dyn_cast<OpenedArchetypeType>(this )) {
3220
+ return Environment = opened->createGenericEnvironment ();
3221
3221
}
3222
- if (auto opaque = dyn_cast<SequenceArchetypeType>(root)) {
3223
- return opaque->getGenericEnvironment ();
3222
+
3223
+ // Nested archetypes get their environment from their root.
3224
+ if (auto nested = dyn_cast<NestedArchetypeType>(this )) {
3225
+ return Environment = nested->getRoot ()->getGenericEnvironment ();
3224
3226
}
3225
- llvm_unreachable (" unhandled root archetype kind?!" );
3227
+
3228
+ llvm_unreachable (" Archetype without a generic environment!" );
3226
3229
}
3227
3230
3228
3231
ArchetypeType *ArchetypeType::getRoot () const {
@@ -3261,8 +3264,7 @@ PrimaryArchetypeType::PrimaryArchetypeType(const ASTContext &Ctx,
3261
3264
Type Superclass, LayoutConstraint Layout)
3262
3265
: ArchetypeType(TypeKind::PrimaryArchetype, Ctx,
3263
3266
RecursiveTypeProperties::HasArchetype,
3264
- InterfaceType, ConformsTo, Superclass, Layout),
3265
- Environment(GenericEnv)
3267
+ InterfaceType, ConformsTo, Superclass, Layout, GenericEnv)
3266
3268
{
3267
3269
}
3268
3270
@@ -3274,7 +3276,8 @@ OpenedArchetypeType::OpenedArchetypeType(const ASTContext &Ctx,
3274
3276
: ArchetypeType(TypeKind::OpenedArchetype, Ctx,
3275
3277
RecursiveTypeProperties::HasArchetype
3276
3278
| RecursiveTypeProperties::HasOpenedExistential,
3277
- Type (), ConformsTo, Superclass, Layout),
3279
+ Type (), ConformsTo, Superclass, Layout,
3280
+ /* Environment=*/ nullptr),
3278
3281
Opened(Existential.getPointer()),
3279
3282
ID(uuid)
3280
3283
{
@@ -3288,7 +3291,8 @@ NestedArchetypeType::NestedArchetypeType(const ASTContext &Ctx,
3288
3291
LayoutConstraint Layout)
3289
3292
: ArchetypeType(TypeKind::NestedArchetype, Ctx,
3290
3293
Parent->getRecursiveProperties (),
3291
- InterfaceType, ConformsTo, Superclass, Layout),
3294
+ InterfaceType, ConformsTo, Superclass, Layout,
3295
+ /* Environment=*/ nullptr),
3292
3296
Parent(Parent)
3293
3297
{
3294
3298
}
@@ -3300,8 +3304,8 @@ OpaqueTypeArchetypeType::OpaqueTypeArchetypeType(
3300
3304
ArrayRef<ProtocolDecl*> conformsTo,
3301
3305
Type superclass, LayoutConstraint layout)
3302
3306
: ArchetypeType(TypeKind::OpaqueTypeArchetype, interfaceType->getASTContext (),
3303
- properties, interfaceType, conformsTo, superclass, layout) ,
3304
- Environment( environment)
3307
+ properties, interfaceType, conformsTo, superclass, layout,
3308
+ environment)
3305
3309
{
3306
3310
}
3307
3311
@@ -3315,8 +3319,7 @@ SequenceArchetypeType::SequenceArchetypeType(
3315
3319
LayoutConstraint Layout)
3316
3320
: ArchetypeType(TypeKind::SequenceArchetype, Ctx,
3317
3321
RecursiveTypeProperties::HasArchetype, InterfaceType,
3318
- ConformsTo, Superclass, Layout),
3319
- Environment(GenericEnv) {
3322
+ ConformsTo, Superclass, Layout, GenericEnv) {
3320
3323
assert (cast<GenericTypeParamType>(InterfaceType.getPointer ())->isTypeSequence ());
3321
3324
}
3322
3325
@@ -3328,10 +3331,6 @@ CanType OpaqueTypeArchetypeType::getCanonicalInterfaceType(Type interfaceType) {
3328
3331
->getCanonicalType ();
3329
3332
}
3330
3333
3331
- GenericEnvironment *OpaqueTypeArchetypeType::getGenericEnvironment () const {
3332
- return Environment;
3333
- }
3334
-
3335
3334
OpaqueTypeDecl *OpaqueTypeArchetypeType::getDecl () const {
3336
3335
return Environment->getOpaqueTypeDecl ();
3337
3336
}
0 commit comments