Fix JSON macro bug with ref objects.

This commit is contained in:
Dominik Picheta
2017-04-17 17:59:49 +02:00
parent afb7542d20
commit 2108dcf0d5
2 changed files with 34 additions and 4 deletions

View File

@@ -1608,7 +1608,11 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
result = processType(typeSym, obj, jsonNode)
of nnkSym:
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:
doAssert false, "Unable to create constructor for: " & $typeSym.kind

View File

@@ -159,11 +159,11 @@ when isMainModule:
name: string
age: int
Data = object
Data1 = object # TODO: Codegen bug when changed to ``Data``.
person: Person
list: seq[int]
var data = to(jsonNode, Data)
var data = to(jsonNode, Data1)
doAssert data.person.name == "Nimmer"
doAssert data.person.age == 21
doAssert data.list == @[1, 2, 3, 4]
@@ -182,4 +182,30 @@ when isMainModule:
}
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]