summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2017-11-28 21:49:34 +0000
committerDominik Picheta <dominikpicheta@googlemail.com>2017-11-30 21:34:30 +0000
commit11fcae57052b3c886b4d2b593acb3ac0d717edd1 (patch)
tree6a50936e8f01d4df0ccddde08a698d882eb71594 /lib
parent216119212c256548a3e7557d5190fe61a7b9524a (diff)
downloadNim-11fcae57052b3c886b4d2b593acb3ac0d717edd1.tar.gz
Fixes #5856. Code based on @loloiccl's PR (#5879).
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/json.nim28
1 files changed, 23 insertions, 5 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index cea485c43..1b887a0c5 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -1524,6 +1524,27 @@ proc processObjField(field, jsonNode: NimNode): seq[NimNode] =
 
   doAssert result.len > 0
 
+proc processObjFields(obj: NimNode,
+                      jsonNode: NimNode): seq[NimNode] {.compileTime.} =
+  ## Process all the fields of an ``ObjectTy`` and any of its
+  ## parent type's fields (via inheritance).
+  result = @[]
+
+  expectKind(obj[2], nnkRecList)
+  for field in obj[2]:
+    let nodes = processObjField(field, jsonNode)
+    result.add(nodes)
+
+  # process parent type fields
+  case obj[1].kind
+  of nnkBracketExpr:
+    assert $obj[1][0] == "ref"
+    result.add(processObjFields(getType(obj[1][1]), jsonNode))
+  of nnkSym:
+    result.add(processObjFields(getType(obj[1]), jsonNode))
+  else:
+    discard
+
 proc processType(typeName: NimNode, obj: NimNode,
                  jsonNode: NimNode, isRef: bool): NimNode {.compileTime.} =
   ## Process a type such as ``Sym "float"`` or ``ObjectTy ...``.
@@ -1533,7 +1554,7 @@ proc processType(typeName: NimNode, obj: NimNode,
   ## .. code-block::plain
   ##     ObjectTy
   ##       Empty
-  ##       Empty
+  ##       InheritanceInformation
   ##       RecList
   ##         Sym "events"
   case obj.kind
@@ -1543,10 +1564,7 @@ proc processType(typeName: NimNode, obj: NimNode,
     result.add(typeName) # Name of the type to construct.
 
     # Process each object field and add it as an exprColonExpr
-    expectKind(obj[2], nnkRecList)
-    for field in obj[2]:
-      let nodes = processObjField(field, jsonNode)
-      result.add(nodes)
+    result.add(processObjFields(obj, jsonNode))
 
     # Object might be null. So we need to check for that.
     if isRef: