summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorDominik Picheta <dominikpicheta@gmail.com>2017-11-29 15:56:46 +0000
committerDominik Picheta <dominikpicheta@googlemail.com>2017-11-30 21:34:30 +0000
commitd3c9b58c005e7cd537cbdf3dfd3f69e72fa40722 (patch)
tree3595a91ef8fc1d2cd0846b71e2063f4fe7d0bbee /lib
parente0681715dc9c54135937f54510015f66d384aa29 (diff)
downloadNim-d3c9b58c005e7cd537cbdf3dfd3f69e72fa40722.tar.gz
Fixes #6604. Rejects unnamed tuples with error.
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/json.nim15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index b9f49f0bd..90cf7b8c9 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -1701,6 +1701,10 @@ proc createConstructor(typeSym, jsonNode: NimNode): NimNode =
       result = processType(typeSym, obj, jsonNode, false)
   of nnkTupleTy:
     result = processType(typeSym, typeSym, jsonNode, false)
+  of nnkPar:
+    # TODO: The fact that `jsonNode` here works to give a good line number
+    # is weird. Specifying typeSym should work but doesn't.
+    error("Use a named tuple instead of: " & $toStrLit(typeSym), jsonNode)
   else:
     doAssert false, "Unable to create constructor for: " & $typeSym.kind
 
@@ -1828,9 +1832,16 @@ macro to*(node: JsonNode, T: typedesc): untyped =
   expectKind(typeNode, nnkBracketExpr)
   doAssert(($typeNode[0]).normalize == "typedesc")
 
-  result = createConstructor(typeNode[1], node)
+  # Create `temp` variable to store the result in case the user calls this
+  # on `parseJson` (see bug #6604).
+  result = newNimNode(nnkStmtListExpr)
+  let temp = genSym(nskLet, "temp")
+  result.add quote do:
+    let `temp` = `node`
+
+  let constructor = createConstructor(typeNode[1], temp)
   # TODO: Rename postProcessValue and move it (?)
-  result = postProcessValue(result)
+  result.add(postProcessValue(constructor))
 
   # echo(treeRepr(result))
   # echo(toStrLit(result))