Skip to content

Commit adda34b

Browse files
committed
[Sema] Report public imports of private modules with access levels
Take into account access-level on imports to raise an error only on public imports, non-public imports of a private module are safe.
1 parent 2ef0196 commit adda34b

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,6 +1959,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
19591959
if (target &&
19601960
!ID->getAttrs().hasAttribute<ImplementationOnlyAttr>() &&
19611961
!ID->getAttrs().hasAttribute<SPIOnlyAttr>() &&
1962+
ID->getAccessLevel() == AccessLevel::Public &&
19621963
target->getLibraryLevel() == LibraryLevel::SPI) {
19631964

19641965
auto &diags = ID->getASTContext().Diags;

test/Sema/implementation-only-import-suggestion.swift

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,60 @@ import PublicClang_Private
9292
import FullyPrivateClang
9393
import LocalClang
9494
@_exported import MainLib
95+
96+
// RUN: %target-swift-frontend -typecheck -sdk %t/sdk %t/InternalImports.swift \
97+
// RUN: -enable-experimental-feature AccessLevelOnImport \
98+
// RUN: -module-name MainLib -module-cache-path %t \
99+
// RUN: -F %t/sdk/System/Library/PrivateFrameworks/ \
100+
// RUN: -library-level api -verify
101+
//--- InternalImports.swift
102+
internal import PublicSwift
103+
internal import PrivateSwift
104+
105+
internal import PublicClang
106+
internal import PublicClang_Private
107+
internal import FullyPrivateClang
108+
internal import LocalClang
109+
110+
// RUN: %target-swift-frontend -typecheck -sdk %t/sdk %t/FileprivateImports.swift \
111+
// RUN: -enable-experimental-feature AccessLevelOnImport \
112+
// RUN: -module-name MainLib -module-cache-path %t \
113+
// RUN: -F %t/sdk/System/Library/PrivateFrameworks/ \
114+
// RUN: -library-level api -verify
115+
//--- FileprivateImports.swift
116+
fileprivate import PublicSwift
117+
fileprivate import PrivateSwift
118+
119+
fileprivate import PublicClang
120+
fileprivate import PublicClang_Private
121+
fileprivate import FullyPrivateClang
122+
fileprivate import LocalClang
123+
124+
// RUN: %target-swift-frontend -typecheck -sdk %t/sdk %t/PrivateImports.swift \
125+
// RUN: -enable-experimental-feature AccessLevelOnImport \
126+
// RUN: -module-name MainLib -module-cache-path %t \
127+
// RUN: -F %t/sdk/System/Library/PrivateFrameworks/ \
128+
// RUN: -library-level api -verify
129+
//--- PrivateImports.swift
130+
private import PublicSwift
131+
private import PrivateSwift
132+
133+
private import PublicClang
134+
private import PublicClang_Private
135+
private import FullyPrivateClang
136+
private import LocalClang
137+
138+
// RUN: %target-swift-frontend -typecheck -sdk %t/sdk %t/ExplicitlyPublicImports.swift \
139+
// RUN: -enable-experimental-feature AccessLevelOnImport \
140+
// RUN: -module-name MainLib -module-cache-path %t \
141+
// RUN: -F %t/sdk/System/Library/PrivateFrameworks/ \
142+
// RUN: -library-level api -verify
143+
//--- ExplicitlyPublicImports.swift
144+
public import PublicSwift
145+
public import PrivateSwift // expected-error{{private module 'PrivateSwift' is imported publicly from the public module 'MainLib'}}
146+
147+
public import PublicClang
148+
public import PublicClang_Private // expected-error{{private module 'PublicClang_Private' is imported publicly from the public module 'MainLib'}}
149+
public import FullyPrivateClang // expected-error{{private module 'FullyPrivateClang' is imported publicly from the public module 'MainLib'}}
150+
public import LocalClang // expected-error{{private module 'LocalClang' is imported publicly from the public module 'MainLib'}}
151+
@_exported public import MainLib // expected-warning{{private module 'MainLib' is imported publicly from the public module 'MainLib'}}

0 commit comments

Comments
 (0)