From f2f32626bcfbb2deb89d6fec925e094c0c371d7e Mon Sep 17 00:00:00 2001 From: joe-conigliaro Date: Thu, 17 Dec 2020 16:08:28 +1100 Subject: [PATCH] all: get -usecache working with mods in ~/.vmodules (ui examples) --- vlib/v/builder/cc.v | 13 +++++-------- vlib/v/gen/cgen.v | 15 ++++++++++++++- vlib/v/parser/parser.v | 2 +- vlib/v/table/table.v | 5 +++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/vlib/v/builder/cc.v b/vlib/v/builder/cc.v index 7886e962bb..9f7ccc252b 100644 --- a/vlib/v/builder/cc.v +++ b/vlib/v/builder/cc.v @@ -385,13 +385,6 @@ fn (mut v Builder) cc() { if imp == 'webview' { continue } - // println('cache: import "$imp"') - mod_path := imp.replace('.', os.path_separator) - // TODO: to get import path all imports (even relative) we can use: - // import_path := v.find_module_path(imp, ast_file.path) or { - // verror('cannot import module "$imp" (not found)') - // break - // } // The problem is cmd/v is in module main and imports // the relative module named help, which is built as cmd.v.help not help // currently this got this workign by building into main, see ast.FnDecl in cgen @@ -402,7 +395,11 @@ fn (mut v Builder) cc() { // if os.is_dir(af_base_dir + os.path_separator + mod_path) { // continue // } - imp_path := os.join_path('vlib', mod_path) + // imp_path := os.join_path('vlib', mod_path) + imp_path := v.find_module_path(imp, ast_file.path) or { + verror('cannot import module "$imp" (not found)') + break + } obj_path := v.rebuild_cached_module(vexe, imp_path) libs += ' ' + obj_path if obj_path.ends_with('vlib/ui.o') { diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index ca5627b26e..acd5add5eb 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -3,6 +3,7 @@ // that can be found in the LICENSE file. module gen +import os import strings import v.ast import v.table @@ -138,6 +139,18 @@ const ( pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string { // println('start cgen2') + mut module_built := '' + if pref.build_mode == .build_module { + // TODO: detect this properly for all cases + // either get if from an earlier stage or use the lookup paths + if pref.path.contains('vlib' + os.path_separator) { + module_built = pref.path.after('vlib' + os.path_separator).replace(os.path_separator, + '.') + } else if pref.path.contains('.vmodules' + os.path_separator) { + module_built = pref.path.after('.vmodules' + os.path_separator).replace(os.path_separator, + '.') + } + } mut g := Gen{ out: strings.new_builder(1000) cheaders: strings.new_builder(8192) @@ -164,7 +177,7 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string fn_decl: 0 autofree: true indent: -1 - module_built: pref.path.after('vlib/').replace('/', '.') + module_built: module_built } for mod in g.table.modules { g.inits[mod] = strings.new_builder(100) diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 43ce34bb92..d0e9c691bb 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -1622,7 +1622,7 @@ fn (mut p Parser) module_decl() ast.Module { // is not imported. // So here we fetch the name of the module by looking at the path that's being built. word := p.pref.path.after('/') - if full_mod == word { + if full_mod == word && p.pref.path.contains('vlib') { full_mod = p.pref.path.after('vlib/').replace('/', '.') // println('new full mod =$full_mod') } diff --git a/vlib/v/table/table.v b/vlib/v/table/table.v index 62f7619ecb..fa4f65ed64 100644 --- a/vlib/v/table/table.v +++ b/vlib/v/table/table.v @@ -678,8 +678,9 @@ pub fn (t &Table) mktyp(typ Type) Type { } } -// Once we have a module format we can read from module file instead -// this is not optimal +// TODO: Once we have a module format we can read from module file instead +// this is not optimal. it depends on the full import being in table.imports +// already, we can instead lookup the module path and then work it out pub fn (table &Table) qualify_module(mod string, file_path string) string { for m in table.imports { // if m.contains('gen') { println('qm=$m') }