Skip to content

Commit 1c66d02

Browse files
committed
Add package access level to enum AccessLevel
Resolves rdar://104198440
1 parent 792be3f commit 1c66d02

31 files changed

+57
-5
lines changed

Diff for: include/swift/AST/AccessScope.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class AccessScope {
7070
return RHS.isPublic();
7171
if (isPackage())
7272
return RHS.isPackage();
73+
7374
return getDeclContext() == RHS.getDeclContext();
7475
}
7576

@@ -98,7 +99,6 @@ class AccessScope {
9899
}
99100
if (isPackage())
100101
return AS.isPublic();
101-
102102
// If this is public, it can't be less than access level of AS
103103
// so return false
104104
return false;

Diff for: include/swift/AST/AttrKind.h

+6
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,

Diff for: include/swift/AST/Decl.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -687,13 +687,14 @@ class alignas(1 << DeclAlignInBits) Decl : public ASTAllocated<Decl> {
687687
NumPathElements : 8
688688
);
689689

690-
SWIFT_INLINE_BITFIELD(ExtensionDecl, Decl, 3+1,
690+
SWIFT_INLINE_BITFIELD(ExtensionDecl, Decl, 4+1,
691691
/// An encoding of the default and maximum access level for this extension.
692+
/// The value 4 corresponds to AccessLevel::Public
692693
///
693694
/// This is encoded as (1 << (maxAccess-1)) | (1 << (defaultAccess-1)),
694695
/// which works because the maximum is always greater than or equal to the
695696
/// default, and 'private' is never used. 0 represents an uncomputed value.
696-
DefaultAndMaxAccessLevel : 3,
697+
DefaultAndMaxAccessLevel : 4,
697698

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

Diff for: lib/APIDigester/ModuleAnalyzerNodes.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1733,6 +1733,7 @@ SDKContext::shouldIgnore(Decl *D, const Decl* Parent) const {
17331733
case AccessLevel::Private:
17341734
case AccessLevel::FilePrivate:
17351735
return true;
1736+
case AccessLevel::Package:
17361737
case AccessLevel::Public:
17371738
case AccessLevel::Open:
17381739
break;

Diff for: lib/AST/ASTPrinter.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,9 @@ class PrintAST : public ASTVisitor<PrintAST> {
728728
case AccessLevel::Public:
729729
Printer << tok::kw_public;
730730
break;
731+
case AccessLevel::Package:
732+
Printer.printKeyword("package", Options);
733+
break;
731734
case AccessLevel::Open:
732735
Printer.printKeyword("open", Options);
733736
break;

Diff for: lib/AST/ASTVerifier.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,7 @@ class Verifier : public ASTWalker {
944944
PrettyStackTraceDecl debugStack("verifying access", D);
945945
if (!D->getASTContext().isAccessControlDisabled() &&
946946
D->getFormalAccessScope().isPublic() &&
947-
D->getFormalAccess() < AccessLevel::Public) {
947+
D->getFormalAccess() <= AccessLevel::Package) {
948948
Out << "non-public decl has no formal access scope\n";
949949
D->dump(Out);
950950
abort();

Diff for: lib/AST/AccessRequests.cpp

+2
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 {

Diff for: lib/AST/Attr.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ StringRef swift::getAccessLevelSpelling(AccessLevel value) {
7474
case AccessLevel::Private: return "private";
7575
case AccessLevel::FilePrivate: return "fileprivate";
7676
case AccessLevel::Internal: return "internal";
77+
case AccessLevel::Package: return "package";
7778
case AccessLevel::Public: return "public";
7879
case AccessLevel::Open: return "open";
7980
}

Diff for: lib/AST/Decl.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -3598,6 +3598,7 @@ AccessLevel ValueDecl::getEffectiveAccess() const {
35983598
switch (effectiveAccess) {
35993599
case AccessLevel::Open:
36003600
break;
3601+
case AccessLevel::Package:
36013602
case AccessLevel::Public:
36023603
case AccessLevel::Internal:
36033604
if (getModuleContext()->isTestingEnabled() ||
@@ -3720,6 +3721,7 @@ getAccessScopeForFormalAccess(const ValueDecl *VD,
37203721
: AccessLimitKind::None);
37213722
case AccessLevel::Internal:
37223723
return AccessScope(resultDC->getParentModule());
3724+
case AccessLevel::Package:
37233725
case AccessLevel::Public:
37243726
case AccessLevel::Open:
37253727
return AccessScope::getPublic();
@@ -3869,6 +3871,7 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
38693871
auto *useSF = dyn_cast<SourceFile>(useFile);
38703872
return useSF && useSF->hasTestableOrPrivateImport(access, sourceModule);
38713873
}
3874+
case AccessLevel::Package:
38723875
case AccessLevel::Public:
38733876
case AccessLevel::Open:
38743877
return true;

Diff for: lib/AST/Module.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2752,6 +2752,7 @@ bool SourceFile::hasTestableOrPrivateImport(
27522752
auto *module = ofDecl->getModuleContext();
27532753
switch (accessLevel) {
27542754
case AccessLevel::Internal:
2755+
case AccessLevel::Package:
27552756
case AccessLevel::Public:
27562757
// internal/public access only needs an import marked as @_private. The
27572758
// filename does not need to match (and we don't serialize it for such

Diff for: lib/IDE/CodeCompletionResultBuilder.h

+5
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,

Diff for: lib/IRGen/GenDecl.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1529,6 +1529,7 @@ bool IRGenerator::hasLazyMetadata(TypeDecl *type) {
15291529
switch (type->getEffectiveAccess()) {
15301530
case AccessLevel::Open:
15311531
case AccessLevel::Public:
1532+
case AccessLevel::Package:
15321533
// We can't remove metadata for externally visible types.
15331534
return false;
15341535
case AccessLevel::Internal:

Diff for: lib/SIL/IR/SIL.cpp

+1
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;

Diff for: lib/SIL/IR/SILDeclRef.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,7 @@ SILLinkage SILDeclRef::getDefinitionLinkage() const {
600600
return SILLinkage::Shared;
601601
return SILLinkage::Hidden;
602602

603+
case AccessLevel::Package:
603604
case AccessLevel::Public:
604605
case AccessLevel::Open:
605606
switch (limit) {
@@ -1490,6 +1491,7 @@ SubclassScope SILDeclRef::getSubclassScope() const {
14901491
// SILModule, so we don't need to do anything.
14911492
return SubclassScope::NotApplicable;
14921493
case AccessLevel::Internal:
1494+
case AccessLevel::Package:
14931495
case AccessLevel::Public:
14941496
// If the class is internal or public, it can only be subclassed from
14951497
// the same AST Module, but possibly a different SILModule.

Diff for: lib/SIL/IR/SILModule.cpp

+1
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;

Diff for: lib/SILOptimizer/Analysis/BasicCalleeAnalysis.cpp

+1
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;

Diff for: lib/SILOptimizer/IPO/DeadFunctionElimination.cpp

+1
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;

Diff for: lib/SILOptimizer/IPO/GlobalOpt.cpp

+1
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;

Diff for: lib/SILOptimizer/Transforms/SpeculativeDevirtualizer.cpp

+1
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;

Diff for: lib/SILOptimizer/Utils/Devirtualize.cpp

+2
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;

Diff for: lib/SILOptimizer/Utils/InstOptUtils.cpp

+1
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

Diff for: lib/Sema/MiscDiagnostics.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -5554,6 +5554,7 @@ void swift::fixItAccess(InFlightDiagnostic &diag, ValueDecl *VD,
55545554
case AccessLevel::Private: fixItString = "private "; break;
55555555
case AccessLevel::FilePrivate: fixItString = "fileprivate "; break;
55565556
case AccessLevel::Internal: fixItString = "internal "; break;
5557+
case AccessLevel::Package: fixItString = "package "; break;
55575558
case AccessLevel::Public: fixItString = "public "; break;
55585559
case AccessLevel::Open: fixItString = "open "; break;
55595560
}

Diff for: lib/Sema/TypeCheckAccess.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2102,6 +2102,7 @@ static void checkExtensionGenericParamAccess(const ExtensionDecl *ED) {
21022102
case AccessLevel::Internal:
21032103
desiredAccessScope = AccessScope(ED->getModuleContext());
21042104
break;
2105+
case AccessLevel::Package:
21052106
case AccessLevel::Public:
21062107
case AccessLevel::Open:
21072108
break;

Diff for: lib/Sema/TypeCheckDeclPrimary.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -3420,6 +3420,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
34203420
case AccessLevel::Open:
34213421
requiredAccess = AccessLevel::Public;
34223422
break;
3423+
case AccessLevel::Package:
34233424
case AccessLevel::Public:
34243425
case AccessLevel::Internal:
34253426
requiredAccess = AccessLevel::Internal;

Diff for: lib/Sema/TypeCheckProtocol.cpp

+1
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
}

Diff for: lib/Serialization/Deserialization.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2481,6 +2481,7 @@ static Optional<swift::AccessLevel> getActualAccessLevel(uint8_t raw) {
24812481
CASE(Private)
24822482
CASE(FilePrivate)
24832483
CASE(Internal)
2484+
CASE(Package)
24842485
CASE(Public)
24852486
CASE(Open)
24862487
#undef CASE

Diff for: lib/Serialization/ModuleFormat.h

+2-1
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 = 728; // package name field
61+
const uint16_t SWIFTMODULE_VERSION_MINOR = 735; // 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
};

Diff for: lib/Serialization/Serialization.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2188,6 +2188,7 @@ static uint8_t getRawStableAccessLevel(swift::AccessLevel access) {
21882188
CASE(Private)
21892189
CASE(FilePrivate)
21902190
CASE(Internal)
2191+
CASE(Package)
21912192
CASE(Public)
21922193
CASE(Open)
21932194
#undef CASE

Diff for: tools/SourceKit/lib/SwiftLang/SwiftEditor.cpp

+3
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:

Diff for: tools/SourceKit/lib/SwiftLang/SwiftLangSupport.cpp

+6
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");
@@ -793,6 +795,8 @@ Optional<UIdent> SwiftLangSupport::getUIDForDeclAttribute(const swift::DeclAttri
793795
return Attr_FilePrivate;
794796
case AccessLevel::Internal:
795797
return Attr_Internal;
798+
case AccessLevel::Package:
799+
return Attr_Package;
796800
case AccessLevel::Public:
797801
return Attr_Public;
798802
case AccessLevel::Open:
@@ -807,6 +811,8 @@ Optional<UIdent> SwiftLangSupport::getUIDForDeclAttribute(const swift::DeclAttri
807811
return Attr_Setter_FilePrivate;
808812
case AccessLevel::Internal:
809813
return Attr_Setter_Internal;
814+
case AccessLevel::Package:
815+
return Attr_Setter_Package;
810816
case AccessLevel::Public:
811817
return Attr_Setter_Public;
812818
case AccessLevel::Open:

Diff for: utils/gyb_syntax_support/AttributeKinds.py

+1
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)