@@ -184,6 +184,7 @@ bool CanType::isReferenceTypeImpl(CanType type, const GenericSignatureImpl *sig,
184
184
case TypeKind::OpenedArchetype:
185
185
case TypeKind::NestedArchetype:
186
186
case TypeKind::OpaqueTypeArchetype:
187
+ case TypeKind::SequenceArchetype:
187
188
return cast<ArchetypeType>(type)->requiresClass();
188
189
case TypeKind::Protocol:
189
190
return cast<ProtocolType>(type)->requiresClass();
@@ -3062,6 +3063,9 @@ GenericEnvironment *ArchetypeType::getGenericEnvironment() const {
3062
3063
if (auto opaque = dyn_cast<OpaqueTypeArchetypeType>(root)) {
3063
3064
return opaque->getGenericEnvironment();
3064
3065
}
3066
+ if (auto opaque = dyn_cast<SequenceArchetypeType>(root)) {
3067
+ return opaque->getGenericEnvironment();
3068
+ }
3065
3069
llvm_unreachable("unhandled root archetype kind?!");
3066
3070
}
3067
3071
@@ -3145,6 +3149,17 @@ OpaqueTypeArchetypeType::OpaqueTypeArchetypeType(OpaqueTypeDecl *OpaqueDecl,
3145
3149
{
3146
3150
}
3147
3151
3152
+ SequenceArchetypeType::SequenceArchetypeType(
3153
+ const ASTContext &Ctx, GenericEnvironment *GenericEnv, Type InterfaceType,
3154
+ ArrayRef<ProtocolDecl *> ConformsTo, Type Superclass,
3155
+ LayoutConstraint Layout)
3156
+ : ArchetypeType(TypeKind::SequenceArchetype, Ctx,
3157
+ RecursiveTypeProperties::HasArchetype, InterfaceType,
3158
+ ConformsTo, Superclass, Layout),
3159
+ Environment(GenericEnv) {
3160
+ assert(cast<GenericTypeParamType>(InterfaceType.getPointer())->isTypeSequence());
3161
+ }
3162
+
3148
3163
GenericSignature OpaqueTypeArchetypeType::getBoundSignature() const {
3149
3164
return Environment->getGenericSignature();
3150
3165
}
@@ -3459,6 +3474,29 @@ PrimaryArchetypeType::getNew(const ASTContext &Ctx,
3459
3474
Ctx, GenericEnv, InterfaceType, ConformsTo, Superclass, Layout));
3460
3475
}
3461
3476
3477
+ CanSequenceArchetypeType
3478
+ SequenceArchetypeType::get(const ASTContext &Ctx,
3479
+ GenericEnvironment *GenericEnv,
3480
+ GenericTypeParamType *InterfaceType,
3481
+ SmallVectorImpl<ProtocolDecl *> &ConformsTo,
3482
+ Type Superclass, LayoutConstraint Layout) {
3483
+ assert(!Superclass || Superclass->getClassOrBoundGenericClass());
3484
+ assert(GenericEnv && "missing generic environment for archetype");
3485
+
3486
+ // Gather the set of protocol declarations to which this archetype conforms.
3487
+ ProtocolType::canonicalizeProtocols(ConformsTo);
3488
+
3489
+ auto arena = AllocationArena::Permanent;
3490
+ void *mem =
3491
+ Ctx.Allocate(SequenceArchetypeType::totalSizeToAlloc<ProtocolDecl *, Type,
3492
+ LayoutConstraint>(
3493
+ ConformsTo.size(), Superclass ? 1 : 0, Layout ? 1 : 0),
3494
+ alignof(SequenceArchetypeType), arena);
3495
+
3496
+ return CanSequenceArchetypeType(::new (mem) SequenceArchetypeType(
3497
+ Ctx, GenericEnv, InterfaceType, ConformsTo, Superclass, Layout));
3498
+ }
3499
+
3462
3500
bool ArchetypeType::requiresClass() const {
3463
3501
if (auto layout = getLayoutConstraint())
3464
3502
return layout->isClass();
@@ -4125,6 +4163,9 @@ static Type substType(Type derivedType,
4125
4163
if (isa<PrimaryArchetypeType>(substOrig))
4126
4164
return ErrorType::get(type);
4127
4165
4166
+ if (isa<SequenceArchetypeType>(substOrig))
4167
+ return ErrorType::get(type);
4168
+
4128
4169
// Opened existentials cannot be substituted in this manner,
4129
4170
// but if they appear in the original type this is not an
4130
4171
// error.
@@ -4534,6 +4575,7 @@ case TypeKind::Id:
4534
4575
#include "swift/AST/TypeNodes.def"
4535
4576
case TypeKind::PrimaryArchetype:
4536
4577
case TypeKind::OpenedArchetype:
4578
+ case TypeKind::SequenceArchetype:
4537
4579
case TypeKind::Error:
4538
4580
case TypeKind::Unresolved:
4539
4581
case TypeKind::TypeVariable:
@@ -5279,7 +5321,8 @@ ReferenceCounting TypeBase::getReferenceCounting() {
5279
5321
case TypeKind::PrimaryArchetype:
5280
5322
case TypeKind::OpenedArchetype:
5281
5323
case TypeKind::NestedArchetype:
5282
- case TypeKind::OpaqueTypeArchetype: {
5324
+ case TypeKind::OpaqueTypeArchetype:
5325
+ case TypeKind::SequenceArchetype: {
5283
5326
auto archetype = cast<ArchetypeType>(type);
5284
5327
auto layout = archetype->getLayoutConstraint();
5285
5328
(void)layout;
0 commit comments