Skip to content

Commit 8315120

Browse files
authored
Merge pull request #76051 from slavapestov/archetype-get-parent
AST: Remove ArchetypeType::getParent()
2 parents f7342e7 + 4d2b4f4 commit 8315120

24 files changed

+254
-243
lines changed

include/swift/AST/InFlightSubstitution.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ class InFlightSubstitution {
134134
return Options;
135135
}
136136

137+
bool shouldSubstitutePrimaryArchetypes() const {
138+
return Options.contains(SubstFlags::SubstitutePrimaryArchetypes);
139+
}
140+
137141
bool shouldSubstituteOpaqueArchetypes() const {
138142
return Options.contains(SubstFlags::SubstituteOpaqueArchetypes);
139143
}

include/swift/AST/SubstitutionMap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ class SubstitutionMap {
277277
/// Note that this only finds replacements for maps that are directly
278278
/// stored inside the map. In most cases, you should call Type::subst()
279279
/// instead, since that will resolve member types also.
280-
Type lookupSubstitution(CanSubstitutableType type) const;
280+
Type lookupSubstitution(GenericTypeParamType *type) const;
281281
};
282282

283283
inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,

include/swift/AST/Type.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,13 @@ class MakeAbstractConformanceForGenericType {
117117

118118
/// Flags that can be passed when substituting into a type.
119119
enum class SubstFlags {
120-
/// Allow substitutions to recurse into SILFunctionTypes. Normally,
121-
/// SILType::subst() should be used for lowered types, however in special
122-
/// cases where the substitution is just changing between contextual and
123-
/// interface type representations, using Type::subst() is allowed.
124-
AllowLoweredTypes = 0x01,
125120
/// Map member types to their desugared witness type.
126-
DesugarMemberTypes = 0x02,
121+
DesugarMemberTypes = 0x01,
122+
/// Allow primary archetypes to themselves be the subject of substitution.
123+
/// Otherwise, we map them out of context first.
124+
SubstitutePrimaryArchetypes = 0x02,
127125
/// Allow opaque archetypes to themselves be the subject of substitution,
128-
/// used when erasing them to their underlying types. otherwise, we
126+
/// used when erasing them to their underlying types. Otherwise, we
129127
/// recursively substitute their substitutions, instead, preserving the
130128
/// opaque archetype.
131129
SubstituteOpaqueArchetypes = 0x04,

include/swift/AST/TypeTransform.h

Lines changed: 61 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,6 @@ class TypeTransform {
104104
case TypeKind::Id:
105105
#define TYPE(Id, Parent)
106106
#include "swift/AST/TypeNodes.def"
107-
case TypeKind::PrimaryArchetype:
108-
case TypeKind::OpenedArchetype:
109-
case TypeKind::PackArchetype:
110-
case TypeKind::ElementArchetype:
111107
case TypeKind::Error:
112108
case TypeKind::Unresolved:
113109
case TypeKind::TypeVariable:
@@ -117,9 +113,41 @@ case TypeKind::Id:
117113
case TypeKind::BuiltinTuple:
118114
return t;
119115

116+
case TypeKind::PrimaryArchetype:
117+
case TypeKind::PackArchetype: {
118+
auto *archetype = cast<ArchetypeType>(base);
119+
return asDerived().transformPrimaryArchetypeType(archetype, pos);
120+
}
121+
122+
case TypeKind::OpaqueTypeArchetype: {
123+
auto *opaque = cast<OpaqueTypeArchetypeType>(base);
124+
if (auto result = asDerived().transformOpaqueTypeArchetypeType(opaque, pos))
125+
return *result;
126+
127+
auto subMap = opaque->getSubstitutions();
128+
auto newSubMap = asDerived().transformSubMap(subMap);
129+
if (newSubMap == subMap)
130+
return t;
131+
if (!newSubMap)
132+
return Type();
133+
134+
return OpaqueTypeArchetypeType::get(opaque->getDecl(),
135+
opaque->getInterfaceType(),
136+
newSubMap);
137+
}
138+
139+
case TypeKind::OpenedArchetype:
140+
case TypeKind::ElementArchetype: {
141+
auto *local = cast<LocalArchetypeType>(base);
142+
if (auto result = asDerived().transformLocalArchetypeType(local, pos))
143+
return *result;
144+
145+
return local;
146+
}
147+
120148
case TypeKind::GenericTypeParam: {
121149
auto *param = cast<GenericTypeParamType>(base);
122-
return asDerived().transformGenericTypeParam(param, pos);
150+
return asDerived().transformGenericTypeParamType(param, pos);
123151
}
124152

125153
case TypeKind::Enum:
@@ -140,7 +168,7 @@ case TypeKind::Id:
140168

141169
return t;
142170
}
143-
171+
144172
case TypeKind::SILBlockStorage: {
145173
auto storageTy = cast<SILBlockStorageType>(base);
146174
Type transCap = doIt(storageTy->getCaptureType(),
@@ -194,7 +222,7 @@ case TypeKind::Id:
194222
newSubMap);
195223
return boxTy;
196224
}
197-
225+
198226
case TypeKind::SILFunction: {
199227
auto fnTy = cast<SILFunctionType>(base);
200228

@@ -356,20 +384,6 @@ case TypeKind::Id:
356384

357385
return BoundGenericType::get(bound->getDecl(), substParentTy, substArgs);
358386
}
359-
360-
case TypeKind::OpaqueTypeArchetype: {
361-
auto opaque = cast<OpaqueTypeArchetypeType>(base);
362-
auto subMap = opaque->getSubstitutions();
363-
auto newSubMap = asDerived().transformSubMap(subMap);
364-
if (newSubMap == subMap)
365-
return t;
366-
if (!newSubMap)
367-
return Type();
368-
369-
return OpaqueTypeArchetypeType::get(opaque->getDecl(),
370-
opaque->getInterfaceType(),
371-
newSubMap);
372-
}
373387

374388
case TypeKind::ExistentialMetatype: {
375389
auto meta = cast<ExistentialMetatypeType>(base);
@@ -591,12 +605,12 @@ case TypeKind::Id:
591605

592606
case TypeKind::PackExpansion: {
593607
auto *expand = cast<PackExpansionType>(base);
594-
return asDerived().transformPackExpansion(expand, pos);
608+
return asDerived().transformPackExpansionType(expand, pos);
595609
}
596610

597611
case TypeKind::PackElement: {
598612
auto element = cast<PackElementType>(base);
599-
return asDerived().transformPackElement(element, pos);
613+
return asDerived().transformPackElementType(element, pos);
600614
}
601615

602616
case TypeKind::Tuple: {
@@ -662,7 +676,7 @@ case TypeKind::Id:
662676

663677
case TypeKind::DependentMember: {
664678
auto dependent = cast<DependentMemberType>(base);
665-
return asDerived().transformDependentMember(dependent, pos);
679+
return asDerived().transformDependentMemberType(dependent, pos);
666680
}
667681

668682
case TypeKind::GenericFunction:
@@ -859,7 +873,7 @@ case TypeKind::Id:
859873
auto objectTy = doIt(inout->getObjectType(), TypePosition::Invariant);
860874
if (!objectTy || objectTy->hasError())
861875
return objectTy;
862-
876+
863877
return objectTy.getPointer() == inout->getObjectType().getPointer() ?
864878
t : InOutType::get(objectTy);
865879
}
@@ -892,10 +906,10 @@ case TypeKind::Id:
892906
if (substMember.getPointer() != member.getPointer())
893907
anyChanged = true;
894908
}
895-
909+
896910
if (!anyChanged)
897911
return t;
898-
912+
899913
return ProtocolCompositionType::get(ctx,
900914
substMembers,
901915
pc->getInverses(),
@@ -936,7 +950,7 @@ case TypeKind::Id:
936950
substArgs);
937951
}
938952
}
939-
953+
940954
llvm_unreachable("Unhandled type in transformation");
941955
}
942956

@@ -970,11 +984,11 @@ case TypeKind::Id:
970984
return doIt(fieldTy, pos)->getCanonicalType();
971985
}
972986

973-
Type transformGenericTypeParam(GenericTypeParamType *param, TypePosition pos) {
987+
Type transformGenericTypeParamType(GenericTypeParamType *param, TypePosition pos) {
974988
return param;
975989
}
976990

977-
Type transformPackExpansion(PackExpansionType *expand, TypePosition pos) {
991+
Type transformPackExpansionType(PackExpansionType *expand, TypePosition pos) {
978992
// Substitution completely replaces this.
979993

980994
Type transformedPat = doIt(expand->getPatternType(), pos);
@@ -992,7 +1006,7 @@ case TypeKind::Id:
9921006
return PackExpansionType::get(transformedPat, transformedCount);
9931007
}
9941008

995-
Type transformPackElement(PackElementType *element, TypePosition pos) {
1009+
Type transformPackElementType(PackElementType *element, TypePosition pos) {
9961010
Type transformedPack = doIt(element->getPackType(), pos);
9971011
if (!transformedPack)
9981012
return Type();
@@ -1003,7 +1017,7 @@ case TypeKind::Id:
10031017
return PackElementType::get(transformedPack, element->getLevel());
10041018
}
10051019

1006-
Type transformDependentMember(DependentMemberType *dependent, TypePosition pos) {
1020+
Type transformDependentMemberType(DependentMemberType *dependent, TypePosition pos) {
10071021
auto dependentBase = doIt(dependent->getBase(), pos);
10081022
if (!dependentBase)
10091023
return Type();
@@ -1016,6 +1030,21 @@ case TypeKind::Id:
10161030

10171031
return DependentMemberType::get(dependentBase, dependent->getName());
10181032
}
1033+
1034+
Type transformPrimaryArchetypeType(ArchetypeType *primary,
1035+
TypePosition pos) {
1036+
return primary;
1037+
}
1038+
1039+
std::optional<Type> transformOpaqueTypeArchetypeType(OpaqueTypeArchetypeType *opaque,
1040+
TypePosition pos) {
1041+
return std::nullopt;
1042+
}
1043+
1044+
std::optional<Type> transformLocalArchetypeType(LocalArchetypeType *opaque,
1045+
TypePosition pos) {
1046+
return std::nullopt;
1047+
}
10191048
};
10201049

10211050
}

include/swift/AST/Types.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4803,8 +4803,7 @@ class SILFunctionConventions;
48034803

48044804

48054805
CanType substOpaqueTypesWithUnderlyingTypes(CanType type,
4806-
TypeExpansionContext context,
4807-
bool allowLoweredTypes = false);
4806+
TypeExpansionContext context);
48084807
ProtocolConformanceRef
48094808
substOpaqueTypesWithUnderlyingTypes(ProtocolConformanceRef ref, Type origType,
48104809
TypeExpansionContext context);
@@ -6575,10 +6574,6 @@ class ArchetypeType : public SubstitutableType,
65756574
/// which the archetype conforms.
65766575
Type getNestedTypeByName(Identifier name);
65776576

6578-
/// Retrieve the parent of this archetype, or null if this is a
6579-
/// primary archetype.
6580-
ArchetypeType *getParent() const;
6581-
65826577
/// Return the archetype that represents the root generic parameter of its
65836578
/// interface type.
65846579
ArchetypeType *getRoot() const;

0 commit comments

Comments
 (0)