Skip to content

Commit 7be6058

Browse files
authored
Merge pull request #40268 from slavapestov/rqm-inferred-generic-signature-request
RequirementMachine: Implement InferredGenericSignatureRequest
2 parents 5a006d2 + 77d4a20 commit 7be6058

15 files changed

+931
-155
lines changed

include/swift/AST/Decl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4225,6 +4225,7 @@ class ProtocolDecl final : public NominalTypeDecl {
42254225
friend class SuperclassDeclRequest;
42264226
friend class SuperclassTypeRequest;
42274227
friend class StructuralRequirementsRequest;
4228+
friend class TypeAliasRequirementsRequest;
42284229
friend class ProtocolDependenciesRequest;
42294230
friend class RequirementSignatureRequest;
42304231
friend class RequirementSignatureRequestRQM;
@@ -4421,6 +4422,11 @@ class ProtocolDecl final : public NominalTypeDecl {
44214422
/// instead.
44224423
ArrayRef<StructuralRequirement> getStructuralRequirements() const;
44234424

4425+
/// Retrieve same-type requirements implied by protocol typealiases with the
4426+
/// same name as associated types, and diagnose cases that are better expressed
4427+
/// via a 'where' clause.
4428+
ArrayRef<Requirement> getTypeAliasRequirements() const;
4429+
44244430
/// Get the list of protocols appearing on the right hand side of conformance
44254431
/// requirements. Computed from the structural requirements, above.
44264432
ArrayRef<ProtocolDecl *> getProtocolDependencies() const;

include/swift/AST/TypeCheckRequests.h

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,25 @@ class StructuralRequirementsRequest :
387387
bool isCached() const { return true; }
388388
};
389389

390+
class TypeAliasRequirementsRequest :
391+
public SimpleRequest<TypeAliasRequirementsRequest,
392+
ArrayRef<Requirement>(ProtocolDecl *),
393+
RequestFlags::Cached> {
394+
public:
395+
using SimpleRequest::SimpleRequest;
396+
397+
private:
398+
friend SimpleRequest;
399+
400+
// Evaluation.
401+
ArrayRef<Requirement>
402+
evaluate(Evaluator &evaluator, ProtocolDecl *proto) const;
403+
404+
public:
405+
// Caching.
406+
bool isCached() const { return true; }
407+
};
408+
390409
class ProtocolDependenciesRequest :
391410
public SimpleRequest<ProtocolDependenciesRequest,
392411
ArrayRef<ProtocolDecl *>(ProtocolDecl *),
@@ -1534,7 +1553,50 @@ class InferredGenericSignatureRequest :
15341553
SourceLoc getNearestLoc() const {
15351554
return SourceLoc();
15361555
}
1537-
1556+
1557+
// Cycle handling.
1558+
void noteCycleStep(DiagnosticEngine &diags) const;
1559+
};
1560+
1561+
/// Build a generic signature using the RequirementMachine. This is temporary;
1562+
/// once the GenericSignatureBuilder goes away this will be folded into
1563+
/// InferredGenericSignatureRequest.
1564+
class InferredGenericSignatureRequestRQM :
1565+
public SimpleRequest<InferredGenericSignatureRequestRQM,
1566+
GenericSignatureWithError (ModuleDecl *,
1567+
const GenericSignatureImpl *,
1568+
GenericParamList *,
1569+
WhereClauseOwner,
1570+
SmallVector<Requirement, 2>,
1571+
SmallVector<TypeLoc, 2>,
1572+
bool),
1573+
RequestFlags::Cached> {
1574+
public:
1575+
using SimpleRequest::SimpleRequest;
1576+
1577+
private:
1578+
friend SimpleRequest;
1579+
1580+
// Evaluation.
1581+
GenericSignatureWithError
1582+
evaluate(Evaluator &evaluator,
1583+
ModuleDecl *parentModule,
1584+
const GenericSignatureImpl *baseSignature,
1585+
GenericParamList *genericParams,
1586+
WhereClauseOwner whereClause,
1587+
SmallVector<Requirement, 2> addedRequirements,
1588+
SmallVector<TypeLoc, 2> inferenceSources,
1589+
bool allowConcreteGenericParams) const;
1590+
1591+
public:
1592+
// Separate caching.
1593+
bool isCached() const { return true; }
1594+
1595+
/// Inferred generic signature requests don't have source-location info.
1596+
SourceLoc getNearestLoc() const {
1597+
return SourceLoc();
1598+
}
1599+
15381600
// Cycle handling.
15391601
void noteCycleStep(DiagnosticEngine &diags) const;
15401602
};

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,14 @@ SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequest,
143143
SmallVector<Requirement, 2>,
144144
SmallVector<TypeLoc, 2>, bool),
145145
Cached, NoLocationInfo)
146+
SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequestRQM,
147+
GenericSignatureWithError (ModuleDecl *,
148+
const GenericSignatureImpl *,
149+
GenericParamList *,
150+
WhereClauseOwner,
151+
SmallVector<Requirement, 2>,
152+
SmallVector<TypeLoc, 2>, bool),
153+
Cached, NoLocationInfo)
146154
SWIFT_REQUEST(TypeChecker, DistributedModuleIsAvailableRequest,
147155
bool(ModuleDecl *), Cached, NoLocationInfo)
148156
SWIFT_REQUEST(TypeChecker, InheritedTypeRequest,
@@ -227,6 +235,9 @@ SWIFT_REQUEST(TypeChecker, RequirementRequest,
227235
SWIFT_REQUEST(TypeChecker, StructuralRequirementsRequest,
228236
ArrayRef<StructuralRequirement>(ProtocolDecl *), Cached,
229237
HasNearestLocation)
238+
SWIFT_REQUEST(TypeChecker, TypeAliasRequirementsRequest,
239+
ArrayRef<Requirement>(ProtocolDecl *), Cached,
240+
HasNearestLocation)
230241
SWIFT_REQUEST(TypeChecker, ProtocolDependenciesRequest,
231242
ArrayRef<ProtocolDecl *>(ProtocolDecl *), Cached,
232243
HasNearestLocation)

include/swift/Basic/LangOptions.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,8 +489,14 @@ namespace swift {
489489
RequirementMachineMode RequirementMachineProtocolSignatures =
490490
RequirementMachineMode::Disabled;
491491

492-
/// Enable the new experimental generic signature minimization algorithm.
493-
RequirementMachineMode RequirementMachineGenericSignatures =
492+
/// Enable the new experimental generic signature minimization algorithm
493+
/// for abstract generic signatures.
494+
RequirementMachineMode RequirementMachineAbstractSignatures =
495+
RequirementMachineMode::Disabled;
496+
497+
/// Enable the new experimental generic signature minimization algorithm
498+
/// for user-written generic signatures.
499+
RequirementMachineMode RequirementMachineInferredSignatures =
494500
RequirementMachineMode::Disabled;
495501

496502
/// Sets the target we are building for and updates platform conditions

include/swift/Option/Options.td

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,11 @@ def requirement_machine_protocol_signatures_EQ : Joined<["-"], "requirement-mach
624624
Flags<[FrontendOption]>,
625625
HelpText<"Control usage of experimental protocol requirement signature minimization: 'on', 'off', or 'verify'">;
626626

627-
def requirement_machine_generic_signatures_EQ : Joined<["-"], "requirement-machine-generic-signatures=">,
627+
def requirement_machine_abstract_signatures_EQ : Joined<["-"], "requirement-machine-abstract-signatures=">,
628+
Flags<[FrontendOption]>,
629+
HelpText<"Control usage of experimental generic signature minimization: 'on', 'off', or 'verify'">;
630+
631+
def requirement_machine_inferred_signatures_EQ : Joined<["-"], "requirement-machine-inferred-signatures=">,
628632
Flags<[FrontendOption]>,
629633
HelpText<"Control usage of experimental generic signature minimization: 'on', 'off', or 'verify'">;
630634

lib/AST/Decl.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5264,6 +5264,13 @@ ProtocolDecl::getStructuralRequirements() const {
52645264
None);
52655265
}
52665266

5267+
ArrayRef<Requirement>
5268+
ProtocolDecl::getTypeAliasRequirements() const {
5269+
return evaluateOrDefault(getASTContext().evaluator,
5270+
TypeAliasRequirementsRequest { const_cast<ProtocolDecl *>(this) },
5271+
None);
5272+
}
5273+
52675274
ArrayRef<ProtocolDecl *>
52685275
ProtocolDecl::getProtocolDependencies() const {
52695276
return evaluateOrDefault(getASTContext().evaluator,

0 commit comments

Comments
 (0)