Skip to content

Commit be49c81

Browse files
committed
fix[parser]: Make duplicate built-in import exception consistent
1 parent 699b1ec commit be49c81

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

tests/functional/codegen/modules/test_stateless_functions.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,16 @@ def test_reject_duplicate_imports(make_input_bundle):
323323
compiler.compile_code(contract_source, input_bundle=input_bundle)
324324

325325

326+
def test_reject_duplicate_builtin_imports(make_input_bundle):
327+
contract_source = """
328+
import math
329+
import math as math2
330+
"""
331+
input_bundle = make_input_bundle({"contract.vy": contract_source})
332+
with pytest.raises(DuplicateImport):
333+
compiler.compile_code(contract_source, input_bundle=input_bundle)
334+
335+
326336
def test_nested_module_access(get_contract, make_input_bundle):
327337
lib1 = """
328338
import lib2

vyper/semantics/analysis/imports.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class ImportAnalyzer:
8888
seen: OrderedSet[vy_ast.Module]
8989
_compiler_inputs: dict[CompilerInput, vy_ast.Module]
9090
toplevel_module: vy_ast.Module
91+
importedBuiltins: dict[str, vy_ast.VyperNode] = dict()
9192

9293
def __init__(self, input_bundle: InputBundle, graph: _ImportGraph, module_ast: vy_ast.Module):
9394
self.input_bundle = input_bundle
@@ -187,6 +188,13 @@ def _load_import(
187188
self, node: vy_ast.VyperNode, level: int, module_str: str, alias: str
188189
) -> tuple[CompilerInput, Any]:
189190
if _is_builtin(level, module_str):
191+
if module_str in self.importedBuiltins:
192+
previous_import_stmt = self.importedBuiltins[module_str]
193+
raise DuplicateImport(
194+
f"{module_str} imported more than once!", previous_import_stmt, node
195+
)
196+
197+
self.importedBuiltins[module_str] = node
190198
return _load_builtin_import(level, module_str)
191199

192200
path = _import_to_path(level, module_str)

0 commit comments

Comments
 (0)