diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2015-03-03 19:45:14 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2015-03-03 19:45:14 +0100 |
commit | 9731fb54201375760166aa47f5a8f99f2de77bca (patch) | |
tree | 157c5f8c96eb7f09dbdb7abbba8f41532b0c0870 | |
parent | b870744d5de2c5682e07add0bbce9d5584ea5892 (diff) | |
parent | 0553758ebd66ae7f10dca46f594d1503192ebaa6 (diff) | |
download | Nim-9731fb54201375760166aa47f5a8f99f2de77bca.tar.gz |
Merge pull request #2248 from chrisheller/devel
Make macros.nim expectKind error message with a single TNimrodNodeKind c...
-rw-r--r-- | lib/core/macros.nim | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/lib/core/macros.nim b/lib/core/macros.nim index 4758dc0c1..0888a8767 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -343,7 +343,7 @@ proc expectKind*(n: PNimrodNode, k: TNimrodNodeKind) {.compileTime.} = ## checks that `n` is of kind `k`. If this is not the case, ## compilation aborts with an error message. This is useful for writing ## macros that check the AST that is passed to them. - if n.kind != k: error("macro expects a node of kind: " & $k) + if n.kind != k: error("Expected a node of kind " & $k & ", got " & $n.kind) proc expectMinLen*(n: PNimrodNode, min: int) {.compileTime.} = ## checks that `n` has at least `min` children. If this is not the case, @@ -581,10 +581,8 @@ const CallNodes* = {nnkCall, nnkInfix, nnkPrefix, nnkPostfix, nnkCommand, nnkCallStrLit, nnkHiddenCallConv} -from strutils import cmpIgnoreStyle, format - proc expectKind*(n: PNimrodNode; k: set[TNimrodNodeKind]) {.compileTime.} = - assert n.kind in k, "Expected one of $1, got $2".format(k, n.kind) + assert n.kind in k, "Expected one of " & $k & ", got " & $n.kind proc newProc*(name = newEmptyNode(); params: openArray[PNimrodNode] = [newEmptyNode()]; body: PNimrodNode = newStmtList(), procType = nnkProcDef): PNimrodNode {.compileTime.} = @@ -654,7 +652,7 @@ proc `pragma=`*(someProc: PNimrodNode; val: PNimrodNode){.compileTime.}= template badNodeKind(k; f): stmt{.immediate.} = - assert false, "Invalid node kind $# for macros.`$2`".format(k, f) + assert false, "Invalid node kind " & $k & " for macros.`" & $f & "`" proc body*(someProc: PNimrodNode): PNimrodNode {.compileTime.} = case someProc.kind: @@ -776,6 +774,22 @@ proc copy*(node: PNimrodNode): PNimrodNode {.compileTime.} = ## An alias for copyNimTree(). return node.copyNimTree() +proc cmpIgnoreStyle(a, b: cstring): int {.noSideEffect.} = + proc toLower(c: char): char {.inline.} = + if c in {'A'..'Z'}: result = chr(ord(c) + (ord('a') - ord('A'))) + else: result = c + var i = 0 + var j = 0 + while true: + while a[i] == '_': inc(i) + while b[j] == '_': inc(j) # BUGFIX: typo + var aa = toLower(a[i]) + var bb = toLower(b[j]) + result = ord(aa) - ord(bb) + if result != 0 or aa == '\0': break + inc(i) + inc(j) + proc eqIdent* (a, b: string): bool = cmpIgnoreStyle(a, b) == 0 ## Check if two idents are identical. |