@@ -194,49 +194,52 @@ Type TypeChecker::getOrCreateOpaqueResultType(TypeResolution resolution,
194
194
// Create a generic signature for the opaque environment. This is the outer
195
195
// generic signature with an added generic parameter representing the opaque
196
196
// type and its interface constraints.
197
- SmallVector<GenericTypeParamType *, 4 > interfaceGenericParams;
198
- SmallVector<Requirement, 4 > interfaceRequirements;
197
+ GenericSignatureBuilder builder (Context);
199
198
200
199
auto originatingDC = originatingDecl->getInnermostDeclContext ();
200
+ unsigned returnTypeDepth = 0 ;
201
201
auto outerGenericSignature = originatingDC->getGenericSignatureOfContext ();
202
+
202
203
if (outerGenericSignature) {
203
- std::copy (outerGenericSignature->getGenericParams ().begin (),
204
- outerGenericSignature->getGenericParams ().end (),
205
- std::back_inserter (interfaceGenericParams));
206
- std::copy (outerGenericSignature->getRequirements ().begin (),
207
- outerGenericSignature->getRequirements ().end (),
208
- std::back_inserter (interfaceRequirements));
204
+ builder.addGenericSignature (outerGenericSignature);
205
+ returnTypeDepth =
206
+ outerGenericSignature->getGenericParams ().back ()->getDepth () + 1 ;
209
207
}
210
-
211
- unsigned returnTypeDepth = 0 ;
212
- if (!interfaceGenericParams.empty ())
213
- returnTypeDepth = interfaceGenericParams.back ()->getDepth () + 1 ;
208
+
214
209
auto returnTypeParam = GenericTypeParamType::get (returnTypeDepth, 0 ,
215
210
Context);
216
- interfaceGenericParams.push_back (returnTypeParam);
211
+
212
+ builder.addGenericParameter (returnTypeParam);
217
213
218
214
if (constraintType->getClassOrBoundGenericClass ()) {
219
- // Use the type as a superclass constraint.
220
- interfaceRequirements.push_back (Requirement (RequirementKind::Superclass,
221
- returnTypeParam, constraintType));
215
+ builder.addRequirement (Requirement (RequirementKind::Superclass,
216
+ returnTypeParam, constraintType),
217
+ GenericSignatureBuilder::FloatingRequirementSource::forAbstract (),
218
+ originatingDC->getParentModule ());
222
219
} else {
223
220
auto constraints = constraintType->getExistentialLayout ();
224
221
if (auto superclass = constraints.getSuperclass ()) {
225
- interfaceRequirements.push_back (Requirement (RequirementKind::Superclass,
226
- returnTypeParam, superclass));
222
+ builder.addRequirement (Requirement (RequirementKind::Superclass,
223
+ returnTypeParam, superclass),
224
+ GenericSignatureBuilder::FloatingRequirementSource::forAbstract (),
225
+ originatingDC->getParentModule ());
227
226
}
228
227
for (auto protocol : constraints.getProtocols ()) {
229
- interfaceRequirements.push_back (Requirement (RequirementKind::Conformance,
230
- returnTypeParam, protocol));
228
+ builder.addRequirement (Requirement (RequirementKind::Conformance,
229
+ returnTypeParam, protocol),
230
+ GenericSignatureBuilder::FloatingRequirementSource::forAbstract (),
231
+ originatingDC->getParentModule ());
231
232
}
232
233
if (auto layout = constraints.getLayoutConstraint ()) {
233
- interfaceRequirements.push_back (Requirement (RequirementKind::Layout,
234
- returnTypeParam, layout));
234
+ builder.addRequirement (Requirement (RequirementKind::Layout,
235
+ returnTypeParam, layout),
236
+ GenericSignatureBuilder::FloatingRequirementSource::forAbstract (),
237
+ originatingDC->getParentModule ());
235
238
}
236
239
}
237
240
238
- auto interfaceSignature = GenericSignature::get (interfaceGenericParams,
239
- interfaceRequirements );
241
+ auto interfaceSignature = std::move (builder)
242
+ . computeGenericSignature ( SourceLoc () );
240
243
241
244
// Create the OpaqueTypeDecl for the result type.
242
245
// It has the same parent context and generic environment as the originating
0 commit comments