Skip to content

Commit 22dc988

Browse files
committed
AST: Stub out ASTContext::getOpenedElementSignature()
1 parent 5c32f21 commit 22dc988

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

include/swift/AST/ASTContext.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,6 +1346,13 @@ class ASTContext final {
13461346
CanGenericSignature getOpenedExistentialSignature(Type type,
13471347
GenericSignature parentSig);
13481348

1349+
/// Get a generic signature where the generic parameter τ_d_i represents
1350+
/// the element of the pack generic parameter τ_d_i… in \p baseGenericSig.
1351+
///
1352+
/// This drops the @_typeSequence attribute from each generic parameter,
1353+
/// and converts same-element requirements to same-type requirements.
1354+
CanGenericSignature getOpenedElementSignature(CanGenericSignature baseGenericSig);
1355+
13491356
GenericSignature getOverrideGenericSignature(const ValueDecl *base,
13501357
const ValueDecl *derived);
13511358

lib/AST/ASTContext.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,11 @@ struct ASTContext::Implementation {
342342
llvm::DenseMap<std::pair<CanType, const GenericSignatureImpl *>, CanGenericSignature>
343343
ExistentialSignatures;
344344

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+
345350
/// Overridden declarations.
346351
llvm::DenseMap<const ValueDecl *, ArrayRef<ValueDecl *>> Overrides;
347352

@@ -5256,6 +5261,76 @@ ASTContext::getOpenedExistentialSignature(Type type, GenericSignature parentSig)
52565261
return canGenericSig;
52575262
}
52585263

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+
52595334
GenericSignature
52605335
ASTContext::getOverrideGenericSignature(const ValueDecl *base,
52615336
const ValueDecl *derived) {

0 commit comments

Comments
 (0)