Skip to content

Commit a4712d7

Browse files
committed
AST: Use TypeTransform::transformPackElement() to transform PackElementType
1 parent 3d64f8d commit a4712d7

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

include/swift/AST/TypeTransform.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -592,15 +592,7 @@ case TypeKind::Id:
592592

593593
case TypeKind::PackElement: {
594594
auto element = cast<PackElementType>(base);
595-
596-
Type transformedPack = doIt(element->getPackType(), pos);
597-
if (!transformedPack)
598-
return Type();
599-
600-
if (transformedPack.getPointer() == element->getPackType().getPointer())
601-
return t;
602-
603-
return PackElementType::get(transformedPack, element->getLevel());
595+
return asDerived().transformPackElement(element, pos);
604596
}
605597

606598
case TypeKind::Tuple: {
@@ -1001,6 +993,17 @@ case TypeKind::Id:
1001993

1002994
return PackExpansionType::get(transformedPat, transformedCount);
1003995
}
996+
997+
Type transformPackElement(PackElementType *element, TypePosition pos) {
998+
Type transformedPack = doIt(element->getPackType(), pos);
999+
if (!transformedPack)
1000+
return Type();
1001+
1002+
if (transformedPack.getPointer() == element->getPackType().getPointer())
1003+
return element;
1004+
1005+
return PackElementType::get(transformedPack, element->getLevel());
1006+
}
10041007
};
10051008

10061009
}

lib/AST/TypeSubstitution.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,8 @@ class TypeSubstituter : public TypeTransform<TypeSubstituter> {
492492

493493
Type transformPackExpansion(PackExpansionType *expand, TypePosition pos);
494494

495+
Type transformPackElement(PackElementType *element, TypePosition pos);
496+
495497
SubstitutionMap transformSubstitutionMap(SubstitutionMap subs);
496498

497499
CanType transformSILField(CanType fieldTy, TypePosition pos);
@@ -508,14 +510,6 @@ TypeSubstituter::transform(TypeBase *type, TypePosition position) {
508510
"should not be doing AST type-substitution on a lowered SIL type;"
509511
"use SILType::subst");
510512

511-
auto oldLevel = level;
512-
SWIFT_DEFER { level = oldLevel; };
513-
514-
if (auto elementTy = dyn_cast<PackElementType>(type)) {
515-
type = elementTy->getPackType().getPointer();
516-
level += elementTy->getLevel();
517-
}
518-
519513
// We only substitute for substitutable types and dependent member types.
520514

521515
// For dependent member types, we may need to look up the member if the
@@ -592,6 +586,13 @@ Type TypeSubstituter::transformPackExpansion(PackExpansionType *expand,
592586
return Type(PackType::get(expand->getASTContext(), eltTys));
593587
}
594588

589+
Type TypeSubstituter::transformPackElement(PackElementType *element,
590+
TypePosition pos) {
591+
SWIFT_DEFER { level -= element->getLevel(); };
592+
level += element->getLevel();
593+
return doIt(element->getPackType(), pos);
594+
}
595+
595596
SubstitutionMap TypeSubstituter::transformSubstitutionMap(SubstitutionMap subs) {
596597
// FIXME: Take level into account? Move level down into IFS?
597598
return subs.subst(IFS);

0 commit comments

Comments
 (0)