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:
metagn 2022-09-28 16:05:01 +03:00 • committed by GitHub
commit de4b0346bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 176 additions and 65 deletions

View file

@ -0,0 +1,8 @@
discard """
nimout: '''
tconst.nim(8, 9) Warning: abcd; foo is deprecated [Deprecated]
'''
"""
const foo* {.deprecated: "abcd".} = 42
discard foo

View 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

View file

@ -1,5 +1,5 @@
discard """
nimout: '''"muhaha"
nimout: '''foo = "muhaha"
proc poo(x, y: int) =
let y = x
echo ["poo"]'''

View file

@ -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)

View 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

View file

@ -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'")