mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-11 22:08:54 +00:00
fix include in templates, with prefix operators (#24029)
fixes #12539, refs #21636 `evalInclude` now uses `getPIdent` to check if a symbol isn't `/` anymore instead of assuming it's an ident, which it's not when used in templates. Also it just checks if the symbol is `as` now, because there are other infix operators that could be used like `/../`. It also works with prefix operators now by copying what was done in #21636.
This commit is contained in:
@@ -2735,20 +2735,23 @@ proc incMod(c: PContext, n: PNode, it: PNode, includeStmtResult: PNode) =
|
||||
proc evalInclude(c: PContext, n: PNode): PNode =
|
||||
result = newNodeI(nkStmtList, n.info)
|
||||
result.add n
|
||||
template checkAs(it: PNode) =
|
||||
if it.kind == nkInfix and it.len == 3:
|
||||
let op = it[0].getPIdent
|
||||
if op != nil and op.id == ord(wAs):
|
||||
localError(c.config, it.info, "Cannot use '" & it[0].renderTree & "' in 'include'.")
|
||||
for i in 0..<n.len:
|
||||
var imp: PNode
|
||||
let it = n[i]
|
||||
if it.kind == nkInfix and it.len == 3 and it[0].ident.s != "/":
|
||||
localError(c.config, it.info, "Cannot use '" & it[0].ident.s & "' in 'include'.")
|
||||
if it.kind == nkInfix and it.len == 3 and it[2].kind == nkBracket:
|
||||
let sep = it[0]
|
||||
let dir = it[1]
|
||||
imp = newNodeI(nkInfix, it.info)
|
||||
imp.add sep
|
||||
imp.add dir
|
||||
imp.add sep # dummy entry, replaced in the loop
|
||||
for x in it[2]:
|
||||
imp[2] = x
|
||||
checkAs(it)
|
||||
if it.kind in {nkInfix, nkPrefix} and it[^1].kind == nkBracket:
|
||||
let lastPos = it.len - 1
|
||||
var imp = copyNode(it)
|
||||
newSons(imp, it.len)
|
||||
for i in 0 ..< lastPos: imp[i] = it[i]
|
||||
imp[lastPos] = imp[0] # dummy entry, replaced in the loop
|
||||
for x in it[lastPos]:
|
||||
checkAs(x)
|
||||
imp[lastPos] = x
|
||||
incMod(c, n, imp, result)
|
||||
else:
|
||||
incMod(c, n, it, result)
|
||||
|
||||
1
tests/modules/mincludeprefix.nim
Normal file
1
tests/modules/mincludeprefix.nim
Normal file
@@ -0,0 +1 @@
|
||||
const bar = 456
|
||||
1
tests/modules/mincludetemplate.nim
Normal file
1
tests/modules/mincludetemplate.nim
Normal file
@@ -0,0 +1 @@
|
||||
const foo = 123
|
||||
3
tests/modules/tincludeprefix.nim
Normal file
3
tests/modules/tincludeprefix.nim
Normal file
@@ -0,0 +1,3 @@
|
||||
include ./[mincludeprefix, mincludetemplate]
|
||||
doAssert foo == 123
|
||||
doAssert bar == 456
|
||||
5
tests/modules/tincludetemplate.nim
Normal file
5
tests/modules/tincludetemplate.nim
Normal file
@@ -0,0 +1,5 @@
|
||||
# issue #12539
|
||||
|
||||
template includePath(n: untyped) = include ../modules/n # But `include n` works
|
||||
includePath(mincludetemplate)
|
||||
doAssert foo == 123
|
||||
Reference in New Issue
Block a user