Skip to content

Commit 70ce95f

Browse files
committed
wip
1 parent 9bbc844 commit 70ce95f

File tree

5 files changed

+452
-218
lines changed

5 files changed

+452
-218
lines changed

Sources/StructuredQueriesCore/Documentation.docc/Extensions/PrimaryKeyedTable.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct Enrollment {
5151
var studentID: StudentID
5252
}
5353

54-
@Columns // Automatically inferred as '@Columns(primaryKey: True)
54+
// Automatically inferred as '@Columns(primaryKey: True)
5555
let id: ID
5656
// ...
5757
}

Sources/StructuredQueriesMacros/TableMacro.swift

Lines changed: 84 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ extension TableMacro: ExtensionMacro {
303303
)
304304
)
305305
}
306+
isPrimaryKey = true
306307
primaryKey = (
307308
identifier: identifier,
308309
label: label,
@@ -372,51 +373,35 @@ extension TableMacro: ExtensionMacro {
372373
binding.initializer?.value.rewritten(selfRewriter)
373374
?? (columnQueryValueType?.isOptionalType == true
374375
? ExprSyntax(NilLiteralExprSyntax()) : nil)
375-
if isColumnGroup {
376+
let tableColumnType =
377+
isGenerated
378+
? "GeneratedColumn"
379+
: isColumnGroup
380+
? "ColumnGroup"
381+
: isExplicitColumn
382+
? "TableColumn"
383+
: "_TableColumn"
384+
let tableColumnInitializer = tableColumnType == "_TableColumn" ? ".for" : ""
385+
func appendColumnProperty(primaryKey: Bool = false) {
376386
columnsProperties.append(
377387
"""
378-
public let \(identifier) = \(moduleName).ColumnGroup<\
388+
public let \(primaryKey ? "primaryKey" : identifier) = \
389+
\(moduleName).\(raw: tableColumnType)<\
379390
QueryValue, \
380391
\(raw: columnQueryValueType?.trimmedDescription ?? "_")\
381-
>(\
382-
keyPath: \\QueryValue.\(identifier)\
383-
)
384-
"""
385-
)
386-
allColumns.append(identifier)
387-
} else if isGenerated {
388-
columnsProperties.append(
389-
"""
390-
public var \(identifier): \(moduleName).GeneratedColumn<\
391-
QueryValue, \
392-
\(raw: columnQueryValueType?.trimmedDescription ?? "_")\
393-
> {
394-
\(moduleName).GeneratedColumn<\
395-
QueryValue, \
396-
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
397-
>(\
398-
\(columnName), \
399-
keyPath: \\QueryValue.\(identifier))
400-
}
401-
"""
402-
)
403-
allColumns.append(identifier)
404-
} else {
405-
let tableColumnInitializer = isExplicitColumn ? "" : ".for"
406-
let tableColumnType = isExplicitColumn ? "TableColumn" : "_TableColumn"
407-
columnsProperties.append(
408-
"""
409-
public let \(identifier) = \(moduleName).\(raw: tableColumnType)<\
410-
QueryValue, \
411-
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
412392
>\(raw: tableColumnInitializer)(\
413-
\(columnName), \
414-
keyPath: \\QueryValue.\(identifier)\(defaultValue.map { ", default: \($0)" } ?? "")\
393+
\(raw: isColumnGroup ? "" : "\(columnName), ")\
394+
keyPath: \\QueryValue.\(identifier)\
395+
\(isColumnGroup ? "" : defaultValue.map { ", default: \($0)" } ?? "")\
415396
)
416397
"""
417398
)
418-
allColumns.append(identifier)
419399
}
400+
appendColumnProperty()
401+
if isPrimaryKey {
402+
appendColumnProperty(primaryKey: true)
403+
}
404+
allColumns.append(identifier)
420405
let decodedType = columnQueryValueType?.asNonOptionalType()
421406
if let defaultValue {
422407
decodings.append(
@@ -506,13 +491,6 @@ extension TableMacro: ExtensionMacro {
506491
property.attributes[attributeIndex] = .attribute(attribute)
507492
}
508493
}
509-
if !hasColumnAttribute {
510-
let attribute = "@Column(primaryKey: false)\n"
511-
property.attributes.insert(
512-
AttributeListSyntax.Element("\(raw: attribute)"),
513-
at: property.attributes.startIndex
514-
)
515-
}
516494
var binding = binding
517495
if let type = binding.typeAnnotation?.type.asOptionalType() {
518496
binding.typeAnnotation?.type = type
@@ -673,34 +651,30 @@ extension TableMacro: ExtensionMacro {
673651
columnWidths.append("\(columnQueryValueType).columnWidth")
674652

675653
let defaultValue = parameter.defaultValue?.value.rewritten(selfRewriter)
676-
if isColumnGroup {
654+
let tableColumnType =
655+
isColumnGroup
656+
? "ColumnGroup"
657+
: isExplicitColumn
658+
? "TableColumn"
659+
: "_TableColumn"
660+
let tableColumnInitializer = tableColumnType == "_TableColumn" ? ".for" : ""
661+
func appendColumnProperty(primaryKey: Bool = false) {
677662
columnsProperties.append(
678663
"""
679-
public let \(identifier) = \(moduleName).ColumnGroup<\
664+
public let \(primaryKey ? "primaryKey" : identifier) = \
665+
\(moduleName).\(raw: tableColumnType)<\
680666
QueryValue, \
681667
\(raw: columnQueryValueType.trimmedDescription)?\
682-
>(\
683-
keyPath: \\QueryValue.\(identifier)\
684-
)
685-
"""
686-
)
687-
allColumns.append(identifier)
688-
} else {
689-
let tableColumnInitializer = isExplicitColumn ? "" : ".for"
690-
let tableColumnType = isExplicitColumn ? "TableColumn" : "_TableColumn"
691-
columnsProperties.append(
692-
"""
693-
public let \(identifier) = \(moduleName).\(raw: tableColumnType)<\
694-
QueryValue, \
695-
\(columnQueryValueType.rewritten(selfRewriter))?\
696668
>\(raw: tableColumnInitializer)(\
697-
\(columnName), \
698-
keyPath: \\QueryValue.\(identifier)\(defaultValue.map { ", default: \($0)" } ?? "")\
669+
\(raw: isColumnGroup ? "" : "\(columnName), ")\
670+
keyPath: \\QueryValue.\(identifier)\
671+
\(isColumnGroup ? "" : defaultValue.map { ", default: \($0)" } ?? "")\
699672
)
700673
"""
701674
)
702-
allColumns.append(identifier)
703675
}
676+
appendColumnProperty()
677+
allColumns.append(identifier)
704678
let decodedType = columnQueryValueType.asNonOptionalType()
705679
decodings.append(
706680
"""
@@ -729,14 +703,7 @@ extension TableMacro: ExtensionMacro {
729703
\(allColumns.map { "self.\($0) = other.\($0)" as ExprSyntax }, separator: "\n")
730704
}
731705
"""
732-
} else if let primaryKey {
733-
columnsProperties.append(
734-
"""
735-
public var primaryKey: \(moduleName).\
736-
\(raw: primaryKey.isColumnGroup ? "ColumnGroup" : "TableColumn")\
737-
<QueryValue, \(primaryKey.queryValueType)> { self.\(primaryKey.identifier) }
738-
"""
739-
)
706+
} else if primaryKey != nil {
740707
draft = """
741708
742709
@_Draft(\(type).self)
@@ -974,7 +941,9 @@ extension TableMacro: MemberMacro {
974941
?? binding.initializer?.value.literalType)
975942
.map { $0.rewritten(selfRewriter) }
976943
var columnQueryOutputType = columnQueryValueType
977-
var isPrimaryKey = primaryKey == nil && identifier.text == "id"
944+
var isPrimaryKey = primaryKey == nil
945+
&& identifier.text == "id"
946+
&& node.attributeName.identifier != "_Draft"
978947
var isColumnGroup = false
979948
var isEphemeral = false
980949
var isExplicitColumn = false
@@ -1024,6 +993,7 @@ extension TableMacro: MemberMacro {
1024993
isPrimaryKey = false
1025994
break
1026995
}
996+
isPrimaryKey = true
1027997
if primaryKey != nil {
1028998
var newArguments = arguments
1029999
newArguments.remove(at: argumentIndex)
@@ -1077,59 +1047,38 @@ extension TableMacro: MemberMacro {
10771047
binding.initializer?.value.rewritten(selfRewriter)
10781048
?? (columnQueryValueType?.isOptionalType == true
10791049
? ExprSyntax(NilLiteralExprSyntax()) : nil)
1080-
if isColumnGroup {
1050+
let tableColumnType =
1051+
isGenerated
1052+
? "GeneratedColumn"
1053+
: isColumnGroup
1054+
? "ColumnGroup"
1055+
: isExplicitColumn
1056+
? "TableColumn"
1057+
: "_TableColumn"
1058+
let tableColumnInitializer = tableColumnType == "_TableColumn" ? ".for" : ""
1059+
func appendColumnProperty(primaryKey: Bool = false) {
10811060
columnsProperties.append(
10821061
"""
1083-
public let \(identifier) = \(moduleName).ColumnGroup<\
1062+
public let \(primaryKey ? "primaryKey" : identifier) = \
1063+
\(moduleName).\(raw: tableColumnType)<\
10841064
QueryValue, \
10851065
\(raw: columnQueryValueType?.trimmedDescription ?? "_")\
1086-
>(\
1087-
keyPath: \\QueryValue.\(identifier)\
1088-
)
1089-
"""
1090-
)
1091-
allColumns.append((identifier, "_", columnQueryValueType, defaultValue))
1092-
allColumnNames.append(identifier)
1093-
writableColumns.append(identifier)
1094-
} else if isGenerated {
1095-
columnsProperties.append(
1096-
"""
1097-
public var \(identifier): \(moduleName).GeneratedColumn<\
1098-
QueryValue, \
1099-
\(raw: columnQueryValueType?.trimmedDescription ?? "_")\
1100-
> { \
1101-
\(moduleName).GeneratedColumn<\
1102-
QueryValue, \
1103-
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
1104-
>(\
1105-
\(columnName), \
1106-
keyPath: \\QueryValue.\(identifier)\
1107-
)
1108-
}
1109-
"""
1110-
)
1111-
allColumns.append((identifier, "_", columnQueryValueType, defaultValue))
1112-
allColumnNames.append(identifier)
1113-
} else {
1114-
let tableColumnInitializer = isExplicitColumn ? "" : ".for"
1115-
let tableColumnType = isExplicitColumn ? "TableColumn" : "_TableColumn"
1116-
columnsProperties.append(
1117-
"""
1118-
public let \(identifier) = \(moduleName).\(raw: tableColumnType)<\
1119-
QueryValue, \
1120-
\(columnQueryValueType?.rewritten(selfRewriter) ?? "_")\
11211066
>\(raw: tableColumnInitializer)(\
1122-
\(columnName), \
1123-
keyPath: \\QueryValue.\(identifier)\(defaultValue.map { ", default: \($0)" } ?? "")\
1067+
\(raw: isColumnGroup ? "" : "\(columnName), ")\
1068+
keyPath: \\QueryValue.\(identifier)\
1069+
\(isColumnGroup ? "" : defaultValue.map { ", default: \($0)" } ?? "")\
11241070
)
11251071
"""
11261072
)
1127-
allColumns.append((identifier, "_", columnQueryValueType, defaultValue))
1128-
allColumnNames.append(identifier)
1129-
writableColumns.append(identifier)
11301073
}
1131-
1074+
appendColumnProperty()
1075+
if isPrimaryKey {
1076+
appendColumnProperty(primaryKey: true)
1077+
}
1078+
allColumns.append((identifier, "_", columnQueryValueType, defaultValue))
1079+
allColumnNames.append(identifier)
11321080
if !isGenerated {
1081+
writableColumns.append(identifier)
11331082
if let primaryKey, primaryKey.identifier == identifier {
11341083
var hasColumnAttribute = false
11351084
var property = property
@@ -1185,13 +1134,6 @@ extension TableMacro: MemberMacro {
11851134
}
11861135
}
11871136
property = property.trimmed
1188-
if !hasColumnAttribute {
1189-
let attribute = "@Column(primaryKey: false)\n"
1190-
property.attributes.insert(
1191-
AttributeListSyntax.Element("\(raw: attribute)"),
1192-
at: property.attributes.startIndex
1193-
)
1194-
}
11951137
var binding = binding
11961138
if let type = binding.typeAnnotation?.type.asOptionalType() {
11971139
binding.typeAnnotation?.type = type
@@ -1315,42 +1257,34 @@ extension TableMacro: MemberMacro {
13151257
selectedColumns.append(identifier)
13161258

13171259
let defaultValue = parameter.defaultValue?.value.rewritten(selfRewriter)
1318-
if isColumnGroup {
1260+
let tableColumnType =
1261+
isColumnGroup
1262+
? "ColumnGroup"
1263+
: isExplicitColumn
1264+
? "TableColumn"
1265+
: "_TableColumn"
1266+
let tableColumnInitializer = tableColumnType == "_TableColumn" ? ".for" : ""
1267+
func appendColumnProperty(primaryKey: Bool = false) {
13191268
columnsProperties.append(
13201269
"""
1321-
public let \(identifier) = \(moduleName).ColumnGroup<\
1270+
public let \(primaryKey ? "primaryKey" : identifier) = \
1271+
\(moduleName).\(raw: tableColumnType)<\
13221272
QueryValue, \
1323-
\(raw: columnQueryValueType)?\
1324-
>(\
1325-
keyPath: \\QueryValue.\(identifier)\
1326-
)
1327-
"""
1328-
)
1329-
allColumns.append(
1330-
(identifier, parameter.firstName ?? "_", columnQueryValueType, defaultValue)
1331-
)
1332-
allColumnNames.append(identifier)
1333-
writableColumns.append(identifier)
1334-
} else {
1335-
let tableColumnInitializer = isExplicitColumn ? "" : ".for"
1336-
let tableColumnType = isExplicitColumn ? "TableColumn" : "_TableColumn"
1337-
columnsProperties.append(
1338-
"""
1339-
public let \(identifier) = \(moduleName).\(raw: tableColumnType)<\
1340-
QueryValue, \
1341-
\(columnQueryValueType.rewritten(selfRewriter))?\
1273+
\(raw: columnQueryValueType.trimmedDescription)?\
13421274
>\(raw: tableColumnInitializer)(\
1343-
\(columnName), \
1344-
keyPath: \\QueryValue.\(identifier)\(defaultValue.map { ", default: \($0)" } ?? "")\
1275+
\(raw: isColumnGroup ? "" : "\(columnName), ")\
1276+
keyPath: \\QueryValue.\(identifier)\
1277+
\(isColumnGroup ? "" : defaultValue.map { ", default: \($0)" } ?? "")\
13451278
)
13461279
"""
13471280
)
1348-
allColumns.append(
1349-
(identifier, parameter.firstName ?? "_", columnQueryValueType, defaultValue)
1350-
)
1351-
allColumnNames.append(identifier)
1352-
writableColumns.append(identifier)
13531281
}
1282+
appendColumnProperty()
1283+
allColumns.append(
1284+
(identifier, parameter.firstName ?? "_", columnQueryValueType, defaultValue)
1285+
)
1286+
allColumnNames.append(identifier)
1287+
writableColumns.append(identifier)
13541288
}
13551289
for (identifier, firstName, valueType, defaultValue) in allColumns {
13561290
var argument = """
@@ -1381,14 +1315,7 @@ extension TableMacro: MemberMacro {
13811315
}
13821316

13831317
var draft: DeclSyntax?
1384-
if let primaryKey {
1385-
columnsProperties.append(
1386-
"""
1387-
public var primaryKey: \(moduleName).\
1388-
\(raw: primaryKey.isColumnGroup ? "ColumnGroup" : "TableColumn")\
1389-
<QueryValue, \(primaryKey.queryValueType)> { self.\(primaryKey.identifier) }
1390-
"""
1391-
)
1318+
if primaryKey != nil {
13921319
draft = """
13931320
13941321
@_Draft(\(type).self)

0 commit comments

Comments
 (0)