diff options
Diffstat (limited to 'tests/macros')
-rw-r--r-- | tests/macros/t7723.nim | 19 | ||||
-rw-r--r-- | tests/macros/t8706.nim | 21 | ||||
-rw-r--r-- | tests/macros/t9194.nim | 20 | ||||
-rw-r--r-- | tests/macros/tbugs.nim | 106 | ||||
-rw-r--r-- | tests/macros/tdebugstmt.nim | 29 | ||||
-rw-r--r-- | tests/macros/tdump.nim | 13 | ||||
-rw-r--r-- | tests/macros/texprcolonexpr.nim | 19 | ||||
-rw-r--r-- | tests/macros/tgenericparams.nim | 13 | ||||
-rw-r--r-- | tests/macros/tgentemplates.nim | 35 | ||||
-rw-r--r-- | tests/macros/tidgen.nim | 19 | ||||
-rw-r--r-- | tests/macros/tissues.nim | 241 | ||||
-rw-r--r-- | tests/macros/tlexerex.nim | 15 | ||||
-rw-r--r-- | tests/macros/tlineinfo.nim | 14 | ||||
-rw-r--r-- | tests/macros/tmacro_in_template.nim | 10 | ||||
-rw-r--r-- | tests/macros/tvarious.nim | 111 | ||||
-rw-r--r-- | tests/macros/tvarnimnode.nim | 19 | ||||
-rw-r--r-- | tests/macros/typesapi.nim | 21 |
17 files changed, 352 insertions, 373 deletions
diff --git a/tests/macros/t7723.nim b/tests/macros/t7723.nim deleted file mode 100644 index e1d0a8a8d..000000000 --- a/tests/macros/t7723.nim +++ /dev/null @@ -1,19 +0,0 @@ -discard """ - msg: ''' -proc init(foo128049: int; bar128051: typedesc[int]): int = - foo128049 -''' -""" - -import macros - -macro foo1(): untyped = - result = newStmtList() - result.add quote do: - proc init(foo: int, bar: typedesc[int]): int = - foo - -expandMacros: - foo1() - -doAssert init(1, int) == 1 diff --git a/tests/macros/t8706.nim b/tests/macros/t8706.nim deleted file mode 100644 index b8640a80d..000000000 --- a/tests/macros/t8706.nim +++ /dev/null @@ -1,21 +0,0 @@ -discard """ - output: '''0 -0 -''' -""" - -import macros - -macro varargsLen(args:varargs[untyped]): untyped = - doAssert args.kind == nnkArglist - doAssert args.len == 0 - result = newLit(args.len) - -template bar(a0:varargs[untyped]): untyped = - varargsLen(a0) - -template foo(x: int, a0:varargs[untyped]): untyped = - bar(a0) - -echo foo(42) -echo bar() diff --git a/tests/macros/t9194.nim b/tests/macros/t9194.nim deleted file mode 100644 index ef58750aa..000000000 --- a/tests/macros/t9194.nim +++ /dev/null @@ -1,20 +0,0 @@ -discard """ - output: ''' -range[0 .. 100] -array[0 .. 100, int] -''' -""" - -import macros - -type - Foo1 = range[0 .. 100] - Foo2 = array[0 .. 100, int] - -macro get(T: typedesc): untyped = - # Get the X out of typedesc[X] - let tmp = getTypeImpl(T) - result = newStrLitNode(getTypeImpl(tmp[1]).repr) - -echo Foo1.get -echo Foo2.get diff --git a/tests/macros/tbugs.nim b/tests/macros/tbugs.nim deleted file mode 100644 index 990edf1e2..000000000 --- a/tests/macros/tbugs.nim +++ /dev/null @@ -1,106 +0,0 @@ -discard """ -msg: '''a -s -d -f -TTaa -TTaa -TTaa -TTaa -true -true -nil -42 -false -true''' - -output: '''test -2''' -""" - -type - Foo = object - s: char - -iterator test2(f: string): Foo = - for i in f: - yield Foo(s: i) - -macro test(): untyped = - for i in test2("asdf"): - echo i.s - -test() - - -# bug 1297 - -import macros - -type TType = tuple[s: string] - -macro echotest(): untyped = - var t: TType - t.s = "" - t.s.add("test") - result = newCall(newIdentNode("echo"), newStrLitNode(t.s)) - -echotest() - -# bug #1103 - -type - Td = tuple - a:string - b:int - -proc get_data(d: Td) : string {.compileTime.} = - result = d.a # Works if a literal string is used here. - # Bugs if line A or B is active. Works with C - result &= "aa" # A - #result.add("aa") # B - #result = result & "aa" # C - -macro m(s:static[Td]) : untyped = - echo get_data(s) - echo get_data(s) - result = newEmptyNode() - -const s=("TT", 3) -m(s) -m(s) - -# bug #933 - -proc nilcheck(): NimNode {.compileTime.} = - echo(result == nil) # true - echo(result.isNil) # true - echo(repr(result)) # nil - -macro testnilcheck(): untyped = - result = newNimNode(nnkStmtList) - discard nilcheck() - -testnilcheck() - -# bug #1323 - -proc calc(): array[1, int] = - result[0].inc() - result[0].inc() - -const c = calc() -echo c[0] - - -# bug #3046 - -macro sampleMacroInt(i: int): untyped = - echo i.intVal - -macro sampleMacroBool(b: bool): untyped = - echo b.boolVal - -sampleMacroInt(42) -sampleMacroBool(false) -sampleMacroBool(system.true) diff --git a/tests/macros/tdebugstmt.nim b/tests/macros/tdebugstmt.nim deleted file mode 100644 index 69e610075..000000000 --- a/tests/macros/tdebugstmt.nim +++ /dev/null @@ -1,29 +0,0 @@ -discard """ - output: '''a[0]: 42 -a[1]: 45 -x: some string''' -""" - -import macros - -macro debug(n: varargs[untyped]): untyped = - # `n` is a Nim AST that contains the whole macro invocation - # this macro returns a list of statements: - result = newNimNode(nnkStmtList, n) - # iterate over any argument that is passed to this macro: - for i in 0..n.len-1: - # add a call to the statement list that writes the expression; - # `toStrLit` converts an AST to its string representation: - add(result, newCall("write", newIdentNode("stdout"), toStrLit(n[i]))) - # add a call to the statement list that writes ": " - add(result, newCall("write", newIdentNode("stdout"), newStrLitNode(": "))) - # add a call to the statement list that writes the expressions value: - 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) diff --git a/tests/macros/tdump.nim b/tests/macros/tdump.nim deleted file mode 100644 index e4c14dc6b..000000000 --- a/tests/macros/tdump.nim +++ /dev/null @@ -1,13 +0,0 @@ -discard """ - output: '''x = 10 -x + y = 30 -''' -""" - -import future - -let - x = 10 - y = 20 -dump x -dump(x + y) \ No newline at end of file diff --git a/tests/macros/texprcolonexpr.nim b/tests/macros/texprcolonexpr.nim deleted file mode 100644 index 59c799771..000000000 --- a/tests/macros/texprcolonexpr.nim +++ /dev/null @@ -1,19 +0,0 @@ -discard """ - msg: ''' -Infix - Ident !"=>" - Call - Ident !"name" - Ident !"a" - ExprColonExpr - Ident !"b" - Ident !"cint" - NilLit nil -''' -""" -import macros - -macro def(x): untyped = - echo treeRepr(x) - -def name(a, b:cint) => nil diff --git a/tests/macros/tgenericparams.nim b/tests/macros/tgenericparams.nim deleted file mode 100644 index d656f045a..000000000 --- a/tests/macros/tgenericparams.nim +++ /dev/null @@ -1,13 +0,0 @@ -discard """ -output: '''proc foo[T, N: static[int]]() -proc foo[T; N: static[int]]()''' -""" -import macros - -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() diff --git a/tests/macros/tgentemplates.nim b/tests/macros/tgentemplates.nim deleted file mode 100644 index 301d58c6a..000000000 --- a/tests/macros/tgentemplates.nim +++ /dev/null @@ -1,35 +0,0 @@ -# bug #1140 - -import parseutils, macros - -proc parse_until_symbol(node: NimNode, value: string, index: var int): bool {.compiletime.} = - var splitValue: string - var read = value.parseUntil(splitValue, '$', index) - - # when false: - if false: - var identifier: string - read = value.parseWhile(identifier, {}, index) - node.add newCall("add", ident("result"), newCall("$", ident(identifier))) - - if splitValue.len > 0: - node.insert node.len, newCall("add", ident("result"), newStrLitNode(splitValue)) - -proc parse_template(node: NimNode, value: string) {.compiletime.} = - var index = 0 - while index < value.len and - parse_until_symbol(node, value, index): discard - -macro tmpli*(body: untyped): typed = - result = newStmtList() - result.add parseExpr("result = \"\"") - result.parse_template body[1].strVal - - -proc actual: string = tmpli html""" - <p>Test!</p> - """ - -proc another: string = tmpli html""" - <p>what</p> - """ diff --git a/tests/macros/tidgen.nim b/tests/macros/tidgen.nim deleted file mode 100644 index 88322b227..000000000 --- a/tests/macros/tidgen.nim +++ /dev/null @@ -1,19 +0,0 @@ -discard """ - output: "3 4" -""" - -import macros - -# 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() - -echo Id1(), " ", Id2() - diff --git a/tests/macros/tissues.nim b/tests/macros/tissues.nim new file mode 100644 index 000000000..ecdcd5da9 --- /dev/null +++ b/tests/macros/tissues.nim @@ -0,0 +1,241 @@ +discard """ + msg: ''' +proc init(foo129050: int; bar129052: typedesc[int]): int = + foo129050 + +IntLit 5 +proc (x: int): string => typeDesc[proc[string, int]] +proc (x: int): void => typeDesc[proc[void, int]] +proc (x: int) => typeDesc[proc[void, int]] +x => uncheckedArray[int] +a +s +d +f +TTaa +TTaa +TTaa +TTaa +true +true +nil +42 +false +true +''' + + output: ''' +range[0 .. 100] +array[0 .. 100, int] +10 +test +''' +""" + + +import macros, parseutils + + +block t7723: + macro foo1(): untyped = + result = newStmtList() + result.add quote do: + proc init(foo: int, bar: typedesc[int]): int = + foo + + expandMacros: + foo1() + + doAssert init(1, int) == 1 + + + +block t8706: + macro varargsLen(args:varargs[untyped]): untyped = + doAssert args.kind == nnkArglist + doAssert args.len == 0 + result = newLit(args.len) + + template bar(a0:varargs[untyped]): untyped = + varargsLen(a0) + + template foo(x: int, a0:varargs[untyped]): untyped = + bar(a0) + + doAssert foo(42) == 0 + doAssert bar() == 0 + + + +block t9194: + type + Foo1 = range[0 .. 100] + Foo2 = array[0 .. 100, int] + + macro get(T: typedesc): untyped = + # Get the X out of typedesc[X] + let tmp = getTypeImpl(T) + result = newStrLitNode(getTypeImpl(tmp[1]).repr) + + echo Foo1.get + echo Foo2.get + + + +block t1944: + template t(e: untyped): untyped = + macro m(eNode: untyped): untyped = + echo eNode.treeRepr + m e + + t 5 + + +block t926: + proc test(f: var NimNode) {.compileTime.} = + f = newNimNode(nnkStmtList) + f.add newCall(newIdentNode("echo"), newLit(10)) + + macro blah(prc: untyped): untyped = + result = prc + test(result) + + proc test() {.blah.} = + echo 5 + + + +block t2211: + macro showType(t:typed): untyped = + let ty = t.getType + echo t.repr, " => ", ty.repr + + showType(proc(x:int): string) + showType(proc(x:int): void) + showType(proc(x:int)) + + var x: UncheckedArray[int] + showType(x) + + + +block t1140: + proc parse_until_symbol(node: NimNode, value: string, index: var int): bool {.compiletime.} = + var splitValue: string + var read = value.parseUntil(splitValue, '$', index) + + # when false: + if false: + var identifier: string + read = value.parseWhile(identifier, {}, index) + node.add newCall("add", ident("result"), newCall("$", ident(identifier))) + + if splitValue.len > 0: + node.insert node.len, newCall("add", ident("result"), newStrLitNode(splitValue)) + + proc parse_template(node: NimNode, value: string) {.compiletime.} = + var index = 0 + while index < value.len and + parse_until_symbol(node, value, index): discard + + macro tmpli(body: untyped): typed = + result = newStmtList() + result.add parseExpr("result = \"\"") + result.parse_template body[1].strVal + + + proc actual: string = tmpli html""" + <p>Test!</p> + """ + + proc another: string = tmpli html""" + <p>what</p> + """ + + + +block tbugs: + type + Foo = object + s: char + + iterator test2(f: string): Foo = + for i in f: + yield Foo(s: i) + + macro test(): untyped = + for i in test2("asdf"): + echo i.s + + test() + + + # bug 1297 + + type TType = tuple[s: string] + + macro echotest(): untyped = + var t: TType + t.s = "" + t.s.add("test") + result = newCall(newIdentNode("echo"), newStrLitNode(t.s)) + + echotest() + + # bug #1103 + + type + Td = tuple + a:string + b:int + + proc get_data(d: Td) : string {.compileTime.} = + result = d.a # Works if a literal string is used here. + # Bugs if line A or B is active. Works with C + result &= "aa" # A + #result.add("aa") # B + #result = result & "aa" # C + + macro m(s:static[Td]) : untyped = + echo get_data(s) + echo get_data(s) + result = newEmptyNode() + + const s = ("TT", 3) + m(s) + m(s) + + # bug #933 + + proc nilcheck(): NimNode {.compileTime.} = + echo(result == nil) # true + echo(result.isNil) # true + echo(repr(result)) # nil + + macro testnilcheck(): untyped = + result = newNimNode(nnkStmtList) + discard nilcheck() + + testnilcheck() + + # bug #1323 + + proc calc(): array[1, int] = + result[0].inc() + result[0].inc() + + const c = calc() + doAssert c[0] == 2 + + + # bug #3046 + + macro sampleMacroInt(i: int): untyped = + echo i.intVal + + macro sampleMacroBool(b: bool): untyped = + echo b.boolVal + + sampleMacroInt(42) + sampleMacroBool(false) + sampleMacroBool(system.true) diff --git a/tests/macros/tlexerex.nim b/tests/macros/tlexerex.nim deleted file mode 100644 index db2c38ef6..000000000 --- a/tests/macros/tlexerex.nim +++ /dev/null @@ -1,15 +0,0 @@ -import macros - -macro match*(s: cstring|string; pos: int; sections: varargs[untyped]): untyped = - for sec in sections: - expectKind sec, nnkOfBranch - expectLen sec, 2 - result = newStmtList() - -when isMainModule: - 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" diff --git a/tests/macros/tlineinfo.nim b/tests/macros/tlineinfo.nim deleted file mode 100644 index 2ab0e1ee8..000000000 --- a/tests/macros/tlineinfo.nim +++ /dev/null @@ -1,14 +0,0 @@ -# issue #5617, feature request -# Ability to set a NimNode's lineinfo -import macros - -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 diff --git a/tests/macros/tmacro_in_template.nim b/tests/macros/tmacro_in_template.nim deleted file mode 100644 index 9668495df..000000000 --- a/tests/macros/tmacro_in_template.nim +++ /dev/null @@ -1,10 +0,0 @@ - -# bug #1944 -import macros - -template t(e: untyped): untyped = - macro m(eNode: untyped): untyped = - echo eNode.treeRepr - m e - -t 5 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) diff --git a/tests/macros/tvarnimnode.nim b/tests/macros/tvarnimnode.nim deleted file mode 100644 index 26c9b1f1a..000000000 --- a/tests/macros/tvarnimnode.nim +++ /dev/null @@ -1,19 +0,0 @@ -discard """ - output: 10 -""" - -#bug #926 - -import macros - -proc test(f: var NimNode) {.compileTime.} = - f = newNimNode(nnkStmtList) - f.add newCall(newIdentNode("echo"), newLit(10)) - -macro blah(prc: untyped): untyped = - result = prc - - test(result) - -proc test() {.blah.} = - echo 5 diff --git a/tests/macros/typesapi.nim b/tests/macros/typesapi.nim deleted file mode 100644 index 04b8f0ae5..000000000 --- a/tests/macros/typesapi.nim +++ /dev/null @@ -1,21 +0,0 @@ -discard """ - nimout: '''proc (x: int): string => typeDesc[proc[string, int]] -proc (x: int): void => typeDesc[proc[void, int]] -proc (x: int) => typeDesc[proc[void, int]]''' -x => uncheckedArray[int] -""" - -#2211 - -import macros - -macro showType(t:typed): untyped = - let ty = t.getType - echo t.repr, " => ", ty.repr - -showType(proc(x:int): string) -showType(proc(x:int): void) -showType(proc(x:int)) - -var x: UncheckedArray[int] -showType(x) |