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] let sourceDictionary = source as! [AnyHashable: Any]
{{#discriminator}} {{#discriminator}}
// Check discriminator to support inheritance // 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) return Decoders.decode(clazz: {{classname}}.self, discriminator: discriminator, source: source)
} }
{{/discriminator}} {{/discriminator}}
@ -197,7 +197,9 @@ class Decoders {
{{^unwrapRequired}} {{^unwrapRequired}}
let result = instance == nil ? {{classname}}() : instance as! {{classname}} let result = instance == nil ? {{classname}}() : instance as! {{classname}}
{{#parent}} {{#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}} {{/parent}}
{{#allVars}}{{#isEnum}} {{#allVars}}{{#isEnum}}
if let {{name}} = sourceDictionary["{{baseName}}"] as? {{datatype}} { {{^isContainer}} 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 Decoders.addDecoder(clazz: Animal.self) { (source: AnyObject, instance: AnyObject?) -> Animal in
let sourceDictionary = source as! [AnyHashable: Any] let sourceDictionary = source as! [AnyHashable: Any]
// Check discriminator to support inheritance // 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) return Decoders.decode(clazz: Animal.self, discriminator: discriminator, source: source)
} }
@ -289,7 +289,9 @@ class Decoders {
let sourceDictionary = source as! [AnyHashable: Any] let sourceDictionary = source as! [AnyHashable: Any]
let result = instance == nil ? Cat() : instance as! Cat 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.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?)
result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] 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 sourceDictionary = source as! [AnyHashable: Any]
let result = instance == nil ? Dog() : instance as! Dog 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.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?)
result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] 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 Decoders.addDecoder(clazz: Animal.self) { (source: AnyObject, instance: AnyObject?) -> Animal in
let sourceDictionary = source as! [AnyHashable: Any] let sourceDictionary = source as! [AnyHashable: Any]
// Check discriminator to support inheritance // 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) return Decoders.decode(clazz: Animal.self, discriminator: discriminator, source: source)
} }
@ -289,7 +289,9 @@ class Decoders {
let sourceDictionary = source as! [AnyHashable: Any] let sourceDictionary = source as! [AnyHashable: Any]
let result = instance == nil ? Cat() : instance as! Cat 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.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?)
result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] 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 sourceDictionary = source as! [AnyHashable: Any]
let result = instance == nil ? Dog() : instance as! Dog 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.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?)
result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] 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 Decoders.addDecoder(clazz: Animal.self) { (source: AnyObject, instance: AnyObject?) -> Animal in
let sourceDictionary = source as! [AnyHashable: Any] let sourceDictionary = source as! [AnyHashable: Any]
// Check discriminator to support inheritance // 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) return Decoders.decode(clazz: Animal.self, discriminator: discriminator, source: source)
} }
@ -289,7 +289,9 @@ class Decoders {
let sourceDictionary = source as! [AnyHashable: Any] let sourceDictionary = source as! [AnyHashable: Any]
let result = instance == nil ? Cat() : instance as! Cat 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.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?)
result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] 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 sourceDictionary = source as! [AnyHashable: Any]
let result = instance == nil ? Dog() : instance as! Dog 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.className = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["className"] as AnyObject?)
result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] as AnyObject?) result.color = Decoders.decodeOptional(clazz: String.self, source: sourceDictionary["color"] as AnyObject?)