Skip to content

Commit e9db49a

Browse files
authored
Add SymbolLocator dependency and OpenSwiftUISymbolDualTests (#263)
1 parent 9ab004a commit e9db49a

File tree

5 files changed

+183
-95
lines changed

5 files changed

+183
-95
lines changed

Package.resolved

Lines changed: 0 additions & 42 deletions
This file was deleted.

Package.swift

Lines changed: 103 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -101,20 +101,24 @@ if warningsAsErrorsCondition {
101101
// sharedSwiftSettings.append(.unsafeFlags(["-Wwarning", "concurrency"]))
102102
}
103103

104-
// MARK: - [env] OPENSWIFTUI_BRIDGE_FRAMEWORK
105-
106-
let bridgeFramework = Context.environment["OPENSWIFTUI_BRIDGE_FRAMEWORK"] ?? "SwiftUI"
104+
// MARK: - CoreGraphicsShims Target
107105

108-
// MARK: - Targets
109-
110-
let cOpenSwiftUITarget = Target.target(
111-
name: "COpenSwiftUI",
112-
publicHeadersPath: ".",
113-
cSettings: sharedCSettings + [
114-
.headerSearchPath("../OpenSwiftUI_SPI"),
106+
let coreGraphicsShimsTarget = Target.target(
107+
name: "CoreGraphicsShims",
108+
swiftSettings: sharedSwiftSettings
109+
)
110+
let coreGraphicsShimsTestTarget = Target.testTarget(
111+
name: "CoreGraphicsShimsTests",
112+
dependencies: [
113+
"CoreGraphicsShims",
114+
.product(name: "Numerics", package: "swift-numerics"),
115115
],
116-
cxxSettings: sharedCxxSettings
116+
exclude: ["README.md"],
117+
swiftSettings: sharedSwiftSettings
117118
)
119+
120+
// MARK: - OpenSwiftUISPI Target
121+
118122
let openSwiftUISPITarget = Target.target(
119123
name: "OpenSwiftUI_SPI",
120124
dependencies: [
@@ -125,10 +129,21 @@ let openSwiftUISPITarget = Target.target(
125129
cxxSettings: sharedCxxSettings,
126130
linkerSettings: [.unsafeFlags(["-lMobileGestalt"], .when(platforms: .darwinPlatforms))] // For MGCopyAnswer API support
127131
)
128-
let coreGraphicsShims = Target.target(
129-
name: "CoreGraphicsShims",
132+
133+
let openSwiftUISPITestTarget = Target.testTarget(
134+
name: "OpenSwiftUI_SPITests",
135+
dependencies: [
136+
"OpenSwiftUI_SPI",
137+
// For ProtocolDescriptor symbol linking
138+
"OpenSwiftUI",
139+
.product(name: "Numerics", package: "swift-numerics"),
140+
],
141+
exclude: ["README.md"],
130142
swiftSettings: sharedSwiftSettings
131143
)
144+
145+
// MARK: - OpenSwiftUICore Target
146+
132147
// NOTE:
133148
// In macOS: Mac Catalyst App will use macOS-varient build of SwiftUI.framework in /System/Library/Framework and iOS varient of SwiftUI.framework in /System/iOSSupport/System/Library/Framework
134149
// Add `|| Mac Catalyst` check everywhere in `OpenSwiftUICore` and `OpenSwiftUI_SPI`.
@@ -142,6 +157,29 @@ let openSwiftUICoreTarget = Target.target(
142157
],
143158
swiftSettings: sharedSwiftSettings
144159
)
160+
161+
let openSwiftUICoreTestTarget = Target.testTarget(
162+
name: "OpenSwiftUICoreTests",
163+
dependencies: [
164+
"OpenSwiftUI", // NOTE: For the Glue link logic only, do not call `import OpenSwiftUI` in this target
165+
"OpenSwiftUICore",
166+
.product(name: "Numerics", package: "swift-numerics"),
167+
],
168+
exclude: ["README.md"],
169+
swiftSettings: sharedSwiftSettings
170+
)
171+
172+
// MARK: OpenSwiftUI Target
173+
174+
let cOpenSwiftUITarget = Target.target(
175+
name: "COpenSwiftUI",
176+
publicHeadersPath: ".",
177+
cSettings: sharedCSettings + [
178+
.headerSearchPath("../OpenSwiftUI_SPI"),
179+
],
180+
cxxSettings: sharedCxxSettings
181+
)
182+
145183
let openSwiftUITarget = Target.target(
146184
name: "OpenSwiftUI",
147185
dependencies: [
@@ -154,58 +192,48 @@ let openSwiftUITarget = Target.target(
154192
],
155193
swiftSettings: sharedSwiftSettings
156194
)
195+
157196
let openSwiftUIExtensionTarget = Target.target(
158197
name: "OpenSwiftUIExtension",
159198
dependencies: [
160199
"OpenSwiftUI",
161200
],
162201
swiftSettings: sharedSwiftSettings
163202
)
164-
let openSwiftUIBridgeTarget = Target.target(
165-
name: "OpenSwiftUIBridge",
166-
dependencies: [
167-
"OpenSwiftUI",
168-
],
169-
sources: ["Bridgeable.swift", bridgeFramework],
170-
swiftSettings: sharedSwiftSettings
171-
)
172-
let openSwiftUISPITestTarget = Target.testTarget(
173-
name: "OpenSwiftUI_SPITests",
203+
204+
let openSwiftUITestTarget = Target.testTarget(
205+
name: "OpenSwiftUITests",
174206
dependencies: [
175-
"OpenSwiftUI_SPI",
176-
// For ProtocolDescriptor symbol linking
177207
"OpenSwiftUI",
178-
.product(name: "Numerics", package: "swift-numerics"),
179208
],
180209
exclude: ["README.md"],
181210
swiftSettings: sharedSwiftSettings
182211
)
183-
let openSwiftUICoreTestTarget = Target.testTarget(
184-
name: "OpenSwiftUICoreTests",
212+
213+
let openSwiftUICompatibilityTestTarget = Target.testTarget(
214+
name: "OpenSwiftUICompatibilityTests",
185215
dependencies: [
186-
"OpenSwiftUI", // NOTE: For the Glue link logic only, do not call `import OpenSwiftUI` in this target
187-
"OpenSwiftUICore",
188216
.product(name: "Numerics", package: "swift-numerics"),
189217
],
190218
exclude: ["README.md"],
191219
swiftSettings: sharedSwiftSettings
192220
)
193-
let openSwiftUITestTarget = Target.testTarget(
194-
name: "OpenSwiftUITests",
221+
222+
// MARK: - [env] OPENSWIFTUI_BRIDGE_FRAMEWORK
223+
224+
let bridgeFramework = Context.environment["OPENSWIFTUI_BRIDGE_FRAMEWORK"] ?? "SwiftUI"
225+
226+
// MARK: - OpenSwiftUIBridge Target
227+
228+
let openSwiftUIBridgeTarget = Target.target(
229+
name: "OpenSwiftUIBridge",
195230
dependencies: [
196231
"OpenSwiftUI",
197232
],
198-
exclude: ["README.md"],
199-
swiftSettings: sharedSwiftSettings
200-
)
201-
let openSwiftUICompatibilityTestTarget = Target.testTarget(
202-
name: "OpenSwiftUICompatibilityTests",
203-
dependencies: [
204-
.product(name: "Numerics", package: "swift-numerics"),
205-
],
206-
exclude: ["README.md"],
233+
sources: ["Bridgeable.swift", bridgeFramework],
207234
swiftSettings: sharedSwiftSettings
208235
)
236+
209237
let openSwiftUIBridgeTestTarget = Target.testTarget(
210238
name: "OpenSwiftUIBridgeTests",
211239
dependencies: [
@@ -215,11 +243,26 @@ let openSwiftUIBridgeTestTarget = Target.testTarget(
215243
sources: ["BridgeableTests.swift", bridgeFramework],
216244
swiftSettings: sharedSwiftSettings
217245
)
218-
let coreGraphicsShimsTestTarget = Target.testTarget(
219-
name: "CoreGraphicsShimsTests",
246+
247+
// MARK: - OpenSwiftUISymbolDualTests Target
248+
249+
let openSwiftUISymbolDualTestsHelperTarget = Target.target(
250+
name: "OpenSwiftUISymbolDualTestsHelper",
220251
dependencies: [
221-
"CoreGraphicsShims",
222-
.product(name: "Numerics", package: "swift-numerics"),
252+
.product(name: "SymbolLocator", package: "SymbolLocator"),
253+
],
254+
publicHeadersPath: ".",
255+
cSettings: sharedCSettings + [
256+
.headerSearchPath("../OpenSwiftUI_SPI"),
257+
],
258+
cxxSettings: sharedCxxSettings
259+
)
260+
261+
let openSwiftUISymbolDualTestsTarget = Target.testTarget(
262+
name: "OpenSwiftUISymbolDualTests",
263+
dependencies: [
264+
"OpenSwiftUI",
265+
.target(name: "OpenSwiftUISymbolDualTestsHelper"),
223266
],
224267
exclude: ["README.md"],
225268
swiftSettings: sharedSwiftSettings
@@ -255,6 +298,7 @@ let package = Package(
255298
products: products,
256299
dependencies: [
257300
.package(url: "https://github.com/apple/swift-numerics.git", from: "1.0.2"),
301+
.package(url: "https://github.com/OpenSwiftUIProject/SymbolLocator.git", from: "0.1.0"),
258302
],
259303
targets: [
260304
// TODO: Add SwiftGTK as an backend alternative for UIKit/AppKit on Linux and macOS
@@ -267,21 +311,27 @@ let package = Package(
267311
]
268312
),
269313
.binaryTarget(name: "CoreServices", path: "PrivateFrameworks/CoreServices.xcframework"),
270-
coreGraphicsShims,
271-
cOpenSwiftUITarget,
314+
315+
coreGraphicsShimsTarget,
316+
coreGraphicsShimsTestTarget,
317+
272318
openSwiftUISPITarget,
319+
openSwiftUISPITestTarget,
320+
273321
openSwiftUICoreTarget,
322+
openSwiftUICoreTestTarget,
323+
324+
cOpenSwiftUITarget,
274325
openSwiftUITarget,
275-
276326
openSwiftUIExtensionTarget,
277-
openSwiftUIBridgeTarget,
278-
279-
openSwiftUISPITestTarget,
280-
openSwiftUICoreTestTarget,
281327
openSwiftUITestTarget,
282328
openSwiftUICompatibilityTestTarget,
329+
330+
openSwiftUIBridgeTarget,
283331
openSwiftUIBridgeTestTarget,
284-
coreGraphicsShimsTestTarget,
332+
333+
openSwiftUISymbolDualTestsHelperTarget,
334+
openSwiftUISymbolDualTestsTarget
285335
]
286336
)
287337

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//
2+
// CGSize+ExtensionTestsStub.c
3+
// OpenSwiftUISymbolDualTestsHelper
4+
5+
#include "OpenSwiftUIBase.h"
6+
7+
#if OPENSWIFTUI_TARGET_OS_DARWIN
8+
9+
#import <SymbolLocator.h>
10+
11+
DEFINE_SL_STUB_SLF(OpenSwiftUITestStub_CGSizeHasZero, SwiftUI, $sSo6CGSizeV7SwiftUIE7hasZeroSbvg);
12+
13+
#endif
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//
2+
// CGSize+ExtensionTests.swift
3+
// OpenSwiftUISymbolDualTests
4+
5+
#if canImport(SwiftUI, _underlyingVersion: 6.0.87)
6+
import Testing
7+
import SwiftUI
8+
import OpenSwiftUI
9+
10+
extension CGSize {
11+
var swiftUIHasZero: Bool {
12+
@_silgen_name("OpenSwiftUITestStub_CGSizeHasZero")
13+
get
14+
}
15+
}
16+
17+
#if compiler(>=6.1) // https://github.com/swiftlang/swift/issues/81248
18+
struct CGSize_ExtensionTests {
19+
@Test(
20+
arguments: [
21+
(CGSize(width: 0, height: 0), true),
22+
(CGSize(width: 1, height: 0), true),
23+
(CGSize(width: 0, height: 1), true),
24+
(CGSize(width: 1, height: 1), false)
25+
],
26+
.enabled {
27+
if #available(iOS 18, macOS 14, *) {
28+
return true
29+
} else {
30+
return false
31+
}
32+
}
33+
)
34+
func hasZero(size: CGSize, expectedResult: Bool) {
35+
let openSwiftUIResult = size.hasZero
36+
let swiftUIResult = size.swiftUIHasZero
37+
#expect(openSwiftUIResult == expectedResult)
38+
#expect(swiftUIResult == expectedResult)
39+
#expect(openSwiftUIResult == swiftUIResult)
40+
}
41+
}
42+
#endif
43+
44+
#endif
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
## OpenSwiftUISymbolDualTests
2+
3+
Test non-public API of SwiftUI via SymbolLocator.
4+
5+
```c
6+
DEFINE_SL_STUB_SLF(OpenSwiftUITestStub_CGSizeHasZero, SwiftUI, $sSo6CGSizeV7SwiftUIE7hasZeroSbvg);
7+
```
8+
9+
```swift
10+
import SwiftUI
11+
import OpenSwiftUI
12+
13+
extension CGSize {
14+
var swiftUIHasZero: Bool {
15+
@_silgen_name("OpenSwiftUITestStub_CGSizeHasZero")
16+
get
17+
}
18+
}
19+
20+
let size = CGSize(width: 0, height: 0)
21+
#expect(size.hasZero)
22+
#expect(size.swiftUIHasZero)
23+
```

0 commit comments

Comments
 (0)