import foo {.all.} reboot (#17706)

This commit is contained in:
Timothee Cour
2021-04-16 00:16:39 -07:00
committed by GitHub
parent 12783dbcf0
commit 8161b02897
38 changed files with 584 additions and 76 deletions

9
tests/ic/mimports.nim Normal file
View 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
View 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
View 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
View 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
View File

@@ -0,0 +1,3 @@
const bar1* = 2
const bar2 = 2
const bar3 = 3

5
tests/importalls/m3.nim Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View File

@@ -0,0 +1,4 @@
import ./m1 {.all.} except foo1
doAssert foo2 == 2
doAssert declared(foo2)
doAssert not compiles(foo1)

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

View 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]