store full definition AST for consts, fix noRewrite (#20115)
* continue #9582 for consts, close #9331, fix #20114 also move extractPragma to ast to pave the way for things like {.strdefine: "abc".} etc * changelog correctly * fix jsgen * update tgetimpl * fix sighashes * fix #19766, add comment about postfix * fix noRewrite LOL refs #16620 * fix changelog * fix destructors
This commit is contained in:
parent
fdc6b0fb6e
commit
de4b0346bd
26 changed files with 176 additions and 65 deletions
8
tests/deprecated/tconst.nim
Normal file
8
tests/deprecated/tconst.nim
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
discard """
|
||||
nimout: '''
|
||||
tconst.nim(8, 9) Warning: abcd; foo is deprecated [Deprecated]
|
||||
'''
|
||||
"""
|
||||
|
||||
const foo* {.deprecated: "abcd".} = 42
|
||||
discard foo
|
||||
16
tests/macros/t19766_20114.nim
Normal file
16
tests/macros/t19766_20114.nim
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
discard """
|
||||
action: compile
|
||||
nimout: '''
|
||||
const
|
||||
foo {.strdefine.} = "abc"
|
||||
let hey {.tddd.} = 5
|
||||
'''
|
||||
"""
|
||||
|
||||
import macros
|
||||
|
||||
template tddd {.pragma.}
|
||||
|
||||
expandMacros:
|
||||
const foo {.strdefine.} = "abc"
|
||||
let hey {.tddd.} = 5
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
discard """
|
||||
nimout: '''"muhaha"
|
||||
nimout: '''foo = "muhaha"
|
||||
proc poo(x, y: int) =
|
||||
let y = x
|
||||
echo ["poo"]'''
|
||||
|
|
|
|||
|
|
@ -439,3 +439,43 @@ when false:
|
|||
|
||||
# left-to-right priority/override order for getCustomPragmaVal
|
||||
assert bb.getCustomPragmaVal(hehe) == (key: "hi", val: "hu", haha: "he")
|
||||
|
||||
{.experimental: "dynamicBindSym".}
|
||||
|
||||
# const
|
||||
block:
|
||||
template myAttr() {.pragma.}
|
||||
template myAttr2(x: int) {.pragma.}
|
||||
template myAttr3(x: string) {.pragma.}
|
||||
|
||||
type
|
||||
MyObj2 = ref object
|
||||
|
||||
const a {.myAttr,myAttr2(2),myAttr3:"test".}: int = 0
|
||||
const b {.myAttr,myAttr2(2),myAttr3:"test".} = 0
|
||||
|
||||
macro forceHasCustomPragma(x: untyped, y: typed): untyped =
|
||||
var x = bindSym(x.repr)
|
||||
for c in x:
|
||||
if c.symKind == nskConst:
|
||||
x = c
|
||||
break
|
||||
result = getAst(hasCustomPragma(x, y))
|
||||
|
||||
macro forceGetCustomPragmaVal(x: untyped, y: typed): untyped =
|
||||
var x = bindSym(x.repr)
|
||||
for c in x:
|
||||
if c.symKind == nskConst:
|
||||
x = c
|
||||
break
|
||||
result = getAst(getCustomPragmaVal(x, y))
|
||||
|
||||
template check(s: untyped) =
|
||||
doAssert forceHasCustomPragma(s, myAttr)
|
||||
doAssert forceHasCustomPragma(s, myAttr2)
|
||||
doAssert forceGetCustomPragmaVal(s, myAttr2) == 2
|
||||
doAssert forceHasCustomPragma(s, myAttr3)
|
||||
doAssert forceGetCustomPragmaVal(s, myAttr3) == "test"
|
||||
|
||||
check(a)
|
||||
check(b)
|
||||
|
|
|
|||
20
tests/trmacros/tnorewrite.nim
Normal file
20
tests/trmacros/tnorewrite.nim
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
block:
|
||||
proc get(x: int): int = x
|
||||
|
||||
template t{get(a)}(a: int): int =
|
||||
{.noRewrite.}:
|
||||
get(a) + 1
|
||||
|
||||
doAssert get(0) == 1
|
||||
|
||||
block:
|
||||
var x: int
|
||||
|
||||
template asgn{a = b}(a: int{lvalue}, b: int) =
|
||||
let newVal = b + 1
|
||||
# ^ this is needed but should it be?
|
||||
{.noRewrite.}:
|
||||
a = newVal
|
||||
|
||||
x = 10
|
||||
doAssert x == 11, $x
|
||||
|
|
@ -33,7 +33,8 @@ block tcse:
|
|||
|
||||
block hoist:
|
||||
template optPeg{peg(pattern)}(pattern: string{lit}): Peg =
|
||||
var gl {.global, gensym.} = peg(pattern)
|
||||
{.noRewrite.}:
|
||||
var gl {.global, gensym.} = peg(pattern)
|
||||
gl
|
||||
doAssert match("(a b c)", peg"'(' @ ')'")
|
||||
doAssert match("W_HI_Le", peg"\y 'while'")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue