Skip to content

Commit eb79f3e

Browse files
committed
Move helpers on RequirementRequest to WhereClauseOwner
1 parent 0b18006 commit eb79f3e

File tree

6 files changed

+49
-52
lines changed

6 files changed

+49
-52
lines changed

include/swift/AST/TypeCheckRequests.h

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -374,10 +374,10 @@ struct WhereClauseOwner {
374374
WhereClauseOwner(Decl *decl);
375375

376376
WhereClauseOwner(DeclContext *dc, GenericParamList *genericParams)
377-
: dc(dc), source(genericParams) { }
377+
: dc(dc), source(genericParams) {}
378378

379379
WhereClauseOwner(DeclContext *dc, SpecializeAttr *attr)
380-
: dc(dc), source(attr) { }
380+
: dc(dc), source(attr) {}
381381

382382
SourceLoc getLoc() const;
383383

@@ -396,6 +396,19 @@ struct WhereClauseOwner {
396396
const WhereClauseOwner &rhs) {
397397
return !(lhs == rhs);
398398
}
399+
400+
public:
401+
/// Retrieve the array of requirements.
402+
MutableArrayRef<RequirementRepr> getRequirements() const;
403+
404+
/// Visit each of the requirements,
405+
///
406+
/// \returns true after short-circuiting if the callback returned \c true
407+
/// for any of the requirements.
408+
bool
409+
visitRequirements(TypeResolutionStage stage,
410+
llvm::function_ref<bool(Requirement, RequirementRepr *)>
411+
callback) const &&;
399412
};
400413

401414
void simple_display(llvm::raw_ostream &out, const WhereClauseOwner &owner);
@@ -409,17 +422,6 @@ class RequirementRequest :
409422
public:
410423
using SimpleRequest::SimpleRequest;
411424

412-
/// Retrieve the array of requirements from the given owner.
413-
static MutableArrayRef<RequirementRepr> getRequirements(WhereClauseOwner);
414-
415-
/// Visit each of the requirements in the given owner,
416-
///
417-
/// \returns true after short-circuiting if the callback returned \c true
418-
/// for any of the requirements.
419-
static bool visitRequirements(
420-
WhereClauseOwner, TypeResolutionStage stage,
421-
llvm::function_ref<bool(Requirement, RequirementRepr*)> callback);
422-
423425
private:
424426
friend SimpleRequest;
425427

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4114,7 +4114,7 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
41144114
}
41154115

41164116
// Add any requirements in the where clause on the protocol.
4117-
RequirementRequest::visitRequirements(proto, TypeResolutionStage::Structural,
4117+
WhereClauseOwner(proto).visitRequirements(TypeResolutionStage::Structural,
41184118
[&](const Requirement &req, RequirementRepr *reqRepr) {
41194119
// If we're only looking at same-type constraints, skip everything else.
41204120
if (onlySameTypeConstraints &&
@@ -4240,8 +4240,8 @@ ConstraintResult GenericSignatureBuilder::expandConformanceRequirement(
42404240
}
42414241

42424242
// Add requirements from this associated type's where clause.
4243-
RequirementRequest::visitRequirements(assocTypeDecl,
4244-
TypeResolutionStage::Structural,
4243+
WhereClauseOwner(assocTypeDecl).visitRequirements(
4244+
TypeResolutionStage::Structural,
42454245
[&](const Requirement &req, RequirementRepr *reqRepr) {
42464246
// If we're only looking at same-type constraints, skip everything else.
42474247
if (onlySameTypeConstraints &&
@@ -7714,18 +7714,18 @@ InferredGenericSignatureRequest::evaluate(
77147714

77157715
// Add the requirements clause to the builder.
77167716

7717-
WhereClauseOwner owner(lookupDC, genericParams);
77187717
using FloatingRequirementSource =
77197718
GenericSignatureBuilder::FloatingRequirementSource;
7720-
RequirementRequest::visitRequirements(owner, TypeResolutionStage::Structural,
7719+
WhereClauseOwner(lookupDC, genericParams).visitRequirements(
7720+
TypeResolutionStage::Structural,
77217721
[&](const Requirement &req, RequirementRepr *reqRepr) {
77227722
auto source = FloatingRequirementSource::forExplicit(reqRepr);
77237723

77247724
// If we're extending a protocol and adding a redundant requirement,
77257725
// for example, `extension Foo where Self: Foo`, then emit a
77267726
// diagnostic.
77277727

7728-
if (auto decl = owner.dc->getAsDecl()) {
7728+
if (auto decl = lookupDC->getAsDecl()) {
77297729
if (auto extDecl = dyn_cast<ExtensionDecl>(decl)) {
77307730
auto extType = extDecl->getDeclaredInterfaceType();
77317731
auto extSelfType = extDecl->getSelfInterfaceType();

lib/AST/TypeCheckRequests.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -369,20 +369,19 @@ SourceLoc RequirementRequest::getNearestLoc() const {
369369
return owner.getLoc();
370370
}
371371

372-
MutableArrayRef<RequirementRepr>
373-
RequirementRequest::getRequirements(WhereClauseOwner owner) {
374-
if (auto genericParams = owner.source.dyn_cast<GenericParamList *>()) {
372+
MutableArrayRef<RequirementRepr> WhereClauseOwner::getRequirements() const {
373+
if (auto genericParams = source.dyn_cast<GenericParamList *>()) {
375374
return genericParams->getRequirements();
376375
}
377376

378-
if (auto attr = owner.source.dyn_cast<SpecializeAttr *>()) {
377+
if (auto attr = source.dyn_cast<SpecializeAttr *>()) {
379378
if (auto whereClause = attr->getTrailingWhereClause())
380379
return whereClause->getRequirements();
381380

382381
return { };
383382
}
384383

385-
auto decl = owner.source.dyn_cast<Decl *>();
384+
auto decl = source.dyn_cast<Decl *>();
386385
if (!decl)
387386
return { };
388387

@@ -406,14 +405,15 @@ RequirementRequest::getRequirements(WhereClauseOwner owner) {
406405
return { };
407406
}
408407

409-
bool RequirementRequest::visitRequirements(
410-
WhereClauseOwner owner, TypeResolutionStage stage,
411-
llvm::function_ref<bool(Requirement, RequirementRepr*)> callback) {
412-
auto &evaluator = owner.dc->getASTContext().evaluator;
413-
auto requirements = getRequirements(owner);
408+
bool WhereClauseOwner::visitRequirements(
409+
TypeResolutionStage stage,
410+
llvm::function_ref<bool(Requirement, RequirementRepr *)> callback)
411+
const && {
412+
auto &evaluator = dc->getASTContext().evaluator;
413+
auto requirements = getRequirements();
414414
for (unsigned index : indices(requirements)) {
415415
// Resolve to a requirement.
416-
auto req = evaluator(RequirementRequest{owner, index, stage});
416+
auto req = evaluator(RequirementRequest{*this, index, stage});
417417
if (req) {
418418
// Invoke the callback. If it returns true, we're done.
419419
if (callback(*req, &requirements[index]))
@@ -422,10 +422,10 @@ bool RequirementRequest::visitRequirements(
422422
continue;
423423
}
424424

425-
llvm::handleAllErrors(req.takeError(),
426-
[](const CyclicalRequestError<RequirementRequest> &E) {
427-
// cycle detected
428-
});
425+
llvm::handleAllErrors(
426+
req.takeError(), [](const CyclicalRequestError<RequirementRequest> &E) {
427+
// cycle detected
428+
});
429429
}
430430

431431
return false;
@@ -434,7 +434,7 @@ bool RequirementRequest::visitRequirements(
434434
RequirementRepr &RequirementRequest::getRequirement() const {
435435
auto owner = std::get<0>(getStorage());
436436
auto index = std::get<1>(getStorage());
437-
return getRequirements(owner)[index];
437+
return owner.getRequirements()[index];
438438
}
439439

440440
bool RequirementRequest::isCached() const {

lib/Sema/TypeCheckAccess.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,10 @@ enum class DowngradeToWarning: bool {
4444
/// Calls \p callback for each type in each requirement provided by
4545
/// \p source.
4646
static void forAllRequirementTypes(
47-
WhereClauseOwner source,
47+
WhereClauseOwner &&source,
4848
llvm::function_ref<void(Type, TypeRepr *)> callback) {
49-
RequirementRequest::visitRequirements(
50-
source, TypeResolutionStage::Interface,
51-
[&](const Requirement &req, RequirementRepr* reqRepr) {
49+
std::move(source).visitRequirements(TypeResolutionStage::Interface,
50+
[&](const Requirement &req, RequirementRepr *reqRepr) {
5251
switch (req.getKind()) {
5352
case RequirementKind::Conformance:
5453
case RequirementKind::SameType:
@@ -95,11 +94,11 @@ class AccessControlCheckerBase {
9594
}
9695

9796
void checkRequirementAccess(
98-
WhereClauseOwner source,
97+
WhereClauseOwner &&source,
9998
AccessScope accessScope,
10099
const DeclContext *useDC,
101100
llvm::function_ref<CheckTypeAccessCallback> diagnose) {
102-
forAllRequirementTypes(source, [&](Type type, TypeRepr *typeRepr) {
101+
forAllRequirementTypes(std::move(source), [&](Type type, TypeRepr *typeRepr) {
103102
checkTypeAccessImpl(type, typeRepr, accessScope, useDC,
104103
/*mayBeInferred*/false, diagnose);
105104
});

lib/Sema/TypeCheckAttr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1852,8 +1852,7 @@ void AttributeChecker::visitSpecializeAttr(SpecializeAttr *attr) {
18521852
SmallPtrSet<TypeBase *, 4> constrainedGenericParams;
18531853

18541854
// Go over the set of requirements, adding them to the builder.
1855-
RequirementRequest::visitRequirements(
1856-
WhereClauseOwner(FD, attr), TypeResolutionStage::Interface,
1855+
WhereClauseOwner(FD, attr).visitRequirements(TypeResolutionStage::Interface,
18571856
[&](const Requirement &req, RequirementRepr *reqRepr) {
18581857
// Collect all of the generic parameters used by these types.
18591858
switch (req.getKind()) {

lib/Sema/TypeCheckDecl.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -485,8 +485,7 @@ static void checkInheritanceClause(
485485
/// Check the inheritance clauses generic parameters along with any
486486
/// requirements stored within the generic parameter list.
487487
static void checkGenericParams(GenericParamList *genericParams,
488-
DeclContext *owningDC,
489-
TypeChecker &tc) {
488+
DeclContext *owningDC, TypeChecker &tc) {
490489
if (!genericParams)
491490
return;
492491

@@ -496,12 +495,9 @@ static void checkGenericParams(GenericParamList *genericParams,
496495
}
497496

498497
// Force visitation of each of the requirements here.
499-
RequirementRequest::visitRequirements(WhereClauseOwner(owningDC,
500-
genericParams),
501-
TypeResolutionStage::Interface,
502-
[](Requirement, RequirementRepr *) {
503-
return false;
504-
});
498+
WhereClauseOwner(owningDC, genericParams)
499+
.visitRequirements(TypeResolutionStage::Interface,
500+
[](Requirement, RequirementRepr *) { return false; });
505501
}
506502

507503
/// Retrieve the set of protocols the given protocol inherits.
@@ -2011,7 +2007,8 @@ SelfAccessKindRequest::evaluate(Evaluator &evaluator, FuncDecl *FD) const {
20112007
/// to ensure that they don't introduce additional 'Self' requirements.
20122008
static void checkProtocolSelfRequirements(ProtocolDecl *proto,
20132009
TypeDecl *source) {
2014-
RequirementRequest::visitRequirements(source, TypeResolutionStage::Interface,
2010+
WhereClauseOwner(source).visitRequirements(
2011+
TypeResolutionStage::Interface,
20152012
[&](const Requirement &req, RequirementRepr *reqRepr) {
20162013
switch (req.getKind()) {
20172014
case RequirementKind::Conformance:

0 commit comments

Comments
 (0)