Skip to content

Commit 644c943

Browse files
authored
Merge pull request #64047 from xymus/package-only-imports
[Serialization] Package imports
2 parents 93decb6 + 4b14a8a commit 644c943

24 files changed

+175
-47
lines changed

include/swift/AST/Module.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -789,13 +789,13 @@ 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 of SPIs declared with `@_spi`.
798-
SPIAccessControl = 1 << 3,
797+
/// Include imports declared with `package import`.
798+
PackageOnly = 1 << 3,
799799
/// Include imports declared with `@_spiOnly`.
800800
SPIOnly = 1 << 4,
801801
/// Include imports shadowed by a cross-import overlay. Unshadowed imports

include/swift/Basic/LangOptions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,9 @@ namespace swift {
396396
/// Access or distribution level of the whole module being parsed.
397397
LibraryLevel LibraryLevel = LibraryLevel::Other;
398398

399+
/// The name of the package this module belongs to.
400+
std::string PackageName;
401+
399402
/// Warn about cases where Swift 3 would infer @objc but later versions
400403
/// of Swift do not.
401404
Swift3ObjCInferenceWarnings WarnSwift3ObjCInference =

include/swift/Frontend/FrontendOptions.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,6 @@ class FrontendOptions {
6464
/// The name of the library to link against when using this module.
6565
std::string ModuleLinkName;
6666

67-
/// The name of the package this module belongs to.
68-
std::string PackageName;
69-
7067
/// Module name to use when referenced in clients module interfaces.
7168
std::string ExportAsName;
7269

lib/AST/ASTPrinter.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5544,7 +5544,6 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
55445544
// For the current module, consider both private and public imports.
55455545
ModuleDecl::ImportFilter Filter = ModuleDecl::ImportFilterKind::Exported;
55465546
Filter |= ModuleDecl::ImportFilterKind::Default;
5547-
Filter |= ModuleDecl::ImportFilterKind::SPIAccessControl;
55485547
SmallVector<ImportedModule, 4> Imports;
55495548
Options.CurrentModule->getImportedModules(Imports, Filter);
55505549

lib/AST/ImportCache.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ ImportSet &ImportCache::getImportSet(const DeclContext *dc) {
195195
file->getImportedModules(imports,
196196
{ModuleDecl::ImportFilterKind::Default,
197197
ModuleDecl::ImportFilterKind::ImplementationOnly,
198-
ModuleDecl::ImportFilterKind::SPIOnly,
199-
ModuleDecl::ImportFilterKind::SPIAccessControl});
198+
ModuleDecl::ImportFilterKind::PackageOnly,
199+
ModuleDecl::ImportFilterKind::SPIOnly});
200200
}
201201

202202
auto &result = getImportSet(ctx, imports);
@@ -280,8 +280,8 @@ ImportCache::getAllAccessPathsNotShadowedBy(const ModuleDecl *mod,
280280
file->getImportedModules(stack,
281281
{ModuleDecl::ImportFilterKind::Default,
282282
ModuleDecl::ImportFilterKind::ImplementationOnly,
283-
ModuleDecl::ImportFilterKind::SPIOnly,
284-
ModuleDecl::ImportFilterKind::SPIAccessControl});
283+
ModuleDecl::ImportFilterKind::PackageOnly,
284+
ModuleDecl::ImportFilterKind::SPIOnly});
285285
}
286286

287287
SmallVector<ImportPath::Access, 4> accessPaths;

lib/AST/Module.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1902,12 +1902,12 @@ 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;
1909-
else if (desc.options.contains(ImportFlags::SPIAccessControl))
1910-
requiredFilter |= ModuleDecl::ImportFilterKind::SPIAccessControl;
19111911
else
19121912
requiredFilter |= ModuleDecl::ImportFilterKind::Default;
19131913

@@ -2271,13 +2271,13 @@ SourceFile::collectLinkLibraries(ModuleDecl::LinkLibraryCallback callback) const
22712271

22722272
ModuleDecl::ImportFilter filter = {
22732273
ModuleDecl::ImportFilterKind::Exported,
2274-
ModuleDecl::ImportFilterKind::Default,
2275-
ModuleDecl::ImportFilterKind::SPIAccessControl};
2274+
ModuleDecl::ImportFilterKind::Default};
22762275

22772276
auto *topLevel = getParentModule();
22782277

22792278
ModuleDecl::ImportFilter topLevelFilter = filter;
22802279
topLevelFilter |= ModuleDecl::ImportFilterKind::ImplementationOnly;
2280+
topLevelFilter |= ModuleDecl::ImportFilterKind::PackageOnly,
22812281
topLevelFilter |= ModuleDecl::ImportFilterKind::SPIOnly;
22822282
topLevel->getImportedModules(stack, topLevelFilter);
22832283

@@ -2985,7 +2985,8 @@ bool ModuleDecl::isImportedImplementationOnly(const ModuleDecl *module) const {
29852985
ModuleDecl::ImportFilter filter = {
29862986
ModuleDecl::ImportFilterKind::Exported,
29872987
ModuleDecl::ImportFilterKind::Default,
2988-
ModuleDecl::ImportFilterKind::SPIAccessControl,
2988+
ModuleDecl::ImportFilterKind::PackageOnly,
2989+
ModuleDecl::ImportFilterKind::SPIOnly,
29892990
ModuleDecl::ImportFilterKind::ShadowedByCrossImportOverlay};
29902991
SmallVector<ImportedModule, 4> results;
29912992
getImportedModules(results, filter);
@@ -3008,11 +3009,11 @@ canBeUsedForCrossModuleOptimization(DeclContext *ctxt) const {
30083009
return true;
30093010

30103011
// See if context is imported in a "regular" way, i.e. not with
3011-
// @_implementationOnly or @_spi.
3012+
// @_implementationOnly, `package import` or @_spiOnly.
30123013
ModuleDecl::ImportFilter filter = {
30133014
ModuleDecl::ImportFilterKind::ImplementationOnly,
3014-
ModuleDecl::ImportFilterKind::SPIOnly,
3015-
ModuleDecl::ImportFilterKind::SPIAccessControl
3015+
ModuleDecl::ImportFilterKind::PackageOnly,
3016+
ModuleDecl::ImportFilterKind::SPIOnly
30163017
};
30173018
SmallVector<ImportedModule, 4> results;
30183019
getImportedModules(results, filter);

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -269,16 +269,6 @@ bool ArgsToFrontendOptionsConverter::convert(
269269
if (const Arg *A = Args.getLastArg(OPT_module_link_name))
270270
Opts.ModuleLinkName = A->getValue();
271271

272-
if (const Arg *A = Args.getLastArg(OPT_package_name)) {
273-
auto pkgName = A->getValue();
274-
if (!Lexer::isIdentifier(pkgName))
275-
Diags.diagnose(SourceLoc(), diag::error_bad_package_name, pkgName);
276-
else if (pkgName == STDLIB_NAME)
277-
Diags.diagnose(SourceLoc(), diag::error_stdlib_package_name, pkgName);
278-
else
279-
Opts.PackageName = pkgName;
280-
}
281-
282272
if (const Arg *A = Args.getLastArg(OPT_export_as)) {
283273
auto exportAs = A->getValue();
284274
if (!Lexer::isIdentifier(exportAs))

lib/Frontend/CompilerInvocation.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,16 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
739739
}
740740
}
741741

742+
if (const Arg *A = Args.getLastArg(OPT_package_name)) {
743+
auto pkgName = A->getValue();
744+
if (!Lexer::isIdentifier(pkgName))
745+
Diags.diagnose(SourceLoc(), diag::error_bad_package_name, pkgName);
746+
else if (pkgName == STDLIB_NAME)
747+
Diags.diagnose(SourceLoc(), diag::error_stdlib_package_name, pkgName);
748+
else
749+
Opts.PackageName = pkgName;
750+
}
751+
742752
if (const Arg *A = Args.getLastArg(OPT_require_explicit_availability_EQ)) {
743753
StringRef diagLevel = A->getValue();
744754
if (diagLevel == "warn") {

lib/Frontend/Frontend.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,9 +1088,9 @@ ModuleDecl *CompilerInstance::getMainModule() const {
10881088
MainModule->setABIName(getASTContext().getIdentifier(
10891089
Invocation.getFrontendOptions().ModuleABIName));
10901090
}
1091-
if (!Invocation.getFrontendOptions().PackageName.empty()) {
1091+
if (!Invocation.getLangOptions().PackageName.empty()) {
10921092
MainModule->setPackageName(getASTContext().getIdentifier(
1093-
Invocation.getFrontendOptions().PackageName));
1093+
Invocation.getLangOptions().PackageName));
10941094
}
10951095
if (!Invocation.getFrontendOptions().ExportAsName.empty()) {
10961096
MainModule->setExportAsName(getASTContext().getIdentifier(

lib/Frontend/ModuleInterfaceSupport.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ static void printToolVersionAndFlagsComment(raw_ostream &out,
7070
moduleName << "=" << moduleName;
7171

7272
ModuleDecl::ImportFilter filter = {ModuleDecl::ImportFilterKind::Default,
73-
ModuleDecl::ImportFilterKind::Exported,
74-
ModuleDecl::ImportFilterKind::SPIAccessControl};
73+
ModuleDecl::ImportFilterKind::Exported};
7574
if (Opts.PrintPrivateInterfaceContent)
7675
filter |= ModuleDecl::ImportFilterKind::SPIOnly;
7776

@@ -228,8 +227,7 @@ static void printImports(raw_ostream &out,
228227
// it's not obvious what higher-level optimization would be factored out here.
229228
ModuleDecl::ImportFilter allImportFilter = {
230229
ModuleDecl::ImportFilterKind::Exported,
231-
ModuleDecl::ImportFilterKind::Default,
232-
ModuleDecl::ImportFilterKind::SPIAccessControl};
230+
ModuleDecl::ImportFilterKind::Default};
233231

234232
// With -experimental-spi-imports:
235233
// When printing the private swiftinterface file, print implementation-only

0 commit comments

Comments
 (0)