Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions include/swift/AST/Decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -4225,6 +4225,7 @@ class ProtocolDecl final : public NominalTypeDecl {
friend class SuperclassDeclRequest;
friend class SuperclassTypeRequest;
friend class StructuralRequirementsRequest;
friend class TypeAliasRequirementsRequest;
friend class ProtocolDependenciesRequest;
friend class RequirementSignatureRequest;
friend class RequirementSignatureRequestRQM;
Expand Down Expand Up @@ -4421,6 +4422,11 @@ class ProtocolDecl final : public NominalTypeDecl {
/// instead.
ArrayRef<StructuralRequirement> getStructuralRequirements() const;

/// Retrieve same-type requirements implied by protocol typealiases with the
/// same name as associated types, and diagnose cases that are better expressed
/// via a 'where' clause.
ArrayRef<Requirement> getTypeAliasRequirements() const;

/// Get the list of protocols appearing on the right hand side of conformance
/// requirements. Computed from the structural requirements, above.
ArrayRef<ProtocolDecl *> getProtocolDependencies() const;
Expand Down
64 changes: 63 additions & 1 deletion include/swift/AST/TypeCheckRequests.h
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,25 @@ class StructuralRequirementsRequest :
bool isCached() const { return true; }
};

class TypeAliasRequirementsRequest :
public SimpleRequest<TypeAliasRequirementsRequest,
ArrayRef<Requirement>(ProtocolDecl *),
RequestFlags::Cached> {
public:
using SimpleRequest::SimpleRequest;

private:
friend SimpleRequest;

// Evaluation.
ArrayRef<Requirement>
evaluate(Evaluator &evaluator, ProtocolDecl *proto) const;

public:
// Caching.
bool isCached() const { return true; }
};

class ProtocolDependenciesRequest :
public SimpleRequest<ProtocolDependenciesRequest,
ArrayRef<ProtocolDecl *>(ProtocolDecl *),
Expand Down Expand Up @@ -1534,7 +1553,50 @@ class InferredGenericSignatureRequest :
SourceLoc getNearestLoc() const {
return SourceLoc();
}


// Cycle handling.
void noteCycleStep(DiagnosticEngine &diags) const;
};

/// Build a generic signature using the RequirementMachine. This is temporary;
/// once the GenericSignatureBuilder goes away this will be folded into
/// InferredGenericSignatureRequest.
class InferredGenericSignatureRequestRQM :
public SimpleRequest<InferredGenericSignatureRequestRQM,
GenericSignatureWithError (ModuleDecl *,
const GenericSignatureImpl *,
GenericParamList *,
WhereClauseOwner,
SmallVector<Requirement, 2>,
SmallVector<TypeLoc, 2>,
bool),
RequestFlags::Cached> {
public:
using SimpleRequest::SimpleRequest;

private:
friend SimpleRequest;

// Evaluation.
GenericSignatureWithError
evaluate(Evaluator &evaluator,
ModuleDecl *parentModule,
const GenericSignatureImpl *baseSignature,
GenericParamList *genericParams,
WhereClauseOwner whereClause,
SmallVector<Requirement, 2> addedRequirements,
SmallVector<TypeLoc, 2> inferenceSources,
bool allowConcreteGenericParams) const;

public:
// Separate caching.
bool isCached() const { return true; }

/// Inferred generic signature requests don't have source-location info.
SourceLoc getNearestLoc() const {
return SourceLoc();
}

// Cycle handling.
void noteCycleStep(DiagnosticEngine &diags) const;
};
Expand Down
11 changes: 11 additions & 0 deletions include/swift/AST/TypeCheckerTypeIDZone.def
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,14 @@ SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequest,
SmallVector<Requirement, 2>,
SmallVector<TypeLoc, 2>, bool),
Cached, NoLocationInfo)
SWIFT_REQUEST(TypeChecker, InferredGenericSignatureRequestRQM,
GenericSignatureWithError (ModuleDecl *,
const GenericSignatureImpl *,
GenericParamList *,
WhereClauseOwner,
SmallVector<Requirement, 2>,
SmallVector<TypeLoc, 2>, bool),
Cached, NoLocationInfo)
SWIFT_REQUEST(TypeChecker, DistributedModuleIsAvailableRequest,
bool(ModuleDecl *), Cached, NoLocationInfo)
SWIFT_REQUEST(TypeChecker, InheritedTypeRequest,
Expand Down Expand Up @@ -227,6 +235,9 @@ SWIFT_REQUEST(TypeChecker, RequirementRequest,
SWIFT_REQUEST(TypeChecker, StructuralRequirementsRequest,
ArrayRef<StructuralRequirement>(ProtocolDecl *), Cached,
HasNearestLocation)
SWIFT_REQUEST(TypeChecker, TypeAliasRequirementsRequest,
ArrayRef<Requirement>(ProtocolDecl *), Cached,
HasNearestLocation)
SWIFT_REQUEST(TypeChecker, ProtocolDependenciesRequest,
ArrayRef<ProtocolDecl *>(ProtocolDecl *), Cached,
HasNearestLocation)
Expand Down
10 changes: 8 additions & 2 deletions include/swift/Basic/LangOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -489,8 +489,14 @@ namespace swift {
RequirementMachineMode RequirementMachineProtocolSignatures =
RequirementMachineMode::Disabled;

/// Enable the new experimental generic signature minimization algorithm.
RequirementMachineMode RequirementMachineGenericSignatures =
/// Enable the new experimental generic signature minimization algorithm
/// for abstract generic signatures.
RequirementMachineMode RequirementMachineAbstractSignatures =
RequirementMachineMode::Disabled;

/// Enable the new experimental generic signature minimization algorithm
/// for user-written generic signatures.
RequirementMachineMode RequirementMachineInferredSignatures =
RequirementMachineMode::Disabled;

/// Sets the target we are building for and updates platform conditions
Expand Down
6 changes: 5 additions & 1 deletion include/swift/Option/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,11 @@ def requirement_machine_protocol_signatures_EQ : Joined<["-"], "requirement-mach
Flags<[FrontendOption]>,
HelpText<"Control usage of experimental protocol requirement signature minimization: 'on', 'off', or 'verify'">;

def requirement_machine_generic_signatures_EQ : Joined<["-"], "requirement-machine-generic-signatures=">,
def requirement_machine_abstract_signatures_EQ : Joined<["-"], "requirement-machine-abstract-signatures=">,
Flags<[FrontendOption]>,
HelpText<"Control usage of experimental generic signature minimization: 'on', 'off', or 'verify'">;

def requirement_machine_inferred_signatures_EQ : Joined<["-"], "requirement-machine-inferred-signatures=">,
Flags<[FrontendOption]>,
HelpText<"Control usage of experimental generic signature minimization: 'on', 'off', or 'verify'">;

Expand Down
7 changes: 7 additions & 0 deletions lib/AST/Decl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5260,6 +5260,13 @@ ProtocolDecl::getStructuralRequirements() const {
None);
}

ArrayRef<Requirement>
ProtocolDecl::getTypeAliasRequirements() const {
return evaluateOrDefault(getASTContext().evaluator,
TypeAliasRequirementsRequest { const_cast<ProtocolDecl *>(this) },
None);
}

ArrayRef<ProtocolDecl *>
ProtocolDecl::getProtocolDependencies() const {
return evaluateOrDefault(getASTContext().evaluator,
Expand Down
Loading