mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
import brackets support as and prefixes [backport] (#21636)
* import brackets support `as` and prefixes fixes #21635 * copyTree -> copyNode
This commit is contained in:
@@ -323,22 +323,24 @@ proc evalImport*(c: PContext, n: PNode): PNode =
|
||||
result = newNodeI(nkImportStmt, n.info)
|
||||
for i in 0..<n.len:
|
||||
let it = n[i]
|
||||
if it.kind == nkInfix and it.len == 3 and it[2].kind == nkBracket:
|
||||
let sep = it[0]
|
||||
let dir = it[1]
|
||||
var 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]:
|
||||
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]:
|
||||
# transform `a/b/[c as d]` to `/a/b/c as d`
|
||||
if x.kind == nkInfix and x[0].ident.s == "as":
|
||||
let impAs = copyTree(x)
|
||||
imp[2] = x[1]
|
||||
var impAs = copyNode(x)
|
||||
newSons(impAs, 3)
|
||||
impAs[0] = x[0]
|
||||
imp[lastPos] = x[1]
|
||||
impAs[1] = imp
|
||||
impMod(c, imp, result)
|
||||
impAs[2] = x[2]
|
||||
impMod(c, impAs, result)
|
||||
else:
|
||||
imp[2] = x
|
||||
imp[lastPos] = x
|
||||
impMod(c, imp, result)
|
||||
else:
|
||||
impMod(c, it, result)
|
||||
|
||||
@@ -2,15 +2,20 @@ discard """
|
||||
action: run
|
||||
"""
|
||||
|
||||
import .. / modules / [definitions as foo]
|
||||
import .. / modules / definitions as foo
|
||||
import .. / modules / [mexporta as a1, definitions as foo1]
|
||||
import .. / modules / definitions as foo2
|
||||
import ./[mexporta as a2, definitions as foo3]
|
||||
import std / times as bar
|
||||
from times as bar2 import nil
|
||||
import times as bar3 except convert
|
||||
import definitions as baz
|
||||
|
||||
discard foo.v
|
||||
discard foo1.v
|
||||
discard foo2.v
|
||||
discard foo3.v
|
||||
discard bar.now()
|
||||
discard bar2.now()
|
||||
discard bar3.now()
|
||||
discard baz.v
|
||||
discard a1.xyz
|
||||
discard a2.xyz
|
||||
|
||||
Reference in New Issue
Block a user