From edb80df0ba0d85f0080ea41f6aac730df8eca1f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fouilh=C3=A9?= Date: Thu, 20 Apr 2017 16:54:35 +0200 Subject: [PATCH] fix(swift3): fix infinite loop with inheritance and check if parent decoder exists before calling (#5416) --- .../src/main/resources/swift3/Models.mustache | 6 ++++-- .../PetstoreClient/Classes/Swaggers/Models.swift | 10 +++++++--- .../PetstoreClient/Classes/Swaggers/Models.swift | 10 +++++++--- .../PetstoreClient/Classes/Swaggers/Models.swift | 10 +++++++--- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/swift3/Models.mustache b/modules/swagger-codegen/src/main/resources/swift3/Models.mustache index 087559d1e6f..769c02db776 100644 --- a/modules/swagger-codegen/src/main/resources/swift3/Models.mustache +++ b/modules/swagger-codegen/src/main/resources/swift3/Models.mustache @@ -179,7 +179,7 @@ class Decoders { let sourceDictionary = source as! [AnyHashable: Any] {{#discriminator}} // Check discriminator to support inheritance - if let discriminator = sourceDictionary["{{discriminator}}"] as? String, discriminator != "{{classname}}"{ + if let discriminator = sourceDictionary["{{discriminator}}"] as? String, instance == nil && discriminator != "{{classname}}" { return Decoders.decode(clazz: {{classname}}.self, discriminator: discriminator, source: source) } {{/discriminator}} @@ -197,7 +197,9 @@ class Decoders { {{^unwrapRequired}} let result = instance == nil ? {{classname}}() : instance as! {{classname}} {{#parent}} - _ = Decoders.decode(clazz: {{parent}}.self, source: source, instance: result) + if decoders["\({{parent}}.self)"] != nil { + _ = Decoders.decode(clazz: {{parent}}.self, source: source, instance: result) + } {{/parent}} {{#allVars}}{{#isEnum}} if let {{name}} = sourceDictionary["{{baseName}}"] as? {{datatype}} { {{^isContainer}} diff --git a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/Models.swift b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/Models.swift index d2d50717ba6..dbf9aadf8f2 100644 --- a/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/Models.swift +++ b/samples/client/petstore/swift3/default/PetstoreClient/Classes/Swaggers/Models.swift @@ -173,7 +173,7 @@ class Decoders { Decoders.addDecoder(clazz: Animal.self) { (source: AnyObject, instance: AnyObject?) -> Animal in let sourceDictionary = source as! [AnyHashable: Any] // Check discriminator to support inheritance - if let discriminator = sourceDictionary["className"] as? String, discriminator != "Animal"{ + if let discriminator = sourceDictionary["className"] as? String, instance == nil && discriminator != "Animal" { return Decoders.decode(clazz: Animal.self, discriminator: discriminator, source: source) } @@ -289,7 +289,9 @@ class Decoders { let sourceDictionary = source as! [AnyHashable: Any] let result = instance == nil ? Cat() : instance as! Cat - _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + if decoders["\(Animal.self)"] != nil { + _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + } result.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?) result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] as AnyObject?) @@ -353,7 +355,9 @@ class Decoders { let sourceDictionary = source as! [AnyHashable: Any] let result = instance == nil ? Dog() : instance as! Dog - _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + if decoders["\(Animal.self)"] != nil { + _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + } result.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?) result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] as AnyObject?) diff --git a/samples/client/petstore/swift3/promisekit/PetstoreClient/Classes/Swaggers/Models.swift b/samples/client/petstore/swift3/promisekit/PetstoreClient/Classes/Swaggers/Models.swift index d2d50717ba6..dbf9aadf8f2 100644 --- a/samples/client/petstore/swift3/promisekit/PetstoreClient/Classes/Swaggers/Models.swift +++ b/samples/client/petstore/swift3/promisekit/PetstoreClient/Classes/Swaggers/Models.swift @@ -173,7 +173,7 @@ class Decoders { Decoders.addDecoder(clazz: Animal.self) { (source: AnyObject, instance: AnyObject?) -> Animal in let sourceDictionary = source as! [AnyHashable: Any] // Check discriminator to support inheritance - if let discriminator = sourceDictionary["className"] as? String, discriminator != "Animal"{ + if let discriminator = sourceDictionary["className"] as? String, instance == nil && discriminator != "Animal" { return Decoders.decode(clazz: Animal.self, discriminator: discriminator, source: source) } @@ -289,7 +289,9 @@ class Decoders { let sourceDictionary = source as! [AnyHashable: Any] let result = instance == nil ? Cat() : instance as! Cat - _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + if decoders["\(Animal.self)"] != nil { + _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + } result.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?) result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] as AnyObject?) @@ -353,7 +355,9 @@ class Decoders { let sourceDictionary = source as! [AnyHashable: Any] let result = instance == nil ? Dog() : instance as! Dog - _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + if decoders["\(Animal.self)"] != nil { + _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + } result.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?) result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] as AnyObject?) diff --git a/samples/client/petstore/swift3/rxswift/PetstoreClient/Classes/Swaggers/Models.swift b/samples/client/petstore/swift3/rxswift/PetstoreClient/Classes/Swaggers/Models.swift index d2d50717ba6..dbf9aadf8f2 100644 --- a/samples/client/petstore/swift3/rxswift/PetstoreClient/Classes/Swaggers/Models.swift +++ b/samples/client/petstore/swift3/rxswift/PetstoreClient/Classes/Swaggers/Models.swift @@ -173,7 +173,7 @@ class Decoders { Decoders.addDecoder(clazz: Animal.self) { (source: AnyObject, instance: AnyObject?) -> Animal in let sourceDictionary = source as! [AnyHashable: Any] // Check discriminator to support inheritance - if let discriminator = sourceDictionary["className"] as? String, discriminator != "Animal"{ + if let discriminator = sourceDictionary["className"] as? String, instance == nil && discriminator != "Animal" { return Decoders.decode(clazz: Animal.self, discriminator: discriminator, source: source) } @@ -289,7 +289,9 @@ class Decoders { let sourceDictionary = source as! [AnyHashable: Any] let result = instance == nil ? Cat() : instance as! Cat - _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + if decoders["\(Animal.self)"] != nil { + _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + } result.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?) result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] as AnyObject?) @@ -353,7 +355,9 @@ class Decoders { let sourceDictionary = source as! [AnyHashable: Any] let result = instance == nil ? Dog() : instance as! Dog - _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + if decoders["\(Animal.self)"] != nil { + _ = Decoders.decode(clazz: Animal.self, source: source, instance: result) + } result.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?) result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] as AnyObject?)