@@ -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