From ac08fceaccbbf617a220d28f10f2cb92ea1aedae Mon Sep 17 00:00:00 2001 From: Robert Widmann Date: Fri, 22 Nov 2019 00:53:54 -0800 Subject: [PATCH] Add loadDynamicallyReplacedFunctionDecl To support lazy resolution of the cross-referenced function in a serialized @_dynamicReplacement(for: ...) attribute, add a utility to the LazyMemberLoader and plumb it through. This is a more general utility than the current resolver, which relies on the type checker to strip the attribute off of VarDecls and fan it back out onto accessors, which means serialization has only ever seen AbstractFunctionDecls. --- include/swift/AST/LazyResolver.h | 5 +++++ lib/ClangImporter/ImporterImpl.h | 6 ++++++ lib/Serialization/Deserialization.cpp | 5 +++++ lib/Serialization/ModuleFile.h | 4 ++++ 4 files changed, 20 insertions(+) diff --git a/include/swift/AST/LazyResolver.h b/include/swift/AST/LazyResolver.h index b6cabd44b2a..afd90352852 100644 --- a/include/swift/AST/LazyResolver.h +++ b/include/swift/AST/LazyResolver.h @@ -103,6 +103,11 @@ public: virtual void loadRequirementSignature(const ProtocolDecl *proto, uint64_t contextData, SmallVectorImpl &requirements) = 0; + + /// Returns the replaced decl for a given @_dynamicReplacement(for:) attribute. + virtual ValueDecl * + loadDynamicallyReplacedFunctionDecl(const DynamicReplacementAttr *DRA, + uint64_t contextData) = 0; }; /// A class that can lazily load conformances from a serialized format. diff --git a/lib/ClangImporter/ImporterImpl.h b/lib/ClangImporter/ImporterImpl.h index 7dba7c806ea..86a51564f73 100644 --- a/lib/ClangImporter/ImporterImpl.h +++ b/lib/ClangImporter/ImporterImpl.h @@ -1230,6 +1230,12 @@ public: llvm_unreachable("unimplemented for ClangImporter"); } + ValueDecl * + loadDynamicallyReplacedFunctionDecl(const DynamicReplacementAttr *DRA, + uint64_t contextData) override { + llvm_unreachable("unimplemented for ClangImporter"); + } + void loadRequirementSignature(const ProtocolDecl *decl, uint64_t contextData, SmallVectorImpl &reqs) override { llvm_unreachable("unimplemented for ClangImporter"); diff --git a/lib/Serialization/Deserialization.cpp b/lib/Serialization/Deserialization.cpp index cc5aeab878d..83d6bea4eb7 100644 --- a/lib/Serialization/Deserialization.cpp +++ b/lib/Serialization/Deserialization.cpp @@ -5457,6 +5457,11 @@ ModuleFile::loadAssociatedTypeDefault(const swift::AssociatedTypeDecl *ATD, return getType(contextData); } +ValueDecl *ModuleFile::loadDynamicallyReplacedFunctionDecl( + const DynamicReplacementAttr *DRA, uint64_t contextData) { + return cast(getDecl(contextData)); +} + void ModuleFile::finishNormalConformance(NormalProtocolConformance *conformance, uint64_t contextData) { using namespace decls_block; diff --git a/lib/Serialization/ModuleFile.h b/lib/Serialization/ModuleFile.h index 32623ed1b17..bc111059907 100644 --- a/lib/Serialization/ModuleFile.h +++ b/lib/Serialization/ModuleFile.h @@ -839,6 +839,10 @@ public: virtual Type loadAssociatedTypeDefault(const AssociatedTypeDecl *ATD, uint64_t contextData) override; + virtual ValueDecl * + loadDynamicallyReplacedFunctionDecl(const DynamicReplacementAttr *DRA, + uint64_t contextData) override; + virtual void finishNormalConformance(NormalProtocolConformance *conformance, uint64_t contextData) override;