Remove SimpleRequest::breakCycle

This patch removes the need for Request objects to provide a default
cycle-breaking value, instead opting to return llvm::Expected so clients
must handle a cycle failure explicitly.

Currently, all clients do the 'default' behavior, but this opens the
possibility for future requests to handle failures explicitly.
This commit is contained in:
Harlan Haskins
2018-08-01 13:46:21 -07:00
committed by Harlan Haskins
parent be0e1643d6
commit 5a6985f39e
15 changed files with 261 additions and 188 deletions

View File

@@ -2168,8 +2168,9 @@ resolveTypeDeclsToNominal(Evaluator &evaluator,
if (!typealiases.insert(typealias).second)
continue;
auto underlyingTypeReferences
= evaluator(UnderlyingTypeDeclsReferencedRequest{typealias});
auto underlyingTypeReferences = evaluateOrDefault(evaluator,
UnderlyingTypeDeclsReferencedRequest{typealias}, {});
auto underlyingNominalReferences
= resolveTypeDeclsToNominal(evaluator, ctx, underlyingTypeReferences,
modulesFound, anyObject, typealiases);
@@ -2443,12 +2444,13 @@ DirectlyReferencedTypeDecls UnderlyingTypeDeclsReferencedRequest::evaluate(
}
/// Evaluate a superclass declaration request.
ClassDecl *SuperclassDeclRequest::evaluate(Evaluator &evaluator,
NominalTypeDecl *subject) const {
llvm::Expected<ClassDecl *>
SuperclassDeclRequest::evaluate(Evaluator &evaluator,
NominalTypeDecl *subject) const {
for (unsigned i : indices(subject->getInherited())) {
// Find the inherited declarations referenced at this position.
auto inheritedTypes =
evaluator(InheritedDeclsReferencedRequest{subject, i});
auto inheritedTypes = evaluateOrDefault(evaluator,
InheritedDeclsReferencedRequest{subject, i}, {});
// Resolve those type declarations to nominal type declarations.
SmallVector<ModuleDecl *, 2> modulesFound;
@@ -2467,8 +2469,9 @@ ClassDecl *SuperclassDeclRequest::evaluate(Evaluator &evaluator,
return nullptr;
}
NominalTypeDecl *ExtendedNominalRequest::evaluate(Evaluator &evaluator,
ExtensionDecl *ext) const {
llvm::Expected<NominalTypeDecl *>
ExtendedNominalRequest::evaluate(Evaluator &evaluator,
ExtensionDecl *ext) const {
DirectlyReferencedTypeDecls referenced;
ASTContext &ctx = ext->getASTContext();
@@ -2504,7 +2507,8 @@ void swift::getDirectlyInheritedNominalTypeDecls(
: extDecl->getASTContext();
// Find inherited declarations.
auto referenced = ctx.evaluator(InheritedDeclsReferencedRequest{decl, i});
auto referenced = evaluateOrDefault(ctx.evaluator,
InheritedDeclsReferencedRequest{decl, i}, {});
// Resolve those type declarations to nominal type declarations.
SmallVector<ModuleDecl *, 2> modulesFound;