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

include/swift/AST/AccessScope.h

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

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
@@ -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

lib/APIDigester/ModuleAnalyzerNodes.cpp

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

lib/AST/ASTPrinter.cpp

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

lib/AST/ASTVerifier.cpp

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

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
@@ -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
}

lib/AST/Decl.cpp

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

lib/AST/Module.cpp

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

0 commit comments

Comments
 (0)