def visit_Attribute(self, node: ast.Attribute) -> Optional[Value]:
    root_value = self.visit(node.value)
    if isinstance(root_value, KnownValue):
        try:
            return KnownValue(getattr(root_value.val, node.attr))
        except AttributeError:
            self.ctx.show_error(f'{root_value.val!r} has no attribute {node.attr!r}', node=node)
            return AnyValue(AnySource.error)
    elif (not isinstance(root_value, AnyValue)):
        self.ctx.show_error(f'Cannot resolve annotation {root_value}', node=node)
    return AnyValue(AnySource.error)
def visit_Attribute(self, node: ast.Attribute) -> Optional[Value]:
    root_value = self.visit(node.value)
    if isinstance(root_value, KnownValue):
        try:
            return KnownValue(getattr(root_value.val, node.attr))
        except AttributeError:
            self.ctx.show_error(f'{root_value.val!r} has no attribute {node.attr!r}', node=node)
            return AnyValue(AnySource.error)
    elif (not isinstance(root_value, AnyValue)):
        self.ctx.show_error(f'Cannot resolve annotation {root_value}', node=node)
    return AnyValue(AnySource.error)