diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2017-11-29 15:56:46 +0000 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2017-11-30 21:34:30 +0000 |
commit | d3c9b58c005e7cd537cbdf3dfd3f69e72fa40722 (patch) | |
tree | 3595a91ef8fc1d2cd0846b71e2063f4fe7d0bbee | |
parent | e0681715dc9c54135937f54510015f66d384aa29 (diff) | |
download | Nim-d3c9b58c005e7cd537cbdf3dfd3f69e72fa40722.tar.gz |
Fixes #6604. Rejects unnamed tuples with error.
-rw-r--r-- | lib/pure/json.nim | 15 | ||||
-rw-r--r-- | tests/stdlib/tjsonmacro.nim | 22 | ||||
-rw-r--r-- | tests/stdlib/tjsonmacro_reject.nim | 18 |
3 files changed, 52 insertions, 3 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)) diff --git a/tests/stdlib/tjsonmacro.nim b/tests/stdlib/tjsonmacro.nim index 388d4d534..af9633e9e 100644 --- a/tests/stdlib/tjsonmacro.nim +++ b/tests/stdlib/tjsonmacro.nim @@ -275,4 +275,24 @@ when isMainModule: let parsed = to(j, Thing) doAssert parsed.animal.fur doAssert parsed.animal.legs == 6 - doAssert parsed.color == Red \ No newline at end of file + doAssert parsed.color == Red + + block: + type + Car = object + engine: tuple[name: string, capacity: float] + model: string + + let j = """ + {"engine": {"name": "V8", "capacity": 5.5}, "model": "Skyline"} + """ + + var i = 0 + proc mulTest: JsonNode = + i.inc() + return parseJson(j) + + let parsed = mulTest().to(Car) + doAssert parsed.engine.name == "V8" + + doAssert i == 1 \ No newline at end of file diff --git a/tests/stdlib/tjsonmacro_reject.nim b/tests/stdlib/tjsonmacro_reject.nim new file mode 100644 index 000000000..00506449f --- /dev/null +++ b/tests/stdlib/tjsonmacro_reject.nim @@ -0,0 +1,18 @@ +discard """ + file: "tjsonmacro_reject.nim" + line: 11 + errormsg: "Use a named tuple instead of: (string, float)" +""" + +import json + +type + Car = object + engine: (string, float) + model: string + +let j = """ + {"engine": {"name": "V8", "capacity": 5.5}, model: "Skyline"} +""" +let parsed = parseJson(j) +echo(to(parsed, Car)) \ No newline at end of file |