@@ -2578,9 +2578,9 @@ bool ValueDecl::shouldHideFromEditor() const {
2578
2578
return false ;
2579
2579
}
2580
2580
2581
- // / Return the access level of an internal or public declaration
2582
- // / that's been testably imported .
2583
- static AccessLevel getTestableOrPrivateImportsAccess (const ValueDecl *decl) {
2581
+ // / Return maximally open access level which could be associated with the
2582
+ // / given declaration accounting for @testable importers .
2583
+ static AccessLevel getMaximallyOpenAccessFor (const ValueDecl *decl) {
2584
2584
// Non-final classes are considered open to @testable importers.
2585
2585
if (auto cls = dyn_cast<ClassDecl>(decl)) {
2586
2586
if (!cls->isFinal ())
@@ -2606,6 +2606,11 @@ static AccessLevel getAdjustedFormalAccess(const ValueDecl *VD,
2606
2606
AccessLevel access,
2607
2607
const DeclContext *useDC,
2608
2608
bool treatUsableFromInlineAsPublic) {
2609
+ // If access control is disabled in the current context, adjust
2610
+ // access level of the current declaration to be as open as possible.
2611
+ if (useDC && VD->getASTContext ().isAccessControlDisabled ())
2612
+ return getMaximallyOpenAccessFor (VD);
2613
+
2609
2614
if (treatUsableFromInlineAsPublic &&
2610
2615
access == AccessLevel::Internal &&
2611
2616
VD->isUsableFromInline ()) {
@@ -2618,7 +2623,7 @@ static AccessLevel getAdjustedFormalAccess(const ValueDecl *VD,
2618
2623
auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext ());
2619
2624
if (!useSF) return access;
2620
2625
if (useSF->hasTestableOrPrivateImport (access, VD))
2621
- return getTestableOrPrivateImportsAccess (VD);
2626
+ return getMaximallyOpenAccessFor (VD);
2622
2627
}
2623
2628
2624
2629
return access;
@@ -2646,16 +2651,16 @@ AccessLevel ValueDecl::getEffectiveAccess() const {
2646
2651
case AccessLevel::Internal:
2647
2652
if (getModuleContext ()->isTestingEnabled () ||
2648
2653
getModuleContext ()->arePrivateImportsEnabled ())
2649
- effectiveAccess = getTestableOrPrivateImportsAccess (this );
2654
+ effectiveAccess = getMaximallyOpenAccessFor (this );
2650
2655
break ;
2651
2656
case AccessLevel::FilePrivate:
2652
2657
if (getModuleContext ()->arePrivateImportsEnabled ())
2653
- effectiveAccess = getTestableOrPrivateImportsAccess (this );
2658
+ effectiveAccess = getMaximallyOpenAccessFor (this );
2654
2659
break ;
2655
2660
case AccessLevel::Private:
2656
2661
effectiveAccess = AccessLevel::FilePrivate;
2657
2662
if (getModuleContext ()->arePrivateImportsEnabled ())
2658
- effectiveAccess = getTestableOrPrivateImportsAccess (this );
2663
+ effectiveAccess = getMaximallyOpenAccessFor (this );
2659
2664
break ;
2660
2665
}
2661
2666
@@ -2851,9 +2856,7 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
2851
2856
case AccessLevel::FilePrivate:
2852
2857
if (useDC->getModuleScopeContext () != sourceDC->getModuleScopeContext ()) {
2853
2858
auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext ());
2854
- if (useSF && useSF->hasTestableOrPrivateImport (access, VD))
2855
- return true ;
2856
- return false ;
2859
+ return useSF && useSF->hasTestableOrPrivateImport (access, VD);
2857
2860
}
2858
2861
return true ;
2859
2862
case AccessLevel::Internal: {
@@ -2862,10 +2865,7 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
2862
2865
if (useFile->getParentModule () == sourceModule)
2863
2866
return true ;
2864
2867
auto *useSF = dyn_cast<SourceFile>(useFile);
2865
- if (!useSF) return false ;
2866
- if (useSF->hasTestableOrPrivateImport (access, sourceModule))
2867
- return true ;
2868
- return false ;
2868
+ return useSF && useSF->hasTestableOrPrivateImport (access, sourceModule);
2869
2869
}
2870
2870
case AccessLevel::Public:
2871
2871
case AccessLevel::Open:
0 commit comments