Skip to content

Commit 6435860

Browse files
authored
Support unimplemented as a "hole" for autoclosures (#41)
* wip * Support autoclosures * wip
1 parent ca9661a commit 6435860

File tree

5 files changed

+45
-33
lines changed

5 files changed

+45
-33
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,13 @@ If you are disciplined about injecting dependencies, you probably have a lot of
6060

6161
```swift
6262
class LoginViewModel: ObservableObject {
63-
...
63+
// ...
6464

6565
init(analytics: AnalyticsClient) {
66-
...
66+
// ...
6767
}
6868

69-
...
69+
// ...
7070
}
7171
```
7272

@@ -79,7 +79,7 @@ func testLogin() {
7979
analytics: .test { events.append($0) }
8080
)
8181

82-
...
82+
// ...
8383

8484
XCTAssertEqual(events, [.init(name: "Login Success")])
8585
}
@@ -109,7 +109,7 @@ func testValidation() {
109109
analytics: .unimplemented
110110
)
111111

112-
...
112+
// ...
113113
}
114114
```
115115

Sources/XCTestDynamicOverlay/Documentation.docc/GettingStarted.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ If you are disciplined about injecting dependencies, you probably have a lot of
2323

2424
```swift
2525
class LoginViewModel: ObservableObject {
26-
...
26+
// ...
2727

2828
init(analytics: AnalyticsClient) {
29-
...
29+
// ...
3030
}
3131

32-
...
32+
// ...
3333
}
3434
```
3535

@@ -42,7 +42,7 @@ func testLogin() {
4242
analytics: .test { events.append($0) }
4343
)
4444

45-
...
45+
// ...
4646

4747
XCTAssertEqual(events, [.init(name: "Login Success")])
4848
}
@@ -72,7 +72,7 @@ func testValidation() {
7272
analytics: .unimplemented
7373
)
7474

75-
...
75+
// ...
7676
}
7777
```
7878

Sources/XCTestDynamicOverlay/Documentation.docc/UnimplementedPlaceholder.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
### Overloads
66

7+
- ``unimplemented(_:placeholder:fileID:line:)-9tt2k``
8+
- ``unimplemented(_:file:fileID:line:)-74vrh``
79
- ``unimplemented(_:placeholder:fileID:line:)-63r9c``
810
- ``unimplemented(_:file:fileID:line:)-7naoc``
911
- ``unimplemented(_:placeholder:fileID:line:)-1d7ul``

Sources/XCTestDynamicOverlay/Unimplemented.swift

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// MARK: (Parameters) -> Result
22

3-
@_disfavoredOverload
43
public func unimplemented<Result>(
54
_ description: @autoclosure @escaping @Sendable () -> String = "",
65
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -13,7 +12,6 @@ public func unimplemented<Result>(
1312
}
1413
}
1514

16-
@_disfavoredOverload
1715
public func unimplemented<Result>(
1816
_ description: @autoclosure @escaping @Sendable () -> String = "",
1917
file: StaticString = #file,
@@ -30,6 +28,30 @@ public func unimplemented<Result>(
3028
}
3129

3230
@_disfavoredOverload
31+
public func unimplemented<Result>(
32+
_ description: @autoclosure @escaping @Sendable () -> String = "",
33+
placeholder: @autoclosure @escaping @Sendable () -> Result,
34+
fileID: StaticString = #fileID,
35+
line: UInt = #line
36+
) -> Result {
37+
_fail(description(), nil, fileID: fileID, line: line)
38+
return placeholder()
39+
}
40+
41+
@_disfavoredOverload
42+
public func unimplemented<Result>(
43+
_ description: @autoclosure @escaping @Sendable () -> String = "",
44+
file: StaticString = #file,
45+
fileID: StaticString = #fileID,
46+
line: UInt = #line
47+
) -> Result {
48+
let description = description()
49+
_fail(description, nil, fileID: fileID, line: line)
50+
guard let placeholder: Result = _generatePlaceholder()
51+
else { _unimplementedFatalError(description, file: file, line: line) }
52+
return placeholder
53+
}
54+
3355
public func unimplemented<A, Result>(
3456
_ description: @autoclosure @escaping @Sendable () -> String = "",
3557
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -42,7 +64,6 @@ public func unimplemented<A, Result>(
4264
}
4365
}
4466

45-
@_disfavoredOverload
4667
public func unimplemented<A, Result>(
4768
_ description: @autoclosure @escaping @Sendable () -> String = "",
4869
file: StaticString = #file,
@@ -58,7 +79,6 @@ public func unimplemented<A, Result>(
5879
}
5980
}
6081

61-
@_disfavoredOverload
6282
public func unimplemented<A, B, Result>(
6383
_ description: @autoclosure @escaping @Sendable () -> String = "",
6484
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -71,7 +91,6 @@ public func unimplemented<A, B, Result>(
7191
}
7292
}
7393

74-
@_disfavoredOverload
7594
public func unimplemented<A, B, Result>(
7695
_ description: @autoclosure @escaping @Sendable () -> String = "",
7796
file: StaticString = #file,
@@ -87,7 +106,6 @@ public func unimplemented<A, B, Result>(
87106
}
88107
}
89108

90-
@_disfavoredOverload
91109
public func unimplemented<A, B, C, Result>(
92110
_ description: @autoclosure @escaping @Sendable () -> String = "",
93111
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -100,7 +118,6 @@ public func unimplemented<A, B, C, Result>(
100118
}
101119
}
102120

103-
@_disfavoredOverload
104121
public func unimplemented<A, B, C, Result>(
105122
_ description: @autoclosure @escaping @Sendable () -> String = "",
106123
file: StaticString = #file,
@@ -116,7 +133,6 @@ public func unimplemented<A, B, C, Result>(
116133
}
117134
}
118135

119-
@_disfavoredOverload
120136
public func unimplemented<A, B, C, D, Result>(
121137
_ description: @autoclosure @escaping @Sendable () -> String = "",
122138
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -129,7 +145,6 @@ public func unimplemented<A, B, C, D, Result>(
129145
}
130146
}
131147

132-
@_disfavoredOverload
133148
public func unimplemented<A, B, C, D, Result>(
134149
_ description: @autoclosure @escaping @Sendable () -> String = "",
135150
file: StaticString = #file,
@@ -145,7 +160,6 @@ public func unimplemented<A, B, C, D, Result>(
145160
}
146161
}
147162

148-
@_disfavoredOverload
149163
public func unimplemented<A, B, C, D, E, Result>(
150164
_ description: @autoclosure @escaping @Sendable () -> String = "",
151165
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -158,7 +172,6 @@ public func unimplemented<A, B, C, D, E, Result>(
158172
}
159173
}
160174

161-
@_disfavoredOverload
162175
public func unimplemented<A, B, C, D, E, Result>(
163176
_ description: @autoclosure @escaping @Sendable () -> String = "",
164177
file: StaticString = #file,
@@ -250,7 +263,6 @@ public func unimplemented<A, B, C, D, E, Result>(
250263

251264
// MARK: (Parameters) async -> Result
252265

253-
@_disfavoredOverload
254266
public func unimplemented<Result>(
255267
_ description: @autoclosure @escaping @Sendable () -> String = "",
256268
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -263,7 +275,6 @@ public func unimplemented<Result>(
263275
}
264276
}
265277

266-
@_disfavoredOverload
267278
public func unimplemented<Result>(
268279
_ description: @autoclosure @escaping @Sendable () -> String = "",
269280
file: StaticString = #file,
@@ -288,7 +299,6 @@ public func unimplemented<Result>(
288299
/// default value (like `()` for `Void`) cannot be returned, calling the closure will fatal
289300
/// error instead.
290301
/// - Returns: A closure that generates a failure when invoked.
291-
@_disfavoredOverload
292302
public func unimplemented<A, Result>(
293303
_ description: @autoclosure @escaping @Sendable () -> String = "",
294304
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -301,7 +311,6 @@ public func unimplemented<A, Result>(
301311
}
302312
}
303313

304-
@_disfavoredOverload
305314
public func unimplemented<A, Result>(
306315
_ description: @autoclosure @escaping @Sendable () -> String = "",
307316
file: StaticString = #file,
@@ -317,7 +326,6 @@ public func unimplemented<A, Result>(
317326
}
318327
}
319328

320-
@_disfavoredOverload
321329
public func unimplemented<A, B, Result>(
322330
_ description: @autoclosure @escaping @Sendable () -> String = "",
323331
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -330,7 +338,6 @@ public func unimplemented<A, B, Result>(
330338
}
331339
}
332340

333-
@_disfavoredOverload
334341
public func unimplemented<A, B, Result>(
335342
_ description: @autoclosure @escaping @Sendable () -> String = "",
336343
file: StaticString = #file,
@@ -346,7 +353,6 @@ public func unimplemented<A, B, Result>(
346353
}
347354
}
348355

349-
@_disfavoredOverload
350356
public func unimplemented<A, B, C, Result>(
351357
_ description: @autoclosure @escaping @Sendable () -> String = "",
352358
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -359,7 +365,6 @@ public func unimplemented<A, B, C, Result>(
359365
}
360366
}
361367

362-
@_disfavoredOverload
363368
public func unimplemented<A, B, C, Result>(
364369
_ description: @autoclosure @escaping @Sendable () -> String = "",
365370
file: StaticString = #file,
@@ -375,7 +380,6 @@ public func unimplemented<A, B, C, Result>(
375380
}
376381
}
377382

378-
@_disfavoredOverload
379383
public func unimplemented<A, B, C, D, Result>(
380384
_ description: @autoclosure @escaping @Sendable () -> String = "",
381385
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -388,7 +392,6 @@ public func unimplemented<A, B, C, D, Result>(
388392
}
389393
}
390394

391-
@_disfavoredOverload
392395
public func unimplemented<A, B, C, D, Result>(
393396
_ description: @autoclosure @escaping @Sendable () -> String = "",
394397
file: StaticString = #file,
@@ -404,7 +407,6 @@ public func unimplemented<A, B, C, D, Result>(
404407
}
405408
}
406409

407-
@_disfavoredOverload
408410
public func unimplemented<A, B, C, D, E, Result>(
409411
_ description: @autoclosure @escaping @Sendable () -> String = "",
410412
placeholder: @autoclosure @escaping @Sendable () -> Result,
@@ -417,7 +419,6 @@ public func unimplemented<A, B, C, D, E, Result>(
417419
}
418420
}
419421

420-
@_disfavoredOverload
421422
public func unimplemented<A, B, C, D, E, Result>(
422423
_ description: @autoclosure @escaping @Sendable () -> String = "",
423424
file: StaticString = #file,

Tests/XCTestDynamicOverlayTests/TestHelpers.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,12 @@ let f02: (String, Int) -> Int = unimplemented("f02", placeholder: 42)
6969
let f03: (String, Int, Double) -> Int = unimplemented("f03", placeholder: 42)
7070
let f04: (String, Int, Double, [Int]) -> Int = unimplemented("f04", placeholder: 42)
7171
let f05: (String, Int, Double, [Int], User) -> Int = unimplemented("f05", placeholder: 42)
72+
73+
private struct Autoclosing {
74+
init(
75+
_: @autoclosure () -> Int = unimplemented(),
76+
_: @autoclosure () async -> Int = unimplemented(),
77+
_: @autoclosure () throws -> Int = unimplemented(),
78+
_: @autoclosure () async throws -> Int = unimplemented()
79+
) async {}
80+
}

0 commit comments

Comments
 (0)