add custom pragma support for var and let symbols (#9582)
* add custom pragma support for var and let symbols * updated changelog for custom pragmas on var and let symbols * add oldast switch for backwards compatibility
This commit is contained in:
parent
139fa396e8
commit
044cef152f
9 changed files with 77 additions and 20 deletions
|
|
@ -175,24 +175,47 @@ var foo: Something
|
|||
foo.cardinal = north
|
||||
doAssert foo.b.hasCustomPragma(thingy) == true
|
||||
|
||||
|
||||
proc myproc(s: string): int =
|
||||
proc myproc(s: string): int =
|
||||
{.thingy.}:
|
||||
s.len
|
||||
|
||||
doAssert myproc("123") == 3
|
||||
|
||||
let xx = compiles:
|
||||
proc myproc_bad(s: string): int =
|
||||
proc myproc_bad(s: string): int =
|
||||
{.not_exist.}:
|
||||
s.len
|
||||
doAssert: xx == false
|
||||
|
||||
|
||||
macro checkSym(s: typed{nkSym}): untyped =
|
||||
macro checkSym(s: typed{nkSym}): untyped =
|
||||
let body = s.getImpl.body
|
||||
doAssert body[1].kind == nnkPragmaBlock
|
||||
doAssert body[1][0].kind == nnkPragma
|
||||
doAssert body[1][0][0] == bindSym"thingy"
|
||||
|
||||
checkSym(myproc)
|
||||
checkSym(myproc)
|
||||
|
||||
# var and let pragmas
|
||||
block:
|
||||
template myAttr() {.pragma.}
|
||||
template myAttr2(x: int) {.pragma.}
|
||||
template myAttr3(x: string) {.pragma.}
|
||||
|
||||
let a {.myAttr,myAttr2(2),myAttr3:"test".}: int = 0
|
||||
let b {.myAttr,myAttr2(2),myAttr3:"test".} = 0
|
||||
var x {.myAttr,myAttr2(2),myAttr3:"test".}: int = 0
|
||||
var y {.myAttr,myAttr2(2),myAttr3:"test".}: int
|
||||
var z {.myAttr,myAttr2(2),myAttr3:"test".} = 0
|
||||
|
||||
template check(s: untyped) =
|
||||
doAssert s.hasCustomPragma(myAttr)
|
||||
doAssert s.hasCustomPragma(myAttr2)
|
||||
doAssert s.getCustomPragmaVal(myAttr2) == 2
|
||||
doAssert s.hasCustomPragma(myAttr3)
|
||||
doAssert s.getCustomPragmaVal(myAttr3) == "test"
|
||||
|
||||
check(a)
|
||||
check(b)
|
||||
check(x)
|
||||
check(y)
|
||||
check(z)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue