Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
 def __getitem__(self, key):
     if key not in self:
         raise UndeclaredDefinition(f"'{key}' has not been declared")
     return super().__getitem__(key)
Ejemplo n.º 6
0
 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)