From eaf005e29f5ce4f2d0ee3629667f651982d518c2 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Fri, 29 Aug 2025 18:31:59 +0800 Subject: [PATCH] parser: add duplicate import symbol detect (fix #25185) (#25187) --- vlib/v/fmt/tests/import_duplicate_input.vv | 18 ------------------ vlib/v/parser/module.v | 5 +++++ .../tests/module_import_same_symbol2_err.out | 3 +++ .../tests/module_import_same_symbol2_err.vv | 1 + .../tests/module_import_same_symbol_err.out | 4 ++++ .../tests/module_import_same_symbol_err.vv | 2 ++ 6 files changed, 15 insertions(+), 18 deletions(-) delete mode 100644 vlib/v/fmt/tests/import_duplicate_input.vv create mode 100644 vlib/v/parser/tests/module_import_same_symbol2_err.out create mode 100644 vlib/v/parser/tests/module_import_same_symbol2_err.vv create mode 100644 vlib/v/parser/tests/module_import_same_symbol_err.out create mode 100644 vlib/v/parser/tests/module_import_same_symbol_err.vv diff --git a/vlib/v/fmt/tests/import_duplicate_input.vv b/vlib/v/fmt/tests/import_duplicate_input.vv deleted file mode 100644 index 2d248cb482..0000000000 --- a/vlib/v/fmt/tests/import_duplicate_input.vv +++ /dev/null @@ -1,18 +0,0 @@ -import math -import os -import math -// keep comment -import gg -import gg { MouseButton } -import time { Duration } -import time { Duration } -import math.complex { Complex } -import math.complex { Complex } - -const mypi = math.pi -const mb = MouseButton{} -const complex = Complex{} - -fn main() { - println(os.path_separator) -} diff --git a/vlib/v/parser/module.v b/vlib/v/parser/module.v index 69df3d099f..472b7e7c2e 100644 --- a/vlib/v/parser/module.v +++ b/vlib/v/parser/module.v @@ -310,6 +310,11 @@ fn (mut p Parser) import_syms(mut parent ast.Import) { for p.tok.kind == .name { pos := p.tok.pos() alias := p.check_name() + if alias in p.imported_symbols { + p.error_with_pos('cannot register symbol `${alias}`, it was already imported', + pos) + return + } p.imported_symbols[alias] = parent.mod + '.' + alias // so we can work with this in fmt+checker parent.syms << ast.ImportSymbol{ diff --git a/vlib/v/parser/tests/module_import_same_symbol2_err.out b/vlib/v/parser/tests/module_import_same_symbol2_err.out new file mode 100644 index 0000000000..db6ba12a74 --- /dev/null +++ b/vlib/v/parser/tests/module_import_same_symbol2_err.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/module_import_same_symbol2_err.vv:1:20: error: cannot register symbol `max`, it was already imported + 1 | import math { max, max } + | ~~~ diff --git a/vlib/v/parser/tests/module_import_same_symbol2_err.vv b/vlib/v/parser/tests/module_import_same_symbol2_err.vv new file mode 100644 index 0000000000..9a6c870663 --- /dev/null +++ b/vlib/v/parser/tests/module_import_same_symbol2_err.vv @@ -0,0 +1 @@ +import math { max, max } diff --git a/vlib/v/parser/tests/module_import_same_symbol_err.out b/vlib/v/parser/tests/module_import_same_symbol_err.out new file mode 100644 index 0000000000..1f2a754a02 --- /dev/null +++ b/vlib/v/parser/tests/module_import_same_symbol_err.out @@ -0,0 +1,4 @@ +vlib/v/parser/tests/module_import_same_symbol_err.vv:2:17: error: cannot register symbol `max`, it was already imported + 1 | import math { max } + 2 | import arrays { max } + | ~~~ diff --git a/vlib/v/parser/tests/module_import_same_symbol_err.vv b/vlib/v/parser/tests/module_import_same_symbol_err.vv new file mode 100644 index 0000000000..88bcf786e9 --- /dev/null +++ b/vlib/v/parser/tests/module_import_same_symbol_err.vv @@ -0,0 +1,2 @@ +import math { max } +import arrays { max }