From 27239db4276e2cccdd7e3d2b19f93c31f078e15d Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 4 Feb 2021 08:09:54 +0100 Subject: [PATCH] builder: show file:line when import fails (#8537) --- vlib/v/builder/builder.v | 18 ++++++++++++++---- vlib/v/checker/tests/import_not_found_err.out | 6 +++++- .../vmodules_overrides_test.v | 2 +- vlib/v/tests/repl/entire_commented_module.repl | 4 ++++ vlib/v/tests/repl/runner/runner.v | 6 +++--- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/vlib/v/builder/builder.v b/vlib/v/builder/builder.v index b72fcadfb5..8c8b5d9b4a 100644 --- a/vlib/v/builder/builder.v +++ b/vlib/v/builder/builder.v @@ -2,6 +2,7 @@ module builder import os import v.ast +import v.token import v.table import v.pref import v.util @@ -97,7 +98,7 @@ pub fn (mut b Builder) parse_imports() { for imp in ast_file.imports { mod := imp.mod if mod == 'builtin' { - verror('cannot import module "builtin"') + error_with_pos('cannot import module "builtin"', ast_file.path, imp.pos) break } if mod in done_imports { @@ -106,20 +107,23 @@ pub fn (mut b Builder) parse_imports() { import_path := b.find_module_path(mod, ast_file.path) or { // v.parsers[i].error_with_token_index('cannot import module "$mod" (not found)', v.parsers[i].import_table.get_import_tok_idx(mod)) // break - verror('cannot import module "$mod" (not found)') + error_with_pos('cannot import module "$mod" (not found)', ast_file.path, + imp.pos) break } v_files := b.v_files_from_dir(import_path) if v_files.len == 0 { // v.parsers[i].error_with_token_index('cannot import module "$mod" (no .v files in "$import_path")', v.parsers[i].import_table.get_import_tok_idx(mod)) - verror('cannot import module "$mod" (no .v files in "$import_path")') + error_with_pos('cannot import module "$mod" (no .v files in "$import_path")', + ast_file.path, imp.pos) } // Add all imports referenced by these libs parsed_files := parser.parse_files(v_files, b.table, b.pref, b.global_scope) for file in parsed_files { if file.mod.name != mod { // v.parsers[pidx].error_with_token_index('bad module definition: ${v.parsers[pidx].file_path} imports module "$mod" but $file is defined as module `$p_mod`', 1 - verror('bad module definition: $ast_file.path imports module "$mod" but $file.path is defined as module `$file.mod.name`') + error_with_pos('bad module definition: $ast_file.path imports module "$mod" but $file.path is defined as module `$file.mod.name`', + ast_file.path, imp.pos) } } b.parsed_files << parsed_files @@ -390,6 +394,12 @@ struct FunctionRedefinition { f ast.FnDecl } +fn error_with_pos(s string, fpath string, pos token.Position) { + ferror := util.formatted_error('builder error:', s, fpath, pos) + eprintln(ferror) + exit(1) +} + fn verror(s string) { util.verror('builder error', s) } diff --git a/vlib/v/checker/tests/import_not_found_err.out b/vlib/v/checker/tests/import_not_found_err.out index cee9ed2971..a41edfc9c9 100644 --- a/vlib/v/checker/tests/import_not_found_err.out +++ b/vlib/v/checker/tests/import_not_found_err.out @@ -1 +1,5 @@ -builder error: cannot import module "notexist" (not found) +vlib/v/checker/tests/import_not_found_err.vv:1:1: builder error: cannot import module "notexist" (not found) + 1 | import notexist + | ~~~~~~~~~~~~~~~ + 2 | fn main() { + 3 | println(notexist.name) diff --git a/vlib/v/tests/multiple_paths_in_vmodules/vmodules_overrides_test.v b/vlib/v/tests/multiple_paths_in_vmodules/vmodules_overrides_test.v index 9d8d336d9e..0212027941 100644 --- a/vlib/v/tests/multiple_paths_in_vmodules/vmodules_overrides_test.v +++ b/vlib/v/tests/multiple_paths_in_vmodules/vmodules_overrides_test.v @@ -20,7 +20,7 @@ fn test_compiling_without_vmodules_fails() { os.setenv('VMODULES', '', true) res := os.exec('"$vexe" run "$mainvv"') or { panic(err) } assert res.exit_code == 1 - assert res.output.trim_space() == 'builder error: cannot import module "yyy" (not found)' + assert res.output.trim_space().contains('builder error: cannot import module "yyy" (not found)') } fn test_compiling_with_vmodules_works() { diff --git a/vlib/v/tests/repl/entire_commented_module.repl b/vlib/v/tests/repl/entire_commented_module.repl index 0b79029c60..40693ce838 100644 --- a/vlib/v/tests/repl/entire_commented_module.repl +++ b/vlib/v/tests/repl/entire_commented_module.repl @@ -1,3 +1,7 @@ import v.tests.modules.acommentedmodule ===output=== builder error: bad module definition: .entire_commented_module.repl.vrepl_temp.v imports module "v.tests.modules.acommentedmodule" but vlib/v/tests/modules/acommentedmodule/commentedfile.v is defined as module `main` + 1 | import v.tests.modules.acommentedmodule + | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 2 | import os + 3 | diff --git a/vlib/v/tests/repl/runner/runner.v b/vlib/v/tests/repl/runner/runner.v index 0e03ab6a99..4ec542475e 100644 --- a/vlib/v/tests/repl/runner/runner.v +++ b/vlib/v/tests/repl/runner/runner.v @@ -63,12 +63,12 @@ pub fn run_repl_file(wd string, vexec string, file string) ?string { file_expected := '${file}.expected.txt' os.write_file(file_result, result) or { panic(err) } os.write_file(file_expected, output) or { panic(err) } - diff := diff_files(file_result, file_expected) + diff := diff_files(file_expected, file_result) return error('Difference found in REPL file: $file -====> Got : -|$result| ====> Expected : |$output| +====> Got : +|$result| ====> Diff : $diff ')