Skip to content

Commit 9ba500d

Browse files
authored
Merge pull request #68967 from xymus/feature-0409
Sema: Lift flag requirement for access levels on imports now that SE-0409 has been accepted
2 parents ca6ffea + b9a7034 commit 9ba500d

32 files changed

+175
-160
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2356,9 +2356,6 @@ ERROR(spi_only_imports_not_enabled, none,
23562356
())
23572357

23582358
// Access level on imports
2359-
ERROR(access_level_on_import_not_enabled, none,
2360-
"Access level on imports require '-enable-experimental-feature AccessLevelOnImport'",
2361-
())
23622359
ERROR(access_level_on_import_unsupported, none,
23632360
"The access level %0 is unsupported on imports: "
23642361
"only 'public', 'package', 'internal', 'fileprivate' and 'private' "

include/swift/Basic/Features.def

Lines changed: 1 addition & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 2 additions & 3 deletions
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

Lines changed: 4 additions & 3 deletions
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/ImportResolution.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -821,14 +821,21 @@ void UnboundImport::validateResilience(NullablePtr<ModuleDecl> topLevelModule,
821821
topLevelModule.get()->getName(),
822822
SF.getParentModule()->getName());
823823

824-
if (ctx.LangOpts.hasFeature(Feature::AccessLevelOnImport)) {
824+
if (ctx.LangOpts.hasFeature(Feature::InternalImportsByDefault)) {
825+
// This will catch Swift 6 language mode as well where
826+
// it will be reported as an error.
827+
inFlight.fixItRemove(import.accessLevelRange);
828+
} else {
825829
SourceRange attrRange = import.accessLevelRange;
826830
if (attrRange.isValid())
827831
inFlight.fixItReplace(attrRange, "internal");
828832
else
829833
inFlight.fixItInsert(import.importLoc, "internal ");
830-
} else {
831-
inFlight.limitBehavior(DiagnosticBehavior::Warning);
834+
835+
// Downgrade to warning only in pre-Swift 6 mode and
836+
// when not using the experimental flag.
837+
if (!ctx.LangOpts.hasFeature(Feature::AccessLevelOnImport))
838+
inFlight.limitBehavior(DiagnosticBehavior::Warning);
832839
}
833840
}
834841

lib/Sema/TypeCheckAccess.cpp

Lines changed: 1 addition & 1 deletion
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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -998,12 +998,6 @@ bool AttributeChecker::visitAbstractAccessControlAttr(
998998

999999
SourceFile *File = D->getDeclContext()->getParentSourceFile();
10001000
if (auto importDecl = dyn_cast<ImportDecl>(D)) {
1001-
if (!D->getASTContext().LangOpts.hasFeature(Feature::AccessLevelOnImport) &&
1002-
File && File->Kind != SourceFileKind::Interface) {
1003-
diagnoseAndRemoveAttr(attr, diag::access_level_on_import_not_enabled);
1004-
return true;
1005-
}
1006-
10071001
if (attr->getAccess() == AccessLevel::Open) {
10081002
diagnoseAndRemoveAttr(attr, diag::access_level_on_import_unsupported,
10091003
attr);

lib/Sema/TypeChecker.cpp

Lines changed: 1 addition & 1 deletion
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

Lines changed: 40 additions & 8 deletions
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
@@ -21,30 +22,57 @@
2122
// RUN: -package-name TestPackage \
2223
// RUN: -enable-library-evolution -swift-version 5 \
2324
// RUN: -emit-module-interface-path %t/Client.swiftinterface \
24-
// RUN: -emit-private-module-interface-path %t/Client.private.swiftinterface \
25-
// RUN: -enable-experimental-feature AccessLevelOnImport
25+
// RUN: -emit-private-module-interface-path %t/Client.private.swiftinterface
2626

2727
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.swiftinterface) -I %t
2828
// RUN: %target-swift-typecheck-module-from-interface(%t/Client.private.swiftinterface) -I %t \
2929
// RUN: -module-name Client
3030

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

3434
/// Build a client composed of many files.
3535
// RUN: %target-swift-frontend -typecheck %t/MultiFiles?.swift -I %t \
3636
// RUN: -package-name TestPackage \
3737
// RUN: -enable-library-evolution -swift-version 5 \
3838
// RUN: -emit-module-interface-path %t/MultiFiles.swiftinterface \
39-
// RUN: -emit-private-module-interface-path %t/MultiFiles.private.swiftinterface \
40-
// RUN: -enable-experimental-feature AccessLevelOnImport
39+
// RUN: -emit-private-module-interface-path %t/MultiFiles.private.swiftinterface
4140

4241
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.swiftinterface) -I %t
4342
// RUN: %target-swift-typecheck-module-from-interface(%t/MultiFiles.private.swiftinterface) -I %t \
4443
// RUN: -module-name MultiFiles
4544

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

4977
//--- PublicLib.swift
5078
//--- PackageLib.swift
@@ -53,6 +81,10 @@
5381
//--- PrivateLib.swift
5482

5583
//--- Client.swift
84+
// CHECK-5-NOT: public
85+
// CHECK-FLAG: -enable-upcoming-feature InternalImportsByDefault
86+
// CHECK-6: public
87+
5688
public import PublicLib
5789
// CHECK: PublicLib
5890

0 commit comments

Comments
 (0)