Skip to content

Commit fa9d21b

Browse files
committed
generate public inits for swift
1 parent d4cc121 commit fa9d21b

File tree

21 files changed

+119
-0
lines changed
  • .golden
    • swiftAdvancedNewtypeWithEnumFieldSpec
    • swiftAdvancedRecordSpec
    • swiftBasicDocSpec
    • swiftBasicNewtypeWithConcreteFieldSpec
    • swiftBasicNewtypeWithEitherFieldSpec
    • swiftBasicRecordSpec
    • swiftDeprecatedFieldSpec
    • swiftGenericStructSpec
    • swiftMultipleTypeVariableSpec
    • swiftRecord0DuplicateRecordFieldSpec
    • swiftRecord0SumOfProductDocSpec
    • swiftRecord0SumOfProductWithTaggedFlatObjectStyleSpec
    • swiftRecord0SumOfProductWithTaggedObjectStyleSpec
    • swiftRecord1DuplicateRecordFieldSpec
    • swiftRecord1SumOfProductDocSpec
    • swiftRecord1SumOfProductWithTaggedFlatObjectStyleSpec
    • swiftRecord1SumOfProductWithTaggedObjectStyleSpec
    • swiftStrictFieldsCheck-RecordA
    • swiftStrictFieldsCheck-RecordB
    • swiftTypeVariableSpec
  • src/Moat/Pretty

21 files changed

+119
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
public struct Newtype {
22
public var newtypeField: Enum
3+
4+
public init(newtypeField: Enum) {
5+
self.newtypeField = newtypeField
6+
}
37
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
public struct Data: CaseIterable, Hashable, Codable {
22
public var field0: Int
33
public var field1: Int?
4+
5+
public init(field0: Int, field1: Int?) {
6+
self.field0 = field0
7+
self.field1 = field1
8+
}
49
}

.golden/swiftBasicDocSpec/golden

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,9 @@ public struct Data {
3232
public var first: Int
3333
/// Second field, it's maybe an Int
3434
public var second: Int?
35+
36+
public init(first: Int, second: Int?) {
37+
self.first = first
38+
self.second = second
39+
}
3540
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
public struct Newtype {
22
public var newtypeField: String
3+
4+
public init(newtypeField: String) {
5+
self.newtypeField = newtypeField
6+
}
37
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
public struct Newtype {
22
public var newtypeField: Result<Int, String>
3+
4+
public init(newtypeField: Result<Int, String>) {
5+
self.newtypeField = newtypeField
6+
}
37
}

.golden/swiftBasicRecordSpec/golden

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
public struct Data {
22
public var field0: Int
33
public var field1: Int?
4+
5+
public init(field0: Int, field1: Int?) {
6+
self.field0 = field0
7+
self.field1 = field1
8+
}
49
}

.golden/swiftDeprecatedFieldSpec/golden

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,8 @@ public struct Data {
22
public var field0: Int
33
// Deprecated since build 500
44
// public var field1: Int?
5+
6+
public init(field0: Int) {
7+
self.field0 = field0
8+
}
59
}

.golden/swiftGenericStructSpec/golden

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
public struct Tree<A: Hashable & Codable>: Hashable, Codable {
22
public var rootLabel: A
33
public var subForest: [Tree<A>]
4+
5+
public init(rootLabel: A, subForest: [Tree<A>]) {
6+
self.rootLabel = rootLabel
7+
self.subForest = subForest
8+
}
49
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
public struct Data<A: Hashable & Codable, B: Hashable & Codable>: CaseIterable, Hashable, Codable {
22
public var field0: A
33
public var field1: B
4+
5+
public init(field0: A, field1: B) {
6+
self.field0 = field0
7+
self.field1 = field1
8+
}
49
}

.golden/swiftRecord0DuplicateRecordFieldSpec/golden

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,9 @@ public struct Data0 {
33
public var field0: Int
44
/// not a duplicate
55
public var field1: Int?
6+
7+
public init(field0: Int, field1: Int?) {
8+
self.field0 = field0
9+
self.field1 = field1
10+
}
611
}

.golden/swiftRecord0SumOfProductDocSpec/golden

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,9 @@ public struct Record0: CaseIterable, Hashable, Codable {
44
public var record0Field0: Int
55
/// The first field of record 0
66
public var record0Field1: Int
7+
8+
public init(record0Field0: Int, record0Field1: Int) {
9+
self.record0Field0 = record0Field0
10+
self.record0Field1 = record0Field1
11+
}
712
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
public struct Record0: Codable {
22
public var record0Field0: Int
33
public var record0Field1: Int
4+
5+
public init(record0Field0: Int, record0Field1: Int) {
6+
self.record0Field0 = record0Field0
7+
self.record0Field1 = record0Field1
8+
}
49
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
public struct Record0: Codable {
22
public var record0Field0: Int
33
public var record0Field1: Int
4+
5+
public init(record0Field0: Int, record0Field1: Int) {
6+
self.record0Field0 = record0Field0
7+
self.record0Field1 = record0Field1
8+
}
49
}

.golden/swiftRecord1DuplicateRecordFieldSpec/golden

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,9 @@ public struct Data1 {
33
public var field0: String
44
/// not a duplicate
55
public var field2: String?
6+
7+
public init(field0: String, field2: String?) {
8+
self.field0 = field0
9+
self.field2 = field2
10+
}
611
}

.golden/swiftRecord1SumOfProductDocSpec/golden

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,9 @@ public struct Record1: CaseIterable, Hashable, Codable {
44
public var record1Field0: Int
55
/// The first field of record 1
66
public var record1Field1: Int
7+
8+
public init(record1Field0: Int, record1Field1: Int) {
9+
self.record1Field0 = record1Field0
10+
self.record1Field1 = record1Field1
11+
}
712
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
public struct Record1: Codable {
22
public var record1Field0: Int
33
public var record1Field1: Int
4+
5+
public init(record1Field0: Int, record1Field1: Int) {
6+
self.record1Field0 = record1Field0
7+
self.record1Field1 = record1Field1
8+
}
49
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
public struct Record1: Codable {
22
public var record1Field0: Int
33
public var record1Field1: Int
4+
5+
public init(record1Field0: Int, record1Field1: Int) {
6+
self.record1Field0 = record1Field0
7+
self.record1Field1 = record1Field1
8+
}
49
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
public struct RecordA {
22
public var fieldA: String
3+
4+
public init(fieldA: String) {
5+
self.fieldA = fieldA
6+
}
37
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
public struct RecordB {
22
public var c: String
3+
4+
public init(c: String) {
5+
self.c = c
6+
}
37
}

.golden/swiftTypeVariableSpec/golden

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
public struct Data<A: Hashable & Codable>: CaseIterable, Hashable, Codable {
22
public var field0: A
3+
4+
public init(field0: A) {
5+
self.field0 = field0
6+
}
37
}

src/Moat/Pretty/Swift.hs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ prettySwiftDataWith indent = \case
5454
++ " {"
5555
++ newlineNonEmpty structFields
5656
++ prettyStructFields indents structFields structDeprecatedFields
57+
++ prettyStructInitializer indents structFields structDeprecatedFields
5758
++ newlineNonEmpty structPrivateTypes
5859
++ prettyPrivateTypes indents structPrivateTypes
5960
++ prettyTags indents structTags
@@ -287,6 +288,31 @@ prettyStructFields indents fields deprecatedFields = go fields
287288
++ prettyField field
288289
++ go fs
289290

291+
prettyStructInitializer :: String -> [Field] -> [(String, Maybe String)] -> String
292+
prettyStructInitializer indents fields deprecatedFields =
293+
case activeFields of
294+
[] -> "" -- No initializer needed if there are no active fields
295+
_ ->
296+
"\n"
297+
++ indents
298+
++ "public init("
299+
++ intercalate ", " (map prettyParam activeFields)
300+
++ ") {\n"
301+
++ concatMap (prettyAssignment indents) activeFields
302+
++ indents
303+
++ "}\n"
304+
where
305+
deprecatedFieldNames = map fst deprecatedFields
306+
activeFields = filter (\(Field name _ _) -> name `notElem` deprecatedFieldNames) fields
307+
308+
prettyParam :: Field -> String
309+
prettyParam (Field fieldName fieldType _) =
310+
fieldName ++ ": " ++ prettyMoatType fieldType
311+
312+
prettyAssignment :: String -> Field -> String
313+
prettyAssignment indentStr (Field fieldName _ _) =
314+
indentStr ++ " self." ++ fieldName ++ " = " ++ fieldName ++ "\n"
315+
290316
prettyNewtypeField :: String -> Field -> String -> String
291317
prettyNewtypeField indents (Field alias fieldType _) fieldName =
292318
indents

0 commit comments

Comments
 (0)