File: access-level-import-dependencies.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (143 lines) | stat: -rw-r--r-- 6,558 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/// Check that non-public dependencies are hidden from clients.

// RUN: %empty-directory(%t)
// RUN: split-file %s %t

/// Prepare a module to hide or show depending on the import access-level.
// RUN: %target-swift-frontend -emit-module %t/HiddenDep.swift -o %t \
// RUN:   -swift-version 5 -enable-library-evolution

//--- HiddenDep.swift

//--- PublicDep.swift
public import HiddenDep

//--- PackageDep.swift
package import HiddenDep

//--- InternalDep.swift
internal import HiddenDep

//--- FileprivateDep.swift
fileprivate import HiddenDep

//--- PrivateDep.swift
private import HiddenDep

/// With resilience, non-public dependencies should be hidden.
// RUN: %target-swift-frontend -emit-module %t/PublicDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/PackageDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution -package-name MyPackage
// RUN: %target-swift-frontend -emit-module %t/InternalDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/FileprivateDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution
// RUN: %target-swift-frontend -emit-module %t/PrivateDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution

// RUN: %target-swift-frontend -typecheck %t/ClientOfPublic.swift -I %t \
// RUN:   -package-name MyOtherPackage \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefix=VISIBLE-DEP %s
// VISIBLE-DEP: loaded module 'HiddenDep'
//--- ClientOfPublic.swift
import PublicDep

// RUN: %target-swift-frontend -typecheck %t/ClientOfNonPublic.swift -I %t \
// RUN:   -package-name pkg \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefix=HIDDEN-DEP %s
// HIDDEN-DEP-NOT: loaded module 'HiddenDep'
//--- ClientOfNonPublic.swift
import PackageDep
import InternalDep
import FileprivateDep
import PrivateDep

/// Without resilience, all access-level dependencies are visible to clients.
// RUN: %target-swift-frontend -emit-module %t/PublicDep.swift -o %t -I %t
// RUN: %target-swift-frontend -emit-module %t/PackageDep.swift -o %t -I %t \
// RUN:   -package-name MyPackage
// RUN: %target-swift-frontend -emit-module %t/InternalDep.swift -o %t -I %t
// RUN: %target-swift-frontend -emit-module %t/FileprivateDep.swift -o %t -I %t
// RUN: %target-swift-frontend -emit-module %t/PrivateDep.swift -o %t -I %t

// RUN: %target-swift-frontend -typecheck %t/ClientOfPublic.swift -I %t \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefix=VISIBLE-DEP %s
// RUN: %target-swift-frontend -typecheck %t/ClientOfNonPublic.swift -I %t \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefix=VISIBLE-DEP %s

/// Even with resilience and testing enabled, all non-public dependencies are
/// hidden if there are no testable imports.
// RUN: %target-swift-frontend -emit-module %t/PublicDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution -enable-testing
// RUN: %target-swift-frontend -emit-module %t/PackageDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution -enable-testing -package-name MyPackage
// RUN: %target-swift-frontend -emit-module %t/InternalDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution -enable-testing
// RUN: %target-swift-frontend -emit-module %t/FileprivateDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution -enable-testing
// RUN: %target-swift-frontend -emit-module %t/PrivateDep.swift -o %t -I %t \
// RUN:   -enable-library-evolution -enable-testing

// RUN: %target-swift-frontend -typecheck %t/ClientOfPublic.swift -I %t \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefix=VISIBLE-DEP %s
// RUN: %target-swift-frontend -typecheck %t/ClientOfNonPublic.swift -I %t \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefix=HIDDEN-DEP %s

/// With testable imports, transitive dependencies are required.
//--- TestableClientOfPublic.swift
@testable import PublicDep

//--- TestableClientOfNonPublic.swift
@testable import PackageDep // expected-error {{missing required module 'HiddenDep'}}
@testable import InternalDep // expected-error {{missing required module 'HiddenDep'}}
@testable import FileprivateDep // expected-error {{missing required module 'HiddenDep'}}
@testable import PrivateDep // expected-error {{missing required module 'HiddenDep'}}

// RUN: %target-swift-frontend -typecheck %t/TestableClientOfPublic.swift -I %t \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefix=VISIBLE-DEP %s
// RUN: %target-swift-frontend -typecheck %t/TestableClientOfNonPublic.swift -I %t \
// RUN:   -package-name pkg \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefix=VISIBLE-DEP %s

/// In the case of a testable of a module reexporting another Swift module,
/// only non-public transitive dependencies from the first module are required.
/// Non-public imports from the reexported modules are not loaded, we could
/// revisit this if desired.
// RUN: %target-swift-frontend -emit-module %t/Exporter.swift -o %t -I %t \
// RUN:   -enable-library-evolution -enable-testing
// RUN: %target-swift-frontend -typecheck %t/ExporterClient.swift -I %t \
// RUN:   -index-system-modules -index-ignore-stdlib -index-store-path %t/idx \
// RUN:   -Rmodule-loading 2>&1 | %FileCheck -check-prefixes=CHECK-EXPORTER,HIDDEN-DEP %s
// CHECK-EXPORTER: 'InternalDep' has an ignored transitive dependency on 'HiddenDep'

//--- Exporter.swift
@_exported import InternalDep

//--- ExporterClient.swift
@testable import Exporter

/// Fail if the transitive dependency is missing.
// RUN: rm %t/HiddenDep.swiftmodule
// RUN: %target-swift-frontend -typecheck %t/TestableClientOfNonPublic.swift -I %t \
// RUN:   -package-name pkg \
// RUN:   -verify -show-diagnostics-after-fatal

/// In a multi-file scenario, we try and fail to load the transitive dependency
/// only for @testable imports, not regular imports.
// RUN: %target-swift-frontend -typecheck -I %t \
// RUN:   %t/TestableClientOfNonPublic_FileA.swift \
// RUN:   %t/TestableClientOfNonPublic_FileB.swift \
// RUN:   -verify -show-diagnostics-after-fatal
// RUN: %target-swift-frontend -typecheck -wmo -I %t \
// RUN:   %t/TestableClientOfNonPublic_FileA.swift \
// RUN:   %t/TestableClientOfNonPublic_FileB.swift \
// RUN:   -verify -show-diagnostics-after-fatal

//--- TestableClientOfNonPublic_FileA.swift
import InternalDep
@testable import FileprivateDep // expected-error {{missing required module 'HiddenDep'}}

//--- TestableClientOfNonPublic_FileB.swift
@testable import InternalDep // expected-error {{missing required module 'HiddenDep'}}
import FileprivateDep