Skip to content

Commit 3d64f8d

Browse files
committed
AST: Use TypeTransform::transformPackExpansion() to transform PackExpansionType
1 parent 575597d commit 3d64f8d

File tree

2 files changed

+32
-33
lines changed

2 files changed

+32
-33
lines changed

include/swift/AST/TypeTransform.h

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -586,30 +586,8 @@ case TypeKind::Id:
586586
}
587587

588588
case TypeKind::PackExpansion: {
589-
auto expand = cast<PackExpansionType>(base);
590-
591-
// Substitution completely replaces this.
592-
593-
Type transformedPat = doIt(expand->getPatternType(), pos);
594-
if (!transformedPat)
595-
return Type();
596-
597-
Type transformedCount = doIt(expand->getCountType(), TypePosition::Shape);
598-
if (!transformedCount)
599-
return Type();
600-
601-
if (transformedPat.getPointer() == expand->getPatternType().getPointer() &&
602-
transformedCount.getPointer() == expand->getCountType().getPointer())
603-
return t;
604-
605-
// // If we transform the count to a pack type, expand the pattern.
606-
// // This is necessary because of how we piece together types in
607-
// // the constraint system.
608-
// if (auto countPack = transformedCount->getAs<PackType>()) {
609-
// return PackExpansionType::expand(transformedPat, countPack);
610-
// }
611-
612-
return PackExpansionType::get(transformedPat, transformedCount);
589+
auto *expand = cast<PackExpansionType>(base);
590+
return asDerived().transformPackExpansion(expand, pos);
613591
}
614592

615593
case TypeKind::PackElement: {
@@ -1005,8 +983,26 @@ case TypeKind::Id:
1005983
CanType transformSILField(CanType fieldTy, TypePosition pos) {
1006984
return doIt(fieldTy, pos)->getCanonicalType();
1007985
}
986+
987+
Type transformPackExpansion(PackExpansionType *expand, TypePosition pos) {
988+
// Substitution completely replaces this.
989+
990+
Type transformedPat = doIt(expand->getPatternType(), pos);
991+
if (!transformedPat)
992+
return Type();
993+
994+
Type transformedCount = doIt(expand->getCountType(), TypePosition::Shape);
995+
if (!transformedCount)
996+
return Type();
997+
998+
if (transformedPat.getPointer() == expand->getPatternType().getPointer() &&
999+
transformedCount.getPointer() == expand->getCountType().getPointer())
1000+
return expand;
1001+
1002+
return PackExpansionType::get(transformedPat, transformedCount);
1003+
}
10081004
};
10091005

10101006
}
10111007

1012-
#endif
1008+
#endif

lib/AST/TypeSubstitution.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,9 @@ class TypeSubstituter : public TypeTransform<TypeSubstituter> {
488488
TypeSubstituter(unsigned level, InFlightSubstitution &IFS)
489489
: level(level), IFS(IFS) {}
490490

491-
std::optional<Type> transform(TypeBase *type, TypePosition position);
491+
std::optional<Type> transform(TypeBase *type, TypePosition pos);
492+
493+
Type transformPackExpansion(PackExpansionType *expand, TypePosition pos);
492494

493495
SubstitutionMap transformSubstitutionMap(SubstitutionMap subs);
494496

@@ -506,13 +508,6 @@ TypeSubstituter::transform(TypeBase *type, TypePosition position) {
506508
"should not be doing AST type-substitution on a lowered SIL type;"
507509
"use SILType::subst");
508510

509-
if (auto packExpansionTy = dyn_cast<PackExpansionType>(type)) {
510-
auto eltTys = IFS.expandPackExpansionType(packExpansionTy);
511-
if (eltTys.size() == 1)
512-
return eltTys[0];
513-
return Type(PackType::get(packExpansionTy->getASTContext(), eltTys));
514-
}
515-
516511
auto oldLevel = level;
517512
SWIFT_DEFER { level = oldLevel; };
518513

@@ -589,6 +584,14 @@ TypeSubstituter::transform(TypeBase *type, TypePosition position) {
589584
level);
590585
}
591586

587+
Type TypeSubstituter::transformPackExpansion(PackExpansionType *expand,
588+
TypePosition pos) {
589+
auto eltTys = IFS.expandPackExpansionType(expand);
590+
if (eltTys.size() == 1)
591+
return eltTys[0];
592+
return Type(PackType::get(expand->getASTContext(), eltTys));
593+
}
594+
592595
SubstitutionMap TypeSubstituter::transformSubstitutionMap(SubstitutionMap subs) {
593596
// FIXME: Take level into account? Move level down into IFS?
594597
return subs.subst(IFS);

0 commit comments

Comments
 (0)