@@ -119,27 +119,27 @@ Type TypeBase::mapTypeOutOfContext() {
119
119
}
120
120
121
121
Type
122
- GenericSignatureBuilder::EquivalenceClass::getTypeInContext (
123
- GenericSignatureBuilder &builder, GenericEnvironment *genericEnv ) {
124
- auto genericParams = genericEnv-> getGenericParams ();
122
+ GenericEnvironment::getOrCreateArchetypeFromInterfaceType (
123
+ GenericSignatureBuilder::EquivalenceClass *equivClass ) {
124
+ auto genericParams = getGenericParams ();
125
125
126
- // The anchor descr
127
- Type anchor = getAnchor (builder, genericParams);
126
+ auto &builder = * getGenericSignatureBuilder ();
127
+ Type anchor = equivClass-> getAnchor (builder, genericParams);
128
128
129
129
// If this equivalence class is mapped to a concrete type, produce that
130
130
// type.
131
- if (concreteType) {
132
- if (recursiveConcreteType)
131
+ if (equivClass-> concreteType ) {
132
+ if (equivClass-> recursiveConcreteType )
133
133
return ErrorType::get (anchor);
134
134
135
135
// Prevent recursive substitution.
136
- this ->recursiveConcreteType = true ;
136
+ equivClass ->recursiveConcreteType = true ;
137
137
SWIFT_DEFER {
138
- this ->recursiveConcreteType = false ;
138
+ equivClass ->recursiveConcreteType = false ;
139
139
};
140
140
141
- return genericEnv-> mapTypeIntoContext (concreteType,
142
- builder.getLookupConformanceFn ());
141
+ return mapTypeIntoContext (equivClass-> concreteType ,
142
+ builder.getLookupConformanceFn ());
143
143
}
144
144
145
145
// Local function to check whether we have a generic parameter that has
@@ -148,7 +148,7 @@ GenericSignatureBuilder::EquivalenceClass::getTypeInContext(
148
148
auto genericParam = anchor->getAs <GenericTypeParamType>();
149
149
if (!genericParam) return Type ();
150
150
151
- auto type = genericEnv-> getMappingIfPresent (genericParam);
151
+ auto type = getMappingIfPresent (genericParam);
152
152
if (!type) return Type ();
153
153
154
154
// We already have a mapping for this generic parameter in the generic
@@ -169,8 +169,8 @@ GenericSignatureBuilder::EquivalenceClass::getTypeInContext(
169
169
170
170
// Map the parent type into this context.
171
171
parentArchetype =
172
- parentEquivClass-> getTypeInContext (builder, genericEnv )
173
- ->castTo <ArchetypeType>();
172
+ getOrCreateArchetypeFromInterfaceType (parentEquivClass )
173
+ ->castTo <ArchetypeType>();
174
174
175
175
// If we already have a nested type with this name, return it.
176
176
assocType = depMemTy->getAssocType ();
@@ -186,17 +186,17 @@ GenericSignatureBuilder::EquivalenceClass::getTypeInContext(
186
186
}
187
187
188
188
// Substitute into the superclass.
189
- Type superclass = this ->recursiveSuperclassType ? Type () : this ->superclass ;
189
+ Type superclass = (equivClass->recursiveSuperclassType
190
+ ? Type () : equivClass->superclass );
190
191
if (superclass && superclass->hasTypeParameter ()) {
191
192
// Prevent recursive substitution.
192
- this ->recursiveSuperclassType = true ;
193
+ equivClass ->recursiveSuperclassType = true ;
193
194
SWIFT_DEFER {
194
- this ->recursiveSuperclassType = false ;
195
+ equivClass ->recursiveSuperclassType = false ;
195
196
};
196
197
197
- superclass = genericEnv->mapTypeIntoContext (
198
- superclass,
199
- builder.getLookupConformanceFn ());
198
+ superclass = mapTypeIntoContext (superclass,
199
+ builder.getLookupConformanceFn ());
200
200
if (superclass->is <ErrorType>())
201
201
superclass = Type ();
202
202
@@ -210,10 +210,10 @@ GenericSignatureBuilder::EquivalenceClass::getTypeInContext(
210
210
211
211
// Collect the protocol conformances for the archetype.
212
212
SmallVector<ProtocolDecl *, 4 > protos;
213
- for (const auto &conforms : conformsTo) {
213
+ for (const auto &conforms : equivClass-> conformsTo ) {
214
214
auto proto = conforms.first ;
215
215
216
- if (!isConformanceSatisfiedBySuperclass (proto))
216
+ if (!equivClass-> isConformanceSatisfiedBySuperclass (proto))
217
217
protos.push_back (proto);
218
218
}
219
219
@@ -223,18 +223,20 @@ GenericSignatureBuilder::EquivalenceClass::getTypeInContext(
223
223
// Create a nested archetype.
224
224
auto *depMemTy = anchor->castTo <DependentMemberType>();
225
225
archetype = NestedArchetypeType::getNew (ctx, parentArchetype, depMemTy,
226
- protos, superclass, layout);
226
+ protos, superclass,
227
+ equivClass->layout );
227
228
228
229
// Register this archetype with its parent.
229
230
parentArchetype->registerNestedType (assocType->getName (), archetype);
230
231
} else {
231
232
// Create a top-level archetype.
232
233
auto genericParam = anchor->castTo <GenericTypeParamType>();
233
- archetype = PrimaryArchetypeType::getNew (ctx, genericEnv, genericParam,
234
- protos, superclass, layout);
234
+ archetype = PrimaryArchetypeType::getNew (ctx, this , genericParam,
235
+ protos, superclass,
236
+ equivClass->layout );
235
237
236
238
// Register the archetype with the generic environment.
237
- genericEnv-> addMapping (genericParam, archetype);
239
+ addMapping (genericParam, archetype);
238
240
}
239
241
240
242
return archetype;
@@ -263,7 +265,7 @@ void ArchetypeType::resolveNestedType(
263
265
result = concrete;
264
266
} else {
265
267
auto *equivClass = resolved.getEquivalenceClass (builder);
266
- result = equivClass-> getTypeInContext (builder, genericEnv );
268
+ result = genericEnv-> getOrCreateArchetypeFromInterfaceType (equivClass );
267
269
}
268
270
269
271
assert (!nested.second ||
@@ -294,7 +296,7 @@ Type QueryInterfaceTypeSubstitutions::operator()(SubstitutableType *type) const{
294
296
ArchetypeResolutionKind::CompleteWellFormed);
295
297
296
298
auto mutableSelf = const_cast <GenericEnvironment *>(self);
297
- contextType = equivClass-> getTypeInContext (*builder, mutableSelf );
299
+ contextType = mutableSelf-> getOrCreateArchetypeFromInterfaceType (equivClass );
298
300
299
301
// FIXME: Redundant mapping from key -> index.
300
302
if (self->getContextTypes ()[index].isNull ())
0 commit comments