Skip to content

Commit 7f5eea4

Browse files
committed
AST: Refactor GenericEnvironment::getOrCreateArchetypeFromInterfaceType() to take a Type
1 parent 940ca1e commit 7f5eea4

File tree

2 files changed

+24
-44
lines changed

2 files changed

+24
-44
lines changed

include/swift/AST/GenericEnvironment.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include "swift/AST/GenericParamKey.h"
2222
#include "swift/AST/GenericParamList.h"
2323
#include "swift/AST/GenericSignature.h"
24-
#include "swift/AST/GenericSignatureBuilder.h"
2524
#include "swift/Basic/Compiler.h"
2625
#include "swift/Basic/Debug.h"
2726
#include "llvm/ADT/ArrayRef.h"
@@ -86,8 +85,7 @@ class alignas(1 << DeclAlignInBits) GenericEnvironment final
8685

8786
friend QueryInterfaceTypeSubstitutions;
8887

89-
Type getOrCreateArchetypeFromInterfaceType(
90-
GenericSignatureBuilder::EquivalenceClass *equivClass);
88+
Type getOrCreateArchetypeFromInterfaceType(Type depType);
9189

9290
/// Retrieve the mapping for the given generic parameter, if present.
9391
///

lib/AST/GenericEnvironment.cpp

Lines changed: 23 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,22 @@ Type TypeBase::mapTypeOutOfContext() {
119119
}
120120

121121
Type
122-
GenericEnvironment::getOrCreateArchetypeFromInterfaceType(
123-
GenericSignatureBuilder::EquivalenceClass *equivClass) {
124-
auto genericParams = getGenericParams();
125-
122+
GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
126123
auto &builder = *getGenericSignatureBuilder();
124+
auto resolved =
125+
builder.maybeResolveEquivalenceClass(
126+
depType,
127+
ArchetypeResolutionKind::CompleteWellFormed,
128+
/*wantExactPotentialArchetype=*/false);
129+
if (!resolved)
130+
return ErrorType::get(depType);
131+
132+
if (auto concrete = resolved.getAsConcreteType())
133+
return concrete;
134+
135+
auto *equivClass = resolved.getEquivalenceClass(builder);
136+
137+
auto genericParams = getGenericParams();
127138
Type anchor = equivClass->getAnchor(builder, genericParams);
128139

129140
// If this equivalence class is mapped to a concrete type, produce that
@@ -159,18 +170,12 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(
159170
AssociatedTypeDecl *assocType = nullptr;
160171
ArchetypeType *parentArchetype = nullptr;
161172
if (auto depMemTy = anchor->getAs<DependentMemberType>()) {
162-
// Resolve the equivalence class of the parent.
163-
auto parentEquivClass =
164-
builder.resolveEquivalenceClass(
165-
depMemTy->getBase(),
166-
ArchetypeResolutionKind::CompleteWellFormed);
167-
if (!parentEquivClass)
168-
return ErrorType::get(anchor);
169-
170173
// Map the parent type into this context.
171174
parentArchetype =
172-
getOrCreateArchetypeFromInterfaceType(parentEquivClass)
173-
->castTo<ArchetypeType>();
175+
getOrCreateArchetypeFromInterfaceType(depMemTy->getBase())
176+
->getAs<ArchetypeType>();
177+
if (!parentArchetype)
178+
return ErrorType::get(depMemTy);
174179

175180
// If we already have a nested type with this name, return it.
176181
assocType = depMemTy->getAssocType();
@@ -244,29 +249,12 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(
244249

245250
void ArchetypeType::resolveNestedType(
246251
std::pair<Identifier, Type> &nested) const {
247-
auto genericEnv = getGenericEnvironment();
248-
auto &builder = *genericEnv->getGenericSignatureBuilder();
249-
250252
Type interfaceType = getInterfaceType();
251253
Type memberInterfaceType =
252-
DependentMemberType::get(interfaceType, nested.first);
253-
auto resolved =
254-
builder.maybeResolveEquivalenceClass(
255-
memberInterfaceType,
256-
ArchetypeResolutionKind::CompleteWellFormed,
257-
/*wantExactPotentialArchetype=*/false);
258-
if (!resolved) {
259-
nested.second = ErrorType::get(interfaceType);
260-
return;
261-
}
254+
DependentMemberType::get(interfaceType, nested.first);
262255

263-
Type result;
264-
if (auto concrete = resolved.getAsConcreteType()) {
265-
result = concrete;
266-
} else {
267-
auto *equivClass = resolved.getEquivalenceClass(builder);
268-
result = genericEnv->getOrCreateArchetypeFromInterfaceType(equivClass);
269-
}
256+
Type result = getGenericEnvironment()->getOrCreateArchetypeFromInterfaceType(
257+
memberInterfaceType);
270258

271259
assert(!nested.second ||
272260
nested.second->isEqual(result) ||
@@ -289,14 +277,8 @@ Type QueryInterfaceTypeSubstitutions::operator()(SubstitutableType *type) const{
289277
// If the context type isn't already known, lazily create it.
290278
Type contextType = self->getContextTypes()[index];
291279
if (!contextType) {
292-
auto *builder = self->getGenericSignatureBuilder();
293-
auto equivClass =
294-
builder->resolveEquivalenceClass(
295-
type,
296-
ArchetypeResolutionKind::CompleteWellFormed);
297-
298280
auto mutableSelf = const_cast<GenericEnvironment *>(self);
299-
contextType = mutableSelf->getOrCreateArchetypeFromInterfaceType(equivClass);
281+
contextType = mutableSelf->getOrCreateArchetypeFromInterfaceType(type);
300282

301283
// FIXME: Redundant mapping from key -> index.
302284
if (self->getContextTypes()[index].isNull())

0 commit comments

Comments
 (0)