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.nim58
1 files changed, 58 insertions, 0 deletions
diff --git a/tests/template/ttempl3.nim b/tests/template/ttempl3.nim
new file mode 100644
index 000000000..59be24624
--- /dev/null
+++ b/tests/template/ttempl3.nim
@@ -0,0 +1,58 @@
+
+template withOpenFile(f: expr, filename: string, mode: TFileMode,
+                      actions: stmt): stmt {.immediate.} =
+  block:
+    # test that 'f' is implicitly 'injecting':
+    var f: TFile
+    if open(f, filename, mode):
+      try:
+        actions
+      finally:
+        close(f)
+    else:
+      quit("cannot open for writing: " & filename)
+    
+withOpenFile(txt, "ttempl3.txt", fmWrite):
+  writeln(txt, "line 1")
+  txt.writeln("line 2")
+  
+var
+  myVar: array[0..1, int]
+
+# Test zero argument template: 
+template ha: expr = myVar[0]
+  
+ha = 1  
+echo(ha)
+
+
+# Test identifier generation:
+template prefix(name: expr): expr {.immediate.} = `"hu" name`
+
+var `hu "XYZ"` = "yay"
+
+echo prefix(XYZ)
+
+template typedef(name: expr, typ: typeDesc) {.immediate, 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: expr): expr = `init typ`(arg)
+
+var ff = Foo.create(12)
+
+echo ff.arg