Skip to content

Commit caad07e

Browse files
committed
Requestify Extension Type Validation
1 parent c501131 commit caad07e

File tree

5 files changed

+59
-6
lines changed

5 files changed

+59
-6
lines changed

include/swift/AST/TypeCheckRequests.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,40 @@ class AbstractGenericSignatureRequest :
11041104
}
11051105
};
11061106

1107+
class ExtendedTypeRequest
1108+
: public SimpleRequest<ExtendedTypeRequest,
1109+
Type(ExtensionDecl *),
1110+
CacheKind::SeparatelyCached> {
1111+
public:
1112+
using SimpleRequest::SimpleRequest;
1113+
1114+
private:
1115+
friend SimpleRequest;
1116+
1117+
// Evaluation.
1118+
llvm::Expected<GenericSignature *>
1119+
evaluate(Evaluator &evaluator,
1120+
GenericSignature *baseSignature,
1121+
SmallVector<GenericTypeParamType *, 2> addedParameters,
1122+
SmallVector<Requirement, 2> addedRequirements) const;
1123+
1124+
public:
1125+
// Separate caching.
1126+
bool isCached() const;
1127+
1128+
/// Abstract generic signature requests never have source-location info.
1129+
SourceLoc getNearestLoc() const {
1130+
return SourceLoc();
1131+
}
1132+
llvm::Expected<Type> evaluate(Evaluator &eval, ExtensionDecl *) const;
1133+
1134+
public:
1135+
// Separate caching
1136+
bool isCached() const { return true; }
1137+
Optional<Type> getCachedResult() const;
1138+
void cacheResult(Type value) const;
1139+
};
1140+
11071141
// Allow AnyValue to compare two Type values, even though Type doesn't
11081142
// support ==.
11091143
template<>

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,4 @@ SWIFT_TYPEID(EmittedMembersRequest)
5858
SWIFT_TYPEID(IsImplicitlyUnwrappedOptionalRequest)
5959
SWIFT_TYPEID(ClassAncestryFlagsRequest)
6060
SWIFT_TYPEID(AbstractGenericSignatureRequest)
61+
SWIFT_TYPEID(ExtendedTypeRequest)

lib/AST/TypeCheckRequests.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,3 +824,20 @@ void IsImplicitlyUnwrappedOptionalRequest::cacheResult(bool value) const {
824824
auto *decl = std::get<0>(getStorage());
825825
decl->setImplicitlyUnwrappedOptional(value);
826826
}
827+
828+
//----------------------------------------------------------------------------//
829+
// ExtendedTypeRequest computation.
830+
//----------------------------------------------------------------------------//
831+
832+
Optional<Type> ExtendedTypeRequest::getCachedResult() const {
833+
auto *ext = std::get<0>(getStorage());
834+
if (auto type = ext->getExtendedTypeLoc().getType()) {
835+
return type;
836+
}
837+
return None;
838+
}
839+
840+
void ExtendedTypeRequest::cacheResult(Type value) const {
841+
auto *ext = std::get<0>(getStorage());
842+
ext->getExtendedTypeLoc().setType(value);
843+
}

lib/Sema/TypeCheckDecl.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4414,7 +4414,8 @@ static bool isNonGenericTypeAliasType(Type type) {
44144414
return false;
44154415
}
44164416

4417-
static Type validateExtendedType(ExtensionDecl *ext) {
4417+
llvm::Expected<Type>
4418+
ExtendedTypeRequest::evaluate(Evaluator &eval, ExtensionDecl *ext) const {
44184419
auto error = [&ext]() {
44194420
ext->setInvalid();
44204421
return ErrorType::get(ext->getASTContext());
@@ -4430,7 +4431,6 @@ static Type validateExtendedType(ExtensionDecl *ext) {
44304431
auto tr = TypeResolution::forStructural(ext->getDeclContext());
44314432
auto extendedType = tr.resolveType(ext->getExtendedTypeLoc().getTypeRepr(),
44324433
options);
4433-
ext->getExtendedTypeLoc().setType(extendedType);
44344434

44354435
if (extendedType->hasError())
44364436
return error();
@@ -4483,7 +4483,9 @@ void TypeChecker::validateExtension(ExtensionDecl *ext) {
44834483

44844484
DeclValidationRAII IBV(ext);
44854485

4486-
auto extendedType = validateExtendedType(ext);
4486+
auto extendedType = evaluateOrDefault(Context.evaluator,
4487+
ExtendedTypeRequest{ext},
4488+
ErrorType::get(ext->getASTContext()));
44874489

44884490
if (auto *nominal = ext->getExtendedNominal()) {
44894491
// If this extension was not already bound, it means it is either in an
@@ -4496,8 +4498,6 @@ void TypeChecker::validateExtension(ExtensionDecl *ext) {
44964498
// Validate the nominal type declaration being extended.
44974499
validateDecl(nominal);
44984500

4499-
ext->getExtendedTypeLoc().setType(extendedType);
4500-
45014501
if (auto *genericParams = ext->getGenericParams()) {
45024502
GenericEnvironment *env =
45034503
checkExtensionGenericParams(*this, ext, extendedType, genericParams);

lib/Serialization/Deserialization.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3811,7 +3811,8 @@ class swift::DeclDeserializer {
38113811
MF.configureGenericEnvironment(extension, genericEnvID);
38123812

38133813
auto baseTy = MF.getType(baseID);
3814-
extension->getExtendedTypeLoc().setType(baseTy);
3814+
ctx.evaluator.cacheOutput(ExtendedTypeRequest{extension},
3815+
std::move(baseTy));
38153816
auto nominal = extension->getExtendedNominal();
38163817

38173818
if (isImplicit)

0 commit comments

Comments
 (0)