Skip to content

Commit d7ac12a

Browse files
committed
AST: Use TypeTransform::transformDependentMember() to transform DependentMemberType
1 parent a4712d7 commit d7ac12a

File tree

2 files changed

+27
-24
lines changed

2 files changed

+27
-24
lines changed

include/swift/AST/TypeTransform.h

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -658,17 +658,7 @@ case TypeKind::Id:
658658

659659
case TypeKind::DependentMember: {
660660
auto dependent = cast<DependentMemberType>(base);
661-
auto dependentBase = doIt(dependent->getBase(), pos);
662-
if (!dependentBase)
663-
return Type();
664-
665-
if (dependentBase.getPointer() == dependent->getBase().getPointer())
666-
return t;
667-
668-
if (auto assocType = dependent->getAssocType())
669-
return DependentMemberType::get(dependentBase, assocType);
670-
671-
return DependentMemberType::get(dependentBase, dependent->getName());
661+
return asDerived().transformDependentMember(dependent, pos);
672662
}
673663

674664
case TypeKind::GenericFunction:
@@ -1004,6 +994,20 @@ case TypeKind::Id:
1004994

1005995
return PackElementType::get(transformedPack, element->getLevel());
1006996
}
997+
998+
Type transformDependentMember(DependentMemberType *dependent, TypePosition pos) {
999+
auto dependentBase = doIt(dependent->getBase(), pos);
1000+
if (!dependentBase)
1001+
return Type();
1002+
1003+
if (dependentBase.getPointer() == dependent->getBase().getPointer())
1004+
return dependent;
1005+
1006+
if (auto assocType = dependent->getAssocType())
1007+
return DependentMemberType::get(dependentBase, assocType);
1008+
1009+
return DependentMemberType::get(dependentBase, dependent->getName());
1010+
}
10071011
};
10081012

10091013
}

lib/AST/TypeSubstitution.cpp

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,8 @@ class TypeSubstituter : public TypeTransform<TypeSubstituter> {
494494

495495
Type transformPackElement(PackElementType *element, TypePosition pos);
496496

497+
Type transformDependentMember(DependentMemberType *dependent, TypePosition pos);
498+
497499
SubstitutionMap transformSubstitutionMap(SubstitutionMap subs);
498500

499501
CanType transformSILField(CanType fieldTy, TypePosition pos);
@@ -510,19 +512,6 @@ TypeSubstituter::transform(TypeBase *type, TypePosition position) {
510512
"should not be doing AST type-substitution on a lowered SIL type;"
511513
"use SILType::subst");
512514

513-
// We only substitute for substitutable types and dependent member types.
514-
515-
// For dependent member types, we may need to look up the member if the
516-
// base is resolved to a non-dependent type.
517-
if (auto depMemTy = dyn_cast<DependentMemberType>(type)) {
518-
auto newBase = doIt(depMemTy->getBase(), TypePosition::Invariant);
519-
return getMemberForBaseType(IFS,
520-
depMemTy->getBase(), newBase,
521-
depMemTy->getAssocType(),
522-
depMemTy->getName(),
523-
level);
524-
}
525-
526515
auto substOrig = dyn_cast<SubstitutableType>(type);
527516
if (!substOrig)
528517
return std::nullopt;
@@ -593,6 +582,16 @@ Type TypeSubstituter::transformPackElement(PackElementType *element,
593582
return doIt(element->getPackType(), pos);
594583
}
595584

585+
Type TypeSubstituter::transformDependentMember(DependentMemberType *dependent,
586+
TypePosition pos) {
587+
auto newBase = doIt(dependent->getBase(), TypePosition::Invariant);
588+
return getMemberForBaseType(IFS,
589+
dependent->getBase(), newBase,
590+
dependent->getAssocType(),
591+
dependent->getName(),
592+
level);
593+
}
594+
596595
SubstitutionMap TypeSubstituter::transformSubstitutionMap(SubstitutionMap subs) {
597596
// FIXME: Take level into account? Move level down into IFS?
598597
return subs.subst(IFS);

0 commit comments

Comments
 (0)