[Serialization] Move some package-only import logic from writer to reader

Let's centralize the logic deciding if we load a transitive dependency
on the client side and have the producer write the truth in the
swiftmodule.
This commit is contained in:
Alexis Laferrière
2023-03-21 13:18:35 -07:00
parent e010d7d494
commit d7cd65cdd6
2 changed files with 5 additions and 2 deletions

View File

@@ -2124,7 +2124,7 @@ SourceFile::getImportedModules(SmallVectorImpl<ImportedModule> &modules,
else if (desc.options.contains(ImportFlags::ImplementationOnly) || else if (desc.options.contains(ImportFlags::ImplementationOnly) ||
(desc.accessLevel <= AccessLevel::Internal && moduleIsResilient)) (desc.accessLevel <= AccessLevel::Internal && moduleIsResilient))
requiredFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly; requiredFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly;
else if (desc.accessLevel <= AccessLevel::Package && moduleIsResilient) else if (desc.accessLevel <= AccessLevel::Package)
requiredFilter |= ModuleDecl::ImportFilterKind::PackageOnly; requiredFilter |= ModuleDecl::ImportFilterKind::PackageOnly;
else if (desc.options.contains(ImportFlags::SPIOnly)) else if (desc.options.contains(ImportFlags::SPIOnly))
requiredFilter |= ModuleDecl::ImportFilterKind::SPIOnly; requiredFilter |= ModuleDecl::ImportFilterKind::SPIOnly;

View File

@@ -1694,6 +1694,8 @@ ModuleFileSharedCore::getTransitiveLoadingBehavior(
return ModuleLoadingBehavior::Required; return ModuleLoadingBehavior::Required;
} }
bool moduleIsResilient = getResilienceStrategy() ==
ResilienceStrategy::Resilient;
if (dependency.isImplementationOnly()) { if (dependency.isImplementationOnly()) {
// Implementation-only dependencies are not usually loaded from // Implementation-only dependencies are not usually loaded from
// transitive imports. // transitive imports.
@@ -1712,7 +1714,8 @@ ModuleFileSharedCore::getTransitiveLoadingBehavior(
if (dependency.isPackageOnly()) { if (dependency.isPackageOnly()) {
// Package dependencies are usually loaded only for import from the same // Package dependencies are usually loaded only for import from the same
// package. // package.
if (!packageName.empty() && packageName == getModulePackageName()) { if ((!packageName.empty() && packageName == getModulePackageName()) ||
!moduleIsResilient) {
return ModuleLoadingBehavior::Required; return ModuleLoadingBehavior::Required;
} else if (debuggerMode) { } else if (debuggerMode) {
return ModuleLoadingBehavior::Optional; return ModuleLoadingBehavior::Optional;