Skip to content

Commit 291ddd7

Browse files
committed
RequirementMachine: Plumb through the ModuleDecl used for requirement inference
1 parent 97e160b commit 291ddd7

File tree

3 files changed

+35
-28
lines changed

3 files changed

+35
-28
lines changed

lib/AST/RequirementMachine/RequirementLowering.cpp

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ swift::rewriting::desugarRequirement(Requirement req,
186186
//
187187

188188
static void realizeTypeRequirement(Type subjectType, Type constraintType,
189-
SourceLoc loc, bool wasInferred,
189+
SourceLoc loc,
190190
SmallVectorImpl<StructuralRequirement> &result) {
191191
// Check whether we have a reasonable constraint type at all.
192192
if (!constraintType->isExistentialType() &&
@@ -207,7 +207,7 @@ static void realizeTypeRequirement(Type subjectType, Type constraintType,
207207

208208
// Add source location information.
209209
for (auto req : reqs)
210-
result.push_back({req, loc, wasInferred});
210+
result.push_back({req, loc, /*wasInferred=*/false});
211211
}
212212

213213
/// Infer requirements from applications of BoundGenericTypes to type
@@ -218,21 +218,22 @@ static void realizeTypeRequirement(Type subjectType, Type constraintType,
218218
/// We automatically infer 'T : Hashable' from the fact that 'struct Set'
219219
/// declares a Hashable requirement on its generic parameter.
220220
void swift::rewriting::inferRequirements(
221-
Type type, SourceLoc loc,
221+
Type type, SourceLoc loc, ModuleDecl *module,
222222
SmallVectorImpl<StructuralRequirement> &result) {
223223
// FIXME: Implement
224224
}
225225

226226
/// Desugar a requirement and perform requirement inference if requested
227227
/// to obtain zero or more structural requirements.
228228
void swift::rewriting::realizeRequirement(
229-
Requirement req, RequirementRepr *reqRepr, bool infer,
229+
Requirement req, RequirementRepr *reqRepr,
230+
ModuleDecl *moduleForInference,
230231
SmallVectorImpl<StructuralRequirement> &result) {
231232
auto firstType = req.getFirstType();
232-
if (infer) {
233+
if (moduleForInference) {
233234
auto firstLoc = (reqRepr ? reqRepr->getFirstTypeRepr()->getStartLoc()
234235
: SourceLoc());
235-
inferRequirements(firstType, firstLoc, result);
236+
inferRequirements(firstType, firstLoc, moduleForInference, result);
236237
}
237238

238239
auto loc = (reqRepr ? reqRepr->getSeparatorLoc() : SourceLoc());
@@ -241,14 +242,13 @@ void swift::rewriting::realizeRequirement(
241242
case RequirementKind::Superclass:
242243
case RequirementKind::Conformance: {
243244
auto secondType = req.getSecondType();
244-
if (infer) {
245+
if (moduleForInference) {
245246
auto secondLoc = (reqRepr ? reqRepr->getSecondTypeRepr()->getStartLoc()
246247
: SourceLoc());
247-
inferRequirements(secondType, secondLoc, result);
248+
inferRequirements(secondType, secondLoc, moduleForInference, result);
248249
}
249250

250-
realizeTypeRequirement(firstType, secondType, loc, /*wasInferred=*/false,
251-
result);
251+
realizeTypeRequirement(firstType, secondType, loc, result);
252252
break;
253253
}
254254

@@ -264,10 +264,10 @@ void swift::rewriting::realizeRequirement(
264264

265265
case RequirementKind::SameType: {
266266
auto secondType = req.getSecondType();
267-
if (infer) {
267+
if (moduleForInference) {
268268
auto secondLoc = (reqRepr ? reqRepr->getSecondTypeRepr()->getStartLoc()
269269
: SourceLoc());
270-
inferRequirements(secondType, secondLoc, result);
270+
inferRequirements(secondType, secondLoc, moduleForInference, result);
271271
}
272272

273273
SmallVector<Requirement, 2> reqs;
@@ -283,7 +283,7 @@ void swift::rewriting::realizeRequirement(
283283
/// Collect structural requirements written in the inheritance clause of an
284284
/// AssociatedTypeDecl or GenericTypeParamDecl.
285285
void swift::rewriting::realizeInheritedRequirements(
286-
TypeDecl *decl, Type type, bool infer,
286+
TypeDecl *decl, Type type, ModuleDecl *moduleForInference,
287287
SmallVectorImpl<StructuralRequirement> &result) {
288288
auto &ctx = decl->getASTContext();
289289
auto inheritedTypes = decl->getInherited();
@@ -298,12 +298,11 @@ void swift::rewriting::realizeInheritedRequirements(
298298

299299
auto *typeRepr = inheritedTypes[index].getTypeRepr();
300300
SourceLoc loc = (typeRepr ? typeRepr->getStartLoc() : SourceLoc());
301-
if (infer) {
302-
inferRequirements(inheritedType, loc, result);
301+
if (moduleForInference) {
302+
inferRequirements(inheritedType, loc, moduleForInference, result);
303303
}
304304

305-
realizeTypeRequirement(type, inheritedType, loc, /*wasInferred=*/false,
306-
result);
305+
realizeTypeRequirement(type, inheritedType, loc, result);
307306
}
308307
}
309308

@@ -319,12 +318,13 @@ StructuralRequirementsRequest::evaluate(Evaluator &evaluator,
319318
auto selfTy = proto->getSelfInterfaceType();
320319

321320
realizeInheritedRequirements(proto, selfTy,
322-
/*infer=*/false, result);
321+
/*moduleForInference=*/nullptr, result);
323322

324323
// Add requirements from the protocol's own 'where' clause.
325324
WhereClauseOwner(proto).visitRequirements(TypeResolutionStage::Structural,
326325
[&](const Requirement &req, RequirementRepr *reqRepr) {
327-
realizeRequirement(req, reqRepr, /*infer=*/false, result);
326+
realizeRequirement(req, reqRepr,
327+
/*moduleForInference=*/nullptr, result);
328328
return false;
329329
});
330330

@@ -343,14 +343,17 @@ StructuralRequirementsRequest::evaluate(Evaluator &evaluator,
343343
for (auto assocTypeDecl : proto->getAssociatedTypeMembers()) {
344344
// Add requirements placed directly on this associated type.
345345
auto assocType = assocTypeDecl->getDeclaredInterfaceType();
346-
realizeInheritedRequirements(assocTypeDecl, assocType, /*infer=*/false,
346+
realizeInheritedRequirements(assocTypeDecl, assocType,
347+
/*moduleForInference=*/nullptr,
347348
result);
348349

349350
// Add requirements from this associated type's where clause.
350351
WhereClauseOwner(assocTypeDecl).visitRequirements(
351352
TypeResolutionStage::Structural,
352353
[&](const Requirement &req, RequirementRepr *reqRepr) {
353-
realizeRequirement(req, reqRepr, /*infer=*/false, result);
354+
realizeRequirement(req, reqRepr,
355+
/*moduleForInference=*/nullptr,
356+
result);
354357
return false;
355358
});
356359
}

lib/AST/RequirementMachine/RequirementLowering.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@ namespace rewriting {
4141

4242
void desugarRequirement(Requirement req, SmallVectorImpl<Requirement> &result);
4343

44-
void inferRequirements(Type type, SourceLoc loc,
44+
void inferRequirements(Type type, SourceLoc loc, ModuleDecl *module,
4545
SmallVectorImpl<StructuralRequirement> &result);
4646

47-
void realizeRequirement(Requirement req, RequirementRepr *reqRepr, bool infer,
47+
void realizeRequirement(Requirement req, RequirementRepr *reqRepr,
48+
ModuleDecl *moduleForInference,
4849
SmallVectorImpl<StructuralRequirement> &result);
4950

50-
void realizeInheritedRequirements(TypeDecl *decl, Type type, bool infer,
51+
void realizeInheritedRequirements(TypeDecl *decl, Type type,
52+
ModuleDecl *moduleForInference,
5153
SmallVectorImpl<StructuralRequirement> &result);
5254

5355
/// A utility class for bulding rewrite rules from the top-level requirements

lib/AST/RequirementMachine/RequirementMachineRequests.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ InferredGenericSignatureRequestRQM::evaluate(
373373
bool allowConcreteGenericParams) const {
374374
GenericSignature parentSig(parentSigImpl);
375375

376+
auto &ctx = parentModule->getASTContext();
377+
376378
SmallVector<GenericTypeParamType *, 4> genericParams(
377379
parentSig.getGenericParams().begin(),
378380
parentSig.getGenericParams().end());
@@ -383,7 +385,7 @@ InferredGenericSignatureRequestRQM::evaluate(
383385

384386
const auto visitRequirement = [&](const Requirement &req,
385387
RequirementRepr *reqRepr) {
386-
realizeRequirement(req, reqRepr, /*infer=*/true, requirements);
388+
realizeRequirement(req, reqRepr, parentModule, requirements);
387389
return false;
388390
};
389391

@@ -411,7 +413,7 @@ InferredGenericSignatureRequestRQM::evaluate(
411413
->castTo<GenericTypeParamType>();
412414
genericParams.push_back(gpType);
413415

414-
realizeInheritedRequirements(gpDecl, gpType, /*infer=*/true,
416+
realizeInheritedRequirements(gpDecl, gpType, parentModule,
415417
requirements);
416418
}
417419

@@ -438,7 +440,7 @@ InferredGenericSignatureRequestRQM::evaluate(
438440
auto *typeRepr = sourcePair.getTypeRepr();
439441
auto loc = typeRepr ? typeRepr->getStartLoc() : SourceLoc();
440442

441-
inferRequirements(sourcePair.getType(), loc, requirements);
443+
inferRequirements(sourcePair.getType(), loc, parentModule, requirements);
442444
}
443445

444446
// Finish by adding any remaining requirements. This is used to introduce
@@ -449,7 +451,7 @@ InferredGenericSignatureRequestRQM::evaluate(
449451

450452
// Heap-allocate the requirement machine to save stack space.
451453
std::unique_ptr<RequirementMachine> machine(new RequirementMachine(
452-
parentModule->getASTContext().getRewriteContext()));
454+
ctx.getRewriteContext()));
453455

454456
machine->initWithWrittenRequirements(genericParams, requirements);
455457

0 commit comments

Comments
 (0)