Fix JSON macro bug with ref objects.
This commit is contained in:
parent
afb7542d20
commit
2108dcf0d5
2 changed files with 34 additions and 4 deletions
|
|
@ -1608,7 +1608,11 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
|
||||||
result = processType(typeSym, obj, jsonNode)
|
result = processType(typeSym, obj, jsonNode)
|
||||||
of nnkSym:
|
of nnkSym:
|
||||||
let obj = getType(typeSym)
|
let obj = getType(typeSym)
|
||||||
result = processType(typeSym, obj, jsonNode)
|
if obj.kind == nnkBracketExpr:
|
||||||
|
# When `Sym "Foo"` turns out to be a `ref object`.
|
||||||
|
result = createConstructor(obj, jsonNode)
|
||||||
|
else:
|
||||||
|
result = processType(typeSym, obj, jsonNode)
|
||||||
else:
|
else:
|
||||||
doAssert false, "Unable to create constructor for: " & $typeSym.kind
|
doAssert false, "Unable to create constructor for: " & $typeSym.kind
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -159,11 +159,11 @@ when isMainModule:
|
||||||
name: string
|
name: string
|
||||||
age: int
|
age: int
|
||||||
|
|
||||||
Data = object
|
Data1 = object # TODO: Codegen bug when changed to ``Data``.
|
||||||
person: Person
|
person: Person
|
||||||
list: seq[int]
|
list: seq[int]
|
||||||
|
|
||||||
var data = to(jsonNode, Data)
|
var data = to(jsonNode, Data1)
|
||||||
doAssert data.person.name == "Nimmer"
|
doAssert data.person.name == "Nimmer"
|
||||||
doAssert data.person.age == 21
|
doAssert data.person.age == 21
|
||||||
doAssert data.list == @[1, 2, 3, 4]
|
doAssert data.list == @[1, 2, 3, 4]
|
||||||
|
|
@ -182,4 +182,30 @@ when isMainModule:
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = to(node, TestEnum)
|
var result = to(node, TestEnum)
|
||||||
doAssert result.field == Bar
|
doAssert result.field == Bar
|
||||||
|
|
||||||
|
# Test ref type in field.
|
||||||
|
block:
|
||||||
|
let jsonNode = parseJson("""
|
||||||
|
{
|
||||||
|
"person": {
|
||||||
|
"name": "Nimmer",
|
||||||
|
"age": 21
|
||||||
|
},
|
||||||
|
"list": [1, 2, 3, 4]
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
type
|
||||||
|
Person = ref object
|
||||||
|
name: string
|
||||||
|
age: int
|
||||||
|
|
||||||
|
Data = object
|
||||||
|
person: Person
|
||||||
|
list: seq[int]
|
||||||
|
|
||||||
|
var data = to(jsonNode, Data)
|
||||||
|
doAssert data.person.name == "Nimmer"
|
||||||
|
doAssert data.person.age == 21
|
||||||
|
doAssert data.list == @[1, 2, 3, 4]
|
||||||
Loading…
Add table
Add a link
Reference in a new issue