@@ -342,6 +342,11 @@ struct ASTContext::Implementation {
342
342
llvm::DenseMap<std::pair<CanType, const GenericSignatureImpl *>, CanGenericSignature>
343
343
ExistentialSignatures;
344
344
345
+ // / The element signature for a generic signature, constructed by dropping
346
+ // / @_typeSequence attributes from generic parameters.
347
+ llvm::DenseMap<const GenericSignatureImpl *,
348
+ CanGenericSignature> ElementSignatures;
349
+
345
350
// / Overridden declarations.
346
351
llvm::DenseMap<const ValueDecl *, ArrayRef<ValueDecl *>> Overrides;
347
352
@@ -5256,6 +5261,76 @@ ASTContext::getOpenedExistentialSignature(Type type, GenericSignature parentSig)
5256
5261
return canGenericSig;
5257
5262
}
5258
5263
5264
+ CanGenericSignature
5265
+ ASTContext::getOpenedElementSignature (CanGenericSignature baseGenericSig) {
5266
+ auto &sigs = getImpl ().ElementSignatures ;
5267
+ auto found = sigs.find (baseGenericSig.getPointer ());
5268
+ if (found != sigs.end ())
5269
+ return found->second ;
5270
+
5271
+ // This operation doesn't make sense if the input signature does not contain`
5272
+ // any pack generic parameters.
5273
+ #ifndef NDEBUG
5274
+ {
5275
+ auto found = std::find_if (baseGenericSig.getGenericParams ().begin (),
5276
+ baseGenericSig.getGenericParams ().end (),
5277
+ [](GenericTypeParamType *paramType) {
5278
+ return paramType->isTypeSequence ();
5279
+ });
5280
+ assert (found != baseGenericSig.getGenericParams ().end ());
5281
+ }
5282
+ #endif
5283
+
5284
+ SmallVector<GenericTypeParamType *, 2 > genericParams;
5285
+ SmallVector<Requirement, 2 > requirements;
5286
+
5287
+ auto eraseTypeSequence = [&](GenericTypeParamType *paramType) {
5288
+ return GenericTypeParamType::get (
5289
+ paramType->getDepth (), paramType->getIndex (),
5290
+ /* isTypeSequence=*/ false , *this );
5291
+ };
5292
+
5293
+ for (auto paramType : baseGenericSig.getGenericParams ()) {
5294
+ genericParams.push_back (eraseTypeSequence (paramType));
5295
+ }
5296
+
5297
+ auto eraseTypeSequenceRec = [&](Type type) -> Type {
5298
+ return type.transformRec ([&](Type t) -> Optional<Type> {
5299
+ if (auto *paramType = t->getAs <GenericTypeParamType>())
5300
+ return Type (eraseTypeSequence (paramType));
5301
+ return None;
5302
+ });
5303
+ };
5304
+
5305
+ for (auto requirement : baseGenericSig.getRequirements ()) {
5306
+ switch (requirement.getKind ()) {
5307
+ case RequirementKind::SameCount:
5308
+ // Drop same-length requirements from the element signature.
5309
+ break ;
5310
+ case RequirementKind::Conformance:
5311
+ case RequirementKind::Superclass:
5312
+ case RequirementKind::SameType:
5313
+ requirements.emplace_back (
5314
+ requirement.getKind (),
5315
+ eraseTypeSequenceRec (requirement.getFirstType ()),
5316
+ eraseTypeSequenceRec (requirement.getSecondType ()));
5317
+ break ;
5318
+ case RequirementKind::Layout:
5319
+ requirements.emplace_back (
5320
+ requirement.getKind (),
5321
+ eraseTypeSequenceRec (requirement.getFirstType ()),
5322
+ requirement.getLayoutConstraint ());
5323
+ break ;
5324
+ }
5325
+ }
5326
+
5327
+ auto elementSig = buildGenericSignature (
5328
+ *this , GenericSignature (), genericParams, requirements)
5329
+ .getCanonicalSignature ();
5330
+ sigs[baseGenericSig.getPointer ()] = elementSig;
5331
+ return elementSig;
5332
+ }
5333
+
5259
5334
GenericSignature
5260
5335
ASTContext::getOverrideGenericSignature (const ValueDecl *base,
5261
5336
const ValueDecl *derived) {
0 commit comments