Skip to content

Commit b706d6f

Browse files
committed
generate manually queryFragment
1 parent 18dd177 commit b706d6f

File tree

1 file changed

+64
-22
lines changed

1 file changed

+64
-22
lines changed

Sources/StructuredQueriesMacros/TableMacro.swift

Lines changed: 64 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -261,18 +261,33 @@ extension TableMacro: ExtensionMacro {
261261
}
262262

263263
let defaultValue = binding.initializer?.value.rewritten(selfRewriter)
264-
columnsProperties.append(
265-
"""
266-
public let \(identifier) = \(moduleName).TableColumn<\
267-
QueryValue, \
268-
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
269-
>(\
270-
\(columnName), \
271-
keyPath: \\QueryValue.\(identifier)\(defaultValue.map { ", default: \($0)" } ?? "")\
264+
if isGenerated {
265+
columnsProperties.append(
266+
"""
267+
public var \(identifier): some \(moduleName).QueryExpression<\(raw: columnQueryValueType?.trimmedDescription ?? "_")> {
268+
\(moduleName).TableColumn<\
269+
QueryValue, \
270+
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
271+
>(\
272+
\(columnName), \
273+
keyPath: \\QueryValue.\(identifier))
274+
}
275+
"""
272276
)
273-
"""
274-
)
275-
allColumns.append(identifier)
277+
} else {
278+
columnsProperties.append(
279+
"""
280+
public let \(identifier) = \(moduleName).TableColumn<\
281+
QueryValue, \
282+
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
283+
>(\
284+
\(columnName), \
285+
keyPath: \\QueryValue.\(identifier)\(defaultValue.map { ", default: \($0)" } ?? "")\
286+
)
287+
"""
288+
)
289+
allColumns.append(identifier)
290+
}
276291
let decodedType = columnQueryValueType?.asNonOptionalType()
277292
if let defaultValue {
278293
decodings.append(
@@ -596,6 +611,7 @@ extension TableMacro: MemberMacro {
596611
}
597612
let type = IdentifierTypeSyntax(name: declaration.name.trimmed)
598613
var allColumns: [TokenSyntax] = []
614+
var selectableColumns: [String] = []
599615
var columnsProperties: [DeclSyntax] = []
600616
var decodings: [String] = []
601617
var decodingUnwrappings: [String] = []
@@ -717,6 +733,12 @@ extension TableMacro: MemberMacro {
717733
)
718734
}
719735

736+
// Capture all column string literals for the query fragment
737+
selectableColumns.append(
738+
columnName.as(StringLiteralExprSyntax.self)?.segments.description
739+
?? identifier.text.trimmingBackticks()
740+
)
741+
720742
if !isGenerated {
721743
// NB: A compiler bug prevents us from applying the '@_Draft' macro directly
722744
draftBindings.append((binding, columnQueryOutputType, identifier == primaryKey?.identifier))
@@ -735,18 +757,34 @@ extension TableMacro: MemberMacro {
735757
}
736758

737759
let defaultValue = binding.initializer?.value.rewritten(selfRewriter)
738-
columnsProperties.append(
739-
"""
740-
public let \(identifier) = \(moduleName).TableColumn<\
741-
QueryValue, \
742-
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
743-
>(\
744-
\(columnName), \
745-
keyPath: \\QueryValue.\(identifier)\(defaultValue.map { ", default: \($0)" } ?? "")\
760+
if isGenerated {
761+
columnsProperties.append(
762+
"""
763+
public var \(identifier): some \(moduleName).QueryExpression<\(raw: columnQueryValueType?.trimmedDescription ?? "_")> { \
764+
\(moduleName).TableColumn<\
765+
QueryValue, \
766+
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
767+
>(\
768+
\(columnName), \
769+
keyPath: \\QueryValue.\(identifier)\
770+
)
771+
}
772+
"""
746773
)
747-
"""
748-
)
749-
allColumns.append(identifier)
774+
} else {
775+
columnsProperties.append(
776+
"""
777+
public let \(identifier) = \(moduleName).TableColumn<\
778+
QueryValue, \
779+
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
780+
>(\
781+
\(columnName), \
782+
keyPath: \\QueryValue.\(identifier)\(defaultValue.map { ", default: \($0)" } ?? "")\
783+
)
784+
"""
785+
)
786+
allColumns.append(identifier)
787+
}
750788
let decodedType = columnQueryValueType?.asNonOptionalType()
751789
if let defaultValue {
752790
decodings.append(
@@ -959,6 +997,9 @@ extension TableMacro: MemberMacro {
959997
return []
960998
}
961999

1000+
let queryFragmentString = selectableColumns.map { "\"\($0)\"" }
1001+
.joined(separator: ", ")
1002+
let fragmentLiteral = StringLiteralExprSyntax(content: queryFragmentString)
9621003
var typeAliases: [DeclSyntax] = []
9631004
if declaration.hasMacroApplication("Selection") {
9641005
conformances.append("\(moduleName).PartialSelectStatement")
@@ -981,6 +1022,7 @@ extension TableMacro: MemberMacro {
9811022
public static var allColumns: [any \(moduleName).TableColumnExpression] { \
9821023
[\(allColumns.map { "QueryValue.columns.\($0)" as ExprSyntax }, separator: ", ")]
9831024
}
1025+
public static var queryFragment: String { \(fragmentLiteral) }
9841026
}
9851027
""",
9861028
draft,

0 commit comments

Comments
 (0)