fix(swift3): fix infinite loop with inheritance and check if parent decoder exists before calling (#5416)

This commit is contained in:
Julien Fouilhé 2017-04-20 16:54:35 +02:00 committed by wing328
parent 6359c064f3
commit edb80df0ba
4 changed files with 25 additions and 11 deletions

View File

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

View File

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

View File

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

View File

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