mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-26 17:24:02 +00:00
import foo {.all.} reboot (#17706)
This commit is contained in:
9
tests/ic/mimports.nim
Normal file
9
tests/ic/mimports.nim
Normal file
@@ -0,0 +1,9 @@
|
||||
from mimportsb {.all.} import fnb1, hfnb3
|
||||
|
||||
proc fn1*(): int = 1
|
||||
proc fn2*(): int = 2
|
||||
proc hfn3(): int = 3
|
||||
proc hfn4(): int = 4
|
||||
proc hfn5(): int = 5
|
||||
|
||||
export mimportsb.fnb2, hfnb3
|
||||
4
tests/ic/mimportsb.nim
Normal file
4
tests/ic/mimportsb.nim
Normal file
@@ -0,0 +1,4 @@
|
||||
proc fnb1*(): int = 1
|
||||
proc fnb2*(): int = 2
|
||||
proc hfnb3(): int = 3
|
||||
proc hfnb4(): int = 4
|
||||
29
tests/ic/timports.nim
Normal file
29
tests/ic/timports.nim
Normal file
@@ -0,0 +1,29 @@
|
||||
import mimports
|
||||
doAssert fn1() == 1
|
||||
doAssert not declared(hfn3)
|
||||
|
||||
#!EDIT!#
|
||||
|
||||
import mimports {.all.}
|
||||
doAssert fn1() == 1
|
||||
doAssert declared(hfn3)
|
||||
doAssert hfn3() == 3
|
||||
doAssert mimports.hfn4() == 4
|
||||
|
||||
# reexports
|
||||
doAssert not declared(fnb1)
|
||||
doAssert not declared(hfnb4)
|
||||
doAssert fnb2() == 2
|
||||
doAssert hfnb3() == 3
|
||||
|
||||
#!EDIT!#
|
||||
|
||||
from mimports {.all.} import hfn3
|
||||
doAssert not declared(fn1)
|
||||
from mimports {.all.} as bar import fn1
|
||||
doAssert fn1() == 1
|
||||
doAssert hfn3() == 3
|
||||
doAssert not declared(hfn4)
|
||||
doAssert declared(mimports.hfn4)
|
||||
doAssert mimports.hfn4() == 4
|
||||
doAssert bar.hfn4() == 4
|
||||
70
tests/importalls/m1.nim
Normal file
70
tests/importalls/m1.nim
Normal file
@@ -0,0 +1,70 @@
|
||||
import ./m2
|
||||
import ./m3 {.all.} as m3
|
||||
from ./m3 as m3Bis import nil
|
||||
|
||||
doAssert m3h2 == 2
|
||||
export m3h2
|
||||
|
||||
export m3Bis.m3p1
|
||||
|
||||
const foo0* = 2
|
||||
const foo1 = bar1
|
||||
|
||||
const foo1Aux = 2
|
||||
export foo1Aux
|
||||
|
||||
doAssert not declared(bar2)
|
||||
doAssert not compiles(bar2)
|
||||
|
||||
var foo2 = 2
|
||||
let foo3 = 2
|
||||
|
||||
type Foo4 = enum
|
||||
kg1, kg2
|
||||
|
||||
type Foo4b {.pure.} = enum
|
||||
foo4b1, foo4b2
|
||||
|
||||
type Foo5 = object
|
||||
z1: string
|
||||
z2: Foo4
|
||||
z3: int
|
||||
z4*: int
|
||||
|
||||
proc `z3`*(a: Foo5): auto =
|
||||
a.z3 * 10
|
||||
|
||||
proc foo6(): auto = 2
|
||||
proc foo6b*(): auto = 2
|
||||
template foo7: untyped = 2
|
||||
macro foo8(): untyped = discard
|
||||
template foo9(a: int) = discard
|
||||
|
||||
block:
|
||||
template foo10: untyped = 2
|
||||
type Foo11 = enum
|
||||
kg1b, kg2b
|
||||
proc foo12(): auto = 2
|
||||
|
||||
proc initFoo5*(z3: int): Foo5 = Foo5(z3: z3)
|
||||
|
||||
func foo13(): auto = 2
|
||||
iterator foo14a(): int = discard
|
||||
iterator foo14b*(): int = discard
|
||||
iterator foo14c(): int {.closure.} = discard
|
||||
iterator foo14d(): int {.inline.} = discard
|
||||
|
||||
# fwd declare
|
||||
proc foo15(): int
|
||||
proc foo15(): int = 2
|
||||
|
||||
proc foo16*(): int
|
||||
proc foo16(): int = 2
|
||||
|
||||
proc foo17*(): int
|
||||
proc foo17*(): int = 2
|
||||
|
||||
# other
|
||||
type A1 = distinct int
|
||||
type A2 = distinct int
|
||||
converter foo18(x: A1): A2 = discard
|
||||
3
tests/importalls/m2.nim
Normal file
3
tests/importalls/m2.nim
Normal file
@@ -0,0 +1,3 @@
|
||||
const bar1* = 2
|
||||
const bar2 = 2
|
||||
const bar3 = 3
|
||||
5
tests/importalls/m3.nim
Normal file
5
tests/importalls/m3.nim
Normal file
@@ -0,0 +1,5 @@
|
||||
# xxx use below naming convention in other test files: p: public, h: hidden
|
||||
const m3p1* = 2
|
||||
const m3h2 = 2
|
||||
const m3h3 = 3
|
||||
const m3h4 = 4
|
||||
10
tests/importalls/m4.nim
Normal file
10
tests/importalls/m4.nim
Normal file
@@ -0,0 +1,10 @@
|
||||
{.warning[UnusedImport]: off.} # xxx bug: this shouldn't be needed since we have `export m3`
|
||||
import ./m3 {.all.}
|
||||
import ./m3 as m3b
|
||||
export m3b
|
||||
export m3h3
|
||||
export m3.m3h4
|
||||
|
||||
import ./m2 {.all.} as m2b
|
||||
export m2b except bar3
|
||||
|
||||
9
tests/importalls/mt0.nim
Normal file
9
tests/importalls/mt0.nim
Normal file
@@ -0,0 +1,9 @@
|
||||
import ./m1 as m
|
||||
doAssert compiles(foo0)
|
||||
doAssert not compiles(foo1)
|
||||
doAssert foo6b() == 2
|
||||
doAssert m3h2 == 2
|
||||
|
||||
var f = initFoo5(z3=3)
|
||||
doAssert f.z3 == 30
|
||||
doAssert z3(f) == 30
|
||||
23
tests/importalls/mt1.nim
Normal file
23
tests/importalls/mt1.nim
Normal file
@@ -0,0 +1,23 @@
|
||||
import ./m1 {.all.} as m
|
||||
doAssert foo1 == 2
|
||||
doAssert m.foo1 == 2
|
||||
|
||||
doAssert m.m3h2 == 2
|
||||
doAssert m3h2 == 2
|
||||
doAssert m.foo1Aux == 2
|
||||
doAssert m.m3p1 == 2
|
||||
|
||||
## field access
|
||||
import std/importutils
|
||||
privateAccess(Foo5)
|
||||
# var x = Foo5(z1: "foo", z2: m.kg1)
|
||||
# doAssert x.z1 == "foo"
|
||||
|
||||
var f0: Foo5
|
||||
f0.z3 = 3
|
||||
doAssert f0.z3 == 3
|
||||
var f = initFoo5(z3=3)
|
||||
doAssert f.z3 == 3
|
||||
doAssert z3(f) == 30
|
||||
doAssert m.z3(f) == 30
|
||||
doAssert not compiles(mt1.`z3`(f)) # z3 is an imported symbol
|
||||
104
tests/importalls/mt2.nim
Normal file
104
tests/importalls/mt2.nim
Normal file
@@ -0,0 +1,104 @@
|
||||
from ./m1 {.all.} as r1 import foo1
|
||||
from ./m1 {.all.} as r2 import foo7
|
||||
|
||||
block: # different symbol kinds
|
||||
doAssert foo1 == 2
|
||||
doAssert r1.foo1 == 2
|
||||
doAssert r1.foo2 == 2
|
||||
doAssert compiles(foo1)
|
||||
doAssert compiles(r1.foo2)
|
||||
doAssert not compiles(foo2)
|
||||
doAssert not compiles(m3h2)
|
||||
doAssert r1.foo3 == 2
|
||||
|
||||
block: # enum
|
||||
var a: r1.Foo4
|
||||
let a1 = r1.kg1
|
||||
doAssert a1 == r1.Foo4.kg1
|
||||
type A = r1.Foo4
|
||||
doAssert a1 == A.kg1
|
||||
doAssert not compiles(kg1)
|
||||
doAssert compiles(A.kg1)
|
||||
var witness = false
|
||||
for ai in r1.Foo4:
|
||||
doAssert ai == a
|
||||
doAssert ai == a1
|
||||
witness = true
|
||||
break
|
||||
doAssert witness
|
||||
|
||||
block: # {.pure.} enum
|
||||
var a: r1.Foo4b
|
||||
doAssert not compiles(r1.foo4b1) # because pure
|
||||
doAssert not compiles(foo4b1)
|
||||
let a1 = r1.Foo4b.foo4b1
|
||||
doAssert a1 == a
|
||||
type A = r1.Foo4b
|
||||
doAssert a1 == A.foo4b1
|
||||
var witness = false
|
||||
for ai in A:
|
||||
doAssert ai == a
|
||||
doAssert ai == a1
|
||||
witness = true
|
||||
break
|
||||
doAssert witness
|
||||
|
||||
block: # object
|
||||
doAssert compiles(r1.Foo5)
|
||||
var a: r1.Foo5
|
||||
doAssert compiles(a.z4)
|
||||
doAssert not compiles(a.z3)
|
||||
|
||||
block: # remaining symbol kinds
|
||||
doAssert r1.foo6() == 2
|
||||
doAssert r1.foo6b() == 2
|
||||
doAssert foo7() == 2
|
||||
doAssert r2.foo6b() == 2
|
||||
|
||||
r1.foo8()
|
||||
r1.foo9(1)
|
||||
doAssert r1.foo13() == 2
|
||||
for a in r1.foo14a(): discard
|
||||
for a in r1.foo14b(): discard
|
||||
for a in r1.foo14c(): discard
|
||||
for a in r1.foo14d(): discard
|
||||
doAssert r1.foo15() == 2
|
||||
doAssert r1.foo16() == 2
|
||||
doAssert r1.foo17() == 2
|
||||
doAssert compiles(r1.foo18)
|
||||
doAssert declared(r1.foo18)
|
||||
|
||||
block: # declarations at block scope should not be visible
|
||||
doAssert declared(foo7)
|
||||
doAssert declared(r1.foo6)
|
||||
doAssert not declared(foo10)
|
||||
doAssert not declared(foo6)
|
||||
doAssert not declared(r1.Foo11)
|
||||
doAssert not declared(r1.kg1b)
|
||||
doAssert not declared(r1.foo12)
|
||||
doAssert not compiles(r1.foo12())
|
||||
|
||||
## field access
|
||||
import std/importutils
|
||||
privateAccess(r1.Foo5)
|
||||
var x = r1.Foo5(z1: "foo", z2: r1.kg1)
|
||||
doAssert x.z1 == "foo"
|
||||
|
||||
var f0: r1.Foo5
|
||||
f0.z3 = 3
|
||||
doAssert f0.z3 == 3
|
||||
var f = r1.initFoo5(z3=3)
|
||||
doAssert f.z3 == 3
|
||||
doAssert r1.z3(f) == 30
|
||||
|
||||
import ./m1 as r3
|
||||
doAssert not declared(foo2)
|
||||
doAssert not declared(r3.foo2)
|
||||
|
||||
from ./m1 {.all.} as r4 import nil
|
||||
doAssert not declared(foo2)
|
||||
doAssert declared(r4.foo2)
|
||||
|
||||
from ./m1 {.all.} import nil
|
||||
doAssert not declared(foo2)
|
||||
doAssert declared(m1.foo2)
|
||||
12
tests/importalls/mt3.nim
Normal file
12
tests/importalls/mt3.nim
Normal file
@@ -0,0 +1,12 @@
|
||||
import ./m1 {.all.}
|
||||
# D20201209T194412:here keep this as is, without `as`, so that mt8.nim test keeps
|
||||
# checking that the original module symbol for `m1` isn't modified and that
|
||||
# only the alias in `createModuleAlias` is affected.
|
||||
doAssert declared(m1.foo1)
|
||||
doAssert foo1 == 2
|
||||
|
||||
|
||||
doAssert m1.foo1 == 2
|
||||
|
||||
doAssert not compiles(mt3.foo0) # foo0 is an imported symbol
|
||||
doAssert not compiles(mt3.foo1) # ditto
|
||||
4
tests/importalls/mt4.nim
Normal file
4
tests/importalls/mt4.nim
Normal file
@@ -0,0 +1,4 @@
|
||||
import ./m1 {.all.} except foo1
|
||||
doAssert foo2 == 2
|
||||
doAssert declared(foo2)
|
||||
doAssert not compiles(foo1)
|
||||
3
tests/importalls/mt4b.nim
Normal file
3
tests/importalls/mt4b.nim
Normal file
@@ -0,0 +1,3 @@
|
||||
from ./m1 {.all.} as m2 import nil
|
||||
doAssert not compiles(foo1)
|
||||
doAssert m2.foo1 == 2
|
||||
9
tests/importalls/mt5.nim
Normal file
9
tests/importalls/mt5.nim
Normal file
@@ -0,0 +1,9 @@
|
||||
import ./m1 {.all.} as m2 except foo1
|
||||
doAssert foo2 == 2
|
||||
doAssert not compiles(foo1)
|
||||
doAssert m2.foo1 == 2
|
||||
doAssert compiles(m2.foo1)
|
||||
|
||||
from system {.all.} as s import ThisIsSystem
|
||||
doAssert ThisIsSystem
|
||||
doAssert s.ThisIsSystem
|
||||
13
tests/importalls/mt6.nim
Normal file
13
tests/importalls/mt6.nim
Normal file
@@ -0,0 +1,13 @@
|
||||
import ./m1 {.all.} as m2
|
||||
doAssert compiles(foo1)
|
||||
doAssert compiles(m2.foo1)
|
||||
doAssert declared(foo1)
|
||||
doAssert declared(m2.foo0) # public: works fine
|
||||
|
||||
doAssert m2.foo1 == 2
|
||||
doAssert declared(m2.foo1)
|
||||
doAssert not declared(m2.nonexistant)
|
||||
|
||||
# also tests the quoted `""` import
|
||||
import "."/"m1" {.all.} as m1b
|
||||
doAssert compiles(m1b.foo1)
|
||||
14
tests/importalls/mt7.nim
Normal file
14
tests/importalls/mt7.nim
Normal file
@@ -0,0 +1,14 @@
|
||||
include ./m1
|
||||
doAssert compiles(foo1)
|
||||
doAssert compiles(mt7.foo1)
|
||||
doAssert declared(foo1)
|
||||
doAssert declared(mt7.foo1)
|
||||
doAssert declared(mt7.foo0)
|
||||
|
||||
var f0: Foo5
|
||||
f0.z3 = 3
|
||||
doAssert f0.z3 == 3
|
||||
var f = initFoo5(z3=3)
|
||||
doAssert f.z3 == 3
|
||||
doAssert mt7.z3(f) == 30
|
||||
doAssert z3(f) == 30
|
||||
23
tests/importalls/mt8.nim
Normal file
23
tests/importalls/mt8.nim
Normal file
@@ -0,0 +1,23 @@
|
||||
#[
|
||||
test multiple imports
|
||||
]#
|
||||
|
||||
{.warning[UnusedImport]: off.}
|
||||
import ./m1, m2 {.all.}, ./m3 {.all.}
|
||||
# make sure this keeps using `import ./m1` without as.
|
||||
|
||||
# m1 is regularly imported
|
||||
doAssert declared(m1.foo0)
|
||||
doAssert declared(foo0)
|
||||
|
||||
doAssert not declared(m1.foo1)
|
||||
# if we didn't call `createModuleAlias` even for `import f1 {.all.}`,
|
||||
# this would fail, see D20201209T194412.
|
||||
|
||||
# m2
|
||||
doAssert declared(m2.bar2)
|
||||
doAssert declared(bar2)
|
||||
|
||||
# m3
|
||||
doAssert declared(m3.m3h2)
|
||||
doAssert declared(m3h2)
|
||||
12
tests/importalls/mt9.nim
Normal file
12
tests/importalls/mt9.nim
Normal file
@@ -0,0 +1,12 @@
|
||||
# tests re-export of a module with import {.all.}
|
||||
|
||||
import ./m4
|
||||
|
||||
doAssert m3p1 == 2
|
||||
doAssert not declared(m3h2)
|
||||
doAssert m3h3 == 3
|
||||
doAssert m3h4 == 4
|
||||
|
||||
doAssert bar1 == 2
|
||||
doAssert bar2 == 2
|
||||
doAssert not declared(bar3)
|
||||
7
tests/importalls/tmain2.nim
Normal file
7
tests/importalls/tmain2.nim
Normal file
@@ -0,0 +1,7 @@
|
||||
discard """
|
||||
joinable: false # for clarity, but not necessary
|
||||
"""
|
||||
|
||||
{.warning[UnusedImport]: off.}
|
||||
# only import `mt*.nim` here; these depend on `m*.nim`
|
||||
import "."/[mt0,mt1,mt2,mt3,mt4,mt4b,mt5,mt6,mt7,mt8,mt9]
|
||||
Reference in New Issue
Block a user