summary refs log tree commit diff stats
path: root/tests/template/ttempl3.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/template/ttempl3.nim')
-rw-r--r--tests/template/ttempl3.nim83
1 files changed, 83 insertions, 0 deletions
diff --git a/tests/template/ttempl3.nim b/tests/template/ttempl3.nim
new file mode 100644
index 000000000..17421cd87
--- /dev/null
+++ b/tests/template/ttempl3.nim
@@ -0,0 +1,83 @@
+discard """
+action: compile
+"""
+
+
+template withOpenFile(f: untyped, filename: string, mode: FileMode,
+                      actions: untyped): untyped =
+  block:
+    # test that 'f' is implicitly 'injecting':
+    var f: File
+    if open(f, filename, mode):
+      try:
+        actions
+      finally:
+        close(f)
+    else:
+      quit("cannot open for writing: " & filename)
+
+withOpenFile(txt, "ttempl3.txt", fmWrite):
+  writeLine(txt, "line 1")
+  txt.writeLine("line 2")
+
+var
+  myVar: array[0..1, int]
+
+# Test zero argument template:
+template ha: untyped = myVar[0]
+
+ha = 1
+echo(ha)
+
+
+# Test identifier generation:
+template prefix(name): untyped = `"hu" name`
+
+var `hu "XYZ"` = "yay"
+
+echo prefix(XYZ)
+
+template typedef(name: untyped, typ: typeDesc) {.dirty.} =
+  type
+    `T name`* = typ
+    `P name`* = ref `T name`
+
+typedef(myint, int)
+var x: PMyInt
+
+
+# Test UFCS
+
+type
+  Foo = object
+    arg: int
+
+proc initFoo(arg: int): Foo =
+  result.arg = arg
+
+template create(typ: typeDesc, arg: untyped): untyped = `init typ`(arg)
+
+var ff = Foo.create(12)
+
+echo ff.arg
+
+
+import macros
+
+# bug #11494
+macro staticForEach(arr: untyped, body: untyped): untyped =
+  result = newNimNode(nnkStmtList)
+  arr.expectKind(nnkBracket)
+  for n in arr:
+    let b = copyNimTree(body)
+    result.add quote do:
+      block:
+        type it {.inject.} = `n`
+        `b`
+
+template forEveryMatchingEntity*() =
+  staticForEach([int, string, float]):
+    var a {.inject.}: it
+    echo a
+
+forEveryMatchingEntity()