Skip to content

Commit 2eda1d2

Browse files
authored
Merge pull request #92 from MercuryTechnologies/kb/swift-inits
Generate public initializers for Swift
2 parents 34aaacd + c2e7a2f commit 2eda1d2

File tree

24 files changed

+132
-8
lines changed
  • .golden
    • kotlinDeprecatedFieldSpec
    • 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
  • test

24 files changed

+132
-8
lines changed
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
data class Data(
22
val field0: Int,
3-
// Deprecated since build 500
4-
// val field1: Int? = null,
3+
// Deprecated since build 500
4+
// val field1: Int? = null,
55
)
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
}
+5
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? = nil) {
6+
self.field0 = field0
7+
self.field1 = field1
8+
}
49
}

.golden/swiftBasicDocSpec/golden

+5
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? = nil) {
37+
self.first = first
38+
self.second = second
39+
}
3540
}
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
}
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

+5
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? = nil) {
6+
self.field0 = field0
7+
self.field1 = field1
8+
}
49
}

.golden/swiftDeprecatedFieldSpec/golden

+4
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

+5
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
}
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

+5
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? = nil) {
8+
self.field0 = field0
9+
self.field1 = field1
10+
}
611
}

.golden/swiftRecord0SumOfProductDocSpec/golden

+5
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
}
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
}
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

+5
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? = nil) {
8+
self.field0 = field0
9+
self.field2 = field2
10+
}
611
}

.golden/swiftRecord1SumOfProductDocSpec/golden

+5
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
}
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
}
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
}
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
}
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

+4
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/Kotlin.hs

+6-5
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,7 @@ prettyStructFields indents fields deprecatedFields = go fields
7171
where
7272
deprecatedFieldsMap = Map.fromList deprecatedFields
7373
prettyField (Field fieldName ty _) =
74-
indents
75-
++ "val "
74+
"val "
7675
++ fieldName
7776
++ ": "
7877
++ prettyMoatType ty
@@ -84,11 +83,13 @@ prettyStructFields indents fields deprecatedFields = go fields
8483
go (field@(Field fieldName _ _) : fs) =
8584
case Map.lookup fieldName deprecatedFieldsMap of
8685
Just mComment ->
87-
maybe "" (\comment -> "// " ++ comment ++ "\n") mComment
88-
++ "//"
86+
indents
87+
++ maybe "" (\comment -> "// " ++ comment ++ "\n") mComment
88+
++ indents
89+
++ "// "
8990
++ prettyField field
9091
++ go fs
91-
Nothing -> prettyField field ++ go fs
92+
Nothing -> indents ++ prettyField field ++ go fs
9293

9394
prettyEnumCases :: String -> [EnumCase] -> String
9495
prettyEnumCases indents = go

src/Moat/Pretty/Swift.hs

+30
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,35 @@ 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+
isOptional :: MoatType -> Bool
309+
isOptional (Optional _) = True
310+
isOptional _ = False
311+
312+
prettyParam :: Field -> String
313+
prettyParam (Field fieldName fieldType _) =
314+
fieldName ++ ": " ++ prettyMoatType fieldType ++ (if isOptional fieldType then " = nil" else "")
315+
316+
prettyAssignment :: String -> Field -> String
317+
prettyAssignment indentStr (Field fieldName _ _) =
318+
indentStr ++ " self." ++ fieldName ++ " = " ++ fieldName ++ "\n"
319+
290320
prettyNewtypeField :: String -> Field -> String -> String
291321
prettyNewtypeField indents (Field alias fieldType _) fieldName =
292322
indents

test/DeprecatedFieldSpec.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ mobileGenWith
2424

2525
spec :: Spec
2626
spec =
27-
fdescribe "stays golden" $ do
27+
describe "stays golden" $ do
2828
let moduleName = "DeprecatedFieldSpec"
2929
it "swift" $
3030
defaultGolden ("swift" <> moduleName) (showSwift @Data)

0 commit comments

Comments
 (0)