diff --git a/vlib/v/checker/tests/import_symbol_fn_err.out b/vlib/v/checker/tests/import_symbol_fn_err.out index 5d74a05ec0ba9a..4148cd8f84f874 100644 --- a/vlib/v/checker/tests/import_symbol_fn_err.out +++ b/vlib/v/checker/tests/import_symbol_fn_err.out @@ -1,3 +1,8 @@ +vlib/v/checker/tests/import_symbol_fn_err.vv:1:8: warning: module 'crypto' is imported but never used + 1 | import crypto { userper } + | ~~~~~~ + 2 | fn main() { + 3 | usurper() vlib/v/checker/tests/import_symbol_fn_err.vv:1:17: error: module `crypto` has no constant or function `userper` 1 | import crypto { userper } | ~~~~~~~ diff --git a/vlib/v/checker/tests/selective_const_import.out b/vlib/v/checker/tests/selective_const_import.out index 690fc3c4e115c8..e269f6dc22d4f6 100644 --- a/vlib/v/checker/tests/selective_const_import.out +++ b/vlib/v/checker/tests/selective_const_import.out @@ -1,3 +1,6 @@ +vlib/v/checker/tests/selective_const_import.vv:1:8: warning: module 'time' is imported but never used + 1 | import time { second } + | ~~~~ vlib/v/checker/tests/selective_const_import.vv:1:15: error: cannot selectively import constant `second` from `time`, import `time` and use `time.second` instead 1 | import time { second } | ~~~~~~ diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index a386d50d83ab90..a3b7ae19133e95 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -73,6 +73,7 @@ fn (mut p Parser) call_expr(language ast.Language, mod string) ast.CallExpr { } if fn_name in p.imported_symbols { fn_name = p.imported_symbols[fn_name] + p.register_used_import_for_symbol_name(fn_name) } comments := p.eat_comments(same_line: true) pos.update_last_line(p.prev_tok.line_nr) diff --git a/vlib/v/parser/module.v b/vlib/v/parser/module.v index 1911d83021b68c..e9a3687bf77eed 100644 --- a/vlib/v/parser/module.v +++ b/vlib/v/parser/module.v @@ -31,6 +31,11 @@ fn (mut p Parser) register_used_import(alias string) { } } +fn (mut p Parser) register_used_import_for_symbol_name(sym_name string) { + short_import_name := sym_name.all_before_last('.').all_after_last('.') + p.register_used_import(short_import_name) +} + fn (mut p Parser) register_auto_import(alias string) { if alias !in p.imports { p.imports[alias] = alias diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index 6ef2797162482c..5293bf6757abc3 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -577,6 +577,7 @@ fn (mut p Parser) parse_any_type(language ast.Language, is_ptr bool, check_dot b name = p.expr_mod + '.' + name } else if name in p.imported_symbols { name = p.imported_symbols[name] + p.register_used_import_for_symbol_name(name) } else if !p.builtin_mod && name.len > 1 && name !in p.table.type_idxs { // `Foo` in module `mod` means `mod.Foo` name = p.mod + '.' + name diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 9c45cf5b8d1b33..f12da7df9b8276 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -3699,7 +3699,6 @@ fn (mut p Parser) import_stmt() ast.Import { syms_pos: initial_syms_pos pos: import_node.pos.extend(initial_syms_pos) } - p.register_used_import(mod_alias) // no `unused import` msg for parent } pos_t := p.tok.pos() if import_pos.line_nr == pos_t.line_nr { diff --git a/vlib/v/parser/tests/import_sym_fn_unused_warning_err.out b/vlib/v/parser/tests/import_sym_fn_unused_warning_err.out new file mode 100644 index 00000000000000..9b502e531beeb9 --- /dev/null +++ b/vlib/v/parser/tests/import_sym_fn_unused_warning_err.out @@ -0,0 +1,5 @@ +vlib/v/parser/tests/import_sym_fn_unused_warning_err.vv:1:8: warning: module 'math' is imported but never used + 1 | import math { sin, cos } + | ~~~~ + 2 | + 3 | fn main() {} diff --git a/vlib/v/parser/tests/import_sym_fn_unused_warning_err.vv b/vlib/v/parser/tests/import_sym_fn_unused_warning_err.vv new file mode 100644 index 00000000000000..e5a7d32933c895 --- /dev/null +++ b/vlib/v/parser/tests/import_sym_fn_unused_warning_err.vv @@ -0,0 +1,3 @@ +import math { sin, cos } + +fn main() {}