def _add_import( node: Union[vy_ast.Import, vy_ast.ImportFrom], module: str, name: str, alias: str, interface_codes: InterfaceDict, namespace: dict, ) -> None: if module == "vyper.interfaces": interface_codes = _get_builtin_interfaces() if name not in interface_codes: suggestions_str = get_levenshtein_error_suggestions(name, _get_builtin_interfaces(), 1.0) raise UndeclaredDefinition(f"Unknown interface: {name}. {suggestions_str}", node) if interface_codes[name]["type"] == "vyper": interface_ast = vy_ast.parse_to_ast(interface_codes[name]["code"], contract_name=name) type_ = namespace["interface"].build_primitive_from_node(interface_ast) elif interface_codes[name]["type"] == "json": type_ = namespace["interface"].build_primitive_from_abi(name, interface_codes[name]["code"]) else: raise CompilerPanic(f"Unknown interface format: {interface_codes[name]['type']}") try: namespace[alias] = type_ except VyperException as exc: raise exc.with_annotation(node) from None
def _add_import( node: Union[vy_ast.Import, vy_ast.ImportFrom], module: str, name: str, interface_codes: InterfaceDict, namespace: dict, ) -> None: if module == "vyper.interfaces": interface_codes = _get_builtin_interfaces() if name not in interface_codes: raise UndeclaredDefinition(f"Unknown interface: {name}", node) try: if interface_codes[name]["type"] == "vyper": interface_ast = vy_ast.parse_to_ast(interface_codes[name]["code"]) interface_ast.name = name type_ = namespace["interface"].build_primitive_from_node(interface_ast) elif interface_codes[name]["type"] == "json": type_ = namespace["interface"].build_primitive_from_abi( name, interface_codes[name]["code"] ) else: raise CompilerPanic(f"Unknown interface format: {interface_codes[name]['type']}") namespace[name] = type_ except VyperException as exc: raise exc.with_annotation(node) from None
def types_from_Attribute(self, node): # variable attribute, e.g. `foo.bar` var = self.get_exact_type_from_node(node.value) name = node.attr try: return [var.get_member(name, node)] except UnknownAttribute: if node.get("value.id") != "self": raise if name in self.namespace: raise InvalidReference( f"'{name}' is not a storage variable, it should not be prepended with self", node, ) from None raise UndeclaredDefinition( f"Storage variable '{name}' has not been declared", node) from None
def types_from_Attribute(self, node): # variable attribute, e.g. `foo.bar` var = self.get_exact_type_from_node(node.value, only_definitions=False) name = node.attr try: return [var.get_member(name, node)] except UnknownAttribute: if node.get("value.id") != "self": raise if name in self.namespace: raise InvalidReference( f"'{name}' is not a storage variable, it should not be prepended with self", node, ) from None suggestions_str = get_levenshtein_error_suggestions( name, var.members, 0.4) raise UndeclaredDefinition( f"Storage variable '{name}' has not been declared. {suggestions_str}", node) from None
def __getitem__(self, key): if key not in self: raise UndeclaredDefinition(f"'{key}' has not been declared") return super().__getitem__(key)
def __getitem__(self, key): if key not in self: suggestions_str = get_levenshtein_error_suggestions(key, self, 0.2) raise UndeclaredDefinition( f"'{key}' has not been declared. {suggestions_str}") return super().__getitem__(key)