Skip to content

Commit 8af5bbe

Browse files
committed
AST: Factor out GenericSignatureImpl::getShapeClasses()
1 parent b3cb845 commit 8af5bbe

File tree

3 files changed

+17
-9
lines changed

3 files changed

+17
-9
lines changed

include/swift/AST/GenericSignature.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,9 @@ class alignas(1 << TypeAlignInBits) GenericSignatureImpl final
432432
/// the same shape equivalence class.
433433
bool haveSameShape(Type type1, Type type2) const;
434434

435+
/// Returns all unique shape classes defined by this generic signature.
436+
SmallVector<CanType, 2> getShapeClasses() const;
437+
435438
/// Get the ordinal of a generic parameter in this generic signature.
436439
///
437440
/// For example, if you have a generic signature for a nested context like:

lib/AST/GenericSignature.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,19 @@ GenericSignatureImpl::haveSameShape(Type type1, Type type2) const {
544544
return getRequirementMachine()->haveSameShape(type1, type2);
545545
}
546546

547+
SmallVector<CanType, 2> GenericSignatureImpl::getShapeClasses() const {
548+
SmallSetVector<CanType, 2> result;
549+
550+
forEachParam([&](GenericTypeParamType *gp, bool canonical) {
551+
if (!canonical || !gp->isParameterPack())
552+
return;
553+
554+
result.insert(getReducedShape(gp)->getCanonicalType());
555+
});
556+
557+
return result.takeVector();
558+
}
559+
547560
unsigned GenericParamKey::findIndexIn(
548561
TypeArrayView<GenericTypeParamType> genericParams) const {
549562
// For depth 0, we have random access. We perform the extra checking so that

lib/IRGen/GenProto.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -258,15 +258,7 @@ irgen::enumerateGenericSignatureRequirements(CanGenericSignature signature,
258258
const RequirementCallback &callback) {
259259
if (!signature) return;
260260

261-
// Get all unique pack generic parameter shapes.
262-
SmallSetVector<CanType, 2> packs;
263-
for (auto gp : signature.getGenericParams()) {
264-
if (gp->isParameterPack()) {
265-
packs.insert(signature->getReducedShape(gp)->getCanonicalType());
266-
}
267-
}
268-
269-
for (auto type : packs)
261+
for (auto type : signature->getShapeClasses())
270262
callback(GenericRequirement::forShape(type));
271263

272264
// Get all of the type metadata.

0 commit comments

Comments
 (0)