Exemplo n.º 1
0
def return_transformer(node, resources):
    _validate_restrictions(node)
    rtseq = resources.get_rtseq()
    expression = utils.generic_ast_node_transform(node.value, resources)
    stripped_expression = expression[:expression.find("[")] if expression.find(
        "[") != -1 else expression
    if isinstance(node.value, (ast.Name, ast.Attribute, ast.Subscript)):
        src_var_name = utils.get_variable_name_from_node(node.value)
        if resources.has_variable(
                str(src_var_name
                    )) and not resources.has_channel_ref(stripped_expression):
            rt_expression = expression
            return_default_value = resources.get_variable_py_value(
                src_var_name)
            # In case of "return var[0]" the default value is saved as a list, so make sure to not return list type
            # because those cannot be return variables.
            # The len check is there to not get index error in case of empty lists -> for that I don't know yet
            # what the solution is, so I will leave it like this (Arnold)
            if isinstance(return_default_value, ArrayType):
                if len(return_default_value.value):
                    return_default_value = return_default_value[0]
        else:
            raise TranslateError(_errormessages.invalid_return_value)
    elif isinstance(node.value, ast.Call) or utils.is_node_ast_num(node.value):
        return_default_value = utils.get_value_from_node(node.value, resources)
        if isinstance(return_default_value, ArrayType):
            raise TranslateError(_errormessages.invalid_return_type)
        rt_expression = expression
    else:
        raise TranslateError(_errormessages.invalid_return_value)
    var_name = rtseqapi.add_return_variable(rtseq, '__ret_var__',
                                            return_default_value)
    rtseqapi.add_assignment(resources.get_current_block(), var_name,
                            rt_expression)
    return "return " + str(expression)
def _validate_restrictions(node):
    if not isinstance(node.args[0], ast.UnaryOp) and not utils.is_node_ast_num(
            node.args[0]):
        raise TranslateError(
            _errormessages.invalid_error_code_for_generate_error)
    if not utils.is_node_ast_str(node.args[1]):
        raise TranslateError(_errormessages.invalid_message_for_generate_error)
    if not isinstance(node.args[2], ast.Attribute):
        raise TranslateError(_errormessages.invalid_action_for_generate_error)
Exemplo n.º 3
0
def test_float_1_check_returns_true_bool():
    if sys.version_info >= (3, 8):
        node = ast.Constant(value=1.0)
        res = utils.is_node_ast_num(node)
        assert res is True
Exemplo n.º 4
0
def test_str_empty_check_returns_false_bool():
    if sys.version_info >= (3, 8):
        node = ast.Constant(value="")
        res = utils.is_node_ast_num(node)
        assert res is False
Exemplo n.º 5
0
def test_true_check_returns_false_bool():
    if sys.version_info >= (3, 8):
        node = ast.Constant(value=True)
        res = utils.is_node_ast_num(node)
        assert res is False
    assert True
Exemplo n.º 6
0
def test_complex_2_3_check_returns_true_bool():
    if sys.version_info >= (3, 8):
        node = ast.Constant(value=complex(2, 3))
        res = utils.is_node_ast_num(node)
        assert res is True
Exemplo n.º 7
0
def _validate_restrictions(node):
    if not isinstance(node.value, ast.Attribute) and \
            not utils.is_node_ast_nameconstant(node.value) and \
            not utils.is_node_ast_num(node.value):
        raise TranslateError(_errormessages.invalid_return_type)