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

@@ -984,14 +984,14 @@ ExtensionDecl::takeConformanceLoaderSlow() {
NominalTypeDecl *ExtensionDecl::getExtendedNominal() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(
ExtendedNominalRequest{const_cast<ExtensionDecl *>(this)});;
return evaluateOrDefault(ctx.evaluator,
ExtendedNominalRequest{const_cast<ExtensionDecl *>(this)}, nullptr);
}
Type ExtensionDecl::getInheritedType(unsigned index) const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(InheritedTypeRequest{const_cast<ExtensionDecl *>(this),
index});
return evaluateOrDefault(ctx.evaluator,
InheritedTypeRequest{const_cast<ExtensionDecl *>(this), index}, Type());
}
bool ExtensionDecl::isConstrainedExtension() const {
@@ -1017,14 +1017,16 @@ bool ExtensionDecl::isEquivalentToExtendedContext() const {
AccessLevel ExtensionDecl::getDefaultAccessLevel() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(
DefaultAndMaxAccessLevelRequest{const_cast<ExtensionDecl *>(this)}).first;
return evaluateOrDefault(ctx.evaluator,
DefaultAndMaxAccessLevelRequest{const_cast<ExtensionDecl *>(this)},
{AccessLevel::Private, AccessLevel::Private}).first;
}
AccessLevel ExtensionDecl::getMaxAccessLevel() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(
DefaultAndMaxAccessLevelRequest{const_cast<ExtensionDecl *>(this)}).second;
return evaluateOrDefault(ctx.evaluator,
DefaultAndMaxAccessLevelRequest{const_cast<ExtensionDecl *>(this)},
{AccessLevel::Private, AccessLevel::Private}).second;
}
PatternBindingDecl::PatternBindingDecl(SourceLoc StaticLoc,
@@ -2087,7 +2089,8 @@ CanType ValueDecl::getOverloadSignatureType() const {
llvm::TinyPtrVector<ValueDecl *> ValueDecl::getOverriddenDecls() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(OverriddenDeclsRequest{const_cast<ValueDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
OverriddenDeclsRequest{const_cast<ValueDecl *>(this)}, {});
}
void ValueDecl::setOverriddenDecls(ArrayRef<ValueDecl *> overridden) {
@@ -2098,7 +2101,9 @@ void ValueDecl::setOverriddenDecls(ArrayRef<ValueDecl *> overridden) {
bool ValueDecl::isObjC() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(IsObjCRequest{const_cast<ValueDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
IsObjCRequest{const_cast<ValueDecl *>(this)},
getAttrs().hasAttribute<ObjCAttr>());
}
void ValueDecl::setIsObjC(bool value) {
@@ -2115,7 +2120,9 @@ void ValueDecl::setIsObjC(bool value) {
bool ValueDecl::isDynamic() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(IsDynamicRequest{const_cast<ValueDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
IsDynamicRequest{const_cast<ValueDecl *>(this)},
getAttrs().hasAttribute<DynamicAttr>());
}
void ValueDecl::setIsDynamic(bool value) {
@@ -2440,7 +2447,8 @@ AccessLevel ValueDecl::getEffectiveAccess() const {
AccessLevel ValueDecl::getFormalAccess() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(AccessLevelRequest{const_cast<ValueDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
AccessLevelRequest{const_cast<ValueDecl *>(this)}, AccessLevel::Private);
}
bool ValueDecl::hasOpenAccess(const DeclContext *useDC) const {
@@ -2662,8 +2670,8 @@ void ValueDecl::copyFormalAccessFrom(const ValueDecl *source,
Type TypeDecl::getInheritedType(unsigned index) const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(InheritedTypeRequest{const_cast<TypeDecl *>(this),
index});
return evaluateOrDefault(ctx.evaluator,
InheritedTypeRequest{const_cast<TypeDecl *>(this), index}, Type());
}
Type TypeDecl::getDeclaredInterfaceType() const {
@@ -3166,7 +3174,8 @@ EnumDecl::EnumDecl(SourceLoc EnumLoc,
Type EnumDecl::getRawType() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(EnumRawTypeRequest{const_cast<EnumDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
EnumRawTypeRequest{const_cast<EnumDecl *>(this)}, Type());
}
StructDecl::StructDecl(SourceLoc StructLoc, Identifier Name, SourceLoc NameLoc,
@@ -3615,12 +3624,14 @@ ProtocolDecl::getAssociatedTypeMembers() const {
Type ProtocolDecl::getSuperclass() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(SuperclassTypeRequest{const_cast<ProtocolDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
SuperclassTypeRequest{const_cast<ProtocolDecl *>(this)}, Type());
}
ClassDecl *ProtocolDecl::getSuperclassDecl() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(SuperclassDeclRequest{const_cast<ProtocolDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
SuperclassDeclRequest{const_cast<ProtocolDecl *>(this)}, nullptr);
}
void ProtocolDecl::setSuperclass(Type superclass) {
@@ -4228,8 +4239,9 @@ bool AbstractStorageDecl::AccessorRecord::registerAccessor(AccessorDecl *decl,
AccessLevel
AbstractStorageDecl::getSetterFormalAccess() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(
SetterAccessLevelRequest{const_cast<AbstractStorageDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
SetterAccessLevelRequest{const_cast<AbstractStorageDecl *>(this)},
AccessLevel::Private);
}
void AbstractStorageDecl::setComputedSetter(AccessorDecl *setter) {
@@ -6078,12 +6090,14 @@ Type TypeBase::getSwiftNewtypeUnderlyingType() {
Type ClassDecl::getSuperclass() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(SuperclassTypeRequest{const_cast<ClassDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
SuperclassTypeRequest{const_cast<ClassDecl *>(this)}, Type());
}
ClassDecl *ClassDecl::getSuperclassDecl() const {
ASTContext &ctx = getASTContext();
return ctx.evaluator(SuperclassDeclRequest{const_cast<ClassDecl *>(this)});
return evaluateOrDefault(ctx.evaluator,
SuperclassDeclRequest{const_cast<ClassDecl *>(this)}, nullptr);
}
void ClassDecl::setSuperclass(Type superclass) {