From 8a2d25247f69f891784a0828ed958269bf751e4b Mon Sep 17 00:00:00 2001 From: joe-conigliaro Date: Sun, 7 Jul 2019 09:22:47 +1000 Subject: [PATCH] submodules --- compiler/main.v | 16 +++++++++++++--- compiler/parser.v | 16 +++++++++++++++- compiler/tests/submodule_test.v | 5 +++++ vlib/{ => encoding}/base64/base64.v | 0 vlib/{ => encoding}/base64/base64_test.v | 2 +- 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 compiler/tests/submodule_test.v rename vlib/{ => encoding}/base64/base64.v (100%) rename vlib/{ => encoding}/base64/base64_test.v (99%) diff --git a/compiler/main.v b/compiler/main.v index c423a02f80..69aca8003c 100644 --- a/compiler/main.v +++ b/compiler/main.v @@ -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 diff --git a/compiler/parser.v b/compiler/parser.v index e8e345fcce..7a73a7b791 100644 --- a/compiler/parser.v +++ b/compiler/parser.v @@ -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 diff --git a/compiler/tests/submodule_test.v b/compiler/tests/submodule_test.v new file mode 100644 index 0000000000..896e24bfd6 --- /dev/null +++ b/compiler/tests/submodule_test.v @@ -0,0 +1,5 @@ +import encoding.base64 + +pub fn test_submodules() { + assert base64.decode('c3VibW9kdWxlcyBhcmUgd29ya2luZyE=') == 'submodules are working!' +} diff --git a/vlib/base64/base64.v b/vlib/encoding/base64/base64.v similarity index 100% rename from vlib/base64/base64.v rename to vlib/encoding/base64/base64.v diff --git a/vlib/base64/base64_test.v b/vlib/encoding/base64/base64_test.v similarity index 99% rename from vlib/base64/base64_test.v rename to vlib/encoding/base64/base64_test.v index e9a92a7fff..f2ce9f4b0d 100644 --- a/vlib/base64/base64_test.v +++ b/vlib/encoding/base64/base64_test.v @@ -1,4 +1,4 @@ -import base64 +import encoding.base64 struct testpair { decoded string