Skip to content

Commit 2c5bda2

Browse files
farkassebclaude
andauthored
Declare ArgValues arrays in type position (#360)
With `--enable-args-history` the generated capture array was declared as `var xArgValues = [(a: A, b: B)]()`. In that form Swift has to guess whether `[...]` is a type or an array literal, and it decides by resolving each name the way it would in an expression. A property or method named `Config` then hides the `Config` type, and a `()` element is already a value, so Swift settles on the array literal and the mock fails to compile: error: cannot call value of non-function type '[(config: Int?, force: Bool.Type)]' error: cannot use instance member 'Config' within property initializer error: cannot use optional chaining on non-optional value of type 'Int' error: cannot call value of non-function type '[(event: (), verbose: Bool.Type)]' With `var xArgValues: [(a: A, b: B)] = []` the annotation is unambiguously a type, so the guess never happens. Tuple shape alone does not trigger the failure: optional, dictionary, existential, generic and nested element types compile in either form. The concurrency-safe branch of the same template already used `xArgValues: [T]`, so both paths now render the same way. - Template: emit `var xArgValues: [T] = []` instead of `var xArgValues = [T]()`. - 23 existing fixture lines rewritten to the annotated form; no other output changes. - New compiled fixture `argumentsHistoryMemberShadowsTypeName` proving the annotated form compiles next to a `var Config: Int` member that shadows the `Config` type, and next to a `()`-typed parameter. - README arguments-history example updated to the emitted form. Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
1 parent 6b9381a commit 2c5bda2

4 files changed

Lines changed: 79 additions & 27 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ This will generate:
334334
```swift
335335
public class FooMock: Foo {
336336
var fooFuncCallCount = 0
337-
var fooFuncArgValues = [Int]() // arguments captor
337+
var fooFuncArgValues: [Int] = [] // arguments captor
338338
var fooFuncHandler: ((Int) -> ())?
339339
func fooFunc(val: Int) {
340340
fooFuncCallCount += 1
@@ -346,11 +346,11 @@ public class FooMock: Foo {
346346
}
347347

348348
...
349-
var barFuncArgValues = [(a: String, Float)]() // tuple is also supported.
349+
var barFuncArgValues: [(a: String, Float)] = [] // tuple is also supported.
350350
...
351351

352352
...
353-
var bazFuncArgValues = [(Int, String)]()
353+
var bazFuncArgValues: [(val1: Int, val2: String)] = []
354354
...
355355
}
356356
```

Sources/MockoloFramework/Templates/MethodTemplate.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ extension MethodModel {
301301
let capturedValueType = argsHistory.capturedValueType.typeName
302302

303303
if !requiresConcurrencySafeAccess {
304-
return "\(1.tab)\(declModifiers)var \(argsHistoryVarName) = [\(capturedValueType)]()"
304+
return "\(1.tab)\(declModifiers)var \(argsHistoryVarName): [\(capturedValueType)] = []"
305305
} else {
306306
return """
307307
\(1.tab)\(nonisolatedSpace)\(declModifiers)var \(argsHistoryVarName): [\(capturedValueType)] {

Tests/TestArgumentsHistory/ArgumentsHistoryTests.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,10 @@ class ArgumentsHistoryTests: MockoloTestCase {
7272
dstContent: argumentsHistoryLabels.expected._source,
7373
enableFuncArgsHistory: true)
7474
}
75+
76+
func testArgumentsHistoryMemberShadowsTypeName() {
77+
verify(srcContent: argumentsHistoryMemberShadowsTypeName._source,
78+
dstContent: argumentsHistoryMemberShadowsTypeName.expected._source,
79+
enableFuncArgsHistory: true)
80+
}
7581
}

Tests/TestArgumentsHistory/FixtureArgumentsHistory.swift

Lines changed: 69 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313

1414
private(set) var fooFuncCallCount = 0
15-
var fooFuncArgValues = [Int]()
15+
var fooFuncArgValues: [Int] = []
1616
var fooFuncHandler: ((Int) -> ())?
1717
func fooFunc(val: Int) {
1818
fooFuncCallCount += 1
@@ -23,7 +23,7 @@
2323
}
2424

2525
private(set) var barFuncCallCount = 0
26-
var barFuncArgValues = [[Int]]()
26+
var barFuncArgValues: [[Int]] = []
2727
var barFuncHandler: (([Int]) -> ())?
2828
func barFunc(for: [Int]) {
2929
barFuncCallCount += 1
@@ -34,7 +34,7 @@
3434
}
3535

3636
private(set) var bazFuncCallCount = 0
37-
var bazFuncArgValues = [(arg: String, default: Float)]()
37+
var bazFuncArgValues: [(arg: String, default: Float)] = []
3838
var bazFuncHandler: ((String, Float) -> ())?
3939
func bazFunc(arg: String, default: Float) {
4040
bazFuncCallCount += 1
@@ -61,7 +61,7 @@
6161

6262

6363
private(set) var fooFuncCallCount = 0
64-
var fooFuncArgValues = [Int]()
64+
var fooFuncArgValues: [Int] = []
6565
var fooFuncHandler: ((Int) -> ())?
6666
func fooFunc(val: Int) {
6767
fooFuncCallCount += 1
@@ -83,7 +83,7 @@
8383
}
8484

8585
private(set) var bazFuncCallCount = 0
86-
var bazFuncArgValues = [(arg: String, default: Float)]()
86+
var bazFuncArgValues: [(arg: String, default: Float)] = []
8787
var bazFuncHandler: ((String, Float) -> ())?
8888
func bazFunc(arg: String, default: Float) {
8989
bazFuncCallCount += 1
@@ -122,7 +122,7 @@
122122
}
123123

124124
private(set) var barFuncCallCount = 0
125-
var barFuncArgValues = [Int]()
125+
var barFuncArgValues: [Int] = []
126126
var barFuncHandler: ((Int) -> ())?
127127
func barFunc(val: Int) {
128128
barFuncCallCount += 1
@@ -134,7 +134,7 @@
134134
}
135135

136136
private(set) var bazFuncCallCount = 0
137-
var bazFuncArgValues = [Int]()
137+
var bazFuncArgValues: [Int] = []
138138
var bazFuncHandler: ((Int) -> ())?
139139
func bazFunc(_ val: Int) {
140140
bazFuncCallCount += 1
@@ -146,7 +146,7 @@
146146
}
147147

148148
private(set) var quxFuncCallCount = 0
149-
var quxFuncArgValues = [Int]()
149+
var quxFuncArgValues: [Int] = []
150150
var quxFuncHandler: ((Int) -> String)?
151151
func quxFunc(val: Int) -> String {
152152
quxFuncCallCount += 1
@@ -159,7 +159,7 @@
159159
}
160160

161161
private(set) var quuxFuncCallCount = 0
162-
var quuxFuncArgValues = [(val1: String, val2: Float)]()
162+
var quuxFuncArgValues: [(val1: String, val2: Float)] = []
163163
var quuxFuncHandler: ((String, Float) -> ())?
164164
func quuxFunc(val1: String, val2: Float) {
165165
quuxFuncCallCount += 1
@@ -185,7 +185,7 @@
185185
init() { }
186186

187187
private(set) var fooFuncCallCount = 0
188-
var fooFuncArgValues = [(Int, String)]()
188+
var fooFuncArgValues: [(Int, String)] = []
189189
var fooFuncHandler: (((Int, String)) -> ())?
190190
func fooFunc(val: (Int, String)) {
191191
fooFuncCallCount += 1
@@ -197,7 +197,7 @@
197197
}
198198

199199
private(set) var barFuncCallCount = 0
200-
var barFuncArgValues = [(val1: (bar1: Int, String), val2: (bar3: Int, bar4: String))]()
200+
var barFuncArgValues: [(val1: (bar1: Int, String), val2: (bar3: Int, bar4: String))] = []
201201
var barFuncHandler: (((bar1: Int, String), (bar3: Int, bar4: String)) -> ())?
202202
func barFunc(val1: (bar1: Int, String), val2: (bar3: Int, bar4: String)) {
203203
barFuncCallCount += 1
@@ -235,7 +235,7 @@
235235
}
236236

237237
private(set) var fooFuncVal1CallCount = 0
238-
var fooFuncVal1ArgValues = [Int]()
238+
var fooFuncVal1ArgValues: [Int] = []
239239
var fooFuncVal1Handler: ((Int) -> ())?
240240
func fooFunc(val1: Int) {
241241
fooFuncVal1CallCount += 1
@@ -248,7 +248,7 @@
248248
}
249249

250250
private(set) var fooFuncVal1StringCallCount = 0
251-
var fooFuncVal1StringArgValues = [String]()
251+
var fooFuncVal1StringArgValues: [String] = []
252252
var fooFuncVal1StringHandler: ((String) -> ())?
253253
func fooFunc(val1: String) {
254254
fooFuncVal1StringCallCount += 1
@@ -260,7 +260,7 @@
260260
}
261261

262262
private(set) var fooFuncVal2CallCount = 0
263-
var fooFuncVal2ArgValues = [Int]()
263+
var fooFuncVal2ArgValues: [Int] = []
264264
var fooFuncVal2Handler: ((Int) -> ())?
265265
func fooFunc(val2: Int) {
266266
fooFuncVal2CallCount += 1
@@ -286,7 +286,7 @@
286286
init() { }
287287

288288
private(set) var fooFuncCallCount = 0
289-
var fooFuncArgValues = [(val1: Any, val2: Any?)]()
289+
var fooFuncArgValues: [(val1: Any, val2: Any?)] = []
290290
var fooFuncHandler: ((Any, Any?) -> ())?
291291
func fooFunc<T: StringProtocol>(val1: T, val2: T?) {
292292
fooFuncCallCount += 1
@@ -298,7 +298,7 @@
298298
}
299299

300300
private(set) var barFuncCallCount = 0
301-
var barFuncArgValues = [Any]()
301+
var barFuncArgValues: [Any] = []
302302
var barFuncHandler: ((Any) -> Any)?
303303
func barFunc<T: Sequence, U: Collection>(val: T) -> U {
304304
barFuncCallCount += 1
@@ -326,7 +326,7 @@
326326

327327

328328
private(set) var fooFuncCallCount = 0
329-
var fooFuncArgValues = [Int]()
329+
var fooFuncArgValues: [Int] = []
330330
var fooFuncHandler: ((inout Int) -> ())?
331331
func fooFunc(val: inout Int) {
332332
fooFuncCallCount += 1
@@ -338,7 +338,7 @@
338338
}
339339

340340
private(set) var barFuncCallCount = 0
341-
var barFuncArgValues = [Int]()
341+
var barFuncArgValues: [Int] = []
342342
var barFuncHandler: ((inout Int) -> ())?
343343
func barFunc(into val: inout Int) {
344344
barFuncCallCount += 1
@@ -374,7 +374,7 @@
374374
}
375375

376376
private(set) var barFuncCallCount = 0
377-
var barFuncArgValues = [Int]()
377+
var barFuncArgValues: [Int] = []
378378
var barFuncHandler: ((Int, (String) -> Void) -> ())?
379379
func barFunc(val: Int, handler: (String) -> Void) {
380380
barFuncCallCount += 1
@@ -413,7 +413,7 @@
413413
}
414414

415415
private(set) var barFuncCallCount = 0
416-
var barFuncArgValues = [Int]()
416+
var barFuncArgValues: [Int] = []
417417
var barFuncHandler: ((Int, @escaping BarHandler) -> ())?
418418
func barFunc(val: Int, handler: @escaping BarHandler) {
419419
barFuncCallCount += 1
@@ -461,7 +461,7 @@
461461
init() { }
462462

463463
static private(set) var fooFuncCallCount = 0
464-
static var fooFuncArgValues = [Int]()
464+
static var fooFuncArgValues: [Int] = []
465465
static var fooFuncHandler: ((Int) -> ())?
466466
static func fooFunc(val: Int) {
467467
fooFuncCallCount += 1
@@ -487,7 +487,7 @@
487487
init() { }
488488

489489
private(set) var fooCallCount = 0
490-
var fooArgValues = [(arg0: Int, arg1: Double, throws: String)]()
490+
var fooArgValues: [(arg0: Int, arg1: Double, throws: String)] = []
491491
var fooHandler: ((Int, Double, String) -> ())?
492492
func foo(arg0: Int, _ arg1: Double, first throws: String) {
493493
fooCallCount += 1
@@ -499,7 +499,7 @@
499499
}
500500

501501
private(set) var barCallCount = 0
502-
var barArgValues = [(_0: Int, _1: Void, _2: Void)]()
502+
var barArgValues: [(_0: Int, _1: Void, _2: Void)] = []
503503
var barHandler: ((Int, Void, Void) -> ())?
504504
func bar(_ _0: Int, _ _1: Void, _ _2: Void) {
505505
barCallCount += 1
@@ -512,3 +512,49 @@
512512
}
513513
}
514514
}
515+
516+
@Fixture enum argumentsHistoryMemberShadowsTypeName {
517+
struct Config {}
518+
519+
/// @mockable
520+
protocol Foo {
521+
var Config: Int { get }
522+
func apply(config: Config?, force: Bool)
523+
func log(event: (), verbose: Bool)
524+
}
525+
526+
@Fixture enum expected {
527+
class FooMock: Foo {
528+
init() { }
529+
init(Config: Int = 0) {
530+
self.Config = Config
531+
}
532+
533+
var Config: Int = 0
534+
535+
private(set) var applyCallCount = 0
536+
var applyArgValues: [(config: Config?, force: Bool)] = []
537+
var applyHandler: ((Config?, Bool) -> ())?
538+
func apply(config: Config?, force: Bool) {
539+
applyCallCount += 1
540+
applyArgValues.append((config, force))
541+
if let applyHandler = applyHandler {
542+
applyHandler(config, force)
543+
}
544+
545+
}
546+
547+
private(set) var logCallCount = 0
548+
var logArgValues: [(event: (), verbose: Bool)] = []
549+
var logHandler: (((), Bool) -> ())?
550+
func log(event: (), verbose: Bool) {
551+
logCallCount += 1
552+
logArgValues.append((event, verbose))
553+
if let logHandler = logHandler {
554+
logHandler(event, verbose)
555+
}
556+
557+
}
558+
}
559+
}
560+
}

0 commit comments

Comments
 (0)