submodules

pull/1046/head
joe-conigliaro 2019-07-07 09:22:47 +10:00 committed by Alexander Medvednikov
parent 36908fa304
commit 8a2d25247f
5 changed files with 34 additions and 5 deletions

View File

@ -717,7 +717,7 @@ fn (v mut V) add_user_v_files() {
// Parse lib imports
if v.pref.build_mode == .default_mode {
for i := 0; i < v.table.imports.len; i++ {
pkg := v.table.imports[i]
pkg := v.module_path(v.table.imports[i])
vfiles := v.v_files_from_dir('$TmpPath/vlib/$pkg')
// Add all imports referenced by these libs
for file in vfiles {
@ -730,7 +730,7 @@ fn (v mut V) add_user_v_files() {
// TODO this used to crash compiler?
// for pkg in v.table.imports {
for i := 0; i < v.table.imports.len; i++ {
pkg := v.table.imports[i]
pkg := v.module_path(v.table.imports[i])
idir := os.getwd()
mut import_path := '$idir/$pkg'
if(!os.file_exists(import_path)) {
@ -749,7 +749,8 @@ fn (v mut V) add_user_v_files() {
println(v.table.imports)
}
// Only now add all combined lib files
for pkg in v.table.imports {
for _pkg in v.table.imports {
pkg := v.module_path(_pkg)
idir := os.getwd()
mut module_path := '$idir/$pkg'
// If we are in default mode, we don't parse vlib .v files, but header .vh files in
@ -790,6 +791,15 @@ fn get_arg(joined_args, arg, def string) string {
return res
}
fn (v &V) module_path(pkg string) string {
// submodule support
if pkg.contains('.') {
// return pkg.replace('.', path_sep)
return pkg.replace('.', '/')
}
return pkg
}
fn (v &V) log(s string) {
if !v.pref.is_verbose {
return

View File

@ -289,7 +289,21 @@ fn (p mut Parser) import_statement() {
if p.tok != NAME {
p.error('bad import format')
}
pkg := p.lit.trim_space()
mut pkg := p.lit.trim_space()
// submodule support
// limit depth to 4 for now
max_module_depth := 4
mut depth := 1
for p.peek() == DOT {
p.next() // SKIP DOT
p.next() // SUBMODULE
submodule := p.lit.trim_space()
pkg = pkg + '.' + submodule
depth++
if depth > max_module_depth {
panic('Sorry. Module depth of $max_module_depth exceeded: $pkg ($submodule is too deep).')
}
}
p.next()
p.fgenln(' ' + pkg)
// Make sure there are no duplicate imports

View File

@ -0,0 +1,5 @@
import encoding.base64
pub fn test_submodules() {
assert base64.decode('c3VibW9kdWxlcyBhcmUgd29ya2luZyE=') == 'submodules are working!'
}

View File

@ -1,4 +1,4 @@
import base64
import encoding.base64
struct testpair {
decoded string