Skip to content

Commit ac4d26d

Browse files
committed
Generalize (Primary|Sequence)ArchetypeType to arbitrary interface types.
As another step toward eliminating NestedArchetypeType, generalize the representation, construction, and serialization of primary and sequence archetypes to interface types, rather than generic parameter types.
1 parent 50fd5b5 commit ac4d26d

File tree

7 files changed

+45
-46
lines changed

7 files changed

+45
-46
lines changed

include/swift/AST/Types.h

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5512,14 +5512,10 @@ class PrimaryArchetypeType final : public ArchetypeType,
55125512
static CanTypeWrapper<PrimaryArchetypeType>
55135513
getNew(const ASTContext &Ctx,
55145514
GenericEnvironment *GenericEnv,
5515-
GenericTypeParamType *InterfaceType,
5515+
Type InterfaceType,
55165516
SmallVectorImpl<ProtocolDecl *> &ConformsTo,
55175517
Type Superclass, LayoutConstraint Layout);
55185518

5519-
GenericTypeParamType *getInterfaceType() const {
5520-
return cast<GenericTypeParamType>(InterfaceType.getPointer());
5521-
}
5522-
55235519
static bool classof(const TypeBase *T) {
55245520
return T->getKind() == TypeKind::PrimaryArchetype;
55255521
}
@@ -5743,14 +5739,10 @@ class SequenceArchetypeType final
57435739
/// by this routine.
57445740
static CanTypeWrapper<SequenceArchetypeType>
57455741
get(const ASTContext &Ctx, GenericEnvironment *GenericEnv,
5746-
GenericTypeParamType *InterfaceType,
5742+
Type InterfaceType,
57475743
SmallVectorImpl<ProtocolDecl *> &ConformsTo, Type Superclass,
57485744
LayoutConstraint Layout);
57495745

5750-
GenericTypeParamType *getInterfaceType() const {
5751-
return cast<GenericTypeParamType>(InterfaceType.getPointer());
5752-
}
5753-
57545746
static bool classof(const TypeBase *T) {
57555747
return T->getKind() == TypeKind::SequenceArchetype;
57565748
}

lib/AST/ASTPrinter.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5923,8 +5923,20 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
59235923
printArchetypeCommon(T, T->getAssocType());
59245924
}
59255925

5926+
static AbstractTypeParamDecl *getAbstractTypeParamDecl(ArchetypeType *T) {
5927+
if (auto gp = T->getInterfaceType()->getAs<GenericTypeParamType>()) {
5928+
return gp->getDecl();
5929+
}
5930+
5931+
auto depMemTy = T->getInterfaceType()->castTo<DependentMemberType>();
5932+
return depMemTy->getAssocType();
5933+
}
5934+
59265935
void visitPrimaryArchetypeType(PrimaryArchetypeType *T) {
5927-
printArchetypeCommon(T, T->getInterfaceType()->getDecl());
5936+
if (auto parent = T->getParent())
5937+
visitParentType(parent);
5938+
5939+
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
59285940
}
59295941

59305942
void visitOpaqueTypeArchetypeType(OpaqueTypeArchetypeType *T) {
@@ -5996,7 +6008,9 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
59966008
}
59976009

59986010
void visitSequenceArchetypeType(SequenceArchetypeType *T) {
5999-
printArchetypeCommon(T, T->getInterfaceType()->getDecl());
6011+
if (auto parent = T->getParent())
6012+
visitParentType(parent);
6013+
printArchetypeCommon(T, getAbstractTypeParamDecl(T));
60006014
}
60016015

60026016
void visitGenericTypeParamType(GenericTypeParamType *T) {

lib/AST/GenericEnvironment.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,21 +307,21 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
307307
requirements.layout, this);
308308
getOrCreateNestedTypeStorage()[nestedDependentMemberType] = result;
309309
} else if (genericParam->isTypeSequence()) {
310-
result = SequenceArchetypeType::get(ctx, this, genericParam,
310+
result = SequenceArchetypeType::get(ctx, this, requirements.anchor,
311311
requirements.protos, superclass,
312312
requirements.layout);
313313
addMapping(genericParam, result);
314314
} else {
315315
switch (getKind()) {
316316
case Kind::Normal:
317317
case Kind::OpenedExistential:
318-
result = PrimaryArchetypeType::getNew(ctx, this, genericParam,
318+
result = PrimaryArchetypeType::getNew(ctx, this, requirements.anchor,
319319
requirements.protos, superclass,
320320
requirements.layout);
321321
break;
322322

323323
case Kind::Opaque:
324-
result = OpaqueTypeArchetypeType::getNew(this, genericParam,
324+
result = OpaqueTypeArchetypeType::getNew(this, requirements.anchor,
325325
requirements.protos, superclass,
326326
requirements.layout);
327327
break;

lib/AST/Type.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3625,7 +3625,7 @@ CanNestedArchetypeType NestedArchetypeType::getNew(
36253625
CanPrimaryArchetypeType
36263626
PrimaryArchetypeType::getNew(const ASTContext &Ctx,
36273627
GenericEnvironment *GenericEnv,
3628-
GenericTypeParamType *InterfaceType,
3628+
Type InterfaceType,
36293629
SmallVectorImpl<ProtocolDecl *> &ConformsTo,
36303630
Type Superclass,
36313631
LayoutConstraint Layout) {
@@ -3648,7 +3648,7 @@ PrimaryArchetypeType::getNew(const ASTContext &Ctx,
36483648
CanSequenceArchetypeType
36493649
SequenceArchetypeType::get(const ASTContext &Ctx,
36503650
GenericEnvironment *GenericEnv,
3651-
GenericTypeParamType *InterfaceType,
3651+
Type InterfaceType,
36523652
SmallVectorImpl<ProtocolDecl *> &ConformsTo,
36533653
Type Superclass, LayoutConstraint Layout) {
36543654
assert(!Superclass || Superclass->getClassOrBoundGenericClass());

lib/Serialization/Deserialization.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5480,19 +5480,21 @@ class TypeDeserializer {
54805480
Expected<Type> deserializePrimaryArchetypeType(ArrayRef<uint64_t> scratch,
54815481
StringRef blobData) {
54825482
GenericSignatureID sigID;
5483-
unsigned depth, index;
5483+
TypeID interfaceTypeID;
54845484

54855485
decls_block::PrimaryArchetypeTypeLayout::readRecord(scratch, sigID,
5486-
depth, index);
5486+
interfaceTypeID);
54875487

5488-
auto sig = MF.getGenericSignature(sigID);
5489-
if (!sig)
5490-
MF.fatal();
5488+
auto sigOrError = MF.getGenericSignatureChecked(sigID);
5489+
if (!sigOrError)
5490+
return sigOrError.takeError();
54915491

5492-
Type interfaceType =
5493-
GenericTypeParamType::get(/*type sequence*/ false, depth, index, ctx);
5494-
Type contextType = sig.getGenericEnvironment()
5495-
->mapTypeIntoContext(interfaceType);
5492+
auto interfaceTypeOrError = MF.getTypeChecked(interfaceTypeID);
5493+
if (!interfaceTypeOrError)
5494+
return interfaceTypeOrError.takeError();
5495+
5496+
Type contextType = sigOrError.get().getGenericEnvironment()
5497+
->mapTypeIntoContext(interfaceTypeOrError.get());
54965498

54975499
if (contextType->hasError())
54985500
MF.fatal();
@@ -5549,17 +5551,16 @@ class TypeDeserializer {
55495551
Expected<Type> deserializeSequenceArchetypeType(ArrayRef<uint64_t> scratch,
55505552
StringRef blobData) {
55515553
GenericSignatureID sigID;
5552-
unsigned depth, index;
5554+
TypeID interfaceTypeID;
55535555

5554-
decls_block::SequenceArchetypeTypeLayout::readRecord(scratch, sigID, depth,
5555-
index);
5556+
decls_block::SequenceArchetypeTypeLayout::readRecord(scratch, sigID,
5557+
interfaceTypeID);
55565558

55575559
auto sig = MF.getGenericSignature(sigID);
55585560
if (!sig)
55595561
MF.fatal();
55605562

5561-
Type interfaceType =
5562-
GenericTypeParamType::get(/*type sequence*/ true, depth, index, ctx);
5563+
Type interfaceType = MF.getType(interfaceTypeID);
55635564
Type contextType =
55645565
sig.getGenericEnvironment()->mapTypeIntoContext(interfaceType);
55655566

lib/Serialization/ModuleFormat.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5656
/// describe what change you made. The content of this comment isn't important;
5757
/// it just ensures a conflict if two people change the module format.
5858
/// Don't worry about adhering to the 80-column limit for this line.
59-
const uint16_t SWIFTMODULE_VERSION_MINOR = 657; // opaque interface type
59+
const uint16_t SWIFTMODULE_VERSION_MINOR = 658; // primary archetype interface type
6060

6161
/// A standard hash seed used for all string hashes in a serialized module.
6262
///
@@ -1072,8 +1072,7 @@ namespace decls_block {
10721072
using PrimaryArchetypeTypeLayout = BCRecordLayout<
10731073
PRIMARY_ARCHETYPE_TYPE,
10741074
GenericSignatureIDField, // generic environment
1075-
BCVBR<4>, // generic type parameter depth
1076-
BCVBR<4> // index + 1, or zero if we have a generic type parameter decl
1075+
TypeIDField // interface type
10771076
>;
10781077

10791078
using OpenedArchetypeTypeLayout = BCRecordLayout<
@@ -1097,9 +1096,7 @@ namespace decls_block {
10971096
using SequenceArchetypeTypeLayout = BCRecordLayout<
10981097
SEQUENCE_ARCHETYPE_TYPE,
10991098
GenericSignatureIDField, // generic environment
1100-
BCVBR<4>, // generic type parameter depth
1101-
BCVBR<4> // index + 1, or zero if we have a generic type
1102-
// parameter decl
1099+
TypeIDField // interface type
11031100
>;
11041101

11051102
using DynamicSelfTypeLayout = BCRecordLayout<

lib/Serialization/Serialization.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4462,14 +4462,11 @@ class Serializer::TypeSerializer : public TypeVisitor<TypeSerializer> {
44624462
auto sig = archetypeTy->getGenericEnvironment()->getGenericSignature();
44634463

44644464
GenericSignatureID sigID = S.addGenericSignatureRef(sig);
4465-
auto interfaceType = archetypeTy->getInterfaceType()
4466-
->castTo<GenericTypeParamType>();
4465+
TypeID interfaceTypeID = S.addTypeRef(archetypeTy->getInterfaceType());
44674466

44684467
unsigned abbrCode = S.DeclTypeAbbrCodes[PrimaryArchetypeTypeLayout::Code];
44694468
PrimaryArchetypeTypeLayout::emitRecord(S.Out, S.ScratchRecord, abbrCode,
4470-
sigID,
4471-
interfaceType->getDepth(),
4472-
interfaceType->getIndex());
4469+
sigID, interfaceTypeID);
44734470
}
44744471

44754472
void visitOpenedArchetypeType(const OpenedArchetypeType *archetypeTy) {
@@ -4503,13 +4500,11 @@ class Serializer::TypeSerializer : public TypeVisitor<TypeSerializer> {
45034500
auto sig = archetypeTy->getGenericEnvironment()->getGenericSignature();
45044501

45054502
GenericSignatureID sigID = S.addGenericSignatureRef(sig);
4506-
auto interfaceType =
4507-
archetypeTy->getInterfaceType()->castTo<GenericTypeParamType>();
4503+
TypeID interfaceTypeID = S.addTypeRef(archetypeTy->getInterfaceType());
45084504

45094505
unsigned abbrCode = S.DeclTypeAbbrCodes[SequenceArchetypeTypeLayout::Code];
45104506
SequenceArchetypeTypeLayout::emitRecord(S.Out, S.ScratchRecord, abbrCode,
4511-
sigID, interfaceType->getDepth(),
4512-
interfaceType->getIndex());
4507+
sigID, interfaceTypeID);
45134508
}
45144509

45154510
void visitGenericTypeParamType(const GenericTypeParamType *genericParam) {

0 commit comments

Comments
 (0)