Skip to content

Commit 322ada6

Browse files
committed
[Sema] Intro flag to default imports to internal, the Swift 6 mode
The feature InternalImportsByDefault makes imports default to internal instead of public. Applying the Swift 6 behavior of SE-0409 in Swift 5. Let's use only that flag to track the Swift 6 behavior as well instead of separately checking for the language version.
1 parent 042ccdd commit 322ada6

11 files changed

+60
-12
lines changed

include/swift/Basic/Features.def

+1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ UPCOMING_FEATURE(BareSlashRegexLiterals, 354, 6)
117117
UPCOMING_FEATURE(ExistentialAny, 335, 6)
118118
UPCOMING_FEATURE(ImportObjcForwardDeclarations, 384, 6)
119119
UPCOMING_FEATURE(DisableOutwardActorInference, 401, 6)
120+
UPCOMING_FEATURE(InternalImportsByDefault, 409, 6)
120121

121122
EXPERIMENTAL_FEATURE(StaticAssert, false)
122123
EXPERIMENTAL_FEATURE(NamedOpaqueTypes, false)

lib/AST/ASTPrinter.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -3436,6 +3436,10 @@ static bool usesFeatureDisableOutwardActorInference(Decl *decl) {
34363436
return false;
34373437
}
34383438

3439+
static bool usesFeatureInternalImportsByDefault(Decl *decl) {
3440+
return false;
3441+
}
3442+
34393443
static bool usesFeatureImportSymbolicCXXDecls(Decl *decl) { return false; }
34403444

34413445
static bool usesFeatureGenerateBindingsForThrowingFunctionsInCXX(Decl *decl) {

lib/AST/Decl.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -1506,9 +1506,8 @@ AccessLevel ImportDecl::getAccessLevel() const {
15061506
}
15071507

15081508
auto &LangOpts = getASTContext().LangOpts;
1509-
if (LangOpts.isSwiftVersionAtLeast(6) &&
1510-
LangOpts.hasFeature(Feature::AccessLevelOnImport)) {
1511-
// Tentative Swift 6 mode where the default import is internal.
1509+
if (LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
1510+
// Swift 6 mode where the default import is internal.
15121511
return AccessLevel::Internal;
15131512
} else {
15141513
return AccessLevel::Public;

lib/Frontend/ModuleInterfaceSupport.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ static void printImports(raw_ostream &out,
233233
ModuleDecl *M,
234234
const llvm::SmallSet<StringRef, 4>
235235
&AliasModuleNamesTargets) {
236+
auto &ctx = M->getASTContext();
236237
// FIXME: This is very similar to what's in Serializer::writeInputBlock, but
237238
// it's not obvious what higher-level optimization would be factored out here.
238239
ModuleDecl::ImportFilter allImportFilter = {
@@ -290,7 +291,7 @@ static void printImports(raw_ostream &out,
290291
M->getMissingImportedModules(allImports);
291292

292293
ImportedModule::removeDuplicates(allImports);
293-
diagnoseScopedImports(M->getASTContext().Diags, allImports);
294+
diagnoseScopedImports(ctx.Diags, allImports);
294295

295296
// Collect the public imports as a subset so that we can mark them with
296297
// '@_exported'.
@@ -310,7 +311,7 @@ static void printImports(raw_ostream &out,
310311
// 'import Builtin' in the interface. '-parse-stdlib' still implicitly
311312
// imports it however...
312313
if (importedModule->isBuiltinModule() &&
313-
!M->getASTContext().LangOpts.hasFeature(Feature::BuiltinModule)) {
314+
!ctx.LangOpts.hasFeature(Feature::BuiltinModule)) {
314315
continue;
315316
}
316317

@@ -348,7 +349,7 @@ static void printImports(raw_ostream &out,
348349
out << "@_spi(" << spiName << ") ";
349350
}
350351

351-
if (M->getASTContext().LangOpts.isSwiftVersionAtLeast(6)) {
352+
if (ctx.LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
352353
out << "public ";
353354
}
354355

lib/Sema/TypeCheckAccess.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -2452,7 +2452,7 @@ void swift::diagnoseUnnecessaryPublicImports(SourceFile &SF) {
24522452

24532453
if (levelUsed == AccessLevel::Package) {
24542454
inFlight.fixItReplace(import.accessLevelRange, "package");
2455-
} else if (ctx.isSwiftVersionAtLeast(6)) {
2455+
} else if (ctx.LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
24562456
// Let it default to internal.
24572457
inFlight.fixItRemove(import.accessLevelRange);
24582458
} else {

lib/Sema/TypeCheckAttr.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,7 @@ bool AttributeChecker::visitAbstractAccessControlAttr(
999999
SourceFile *File = D->getDeclContext()->getParentSourceFile();
10001000
if (auto importDecl = dyn_cast<ImportDecl>(D)) {
10011001
if (!D->getASTContext().LangOpts.hasFeature(Feature::AccessLevelOnImport) &&
1002+
!D->getASTContext().LangOpts.hasFeature(Feature::InternalImports) &&
10021003
File && File->Kind != SourceFileKind::Interface) {
10031004
diagnoseAndRemoveAttr(attr, diag::access_level_on_import_not_enabled);
10041005
return true;

lib/Sema/TypeChecker.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ TypeCheckSourceFileRequest::evaluate(Evaluator &eval, SourceFile *SF) const {
310310
CheckInconsistentSPIOnlyImportsRequest{SF},
311311
{});
312312

313-
if (!Ctx.LangOpts.isSwiftVersionAtLeast(6)) {
313+
if (!Ctx.LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
314314
evaluateOrDefault(
315315
Ctx.evaluator,
316316
CheckInconsistentAccessLevelOnImport{SF},

test/ModuleInterface/access-level-import-swiftinterfaces.swift

+38-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/// Check that only public imports are printed in modules interfaces,
22
/// package imports and below are not.
3+
// REQUIRES: asserts
34

45
// RUN: %empty-directory(%t)
56
// RUN: split-file %s %t
@@ -28,8 +29,8 @@
2829
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.private.swiftinterface) -I %t \
2930
// RUN: -module-name Client
3031

31-
// RUN: %FileCheck %s < %t/Client.swiftinterface
32-
// RUN: %FileCheck %s < %t/Client.private.swiftinterface
32+
// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/Client.swiftinterface
33+
// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/Client.private.swiftinterface
3334

3435
/// Build a client composed of many files.
3536
// RUN: %target-swift-frontend -typecheck %t/MultiFiles?.swift -I %t \
@@ -43,8 +44,37 @@
4344
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.private.swiftinterface) -I %t \
4445
// RUN: -module-name MultiFiles
4546

46-
// RUN: %FileCheck %s < %t/MultiFiles.swiftinterface
47-
// RUN: %FileCheck %s < %t/MultiFiles.private.swiftinterface
47+
// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/MultiFiles.swiftinterface
48+
// RUN: %FileCheck --check-prefixes=CHECK,CHECK-5 %s < %t/MultiFiles.private.swiftinterface
49+
50+
/// Swift 6 mode.
51+
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
52+
// RUN: -package-name TestPackage -module-name Client_Swift6 \
53+
// RUN: -enable-library-evolution -swift-version 6 \
54+
// RUN: -emit-module-interface-path %t/Client_Swift6.swiftinterface \
55+
// RUN: -emit-private-module-interface-path %t/Client_Swift6.private.swiftinterface
56+
57+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_Swift6.swiftinterface) -I %t
58+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_Swift6.private.swiftinterface) -I %t \
59+
// RUN: -module-name Client_Swift6
60+
61+
// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6 < %t/Client_Swift6.swiftinterface
62+
// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6 < %t/Client_Swift6.private.swiftinterface
63+
64+
/// Feature flag.
65+
// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t \
66+
// RUN: -package-name TestPackage -module-name Client_FeatureFlag \
67+
// RUN: -enable-library-evolution -swift-version 5 \
68+
// RUN: -emit-module-interface-path %t/Client_FeatureFlag.swiftinterface \
69+
// RUN: -emit-private-module-interface-path %t/Client_FeatureFlag.private.swiftinterface \
70+
// RUN: -enable-upcoming-feature InternalImportsByDefault
71+
72+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_FeatureFlag.swiftinterface) -I %t
73+
// RUN: %target-swift-typecheck-module-from-interface(%t/Client_FeatureFlag.private.swiftinterface) -I %t \
74+
// RUN: -module-name Client_FeatureFlag
75+
76+
// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6,CHECK-FLAG < %t/Client_FeatureFlag.swiftinterface
77+
// RUN: %FileCheck %s --check-prefixes=CHECK,CHECK-6,CHECK-FLAG < %t/Client_FeatureFlag.private.swiftinterface
4878

4979
//--- PublicLib.swift
5080
//--- PackageLib.swift
@@ -53,6 +83,10 @@
5383
//--- PrivateLib.swift
5484

5585
//--- Client.swift
86+
// CHECK-5-NOT: public
87+
// CHECK-FLAG: -enable-upcoming-feature InternalImportsByDefault
88+
// CHECK-6: public
89+
5690
public import PublicLib
5791
// CHECK: PublicLib
5892

test/Sema/access-level-import-flag-check.swift

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
// RUN: %target-swift-frontend -typecheck %t/ClientWithoutTheFlag.swift -I %t \
2020
// RUN: -enable-experimental-feature AccessLevelOnImport \
2121
// RUN: -package-name package
22+
// RUN: %target-swift-frontend -typecheck %t/ClientWithoutTheFlag.swift -I %t \
23+
// RUN: -enable-upcoming-feature InternalImportsByDefault \
24+
// RUN: -package-name package
2225
// REQUIRES: asserts
2326

2427
/// swiftinterfaces don't need the flag.

test/Sema/access-level-import-inconsistencies.swift

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ package import Lib // expected-note {{imported 'package' here}} @:1
6262

6363
// RUN: %target-swift-frontend -typecheck %t/ManyFiles_AmbiguitySwift6_File?.swift -I %t \
6464
// RUN: -enable-experimental-feature AccessLevelOnImport -verify -swift-version 6
65+
// RUN: %target-swift-frontend -typecheck %t/ManyFiles_AmbiguitySwift6_File?.swift -I %t \
66+
// RUN: -enable-upcoming-feature InternalImportsByDefault -verify
6567
//--- ManyFiles_AmbiguitySwift6_FileA.swift
6668
import Lib
6769
//--- ManyFiles_AmbiguitySwift6_FileB.swift

test/Sema/access-level-import-typealias.swift

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
// RUN: %target-swift-frontend -typecheck -verify %t/UsesAliasesNoImport.swift -I %t \
1111
// RUN: -swift-version 5 -enable-library-evolution \
1212
// RUN: -enable-experimental-feature AccessLevelOnImport
13+
// RUN: %target-swift-frontend -typecheck -verify %t/UsesAliasesNoImport.swift -I %t \
14+
// RUN: -swift-version 5 -enable-library-evolution \
15+
// RUN: -enable-upcoming-feature InternalImportsByDefault
1316

1417
//--- Original.swift
1518
open class Clazz {}

0 commit comments

Comments
 (0)