mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge pull request #19391 from DougGregor/assoc-conformance-default-witnesses
[ABI] Associated conformance defaults
This commit is contained in:
@@ -285,6 +285,11 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
|
||||
llvm::DenseMap<std::pair<const ProtocolDecl *, AssociatedTypeDecl *>, Type>
|
||||
DefaultTypeWitnesses;
|
||||
|
||||
/// Default associated conformance witnesses for protocols.
|
||||
llvm::DenseMap<std::tuple<const ProtocolDecl *, CanType, ProtocolDecl *>,
|
||||
ProtocolConformanceRef>
|
||||
DefaultAssociatedConformanceWitnesses;
|
||||
|
||||
/// \brief Structure that captures data that is segregated into different
|
||||
/// arenas.
|
||||
struct Arena {
|
||||
@@ -1709,6 +1714,32 @@ void ProtocolDecl::setDefaultTypeWitness(AssociatedTypeDecl *assocType,
|
||||
(void)pair;
|
||||
}
|
||||
|
||||
Optional<ProtocolConformanceRef>
|
||||
ProtocolDecl::getDefaultAssociatedConformanceWitness(
|
||||
CanType association,
|
||||
ProtocolDecl *requirement) const {
|
||||
auto &ctx = getASTContext();
|
||||
auto found =
|
||||
ctx.getImpl().DefaultAssociatedConformanceWitnesses.find(
|
||||
std::make_tuple(this, association, requirement));
|
||||
if (found == ctx.getImpl().DefaultAssociatedConformanceWitnesses.end())
|
||||
return None;
|
||||
|
||||
return found->second;
|
||||
}
|
||||
|
||||
void ProtocolDecl::setDefaultAssociatedConformanceWitness(
|
||||
CanType association,
|
||||
ProtocolDecl *requirement,
|
||||
ProtocolConformanceRef conformance) {
|
||||
auto &ctx = getASTContext();
|
||||
auto pair = ctx.getImpl().DefaultAssociatedConformanceWitnesses.insert(
|
||||
std::make_pair(std::make_tuple(this, association, requirement),
|
||||
conformance));
|
||||
assert(pair.second && "Already have a default associated conformance");
|
||||
(void)pair;
|
||||
}
|
||||
|
||||
bool ASTContext::canImportModule(std::pair<Identifier, SourceLoc> ModulePath) {
|
||||
// If this module has already been successfully imported, it is importable.
|
||||
if (getLoadedModule(ModulePath) != nullptr)
|
||||
|
||||
Reference in New Issue
Block a user