@@ -184,6 +184,7 @@ bool CanType::isReferenceTypeImpl(CanType type, const GenericSignatureImpl *sig,
184184 case TypeKind::OpenedArchetype:
185185 case TypeKind::NestedArchetype:
186186 case TypeKind::OpaqueTypeArchetype:
187+ case TypeKind::SequenceArchetype:
187188 return cast<ArchetypeType>(type)->requiresClass ();
188189 case TypeKind::Protocol:
189190 return cast<ProtocolType>(type)->requiresClass ();
@@ -3062,6 +3063,9 @@ GenericEnvironment *ArchetypeType::getGenericEnvironment() const {
30623063 if (auto opaque = dyn_cast<OpaqueTypeArchetypeType>(root)) {
30633064 return opaque->getGenericEnvironment ();
30643065 }
3066+ if (auto opaque = dyn_cast<SequenceArchetypeType>(root)) {
3067+ return opaque->getGenericEnvironment ();
3068+ }
30653069 llvm_unreachable (" unhandled root archetype kind?!" );
30663070}
30673071
@@ -3145,6 +3149,17 @@ OpaqueTypeArchetypeType::OpaqueTypeArchetypeType(OpaqueTypeDecl *OpaqueDecl,
31453149{
31463150}
31473151
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+
31483163GenericSignature OpaqueTypeArchetypeType::getBoundSignature () const {
31493164 return Environment->getGenericSignature ();
31503165}
@@ -3459,6 +3474,29 @@ PrimaryArchetypeType::getNew(const ASTContext &Ctx,
34593474 Ctx, GenericEnv, InterfaceType, ConformsTo, Superclass, Layout));
34603475}
34613476
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+
34623500bool ArchetypeType::requiresClass () const {
34633501 if (auto layout = getLayoutConstraint ())
34643502 return layout->isClass ();
@@ -4125,6 +4163,9 @@ static Type substType(Type derivedType,
41254163 if (isa<PrimaryArchetypeType>(substOrig))
41264164 return ErrorType::get (type);
41274165
4166+ if (isa<SequenceArchetypeType>(substOrig))
4167+ return ErrorType::get (type);
4168+
41284169 // Opened existentials cannot be substituted in this manner,
41294170 // but if they appear in the original type this is not an
41304171 // error.
@@ -4534,6 +4575,7 @@ case TypeKind::Id:
45344575#include " swift/AST/TypeNodes.def"
45354576 case TypeKind::PrimaryArchetype:
45364577 case TypeKind::OpenedArchetype:
4578+ case TypeKind::SequenceArchetype:
45374579 case TypeKind::Error:
45384580 case TypeKind::Unresolved:
45394581 case TypeKind::TypeVariable:
@@ -5279,7 +5321,8 @@ ReferenceCounting TypeBase::getReferenceCounting() {
52795321 case TypeKind::PrimaryArchetype:
52805322 case TypeKind::OpenedArchetype:
52815323 case TypeKind::NestedArchetype:
5282- case TypeKind::OpaqueTypeArchetype: {
5324+ case TypeKind::OpaqueTypeArchetype:
5325+ case TypeKind::SequenceArchetype: {
52835326 auto archetype = cast<ArchetypeType>(type);
52845327 auto layout = archetype->getLayoutConstraint ();
52855328 (void )layout;
0 commit comments