Skip to content

Commit 6980cf2

Browse files
committed
[Serialization] Intro package-only module wide information and serialize it
1 parent cceafcf commit 6980cf2

File tree

9 files changed

+34
-9
lines changed

9 files changed

+34
-9
lines changed

include/swift/AST/Module.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -789,16 +789,18 @@ class ModuleDecl
789789
enum class ImportFilterKind {
790790
/// Include imports declared with `@_exported`.
791791
Exported = 1 << 0,
792-
/// Include "regular" imports with no special annotation.
792+
/// Include "regular" imports with an access-level of `public`.
793793
Default = 1 << 1,
794794
/// Include imports declared with `@_implementationOnly` or with an
795795
/// access-level of `package` or less.
796796
ImplementationOnly = 1 << 2,
797+
/// Include imports declared with `package import`.
798+
PackageOnly = 1 << 3,
797799
/// Include imports declared with `@_spiOnly`.
798-
SPIOnly = 1 << 3,
800+
SPIOnly = 1 << 4,
799801
/// Include imports shadowed by a cross-import overlay. Unshadowed imports
800802
/// are included whether or not this flag is specified.
801-
ShadowedByCrossImportOverlay = 1 << 4
803+
ShadowedByCrossImportOverlay = 1 << 5
802804
};
803805
/// \sa getImportedModules
804806
using ImportFilter = OptionSet<ImportFilterKind>;

lib/AST/ImportCache.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ ImportSet &ImportCache::getImportSet(const DeclContext *dc) {
195195
file->getImportedModules(imports,
196196
{ModuleDecl::ImportFilterKind::Default,
197197
ModuleDecl::ImportFilterKind::ImplementationOnly,
198+
ModuleDecl::ImportFilterKind::PackageOnly,
198199
ModuleDecl::ImportFilterKind::SPIOnly});
199200
}
200201

@@ -279,6 +280,7 @@ ImportCache::getAllAccessPathsNotShadowedBy(const ModuleDecl *mod,
279280
file->getImportedModules(stack,
280281
{ModuleDecl::ImportFilterKind::Default,
281282
ModuleDecl::ImportFilterKind::ImplementationOnly,
283+
ModuleDecl::ImportFilterKind::PackageOnly,
282284
ModuleDecl::ImportFilterKind::SPIOnly});
283285
}
284286

lib/AST/Module.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,8 +1902,10 @@ SourceFile::getImportedModules(SmallVectorImpl<ImportedModule> &modules,
19021902
if (desc.options.contains(ImportFlags::Exported))
19031903
requiredFilter |= ModuleDecl::ImportFilterKind::Exported;
19041904
else if (desc.options.contains(ImportFlags::ImplementationOnly) ||
1905-
(desc.accessLevel <= AccessLevel::Package && moduleIsResilient))
1905+
(desc.accessLevel <= AccessLevel::Internal && moduleIsResilient))
19061906
requiredFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly;
1907+
else if (desc.accessLevel <= AccessLevel::Package && moduleIsResilient)
1908+
requiredFilter |= ModuleDecl::ImportFilterKind::PackageOnly;
19071909
else if (desc.options.contains(ImportFlags::SPIOnly))
19081910
requiredFilter |= ModuleDecl::ImportFilterKind::SPIOnly;
19091911
else
@@ -2275,6 +2277,7 @@ SourceFile::collectLinkLibraries(ModuleDecl::LinkLibraryCallback callback) const
22752277

22762278
ModuleDecl::ImportFilter topLevelFilter = filter;
22772279
topLevelFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly;
2280+
topLevelFilter |= ModuleDecl::ImportFilterKind::PackageOnly,
22782281
topLevelFilter |= ModuleDecl::ImportFilterKind::SPIOnly;
22792282
topLevel->getImportedModules(stack, topLevelFilter);
22802283

@@ -2982,6 +2985,8 @@ bool ModuleDecl::isImportedImplementationOnly(const ModuleDecl *module) const {
29822985
ModuleDecl::ImportFilter filter = {
29832986
ModuleDecl::ImportFilterKind::Exported,
29842987
ModuleDecl::ImportFilterKind::Default,
2988+
ModuleDecl::ImportFilterKind::PackageOnly,
2989+
ModuleDecl::ImportFilterKind::SPIOnly,
29852990
ModuleDecl::ImportFilterKind::ShadowedByCrossImportOverlay};
29862991
SmallVector<ImportedModule, 4> results;
29872992
getImportedModules(results, filter);
@@ -3004,9 +3009,10 @@ canBeUsedForCrossModuleOptimization(DeclContext *ctxt) const {
30043009
return true;
30053010

30063011
// See if context is imported in a "regular" way, i.e. not with
3007-
// @_implementationOnly or @_spi.
3012+
// @_implementationOnly, `package import` or @_spiOnly.
30083013
ModuleDecl::ImportFilter filter = {
30093014
ModuleDecl::ImportFilterKind::ImplementationOnly,
3015+
ModuleDecl::ImportFilterKind::PackageOnly,
30103016
ModuleDecl::ImportFilterKind::SPIOnly
30113017
};
30123018
SmallVector<ImportedModule, 4> results;

lib/FrontendTool/ImportedModules.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ bool swift::emitImportedModules(ModuleDecl *mainModule,
8585
clangImporter->getImportedHeaderModule()->getImportedModules(
8686
imported, {ModuleDecl::ImportFilterKind::Exported,
8787
ModuleDecl::ImportFilterKind::Default,
88-
ModuleDecl::ImportFilterKind::ImplementationOnly});
88+
ModuleDecl::ImportFilterKind::ImplementationOnly,
89+
ModuleDecl::ImportFilterKind::PackageOnly,
90+
ModuleDecl::ImportFilterKind::SPIOnly});
8991

9092
for (auto IM : imported) {
9193
if (auto clangModule = IM.importedModule->findUnderlyingClangModule())

lib/FrontendTool/LoadedModuleTrace.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ static void getImmediateImports(
113113
ModuleDecl::ImportFilterKind::Exported,
114114
ModuleDecl::ImportFilterKind::Default,
115115
ModuleDecl::ImportFilterKind::ImplementationOnly,
116+
ModuleDecl::ImportFilterKind::PackageOnly,
117+
ModuleDecl::ImportFilterKind::SPIOnly,
116118
ModuleDecl::ImportFilterKind::ShadowedByCrossImportOverlay}) {
117119
SmallVector<ImportedModule, 8> importList;
118120
module->getImportedModules(importList, importFilter);

lib/IDE/CodeCompletion.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,8 @@ void swift::ide::deliverCompletionResults(
13881388
ModuleDecl::ImportFilterKind::Exported,
13891389
ModuleDecl::ImportFilterKind::Default,
13901390
ModuleDecl::ImportFilterKind::ImplementationOnly,
1391+
ModuleDecl::ImportFilterKind::PackageOnly,
1392+
ModuleDecl::ImportFilterKind::SPIOnly,
13911393
});
13921394

13931395
for (auto Imported : Imports) {

lib/Serialization/ModuleFileSharedCore.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,8 @@ getActualImportControl(unsigned rawValue) {
10211021
return ModuleDecl::ImportFilterKind::Exported;
10221022
case static_cast<unsigned>(serialization::ImportControl::ImplementationOnly):
10231023
return ModuleDecl::ImportFilterKind::ImplementationOnly;
1024+
case static_cast<unsigned>(serialization::ImportControl::PackageOnly):
1025+
return ModuleDecl::ImportFilterKind::PackageOnly;
10241026
default:
10251027
return None;
10261028
}

lib/Serialization/ModuleFormat.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5858
/// describe what change you made. The content of this comment isn't important;
5959
/// it just ensures a conflict if two people change the module format.
6060
/// Don't worry about adhering to the 80-column limit for this line.
61-
const uint16_t SWIFTMODULE_VERSION_MINOR = 750; // serialize param specifiers into ParamTypeFlags
61+
const uint16_t SWIFTMODULE_VERSION_MINOR = 751; // package only import
6262

6363
/// A standard hash seed used for all string hashes in a serialized module.
6464
///
@@ -584,7 +584,9 @@ enum class ImportControl : uint8_t {
584584
/// `@_exported import FooKit`
585585
Exported,
586586
/// `@_uncheckedImplementationOnly import FooKit`
587-
ImplementationOnly
587+
ImplementationOnly,
588+
/// `package import FooKit`
589+
PackageOnly
588590
};
589591
using ImportControlField = BCFixed<2>;
590592

lib/Serialization/Serialization.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1214,7 +1214,8 @@ void Serializer::writeInputBlock(const SerializationOptions &options) {
12141214
M->getImportedModules(allImports,
12151215
{ModuleDecl::ImportFilterKind::Exported,
12161216
ModuleDecl::ImportFilterKind::Default,
1217-
ModuleDecl::ImportFilterKind::ImplementationOnly});
1217+
ModuleDecl::ImportFilterKind::ImplementationOnly,
1218+
ModuleDecl::ImportFilterKind::PackageOnly});
12181219
ImportedModule::removeDuplicates(allImports);
12191220

12201221
// Collect the public and private imports as a subset so that we can
@@ -1223,6 +1224,8 @@ void Serializer::writeInputBlock(const SerializationOptions &options) {
12231224
getImportsAsSet(M, ModuleDecl::ImportFilterKind::Exported);
12241225
ImportSet privateImportSet =
12251226
getImportsAsSet(M, ModuleDecl::ImportFilterKind::Default);
1227+
ImportSet packageOnlyImportSet =
1228+
getImportsAsSet(M, ModuleDecl::ImportFilterKind::PackageOnly);
12261229

12271230
auto clangImporter =
12281231
static_cast<ClangImporter *>(M->getASTContext().getClangModuleLoader());
@@ -1270,6 +1273,8 @@ void Serializer::writeInputBlock(const SerializationOptions &options) {
12701273
stableImportControl = ImportControl::Exported;
12711274
else if (privateImportSet.count(import))
12721275
stableImportControl = ImportControl::Normal;
1276+
else if (packageOnlyImportSet.count(import))
1277+
stableImportControl = ImportControl::PackageOnly;
12731278
else
12741279
stableImportControl = ImportControl::ImplementationOnly;
12751280

0 commit comments

Comments
 (0)