@@ -2578,9 +2578,9 @@ bool ValueDecl::shouldHideFromEditor() const {
25782578 return false ;
25792579}
25802580
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) {
25842584 // Non-final classes are considered open to @testable importers.
25852585 if (auto cls = dyn_cast<ClassDecl>(decl)) {
25862586 if (!cls->isFinal ())
@@ -2606,6 +2606,11 @@ static AccessLevel getAdjustedFormalAccess(const ValueDecl *VD,
26062606 AccessLevel access,
26072607 const DeclContext *useDC,
26082608 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+
26092614 if (treatUsableFromInlineAsPublic &&
26102615 access == AccessLevel::Internal &&
26112616 VD->isUsableFromInline ()) {
@@ -2618,7 +2623,7 @@ static AccessLevel getAdjustedFormalAccess(const ValueDecl *VD,
26182623 auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext ());
26192624 if (!useSF) return access;
26202625 if (useSF->hasTestableOrPrivateImport (access, VD))
2621- return getTestableOrPrivateImportsAccess (VD);
2626+ return getMaximallyOpenAccessFor (VD);
26222627 }
26232628
26242629 return access;
@@ -2646,16 +2651,16 @@ AccessLevel ValueDecl::getEffectiveAccess() const {
26462651 case AccessLevel::Internal:
26472652 if (getModuleContext ()->isTestingEnabled () ||
26482653 getModuleContext ()->arePrivateImportsEnabled ())
2649- effectiveAccess = getTestableOrPrivateImportsAccess (this );
2654+ effectiveAccess = getMaximallyOpenAccessFor (this );
26502655 break ;
26512656 case AccessLevel::FilePrivate:
26522657 if (getModuleContext ()->arePrivateImportsEnabled ())
2653- effectiveAccess = getTestableOrPrivateImportsAccess (this );
2658+ effectiveAccess = getMaximallyOpenAccessFor (this );
26542659 break ;
26552660 case AccessLevel::Private:
26562661 effectiveAccess = AccessLevel::FilePrivate;
26572662 if (getModuleContext ()->arePrivateImportsEnabled ())
2658- effectiveAccess = getTestableOrPrivateImportsAccess (this );
2663+ effectiveAccess = getMaximallyOpenAccessFor (this );
26592664 break ;
26602665 }
26612666
@@ -2851,9 +2856,7 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
28512856 case AccessLevel::FilePrivate:
28522857 if (useDC->getModuleScopeContext () != sourceDC->getModuleScopeContext ()) {
28532858 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);
28572860 }
28582861 return true ;
28592862 case AccessLevel::Internal: {
@@ -2862,10 +2865,7 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
28622865 if (useFile->getParentModule () == sourceModule)
28632866 return true ;
28642867 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);
28692869 }
28702870 case AccessLevel::Public:
28712871 case AccessLevel::Open:
0 commit comments