Skip to content

Commit 91f7854

Browse files
authored
Merge pull request #62652 from apple/es-pkg-acl
[NFC] Add 'package' access modifier to AccessLevel
2 parents 3cc5628 + bf8f9a8 commit 91f7854

32 files changed

+180
-129
lines changed

include/swift/AST/AccessScope.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ class AccessScope {
9898
}
9999
if (isPackage())
100100
return AS.isPublic();
101-
102101
// If this is public, it can't be less than access level of AS
103102
// so return false
104103
return false;

include/swift/AST/AttrKind.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ enum class AccessLevel : uint8_t {
6060
FilePrivate,
6161
/// Internal access is limited to the current module.
6262
Internal,
63+
/// Package access is not limited, but some capabilities may be
64+
/// restricted outside of the current package containing modules.
65+
/// It's similar to Public in that it's accessible from other modules
66+
/// and subclassable only within the defining module as long as
67+
/// the modules are in the same package.
68+
Package,
6369
/// Public access is not limited, but some capabilities may be
6470
/// restricted outside of the current module.
6571
Public,

include/swift/AST/Decl.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -693,13 +693,14 @@ class alignas(1 << DeclAlignInBits) Decl : public ASTAllocated<Decl> {
693693
NumPathElements : 8
694694
);
695695

696-
SWIFT_INLINE_BITFIELD(ExtensionDecl, Decl, 3+1,
696+
SWIFT_INLINE_BITFIELD(ExtensionDecl, Decl, 4+1,
697697
/// An encoding of the default and maximum access level for this extension.
698+
/// The value 4 corresponds to AccessLevel::Public
698699
///
699700
/// This is encoded as (1 << (maxAccess-1)) | (1 << (defaultAccess-1)),
700701
/// which works because the maximum is always greater than or equal to the
701702
/// default, and 'private' is never used. 0 represents an uncomputed value.
702-
DefaultAndMaxAccessLevel : 3,
703+
DefaultAndMaxAccessLevel : 4,
703704

704705
/// Whether there is are lazily-loaded conformances for this extension.
705706
HasLazyConformances : 1

include/swift/AST/DiagnosticsSema.def

Lines changed: 124 additions & 124 deletions
Large diffs are not rendered by default.

lib/APIDigester/ModuleAnalyzerNodes.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,6 +1742,7 @@ SDKContext::shouldIgnore(Decl *D, const Decl* Parent) const {
17421742
case AccessLevel::Private:
17431743
case AccessLevel::FilePrivate:
17441744
return true;
1745+
case AccessLevel::Package:
17451746
case AccessLevel::Public:
17461747
case AccessLevel::Open:
17471748
break;

lib/AST/ASTPrinter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,9 @@ class PrintAST : public ASTVisitor<PrintAST> {
730730
case AccessLevel::Public:
731731
Printer << tok::kw_public;
732732
break;
733+
case AccessLevel::Package:
734+
Printer.printKeyword("package", Options);
735+
break;
733736
case AccessLevel::Open:
734737
Printer.printKeyword("open", Options);
735738
break;

lib/AST/ASTVerifier.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,7 @@ class Verifier : public ASTWalker {
941941
PrettyStackTraceDecl debugStack("verifying access", D);
942942
if (!D->getASTContext().isAccessControlDisabled() &&
943943
D->getFormalAccessScope().isPublic() &&
944-
D->getFormalAccess() < AccessLevel::Public) {
944+
D->getFormalAccess() <= AccessLevel::Package) {
945945
Out << "non-public decl has no formal access scope\n";
946946
D->dump(Out);
947947
abort();

lib/AST/AccessRequests.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ DefaultAndMaxAccessLevelRequest::evaluate(Evaluator &evaluator,
251251
maxAccess = AccessLevel::Public;
252252
} else if (maxScope->isPublic()) {
253253
maxAccess = AccessLevel::Public;
254+
} else if (maxScope->isPackage()) {
255+
maxAccess = AccessLevel::Package;
254256
} else if (isa<ModuleDecl>(maxScope->getDeclContext())) {
255257
maxAccess = AccessLevel::Internal;
256258
} else {

lib/AST/Attr.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ StringRef swift::getAccessLevelSpelling(AccessLevel value) {
7575
case AccessLevel::Private: return "private";
7676
case AccessLevel::FilePrivate: return "fileprivate";
7777
case AccessLevel::Internal: return "internal";
78+
case AccessLevel::Package: return "package";
7879
case AccessLevel::Public: return "public";
7980
case AccessLevel::Open: return "open";
8081
}

lib/AST/Decl.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3652,6 +3652,7 @@ AccessLevel ValueDecl::getEffectiveAccess() const {
36523652
switch (effectiveAccess) {
36533653
case AccessLevel::Open:
36543654
break;
3655+
case AccessLevel::Package:
36553656
case AccessLevel::Public:
36563657
case AccessLevel::Internal:
36573658
if (getModuleContext()->isTestingEnabled() ||
@@ -3774,6 +3775,7 @@ getAccessScopeForFormalAccess(const ValueDecl *VD,
37743775
: AccessLimitKind::None);
37753776
case AccessLevel::Internal:
37763777
return AccessScope(resultDC->getParentModule());
3778+
case AccessLevel::Package:
37773779
case AccessLevel::Public:
37783780
case AccessLevel::Open:
37793781
return AccessScope::getPublic();
@@ -3923,6 +3925,7 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
39233925
auto *useSF = dyn_cast<SourceFile>(useFile);
39243926
return useSF && useSF->hasTestableOrPrivateImport(access, sourceModule);
39253927
}
3928+
case AccessLevel::Package:
39263929
case AccessLevel::Public:
39273930
case AccessLevel::Open:
39283931
return true;

lib/AST/Module.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2762,6 +2762,7 @@ bool SourceFile::hasTestableOrPrivateImport(
27622762
auto *module = ofDecl->getModuleContext();
27632763
switch (accessLevel) {
27642764
case AccessLevel::Internal:
2765+
case AccessLevel::Package:
27652766
case AccessLevel::Public:
27662767
// internal/public access only needs an import marked as @_private. The
27672768
// filename does not need to match (and we don't serialize it for such

lib/IDE/CodeCompletionResultBuilder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ class CodeCompletionResultBuilder {
179179
case AccessLevel::Internal:
180180
// 'internal' is the default, don't add it.
181181
break;
182+
case AccessLevel::Package:
183+
addChunkWithTextNoCopy(
184+
CodeCompletionString::Chunk::ChunkKind::AccessControlKeyword,
185+
"package ");
186+
break;
182187
case AccessLevel::Public:
183188
addChunkWithTextNoCopy(
184189
CodeCompletionString::Chunk::ChunkKind::AccessControlKeyword,

lib/IRGen/GenDecl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,6 +1525,7 @@ bool IRGenerator::hasLazyMetadata(TypeDecl *type) {
15251525
switch (type->getEffectiveAccess()) {
15261526
case AccessLevel::Open:
15271527
case AccessLevel::Public:
1528+
case AccessLevel::Package:
15281529
// We can't remove metadata for externally visible types.
15291530
return false;
15301531
case AccessLevel::Internal:

lib/SIL/IR/SIL.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ FormalLinkage swift::getDeclLinkage(const ValueDecl *D) {
4040
return FormalLinkage::PublicNonUnique;
4141

4242
switch (D->getEffectiveAccess()) {
43+
case AccessLevel::Package:
4344
case AccessLevel::Public:
4445
case AccessLevel::Open:
4546
return FormalLinkage::PublicUnique;

lib/SIL/IR/SILDeclRef.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,7 @@ SILLinkage SILDeclRef::getDefinitionLinkage() const {
607607
return SILLinkage::Shared;
608608
return SILLinkage::Hidden;
609609

610+
case AccessLevel::Package:
610611
case AccessLevel::Public:
611612
case AccessLevel::Open:
612613
switch (limit) {
@@ -1516,6 +1517,7 @@ SubclassScope SILDeclRef::getSubclassScope() const {
15161517
// SILModule, so we don't need to do anything.
15171518
return SubclassScope::NotApplicable;
15181519
case AccessLevel::Internal:
1520+
case AccessLevel::Package:
15191521
case AccessLevel::Public:
15201522
// If the class is internal or public, it can only be subclassed from
15211523
// the same AST Module, but possibly a different SILModule.

lib/SIL/IR/SILModule.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -926,6 +926,7 @@ SILLinkage swift::getDeclSILLinkage(const ValueDecl *decl) {
926926
case AccessLevel::Internal:
927927
linkage = SILLinkage::Hidden;
928928
break;
929+
case AccessLevel::Package:
929930
case AccessLevel::Public:
930931
case AccessLevel::Open:
931932
linkage = SILLinkage::Public;

lib/SILOptimizer/Analysis/BasicCalleeAnalysis.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ void CalleeCache::computeWitnessMethodCalleesForWitnessTable(
177177
switch (Conf->getProtocol()->getEffectiveAccess()) {
178178
case AccessLevel::Open:
179179
llvm_unreachable("protocols cannot have open access level");
180+
case AccessLevel::Package:
180181
case AccessLevel::Public:
181182
canCallUnknown = true;
182183
break;

lib/SILOptimizer/IPO/DeadFunctionElimination.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ class DeadFunctionAndGlobalElimination {
394394
case AccessLevel::Internal:
395395
linkage = SILLinkage::Hidden;
396396
break;
397+
case AccessLevel::Package:
397398
case AccessLevel::Public:
398399
case AccessLevel::Open:
399400
linkage = SILLinkage::Public;

lib/SILOptimizer/IPO/GlobalOpt.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,7 @@ static bool canBeChangedExternally(SILGlobalVariable *SILG) {
490490
return false;
491491
case AccessLevel::Internal:
492492
return !SILG->getModule().isWholeModule();
493+
case AccessLevel::Package:
493494
case AccessLevel::Public:
494495
case AccessLevel::Open:
495496
return true;

lib/SILOptimizer/Transforms/SpeculativeDevirtualizer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ static bool isDefaultCaseKnown(ClassHierarchyAnalysis *CHA,
305305
case AccessLevel::Open:
306306
return false;
307307
case AccessLevel::Public:
308+
case AccessLevel::Package:
308309
case AccessLevel::Internal:
309310
if (!AI.getModule().isWholeModule())
310311
return false;

lib/SILOptimizer/Utils/Devirtualize.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ static bool isKnownFinalClass(ClassDecl *cd, SILModule &module,
156156
case AccessLevel::Open:
157157
return false;
158158
case AccessLevel::Public:
159+
case AccessLevel::Package:
159160
case AccessLevel::Internal:
160161
if (!module.isWholeModule())
161162
return false;
@@ -177,6 +178,7 @@ static bool isKnownFinalClass(ClassDecl *cd, SILModule &module,
177178
case AccessLevel::Open:
178179
return false;
179180
case AccessLevel::Public:
181+
case AccessLevel::Package:
180182
case AccessLevel::Internal:
181183
if (!module.isWholeModule())
182184
return false;

lib/SILOptimizer/Utils/InstOptUtils.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,6 +1344,7 @@ bool swift::calleesAreStaticallyKnowable(SILModule &module, ValueDecl *vd) {
13441344
case AccessLevel::Open:
13451345
return false;
13461346
case AccessLevel::Public:
1347+
case AccessLevel::Package:
13471348
if (isa<ConstructorDecl>(vd)) {
13481349
// Constructors are special: a derived class in another module can
13491350
// "override" a constructor if its class is "open", although the

lib/Sema/MiscDiagnostics.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5626,6 +5626,7 @@ void swift::fixItAccess(InFlightDiagnostic &diag, ValueDecl *VD,
56265626
case AccessLevel::Private: fixItString = "private "; break;
56275627
case AccessLevel::FilePrivate: fixItString = "fileprivate "; break;
56285628
case AccessLevel::Internal: fixItString = "internal "; break;
5629+
case AccessLevel::Package: fixItString = "package "; break;
56295630
case AccessLevel::Public: fixItString = "public "; break;
56305631
case AccessLevel::Open: fixItString = "open "; break;
56315632
}

lib/Sema/TypeCheckAccess.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,6 +2105,7 @@ static void checkExtensionGenericParamAccess(const ExtensionDecl *ED) {
21052105
case AccessLevel::Internal:
21062106
desiredAccessScope = AccessScope(ED->getModuleContext());
21072107
break;
2108+
case AccessLevel::Package:
21082109
case AccessLevel::Public:
21092110
case AccessLevel::Open:
21102111
break;

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3489,6 +3489,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
34893489
case AccessLevel::Open:
34903490
requiredAccess = AccessLevel::Public;
34913491
break;
3492+
case AccessLevel::Package:
34923493
case AccessLevel::Public:
34933494
case AccessLevel::Internal:
34943495
requiredAccess = AccessLevel::Internal;

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6180,6 +6180,7 @@ static void diagnoseUnstableName(ProtocolConformance *conformance,
61806180
case AccessLevel::Internal:
61816181
case AccessLevel::Open:
61826182
case AccessLevel::Public:
6183+
case AccessLevel::Package:
61836184
break;
61846185
}
61856186
}

lib/Serialization/Deserialization.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2493,6 +2493,7 @@ static Optional<swift::AccessLevel> getActualAccessLevel(uint8_t raw) {
24932493
CASE(Private)
24942494
CASE(FilePrivate)
24952495
CASE(Internal)
2496+
CASE(Package)
24962497
CASE(Public)
24972498
CASE(Open)
24982499
#undef CASE

lib/Serialization/ModuleFormat.h

Lines changed: 2 additions & 1 deletion
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 = 735; // @attached
61+
const uint16_t SWIFTMODULE_VERSION_MINOR = 736; // add package access modifier
6262

6363
/// A standard hash seed used for all string hashes in a serialized module.
6464
///
@@ -521,6 +521,7 @@ enum class AccessLevel : uint8_t {
521521
Private = 0,
522522
FilePrivate,
523523
Internal,
524+
Package,
524525
Public,
525526
Open,
526527
};

lib/Serialization/Serialization.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2195,6 +2195,7 @@ static uint8_t getRawStableAccessLevel(swift::AccessLevel access) {
21952195
CASE(Private)
21962196
CASE(FilePrivate)
21972197
CASE(Internal)
2198+
CASE(Package)
21982199
CASE(Public)
21992200
CASE(Open)
22002201
#undef CASE

tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,7 @@ namespace {
11341134
static UIdent getAccessLevelUID(AccessLevel Access) {
11351135
static UIdent AccessOpen("source.lang.swift.accessibility.open");
11361136
static UIdent AccessPublic("source.lang.swift.accessibility.public");
1137+
static UIdent AccessPackage("source.lang.swift.accessibility.package");
11371138
static UIdent AccessInternal("source.lang.swift.accessibility.internal");
11381139
static UIdent AccessFilePrivate("source.lang.swift.accessibility.fileprivate");
11391140
static UIdent AccessPrivate("source.lang.swift.accessibility.private");
@@ -1145,6 +1146,8 @@ static UIdent getAccessLevelUID(AccessLevel Access) {
11451146
return AccessFilePrivate;
11461147
case AccessLevel::Internal:
11471148
return AccessInternal;
1149+
case AccessLevel::Package:
1150+
return AccessPackage;
11481151
case AccessLevel::Public:
11491152
return AccessPublic;
11501153
case AccessLevel::Open:

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,13 @@ static UIdent Attr_ObjcNamed("source.decl.attribute.objc.name");
7474
static UIdent Attr_Private("source.decl.attribute.private");
7575
static UIdent Attr_FilePrivate("source.decl.attribute.fileprivate");
7676
static UIdent Attr_Internal("source.decl.attribute.internal");
77+
static UIdent Attr_Package("source.decl.attribute.package");
7778
static UIdent Attr_Public("source.decl.attribute.public");
7879
static UIdent Attr_Open("source.decl.attribute.open");
7980
static UIdent Attr_Setter_Private("source.decl.attribute.setter_access.private");
8081
static UIdent Attr_Setter_FilePrivate("source.decl.attribute.setter_access.fileprivate");
8182
static UIdent Attr_Setter_Internal("source.decl.attribute.setter_access.internal");
83+
static UIdent Attr_Setter_Package("source.decl.attribute.setter_access.package");
8284
static UIdent Attr_Setter_Public("source.decl.attribute.setter_access.public");
8385
static UIdent Attr_Setter_Open("source.decl.attribute.setter_access.open");
8486
static UIdent EffectiveAccess_Public("source.decl.effective_access.public");
@@ -794,6 +796,8 @@ Optional<UIdent> SwiftLangSupport::getUIDForDeclAttribute(const swift::DeclAttri
794796
return Attr_FilePrivate;
795797
case AccessLevel::Internal:
796798
return Attr_Internal;
799+
case AccessLevel::Package:
800+
return Attr_Package;
797801
case AccessLevel::Public:
798802
return Attr_Public;
799803
case AccessLevel::Open:
@@ -808,6 +812,8 @@ Optional<UIdent> SwiftLangSupport::getUIDForDeclAttribute(const swift::DeclAttri
808812
return Attr_Setter_FilePrivate;
809813
case AccessLevel::Internal:
810814
return Attr_Setter_Internal;
815+
case AccessLevel::Package:
816+
return Attr_Setter_Package;
811817
case AccessLevel::Public:
812818
return Attr_Setter_Public;
813819
case AccessLevel::Open:

utils/gyb_syntax_support/AttributeKinds.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,7 @@ def __init__(self, name, swift_name=None):
833833
DeclAttributeAlias('fileprivate', 'AccessControl', swift_name='fileprivateKeyword'),
834834
DeclAttributeAlias('internal', 'AccessControl', swift_name='internalKeyword'),
835835
DeclAttributeAlias('public', 'AccessControl', swift_name='publicKeyword'),
836+
ContextualDeclAttributeAlias('package', 'AccessControl'),
836837
ContextualDeclAttributeAlias('open', 'AccessControl'),
837838
DeclAttribute('__setter_access', 'SetterAccess',
838839
OnVar, OnSubscript,

0 commit comments

Comments
 (0)