diff --git a/vyper/builtins/_utils.py b/vyper/builtins/_utils.py index 72b05f15e3..3fad225b48 100644 --- a/vyper/builtins/_utils.py +++ b/vyper/builtins/_utils.py @@ -1,7 +1,7 @@ from vyper.ast import parse_to_ast from vyper.codegen.context import Context from vyper.codegen.stmt import parse_body -from vyper.semantics.analysis.local import FunctionNodeVisitor +from vyper.semantics.analysis.local import FunctionAnalyzer from vyper.semantics.namespace import Namespace, override_global_namespace from vyper.semantics.types.function import ContractFunctionT, FunctionVisibility, StateMutability from vyper.semantics.types.module import ModuleT @@ -25,9 +25,7 @@ def generate_inline_function(code, variables, variables_2, memory_allocator): ast_code.body[0]._metadata["func_type"] = ContractFunctionT( "sqrt_builtin", [], [], None, FunctionVisibility.INTERNAL, StateMutability.NONPAYABLE ) - # The FunctionNodeVisitor's constructor performs semantic checks - # annotate the AST as side effects. - analyzer = FunctionNodeVisitor(ast_code, ast_code.body[0], namespace) + analyzer = FunctionAnalyzer(ast_code, ast_code.body[0], namespace) analyzer.analyze() new_context = Context( diff --git a/vyper/semantics/analysis/local.py b/vyper/semantics/analysis/local.py index 2b6a6c5c6a..2b630f9d2e 100644 --- a/vyper/semantics/analysis/local.py +++ b/vyper/semantics/analysis/local.py @@ -58,7 +58,7 @@ def validate_functions(vy_module: vy_ast.Module) -> None: for node in vy_module.get_children(vy_ast.FunctionDef): with namespace.enter_scope(): try: - analyzer = FunctionNodeVisitor(vy_module, node, namespace) + analyzer = FunctionAnalyzer(vy_module, node, namespace) analyzer.analyze() except VyperException as e: err_list.append(e) @@ -179,7 +179,7 @@ def _validate_self_reference(node: vy_ast.Name) -> None: raise StateAccessViolation("not allowed to query self in pure functions", node) -class FunctionNodeVisitor(VyperNodeVisitorBase): +class FunctionAnalyzer(VyperNodeVisitorBase): ignored_types = (vy_ast.Pass,) scope_name = "function" diff --git a/vyper/semantics/analysis/module.py b/vyper/semantics/analysis/module.py index b120928051..0020f7f00a 100644 --- a/vyper/semantics/analysis/module.py +++ b/vyper/semantics/analysis/module.py @@ -136,12 +136,13 @@ def _collect_initialized_modules_r(module_t, seen=None): initialized_infos = module_t.initialized_modules for i in initialized_infos: - if (other := seen.get(i.module_info.module_t)) is not None: - raise StructureException("{i.module_info.alias} initialized twice!", i.node, other) - seen[i.module_info.module_t] = i + initialized_module_t = i.module_info.module_t + if initialized_module_t in seen: + seen_nodes = (i.node, seen[initialized_module_t].node) + raise StructureException(f"`{i.module_info.alias}` initialized twice!", *seen_nodes) + seen[initialized_module_t] = i - for d in i.dependencies: - _collect_initialized_modules_r(d.module_t, seen) + _collect_initialized_modules_r(initialized_module_t, seen) return seen