@@ -119,11 +119,22 @@ Type TypeBase::mapTypeOutOfContext() {
119
119
}
120
120
121
121
Type
122
- GenericEnvironment::getOrCreateArchetypeFromInterfaceType (
123
- GenericSignatureBuilder::EquivalenceClass *equivClass) {
124
- auto genericParams = getGenericParams ();
125
-
122
+ GenericEnvironment::getOrCreateArchetypeFromInterfaceType (Type depType) {
126
123
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 ();
127
138
Type anchor = equivClass->getAnchor (builder, genericParams);
128
139
129
140
// If this equivalence class is mapped to a concrete type, produce that
@@ -159,18 +170,12 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(
159
170
AssociatedTypeDecl *assocType = nullptr ;
160
171
ArchetypeType *parentArchetype = nullptr ;
161
172
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
-
170
173
// Map the parent type into this context.
171
174
parentArchetype =
172
- getOrCreateArchetypeFromInterfaceType (parentEquivClass)
173
- ->castTo <ArchetypeType>();
175
+ getOrCreateArchetypeFromInterfaceType (depMemTy->getBase ())
176
+ ->getAs <ArchetypeType>();
177
+ if (!parentArchetype)
178
+ return ErrorType::get (depMemTy);
174
179
175
180
// If we already have a nested type with this name, return it.
176
181
assocType = depMemTy->getAssocType ();
@@ -244,29 +249,12 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(
244
249
245
250
void ArchetypeType::resolveNestedType (
246
251
std::pair<Identifier, Type> &nested) const {
247
- auto genericEnv = getGenericEnvironment ();
248
- auto &builder = *genericEnv->getGenericSignatureBuilder ();
249
-
250
252
Type interfaceType = getInterfaceType ();
251
253
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 );
262
255
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);
270
258
271
259
assert (!nested.second ||
272
260
nested.second ->isEqual (result) ||
@@ -289,14 +277,8 @@ Type QueryInterfaceTypeSubstitutions::operator()(SubstitutableType *type) const{
289
277
// If the context type isn't already known, lazily create it.
290
278
Type contextType = self->getContextTypes ()[index];
291
279
if (!contextType) {
292
- auto *builder = self->getGenericSignatureBuilder ();
293
- auto equivClass =
294
- builder->resolveEquivalenceClass (
295
- type,
296
- ArchetypeResolutionKind::CompleteWellFormed);
297
-
298
280
auto mutableSelf = const_cast <GenericEnvironment *>(self);
299
- contextType = mutableSelf->getOrCreateArchetypeFromInterfaceType (equivClass );
281
+ contextType = mutableSelf->getOrCreateArchetypeFromInterfaceType (type );
300
282
301
283
// FIXME: Redundant mapping from key -> index.
302
284
if (self->getContextTypes ()[index].isNull ())
0 commit comments