Fixed getCustomPragmaVal to allow multiple fields in custom annotations (#10289)

This commit is contained in:
Ico Doornekamp 2019-01-18 09:04:12 +01:00 • committed by Andreas Rumpf
commit f11f36e7d5
2 changed files with 21 additions and 3 deletions

View file

@ -1500,8 +1500,17 @@ macro getCustomPragmaVal*(n: typed, cp: typed{nkSym}): untyped =
let pragmaNode = customPragmaNode(n) let pragmaNode = customPragmaNode(n)
for p in pragmaNode: for p in pragmaNode:
if p.kind in nnkPragmaCallKinds and p.len > 0 and p[0].kind == nnkSym and p[0] == cp: if p.kind in nnkPragmaCallKinds and p.len > 0 and p[0].kind == nnkSym and p[0] == cp:
return p[1] if p.len == 2:
result = p[1]
else:
let def = p[0].getImpl[3]
result = newTree(nnkPar)
for i in 1..<p.len:
let key = def[i][0]
let val = p[i]
result.add newTree(nnkExprColonExpr, key, val)
break
if result.kind == nnkEmpty:
error(n.repr & " doesn't have a pragma named " & cp.repr()) # returning an empty node results in most cases in a cryptic error, error(n.repr & " doesn't have a pragma named " & cp.repr()) # returning an empty node results in most cases in a cryptic error,

View file

@ -219,3 +219,12 @@ block:
check(x) check(x)
check(y) check(y)
check(z) check(z)
# pragma with multiple fields
block:
template myAttr(first: string, second: int, third: float) {.pragma.}
let a {.myAttr("one", 2, 3.0).} = 0
let ps = a.getCustomPragmaVal(myAttr)
doAssert ps.first == ps[0] and ps.first == "one"
doAssert ps.second == ps[1] and ps.second == 2
doAssert ps.third == ps[2] and ps.third == 3.0