mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-15 07:43:26 +00:00
Fixed getCustomPragmaVal to allow multiple fields in custom annotations (#10289)
This commit is contained in:
committed by
Andreas Rumpf
parent
27e2ed4375
commit
f11f36e7d5
@@ -1500,9 +1500,18 @@ macro getCustomPragmaVal*(n: typed, cp: typed{nkSym}): untyped =
|
||||
let pragmaNode = customPragmaNode(n)
|
||||
for p in pragmaNode:
|
||||
if p.kind in nnkPragmaCallKinds and p.len > 0 and p[0].kind == nnkSym and p[0] == cp:
|
||||
return p[1]
|
||||
|
||||
error(n.repr & " doesn't have a pragma named " & cp.repr()) # returning an empty node results in most cases in a cryptic error,
|
||||
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,
|
||||
|
||||
|
||||
when not defined(booting):
|
||||
|
||||
@@ -219,3 +219,12 @@ block:
|
||||
check(x)
|
||||
check(y)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user