Skip to content

Commit 6cc3d37

Browse files
committed
Refactor part2
1 parent 9feb758 commit 6cc3d37

File tree

5 files changed

+27
-38
lines changed

5 files changed

+27
-38
lines changed

include/swift/AST/Module.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -990,9 +990,7 @@ class SourceFile final : public FileUnit {
990990

991991
void addImports(ArrayRef<ImportedModuleDesc> IM);
992992

993-
bool hasTestableImport(const ModuleDecl *module) const;
994-
995-
bool hasPrivateImport(AccessLevel accessLevel, const ValueDecl *ofDecl) const;
993+
bool hasTestableOrPrivateImport(AccessLevel accessLevel, const ValueDecl *ofDecl) const;
996994

997995
void clearLookupCache();
998996

lib/AST/Decl.cpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2455,12 +2455,8 @@ static AccessLevel getAdjustedFormalAccess(const ValueDecl *VD,
24552455
// @testable/@_private import attributes.
24562456
auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext());
24572457
if (!useSF) return access;
2458-
if (useSF->hasPrivateImport(access, VD))
2458+
if (useSF->hasTestableOrPrivateImport(access, VD))
24592459
return getTestableOrPrivateImportsAccess(VD);
2460-
if ((access == AccessLevel::Internal || access == AccessLevel::Public) &&
2461-
useSF->hasTestableImport(VD->getModuleContext())) {
2462-
return getTestableOrPrivateImportsAccess(VD);
2463-
}
24642460
}
24652461

24662462
return access;
@@ -2677,15 +2673,15 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
26772673
case AccessLevel::Private:
26782674
if (useDC != sourceDC) {
26792675
auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext());
2680-
if (useSF && useSF->hasPrivateImport(access, VD))
2676+
if (useSF && useSF->hasTestableOrPrivateImport(access, VD))
26812677
return true;
26822678
}
26832679
return (useDC == sourceDC ||
26842680
AccessScope::allowsPrivateAccess(useDC, sourceDC));
26852681
case AccessLevel::FilePrivate:
26862682
if (useDC->getModuleScopeContext() != sourceDC->getModuleScopeContext()) {
26872683
auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext());
2688-
if (useSF && useSF->hasPrivateImport(access, VD))
2684+
if (useSF && useSF->hasTestableOrPrivateImport(access, VD))
26892685
return true;
26902686
return false;
26912687
}
@@ -2697,10 +2693,8 @@ static bool checkAccess(const DeclContext *useDC, const ValueDecl *VD,
26972693
return true;
26982694
auto *useSF = dyn_cast<SourceFile>(useFile);
26992695
if (!useSF) return false;
2700-
if (useSF->hasTestableImport(sourceModule))
2696+
if (useSF->hasTestableOrPrivateImport(access, sourceModule))
27012697
return true;
2702-
if (useSF->hasPrivateImport(access, VD))
2703-
return true;
27042698
return false;
27052699
}
27062700
case AccessLevel::Public:
@@ -3638,7 +3632,8 @@ bool EnumDecl::isFormallyExhaustive(const DeclContext *useDC) const {
36383632
// Testably imported enums are exhaustive, on the grounds that only the author
36393633
// of the original library can import it testably.
36403634
if (auto *useSF = dyn_cast<SourceFile>(useDC->getModuleScopeContext()))
3641-
if (useSF->hasTestableImport(containingModule))
3635+
if (useSF->hasTestableOrPrivateImport(AccessLevel::Internal,
3636+
containingModule))
36423637
return true;
36433638

36443639
// Otherwise, the enum is non-exhaustive.

lib/AST/Module.cpp

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,30 +1388,22 @@ void SourceFile::addImports(ArrayRef<ImportedModuleDesc> IM) {
13881388
Imports = newBuf;
13891389
}
13901390

1391-
bool SourceFile::hasTestableImport(const swift::ModuleDecl *module) const {
1392-
return std::any_of(
1393-
Imports.begin(), Imports.end(),
1394-
[module](ImportedModuleDesc desc) -> bool {
1395-
return desc.module.second == module &&
1396-
desc.importOptions.contains(ImportFlags::Testable);
1397-
});
1398-
}
1399-
1400-
bool SourceFile::hasPrivateImport(AccessLevel accessLevel,
1401-
const swift::ValueDecl *ofDecl) const {
1391+
bool SourceFile::hasTestableOrPrivateImport(
1392+
AccessLevel accessLevel, const swift::ValueDecl *ofDecl) const {
14021393
auto *module = ofDecl->getModuleContext();
14031394
switch (accessLevel) {
14041395
case AccessLevel::Internal:
14051396
case AccessLevel::Public:
14061397
// internal/public access only needs an import marked as @_private. The
14071398
// filename does not need to match (and we don't serialize it for such
14081399
// decls).
1409-
return std::any_of(Imports.begin(), Imports.end(),
1410-
[module](ImportedModuleDesc desc) -> bool {
1411-
return desc.module.second == module &&
1412-
desc.importOptions.contains(
1413-
ImportFlags::PrivateImport);
1414-
});
1400+
return std::any_of(
1401+
Imports.begin(), Imports.end(),
1402+
[module](ImportedModuleDesc desc) -> bool {
1403+
return desc.module.second == module &&
1404+
(desc.importOptions.contains(ImportFlags::PrivateImport) ||
1405+
desc.importOptions.contains(ImportFlags::Testable));
1406+
});
14151407
case AccessLevel::Open:
14161408
return true;
14171409
case AccessLevel::FilePrivate:

lib/IDE/CodeCompletion.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5943,10 +5943,13 @@ void CodeCompletionCallbacksImpl::doneParsing() {
59435943
// module loading, for example, the module file is corrupted.
59445944
if (!ModuleFilename.empty()) {
59455945
auto &Ctx = TheModule->getASTContext();
5946-
CodeCompletionCache::Key K{ModuleFilename, TheModule->getName().str(),
5947-
AccessPath, Request.NeedLeadingDot,
5948-
SF.hasTestableImport(TheModule),
5949-
Ctx.LangOpts.CodeCompleteInitsInPostfixExpr};
5946+
CodeCompletionCache::Key K{
5947+
ModuleFilename,
5948+
TheModule->getName().str(),
5949+
AccessPath,
5950+
Request.NeedLeadingDot,
5951+
SF.hasTestableOrPrivateImport(AccessLevel::Internal, TheModule),
5952+
Ctx.LangOpts.CodeCompleteInitsInPostfixExpr};
59505953

59515954
using PairType = llvm::DenseSet<swift::ide::CodeCompletionCache::Key,
59525955
llvm::DenseMapInfo<CodeCompletionCache::Key>>::iterator;

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,13 +1264,14 @@ bool WitnessChecker::checkWitnessAccess(AccessScope &requiredAccessScope,
12641264
if (auto parentFile = dyn_cast<SourceFile>(DC->getModuleScopeContext())) {
12651265
const ModuleDecl *witnessModule = witness->getModuleContext();
12661266
if (parentFile->getParentModule() != witnessModule &&
1267-
parentFile->hasTestableImport(witnessModule) &&
1267+
parentFile->hasTestableOrPrivateImport(AccessLevel::Internal,
1268+
witnessModule) &&
12681269
witness->isAccessibleFrom(parentFile)) {
12691270
actualScopeToCheck = parentFile;
12701271
// Same with @_private(sourceFile:) import.
12711272
} else if (parentFile->getParentModule() != witnessModule &&
1272-
parentFile->hasPrivateImport(witness->getFormalAccess(),
1273-
witness) &&
1273+
parentFile->hasTestableOrPrivateImport(
1274+
witness->getFormalAccess(), witness) &&
12741275
witness->isAccessibleFrom(parentFile)) {
12751276
actualScopeToCheck = parentFile;
12761277
}

0 commit comments

Comments
 (0)