Skip to content

Commit 9eaafed

Browse files
Unroll reduces to statements in macro expansion. (#196)
* Unroll reduces to statements in macro expansion. * wip --------- Co-authored-by: Stephen Celis <[email protected]>
1 parent 4f0e29a commit 9eaafed

File tree

7 files changed

+299
-96
lines changed

7 files changed

+299
-96
lines changed

Package.resolved

Lines changed: 1 addition & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/StructuredQueriesMacros/TableMacro.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,11 @@ extension TableMacro: ExtensionMacro {
868868
public typealias From = Swift.Never
869869
""",
870870
])
871-
let columnWidth: ExprSyntax = "[\(columnWidths, separator: ", ")].reduce(0, +)"
871+
let columnWidth: ExprSyntax = """
872+
var columnWidth = 0
873+
columnWidth += \(columnWidths, separator: "\ncolumnWidth += ")
874+
return columnWidth
875+
"""
872876

873877
return [
874878
DeclSyntax(

Sources/StructuredQueriesSQLiteMacros/DatabaseFunctionMacro.swift

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ extension DatabaseFunctionMacro: PeerMacro {
102102

103103
let functionTypeName = context.makeUniqueName(declarationName)
104104
let databaseFunctionName = StringLiteralExprSyntax(content: functionName)
105-
var argumentCount: [ExprSyntax] = []
105+
var argumentCounts: [ExprSyntax] = []
106106

107107
var bodyArguments: [String] = []
108108
var representableInputTypes: [String] = []
@@ -144,7 +144,7 @@ extension DatabaseFunctionMacro: PeerMacro {
144144
parameters.append(parameterName)
145145
argumentBindings.append(parameterName)
146146

147-
argumentCount.append("\(type)")
147+
argumentCounts.append("\(type)")
148148
decodings.append("let \(parameterName) = try decoder.decode(\(type).self)")
149149
decodingUnwrappings.append("guard let \(parameterName) else { throw InvalidInvocation() }")
150150
}
@@ -215,6 +215,15 @@ extension DatabaseFunctionMacro: PeerMacro {
215215
? representableInputType
216216
: "(\(representableInputType))"
217217

218+
let argumentCount =
219+
argumentCounts.isEmpty
220+
? "0"
221+
: """
222+
var argumentCount = 0
223+
\(argumentCounts.map { "argumentCount += \($0)._columnWidth\n" }.joined())\
224+
return argumentCount
225+
"""
226+
218227
return [
219228
"""
220229
\(attributes)\(access)\(`static`)var $\(raw: declarationName): \(functionTypeName) {
@@ -227,8 +236,8 @@ extension DatabaseFunctionMacro: PeerMacro {
227236
public typealias Input = \(raw: representableInputType)
228237
public typealias Output = \(representableOutputType)
229238
public let name = \(databaseFunctionName)
230-
public var argumentCount: Int? { \
231-
[\(raw: argumentCount.map { "\($0)._columnWidth" }.joined(separator: ", "))].reduce(0, +) \
239+
public var argumentCount: Int? {
240+
\(raw: argumentCount)
232241
}
233242
public let isDeterministic = \(raw: isDeterministic)
234243
public let body: \(raw: bodyType)

Tests/StructuredQueriesMacrosTests/DatabaseFunctionMacroTests.swift

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ extension SnapshotTests {
2828
public typealias Output = Date
2929
public let name = "currentDate"
3030
public var argumentCount: Int? {
31-
[].reduce(0, +)
31+
0
3232
}
3333
public let isDeterministic = false
3434
public let body: () -> Date
@@ -80,7 +80,7 @@ extension SnapshotTests {
8080
public typealias Output = Date
8181
public let name = "current_date"
8282
public var argumentCount: Int? {
83-
[].reduce(0, +)
83+
0
8484
}
8585
public let isDeterministic = false
8686
public let body: () -> Date
@@ -132,7 +132,9 @@ extension SnapshotTests {
132132
public typealias Output = [String].JSONRepresentation
133133
public let name = "jsonCapitalize"
134134
public var argumentCount: Int? {
135-
[[String].JSONRepresentation._columnWidth].reduce(0, +)
135+
var argumentCount = 0
136+
argumentCount += [String].JSONRepresentation._columnWidth
137+
return argumentCount
136138
}
137139
public let isDeterministic = false
138140
public let body: ([String]) -> [String]
@@ -188,7 +190,7 @@ extension SnapshotTests {
188190
public typealias Output = Int
189191
public let name = "fortyTwo"
190192
public var argumentCount: Int? {
191-
[].reduce(0, +)
193+
0
192194
}
193195
public let isDeterministic = true
194196
public let body: () -> Int
@@ -240,7 +242,9 @@ extension SnapshotTests {
240242
public typealias Output = Date?
241243
public let name = "currentDate"
242244
public var argumentCount: Int? {
243-
[String._columnWidth].reduce(0, +)
245+
var argumentCount = 0
246+
argumentCount += String._columnWidth
247+
return argumentCount
244248
}
245249
public let isDeterministic = false
246250
public let body: (String) -> Date?
@@ -296,7 +300,9 @@ extension SnapshotTests {
296300
public typealias Output = Date?
297301
public let name = "currentDate"
298302
public var argumentCount: Int? {
299-
[String._columnWidth].reduce(0, +)
303+
var argumentCount = 0
304+
argumentCount += String._columnWidth
305+
return argumentCount
300306
}
301307
public let isDeterministic = false
302308
public let body: (String) -> Date?
@@ -352,7 +358,9 @@ extension SnapshotTests {
352358
public typealias Output = Date?
353359
public let name = "currentDate"
354360
public var argumentCount: Int? {
355-
[String._columnWidth].reduce(0, +)
361+
var argumentCount = 0
362+
argumentCount += String._columnWidth
363+
return argumentCount
356364
}
357365
public let isDeterministic = false
358366
public let body: (String) -> Date?
@@ -408,7 +416,9 @@ extension SnapshotTests {
408416
public typealias Output = Date?
409417
public let name = "currentDate"
410418
public var argumentCount: Int? {
411-
[String._columnWidth].reduce(0, +)
419+
var argumentCount = 0
420+
argumentCount += String._columnWidth
421+
return argumentCount
412422
}
413423
public let isDeterministic = false
414424
public let body: (String) -> Date?
@@ -464,7 +474,10 @@ extension SnapshotTests {
464474
public typealias Output = String
465475
public let name = "concat"
466476
public var argumentCount: Int? {
467-
[String._columnWidth, String._columnWidth].reduce(0, +)
477+
var argumentCount = 0
478+
argumentCount += String._columnWidth
479+
argumentCount += String._columnWidth
480+
return argumentCount
468481
}
469482
public let isDeterministic = false
470483
public let body: (String, String) -> String
@@ -541,7 +554,9 @@ extension SnapshotTests {
541554
public typealias Output = Date?
542555
public let name = "currentDate"
543556
public var argumentCount: Int? {
544-
[String?._columnWidth].reduce(0, +)
557+
var argumentCount = 0
558+
argumentCount += String?._columnWidth
559+
return argumentCount
545560
}
546561
public let isDeterministic = false
547562
public let body: (String?) -> Date?
@@ -597,7 +612,7 @@ extension SnapshotTests {
597612
public typealias Output = Date
598613
public let name = "currentDate"
599614
public var argumentCount: Int? {
600-
[].reduce(0, +)
615+
0
601616
}
602617
public let isDeterministic = false
603618
public let body: () throws -> Date
@@ -653,7 +668,7 @@ extension SnapshotTests {
653668
public typealias Output = Date
654669
public let name = "currentDate"
655670
public var argumentCount: Int? {
656-
[].reduce(0, +)
671+
0
657672
}
658673
public let isDeterministic = false
659674
public let body: () throws(MyError) -> Date
@@ -709,7 +724,7 @@ extension SnapshotTests {
709724
public typealias Output = Date
710725
public let name = "currentDate"
711726
public var argumentCount: Int? {
712-
[].reduce(0, +)
727+
0
713728
}
714729
public let isDeterministic = false
715730
public let body: () -> Date
@@ -761,7 +776,7 @@ extension SnapshotTests {
761776
public typealias Output = Date
762777
public let name = "currentDate"
763778
public var argumentCount: Int? {
764-
[].reduce(0, +)
779+
0
765780
}
766781
public let isDeterministic = false
767782
public let body: () -> Date
@@ -836,7 +851,7 @@ extension SnapshotTests {
836851
public typealias Output = Date
837852
public let name = "currentDate"
838853
public var argumentCount: Int? {
839-
[].reduce(0, +)
854+
0
840855
}
841856
public let isDeterministic = false
842857
public let body: () -> Date
@@ -888,7 +903,7 @@ extension SnapshotTests {
888903
public typealias Output = Int
889904
public let name = "default"
890905
public var argumentCount: Int? {
891-
[].reduce(0, +)
906+
0
892907
}
893908
public let isDeterministic = false
894909
public let body: () -> Int
@@ -940,7 +955,7 @@ extension SnapshotTests {
940955
public typealias Output = Swift.Void
941956
public let name = "void"
942957
public var argumentCount: Int? {
943-
[].reduce(0, +)
958+
0
944959
}
945960
public let isDeterministic = false
946961
public let body: () -> Swift.Void
@@ -987,7 +1002,7 @@ extension SnapshotTests {
9871002
public typealias Output = Swift.Void
9881003
public let name = "void"
9891004
public var argumentCount: Int? {
990-
[].reduce(0, +)
1005+
0
9911006
}
9921007
public let isDeterministic = false
9931008
public let body: () throws -> Swift.Void
@@ -1047,7 +1062,10 @@ extension SnapshotTests {
10471062
public typealias Output = Swift.Void
10481063
public let name = "min"
10491064
public var argumentCount: Int? {
1050-
[Int._columnWidth, Int._columnWidth].reduce(0, +)
1065+
var argumentCount = 0
1066+
argumentCount += Int._columnWidth
1067+
argumentCount += Int._columnWidth
1068+
return argumentCount
10511069
}
10521070
public let isDeterministic = false
10531071
public let body: (Int, Int) -> Swift.Void
@@ -1111,7 +1129,10 @@ extension SnapshotTests {
11111129
public typealias Output = Swift.Void
11121130
public let name = "min"
11131131
public var argumentCount: Int? {
1114-
[Int._columnWidth, Int._columnWidth].reduce(0, +)
1132+
var argumentCount = 0
1133+
argumentCount += Int._columnWidth
1134+
argumentCount += Int._columnWidth
1135+
return argumentCount
11151136
}
11161137
public let isDeterministic = false
11171138
public let body: (Int, Int) -> Swift.Void
@@ -1172,7 +1193,10 @@ extension SnapshotTests {
11721193
public typealias Output = Bool
11731194
public let name = "isValid"
11741195
public var argumentCount: Int? {
1175-
[Reminder._columnWidth, Bool._columnWidth].reduce(0, +)
1196+
var argumentCount = 0
1197+
argumentCount += Reminder._columnWidth
1198+
argumentCount += Bool._columnWidth
1199+
return argumentCount
11761200
}
11771201
public let isDeterministic = false
11781202
public let body: (Reminder, Bool) -> Bool

0 commit comments

Comments
 (0)