15
15
// ===----------------------------------------------------------------------===//
16
16
17
17
#include " swift/AST/GenericEnvironment.h"
18
+ #include " swift/AST/GenericSignature.h"
18
19
#include " swift/AST/ASTContext.h"
19
- #include " swift/AST/GenericSignatureBuilder.h"
20
20
#include " swift/AST/ProtocolConformance.h"
21
21
#include " swift/Basic/Defer.h"
22
- #include " GenericSignatureBuilderImpl.h"
23
22
24
23
using namespace swift ;
25
24
@@ -56,16 +55,6 @@ GenericEnvironment::GenericEnvironment(GenericSignature signature)
56
55
Type ());
57
56
}
58
57
59
- GenericSignatureBuilder *GenericEnvironment::getGenericSignatureBuilder () const {
60
- if (Builder)
61
- return Builder;
62
-
63
- const_cast <GenericEnvironment *>(this )->Builder
64
- = Signature->getGenericSignatureBuilder ();
65
-
66
- return Builder;
67
- }
68
-
69
58
void GenericEnvironment::addMapping (GenericParamKey key,
70
59
Type contextType) {
71
60
// Find the index into the parallel arrays of generic parameters and
@@ -122,33 +111,30 @@ Type TypeBase::mapTypeOutOfContext() {
122
111
123
112
Type
124
113
GenericEnvironment::getOrCreateArchetypeFromInterfaceType (Type depType) {
125
- auto &builder = *getGenericSignatureBuilder ();
126
- auto &ctx = builder.getASTContext ();
127
-
128
- auto resolved =
129
- builder.maybeResolveEquivalenceClass (
130
- depType,
131
- ArchetypeResolutionKind::CompleteWellFormed,
132
- /* wantExactPotentialArchetype=*/ false );
133
- if (!resolved)
134
- return ErrorType::get (depType);
135
-
136
- if (auto concrete = resolved.getAsConcreteType ()) {
137
- return mapTypeIntoContext (concrete,
138
- builder.getLookupConformanceFn ());
114
+ auto genericSig = getGenericSignature ();
115
+ LookUpConformanceInSignature conformanceLookupFn (genericSig.getPointer ());
116
+
117
+ auto requirements = genericSig->getLocalRequirements (depType);
118
+
119
+ // FIXME: With the RequirementMachine, we will always have an anchor.
120
+ if (requirements.concreteType && !requirements.anchor ) {
121
+ if (requirements.concreteType ->is <ErrorType>())
122
+ return requirements.concreteType ;
123
+
124
+ return mapTypeIntoContext (requirements.concreteType ,
125
+ conformanceLookupFn);
139
126
}
140
127
141
- auto *equivClass = resolved. getEquivalenceClass (builder );
128
+ assert (requirements. anchor && " No anchor or concrete type? " );
142
129
143
- auto genericParams = getGenericParams ();
144
- Type anchor = equivClass->getAnchor (builder, genericParams);
130
+ auto &ctx = genericSig->getASTContext ();
145
131
146
132
// First, write an ErrorType to the location where this type is cached,
147
133
// to catch re-entrant lookups that might arise from an invalid generic
148
134
// signature (eg, <X where X == Array<X>>).
149
135
ArchetypeType *parentArchetype = nullptr ;
150
136
GenericTypeParamType *genericParam = nullptr ;
151
- if (auto depMemTy = anchor->getAs <DependentMemberType>()) {
137
+ if (auto depMemTy = requirements. anchor ->getAs <DependentMemberType>()) {
152
138
parentArchetype =
153
139
getOrCreateArchetypeFromInterfaceType (depMemTy->getBase ())
154
140
->getAs <ArchetypeType>();
@@ -161,7 +147,7 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
161
147
162
148
parentArchetype->registerNestedType (name, ErrorType::get (ctx));
163
149
} else {
164
- genericParam = anchor->castTo <GenericTypeParamType>();
150
+ genericParam = requirements. anchor ->castTo <GenericTypeParamType>();
165
151
if (auto type = getMappingIfPresent (genericParam))
166
152
return *type;
167
153
addMapping (genericParam, ErrorType::get (ctx));
@@ -171,42 +157,33 @@ GenericEnvironment::getOrCreateArchetypeFromInterfaceType(Type depType) {
171
157
172
158
// If this equivalence class is mapped to a concrete type, produce that
173
159
// type.
174
- if (equivClass-> concreteType ) {
175
- result = mapTypeIntoContext (equivClass-> concreteType ,
176
- builder. getLookupConformanceFn () );
160
+ if (requirements. concreteType ) {
161
+ result = mapTypeIntoContext (requirements. concreteType ,
162
+ conformanceLookupFn );
177
163
} else {
178
164
// Substitute into the superclass.
179
- Type superclass = equivClass-> superclass ;
165
+ Type superclass = requirements. superclass ;
180
166
if (superclass && superclass->hasTypeParameter ()) {
181
167
superclass = mapTypeIntoContext (superclass,
182
- builder. getLookupConformanceFn () );
168
+ conformanceLookupFn );
183
169
if (superclass->is <ErrorType>())
184
170
superclass = Type ();
185
171
}
186
172
187
- // Collect the protocol conformances for the archetype.
188
- SmallVector<ProtocolDecl *, 4 > protos;
189
- for (const auto &conforms : equivClass->conformsTo ) {
190
- auto proto = conforms.first ;
191
-
192
- if (!equivClass->isConformanceSatisfiedBySuperclass (proto))
193
- protos.push_back (proto);
194
- }
195
-
196
173
if (parentArchetype) {
197
- auto *depMemTy = anchor->castTo <DependentMemberType>();
174
+ auto *depMemTy = requirements. anchor ->castTo <DependentMemberType>();
198
175
result = NestedArchetypeType::getNew (ctx, parentArchetype, depMemTy,
199
- protos, superclass,
200
- equivClass-> layout );
176
+ requirements. protos , superclass,
177
+ requirements. layout );
201
178
} else {
202
179
result = PrimaryArchetypeType::getNew (ctx, this , genericParam,
203
- protos, superclass,
204
- equivClass-> layout );
180
+ requirements. protos , superclass,
181
+ requirements. layout );
205
182
}
206
183
}
207
184
208
185
// Cache the new archetype for future lookups.
209
- if (auto depMemTy = anchor->getAs <DependentMemberType>()) {
186
+ if (auto depMemTy = requirements. anchor ->getAs <DependentMemberType>()) {
210
187
parentArchetype->registerNestedType (depMemTy->getName (), result);
211
188
} else {
212
189
addMapping (genericParam, result);
0 commit comments