-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathprivate_import.swift
86 lines (66 loc) · 3.39 KB
/
private_import.swift
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
// '@_private import' is intended to be used to compile "thunks" which contain
// modified versions of declarations. For this to work properly, name lookup
// needs to favor declarations in the private import over other imports. This
// emulates the increased visibility of same-module declarations in the original
// file, preserving source compatibility as much as possible.
//
// In this test:
//
// * Module Host contains this file and Host.swift. Note that this file compiles
// successfully with COMPILING_THUNK undefined.
// * This file is also built as a thunk with COMPILING_THUNK defined to "edit"
// it.
// * We also build three other modules called Most, Ghost, and Toast. Each of
// these is imported by both Host and the thunk.
//
// There are various same-name types scattered throughout these modules. If
// name lookup selects the right ones for each of the test cases, the compiler
// will generate the expected diagnostics and the test will pass. If it selects
// incorrect types, deprecation warnings will be emitted and the test will fail.
// We'll put our modules here.
// RUN: %empty-directory(%t)
// Build some libraries to work with.
// RUN: %target-swift-frontend -emit-module -parse-as-library -module-name Most -emit-module-path %t/Most.swiftmodule -primary-file %S/Inputs/private_import/Most.swift
// RUN: %target-swift-frontend -emit-module -parse-as-library -module-name Ghost -emit-module-path %t/Ghost.swiftmodule -primary-file %S/Inputs/private_import/Ghost.swift
// RUN: %target-swift-frontend -emit-module -enable-private-imports -parse-as-library -module-name Toast -emit-module-path %t/Toast.swiftmodule -primary-file %S/Inputs/private_import/Toast.swift
// Build the host module that the thunk is pretending to be part of.
// RUN: %target-swift-frontend -emit-module -module-name Host -I %t -emit-module-path %t/Host.swiftmodule -enable-private-imports %s %S/Inputs/private_import/Host.swift
// Build a thunk for the host module.
// RUN: %target-typecheck-verify-swift -parse-as-library -I %t -DCOMPILING_THUNK
#if COMPILING_THUNK
@_private(sourceFile: "private_import.swift") import Host
#endif
import Most
import Ghost
@_private(sourceFile: "Toast.swift") import Toast
//
// Types with varying definitions
//
struct Hunk {} // Present in both Host and thunk
#if COMPILING_THUNK
struct Thunk {} // Only present in thunk
struct Bunk {} // Not deprecated in thunk
#else
struct Shrunk {} // Only present in Host
@available(*, deprecated, message: "got Host version")
struct Bunk {} // Only deprecated in Host
#endif
//
// Test cases
//
#if COMPILING_THUNK
func thunkCanUseTypesOnlyInThunk(_: Thunk) {}
#endif
func thunkCanRedeclareTypes(_: Hunk) {}
func thunkCanUseTypesOnlyInHost(_: Shrunk, _: Post) {}
func thunkTypesShadowHostTypes(_: Bunk) {}
func hostTypesShadowMostTypes(_: Boast) {}
// no-error@-1; previously, this would give "'Boast' is ambiguous for type lookup in this context"
#if COMPILING_THUNK
func ambiguousWithTwoNonPrivateImports(_: Coast) {}
// expected-error@-1{{'Coast' is ambiguous for type lookup in this context}}
#endif
// The intended clients of '@_private import' should not actually use it twice
// in a single file, so this behavior is more accidental than anything.
func ambiguousWithTwoPrivateImports(_: Roast) {}
// expected-error@-1{{'Roast' is ambiguous for type lookup in this context}}