diff options
author | Miran <narimiran@users.noreply.github.com> | 2018-10-14 17:08:42 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-10-14 17:08:42 +0200 |
commit | a30ba8cc370736b8b737292a8c2b46adadc6f8be (patch) | |
tree | ccded85b9aec0f61daa8f39b8d8cc8e344e9388d /tests/macros/tvarious.nim | |
parent | 8955470644972e2d1f2b029650c04505ebacca23 (diff) | |
download | Nim-a30ba8cc370736b8b737292a8c2b46adadc6f8be.tar.gz |
merge macros tests (#9367)
Diffstat (limited to 'tests/macros/tvarious.nim')
-rw-r--r-- | tests/macros/tvarious.nim | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/tests/macros/tvarious.nim b/tests/macros/tvarious.nim new file mode 100644 index 000000000..15bd28a37 --- /dev/null +++ b/tests/macros/tvarious.nim @@ -0,0 +1,111 @@ +discard """ + msg: ''' +range[0 .. 100] +array[0 .. 100, int] +10 +test +''' + + output: ''' +x = 10 +x + y = 30 +proc foo[T, N: static[int]]() +proc foo[T; N: static[int]]() +a[0]: 42 +a[1]: 45 +x: some string +''' +""" + + +import macros, sugar + + +block tdump: + let + x = 10 + y = 20 + dump x + dump(x + y) + + +block texprcolonexpr: + macro def(x): untyped = + echo treeRepr(x) + + def name(a, b:cint) => nil + + + +block tgenericparams: + macro test():string = + let expr0 = "proc foo[T, N: static[int]]()" + let expr1 = "proc foo[T; N: static[int]]()" + + $toStrLit(parseExpr(expr0)) & "\n" & $toStrLit(parseExpr(expr1)) + + echo test() + + + +block tidgen: + # Test compile-time state in same module + var gid {.compileTime.} = 3 + + macro genId(): int = + result = newIntLitNode(gid) + inc gid + + proc Id1(): int {.compileTime.} = return genId() + proc Id2(): int {.compileTime.} = return genId() + + doAssert Id1() == 3 + doAssert Id2() == 4 + + + +block tlexerex: + macro match(s: cstring|string; pos: int; sections: varargs[untyped]): untyped = + for sec in sections: + expectKind sec, nnkOfBranch + expectLen sec, 2 + result = newStmtList() + + var input = "the input" + var pos = 0 + match input, pos: + of r"[a-zA-Z_]\w+": echo "an identifier" + of r"\d+": echo "an integer" + of r".": echo "something else" + + + +block tlineinfo: + # issue #5617, feature request + type Test = object + + macro mixer(n: typed): untyped = + let x = newIdentNode("echo") + x.copyLineInfo(n) + result = newLit(x.lineInfo == n.lineInfo) + + var z = mixer(Test) + doAssert z + + + +block tdebugstmt: + macro debug(n: varargs[untyped]): untyped = + result = newNimNode(nnkStmtList, n) + for i in 0..n.len-1: + add(result, newCall("write", newIdentNode("stdout"), toStrLit(n[i]))) + add(result, newCall("write", newIdentNode("stdout"), newStrLitNode(": "))) + add(result, newCall("writeLine", newIdentNode("stdout"), n[i])) + + var + a: array[0..10, int] + x = "some string" + a[0] = 42 + a[1] = 45 + + debug(a[0], a[1], x) |