Skip to content

Commit 6ae6ab9

Browse files
committed
Make opaque type archetypes root- and nested-type agnostic
1 parent 8595ebf commit 6ae6ab9

File tree

8 files changed

+27
-18
lines changed

8 files changed

+27
-18
lines changed

include/swift/AST/Types.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5547,10 +5547,12 @@ class OpaqueTypeArchetypeType final : public ArchetypeType,
55475547

55485548
public:
55495549
/// Get an opaque archetype representing the underlying type of the given
5550-
/// opaque type decl's opaque param with ordinal `ordinal`. For example, in
5551-
/// `(some P, some Q)`, `some P`'s type param would have ordinal 0 and `some
5552-
/// Q`'s type param would have ordinal 1.
5553-
static Type get(OpaqueTypeDecl *decl, unsigned ordinal, SubstitutionMap subs);
5550+
/// opaque type decl's interface type. For example, in
5551+
/// `(some P, some Q)`, `some P`'s interface type would be the generic
5552+
/// parameter with index 0, and `some Q`'s interface type would be the
5553+
/// generic parameter with index 1.
5554+
static Type get(OpaqueTypeDecl *decl, Type interfaceType,
5555+
SubstitutionMap subs);
55545556

55555557
/// Retrieve the opaque type declaration.
55565558
OpaqueTypeDecl *getDecl() const;

lib/AST/ASTContext.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4244,7 +4244,7 @@ OpaqueTypeArchetypeType *OpaqueTypeArchetypeType::getNew(
42444244
}
42454245

42464246
Type OpaqueTypeArchetypeType::get(
4247-
OpaqueTypeDecl *Decl, unsigned ordinal, SubstitutionMap Substitutions) {
4247+
OpaqueTypeDecl *Decl, Type interfaceType, SubstitutionMap Substitutions) {
42484248
// TODO: We could attempt to preserve type sugar in the substitution map.
42494249
// Currently archetypes are assumed to be always canonical in many places,
42504250
// though, so doing so would require fixing those places.
@@ -4265,8 +4265,7 @@ Type OpaqueTypeArchetypeType::get(
42654265
environments[{Decl, Substitutions}] = env;
42664266
}
42674267

4268-
auto opaqueParamType = Decl->getOpaqueGenericParams()[ordinal];
4269-
return env->getOrCreateArchetypeFromInterfaceType(opaqueParamType);
4268+
return env->getOrCreateArchetypeFromInterfaceType(interfaceType);
42704269
}
42714270

42724271
CanOpenedArchetypeType OpenedArchetypeType::get(Type existential,

lib/AST/ASTDemangler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,8 @@ Type ASTBuilder::resolveOpaqueType(NodePointer opaqueDescriptor,
274274
SubstitutionMap subs = createSubstitutionMapFromGenericArgs(
275275
opaqueDecl->getGenericSignature(), allArgs,
276276
LookUpConformanceInModule(parentModule));
277-
return OpaqueTypeArchetypeType::get(opaqueDecl, ordinal, subs);
277+
Type interfaceType = opaqueDecl->getOpaqueGenericParams()[ordinal];
278+
return OpaqueTypeArchetypeType::get(opaqueDecl, interfaceType, subs);
278279
}
279280

280281
// TODO: named opaque types

lib/AST/Type.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4922,7 +4922,8 @@ case TypeKind::Id:
49224922
return newSubs[index];
49234923
},
49244924
LookUpConformanceInModule(opaque->getDecl()->getModuleContext()));
4925-
return OpaqueTypeArchetypeType::get(opaque->getDecl(), opaque->getOrdinal(),
4925+
return OpaqueTypeArchetypeType::get(opaque->getDecl(),
4926+
opaque->getInterfaceType(),
49264927
newSubMap);
49274928
}
49284929
case TypeKind::NestedArchetype: {

lib/Sema/TypeCheckType.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,8 @@ static Type getIdentityOpaqueTypeArchetypeType(
295295
if (outerGenericSignature)
296296
subs = outerGenericSignature->getIdentitySubstitutionMap();
297297

298-
return OpaqueTypeArchetypeType::get(opaqueDecl, ordinal, subs);
298+
Type interfaceType = opaqueDecl->getOpaqueGenericParams()[ordinal];
299+
return OpaqueTypeArchetypeType::get(opaqueDecl, interfaceType, subs);
299300
}
300301

301302
Type TypeResolution::resolveTypeInContext(TypeDecl *typeDecl,
@@ -2127,7 +2128,7 @@ NeverNullType TypeResolver::resolveType(TypeRepr *repr,
21272128
subs = outerGenericSignature->getIdentitySubstitutionMap();
21282129

21292130
return OpaqueTypeArchetypeType::get(
2130-
opaqueDecl, gpDecl->getIndex(), subs);
2131+
opaqueDecl, gpDecl->getDeclaredInterfaceType(), subs);
21312132
}
21322133
}
21332134

lib/Serialization/Deserialization.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5513,21 +5513,26 @@ class TypeDeserializer {
55135513
Expected<Type> deserializeOpaqueArchetypeType(ArrayRef<uint64_t> scratch,
55145514
StringRef blobData) {
55155515
DeclID opaqueDeclID;
5516-
unsigned ordinal;
5516+
TypeID interfaceTypeID;
55175517
SubstitutionMapID subsID;
55185518
decls_block::OpaqueArchetypeTypeLayout::readRecord(
5519-
scratch, opaqueDeclID, ordinal, subsID);
5519+
scratch, opaqueDeclID, interfaceTypeID, subsID);
55205520

55215521
auto opaqueTypeOrError = MF.getDeclChecked(opaqueDeclID);
55225522
if (!opaqueTypeOrError)
55235523
return opaqueTypeOrError.takeError();
55245524

5525+
auto interfaceTypeOrError = MF.getTypeChecked(interfaceTypeID);
5526+
if (!interfaceTypeOrError)
5527+
return interfaceTypeOrError.takeError();
5528+
55255529
auto opaqueDecl = cast<OpaqueTypeDecl>(opaqueTypeOrError.get());
55265530
auto subsOrError = MF.getSubstitutionMapChecked(subsID);
55275531
if (!subsOrError)
55285532
return subsOrError.takeError();
55295533

5530-
return OpaqueTypeArchetypeType::get(opaqueDecl, ordinal, subsOrError.get());
5534+
return OpaqueTypeArchetypeType::get(
5535+
opaqueDecl, interfaceTypeOrError.get(), subsOrError.get());
55315536
}
55325537

55335538
Expected<Type> deserializeNestedArchetypeType(ArrayRef<uint64_t> scratch,

lib/Serialization/ModuleFormat.h

Lines changed: 2 additions & 2 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 = 656; // enable explicit existentials
59+
const uint16_t SWIFTMODULE_VERSION_MINOR = 657; // opaque interface type
6060

6161
/// A standard hash seed used for all string hashes in a serialized module.
6262
///
@@ -1084,7 +1084,7 @@ namespace decls_block {
10841084
using OpaqueArchetypeTypeLayout = BCRecordLayout<
10851085
OPAQUE_ARCHETYPE_TYPE,
10861086
DeclIDField, // the opaque type decl
1087-
BCVBR<4>, // the ordinal
1087+
TypeIDField, // the interface type
10881088
SubstitutionMapIDField // the arguments
10891089
>;
10901090

lib/Serialization/Serialization.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4482,11 +4482,11 @@ class Serializer::TypeSerializer : public TypeVisitor<TypeSerializer> {
44824482
visitOpaqueTypeArchetypeType(const OpaqueTypeArchetypeType *archetypeTy) {
44834483
using namespace decls_block;
44844484
auto declID = S.addDeclRef(archetypeTy->getDecl());
4485+
auto interfaceTypeID = S.addTypeRef(archetypeTy->getInterfaceType());
44854486
auto substMapID = S.addSubstitutionMapRef(archetypeTy->getSubstitutions());
44864487
unsigned abbrCode = S.DeclTypeAbbrCodes[OpaqueArchetypeTypeLayout::Code];
44874488
OpaqueArchetypeTypeLayout::emitRecord(S.Out, S.ScratchRecord, abbrCode,
4488-
declID, archetypeTy->getOrdinal(),
4489-
substMapID);
4489+
declID, interfaceTypeID, substMapID);
44904490
}
44914491

44924492
void visitNestedArchetypeType(const NestedArchetypeType *archetypeTy) {

0 commit comments

Comments
 (0)