@@ -119,11 +119,22 @@ Type TypeBase::mapTypeOutOfContext() {
119119}
120120
121121Type
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
245250void 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