summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--doc/idetools.txt20
-rw-r--r--tests/caas/idetools_api.nim30
-rw-r--r--tests/caas/idetools_api.txt4
3 files changed, 53 insertions, 1 deletions
diff --git a/doc/idetools.txt b/doc/idetools.txt
index 4d2315a0c..fdc4ebde6 100644
--- a/doc/idetools.txt
+++ b/doc/idetools.txt
@@ -326,6 +326,26 @@ skLet
         col 7: ""
 
 
+skMacro
+-------
+
+The fourth column will be the empty string if the macro is being
+defined, since at that point in the file the parser hasn't processed
+the full line yet. The signature will be returned complete in
+posterior instances of the macro.
+
+| **Third column**: module + [n scope nesting] + macro name.
+| **Fourth column**: signature of the macro including return type.
+| **Docstring**: docstring if available.
+
+.. code-block:: nimrod
+    proc testMacro() =
+      expect(EArithmetic):
+    --> col 2: idetools_api.expect
+        col 3: proc (varargs[expr], stmt): stmt
+        col 7: ""
+
+
 skMethod
 --------
 
diff --git a/tests/caas/idetools_api.nim b/tests/caas/idetools_api.nim
index 351ec0583..7d27ffdf8 100644
--- a/tests/caas/idetools_api.nim
+++ b/tests/caas/idetools_api.nim
@@ -1,4 +1,4 @@
-import unicode, sequtils
+import unicode, sequtils, macros
 
 proc test_enums() =
   var o: Tfile
@@ -53,3 +53,31 @@ proc findVowelPosition(text: string) =
   echo found
 
 findVowelPosition("Zerg") # should output 1, position of vowel.
+
+macro expect*(exceptions: varargs[expr], body: stmt): stmt {.immediate.} =
+  ## Expect docstrings
+  let exp = callsite()
+  template expectBody(errorTypes, lineInfoLit: expr,
+                      body: stmt): PNimrodNode {.dirty.} =
+    try:
+      body
+      assert false
+    except errorTypes:
+      nil
+
+  var body = exp[exp.len - 1]
+
+  var errorTypes = newNimNode(nnkBracket)
+  for i in countup(1, exp.len - 2):
+    errorTypes.add(exp[i])
+
+  result = getAst(expectBody(errorTypes, exp.lineinfo, body))
+
+proc err =
+  raise newException(EArithmetic, "some exception")
+
+proc testMacro() =
+  expect(EArithmetic):
+    err()
+
+testMacro()
diff --git a/tests/caas/idetools_api.txt b/tests/caas/idetools_api.txt
index f4a2ee69e..3a350f60b 100644
--- a/tests/caas/idetools_api.txt
+++ b/tests/caas/idetools_api.txt
@@ -48,3 +48,7 @@ def\tskLabel\t$MODULE.findVowelPosition.loops\t\t
 # For some reason the use of the label with break displaces its position.
 > idetools --track:$TESTNIM,52,16 --def $SILENT
 def\tskLabel\t$MODULE.findVowelPosition.loops\t\t
+
+# Displaced macro usage by one character.
+> idetools --track:$TESTNIM,80,2 --def $SILENT
+def\tskMacro\t$MODULE.expect\tproc \(varargs\[expr\], stmt\): stmt\t