diff options
-rw-r--r-- | doc/idetools.txt | 20 | ||||
-rw-r--r-- | tests/caas/idetools_api.nim | 30 | ||||
-rw-r--r-- | tests/caas/idetools_api.txt | 4 |
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 |