示例#1
0
def declarations_in_exactly_one_if_else_branch_are_not_definitely_bound():
    _assert_name_is_not_definitely_bound(lambda generate:
        nodes.if_(nodes.bool_literal(True), [generate.assignment()], [])
    )
    _assert_name_is_not_definitely_bound(lambda generate:
        nodes.if_(nodes.bool_literal(True), [], [generate.assignment()])
    )
示例#2
0
def if_else_has_child_names_resolved():
    _assert_children_resolved(
        lambda ref: nodes.if_(ref, [], []),
    )
    _assert_children_resolved(
        lambda ref: nodes.if_(nodes.bool_literal(True), [nodes.expression_statement(ref)], []),
    )
    _assert_children_resolved(
        lambda ref: nodes.if_(nodes.bool_literal(True), [], [nodes.expression_statement(ref)]),
    )
示例#3
0
def test_parse_if_else_statement():
    expected = nodes.if_(
        nodes.ref("b"),
        [nodes.ret(nodes.ref("x"))],
        [nodes.ret(nodes.ref("y"))],
    )
    _assert_statement_parse(expected, "if b:\n  return x\nelse:\n  return y")
示例#4
0
def has_unconditional_return_is_false_if_only_false_branch_of_if_statement_returns():
    assert not returns.has_unconditional_return([
        nodes.if_(
            nodes.int_literal(1),
            [],
            [nodes.ret(nodes.int_literal(2))],
        )
    ])
示例#5
0
def has_unconditional_return_is_true_if_both_branches_of_if_statement_return():
    assert returns.has_unconditional_return([
        nodes.if_(
            nodes.int_literal(1),
            [nodes.ret(nodes.int_literal(1))],
            [nodes.ret(nodes.int_literal(2))],
        )
    ])
示例#6
0
def if_statement_has_false_body_type_checked():
    assert_statement_is_type_checked(
        lambda bad_statement: nodes.if_(
            nodes.int_literal(1),
            [],
            [bad_statement],
        )
    )
示例#7
0
def potentially_bound_variable_becomes_definitely_bound_after_being_assigned_in_both_branches_of_if_else():
    target_node = nodes.ref("x")
    node = nodes.if_(
        nodes.bool_literal(True),
        [nodes.assign([target_node], nodes.none())],
        []
    )
    
    bindings = _updated_bindings(node)
    assert not bindings.is_definitely_bound(target_node)
    
    node = nodes.if_(
        nodes.bool_literal(True),
        [nodes.assign([target_node], nodes.none())],
        [nodes.assign([target_node], nodes.none())]
    )
    bindings = _updated_bindings(node)
    assert bindings.is_definitely_bound(target_node)
示例#8
0
def if_statement_has_condition_type_checked():
    ref_node = nodes.ref("y")
    node = nodes.if_(ref_node, [], [])
    
    try:
        update_context(node)
        assert False, "Expected error"
    except errors.TypeCheckError as error:
        assert_equal(ref_node, error.node)
示例#9
0
def variable_remains_definitely_bound_after_being_reassigned_in_one_branch_of_if_else():
    target_node = nodes.ref("x")
    node = nodes.if_(
        nodes.bool_literal(True),
        [nodes.assign([target_node], nodes.none())],
        []
    )
    
    bindings = _updated_bindings(node, is_definitely_bound={"x": True})
    assert bindings.is_definitely_bound(target_node)
示例#10
0
def children_of_if_else_are_checked():
    _assert_child_expression_is_checked(lambda generate:
        nodes.if_(
            generate.unbound_ref(),
            [],
            []
        )
    )
    _assert_child_statement_is_checked(lambda generate:
        nodes.if_(
            nodes.bool_literal(True),
            [generate.unbound_ref_statement()],
            []
        )
    )
    _assert_child_statement_is_checked(lambda generate:
        nodes.if_(
            nodes.bool_literal(True),
            [],
            [generate.unbound_ref_statement()]
        )
    )
示例#11
0
 def test_condition_is_transformed_using_bool_builtin(self):
     _assert_transform(
         nodes.if_(
             nodes.ref("x"),
             [nodes.ret(nodes.ref("y"))],
             [nodes.ret(nodes.ref("z"))],
         ),
         cc.if_(
             cc.call(cc.builtin("bool"), [cc.ref("x")]),
             [cc.ret(cc.ref("y"))],
             [cc.ret(cc.ref("z"))],
         )
     )
示例#12
0
def only_values_that_are_definitely_bound_are_exported():
    module_node = nodes.module([
        nodes.if_(
            nodes.bool_literal(True),
            [
                nodes.assign(["x"], nodes.str_literal("one")),
                nodes.assign(["y"], nodes.str_literal("two")),
            ],
            [
                nodes.assign(["y"], nodes.str_literal("three")),
            ]
        )
    ])
    
    module, type_lookup = _check(LocalModule(None, module_node))
    assert_equal(None, module.attrs.get("x"))
    assert_equal(types.str_type, module.attrs.type_of("y"))
示例#13
0
 def test_condition_is_not_transformed_using_bool_builtin_if_already_a_bool(self):
     condition_node = nodes.ref("x")
     _assert_transform(
         nodes.if_(
             condition_node,
             [nodes.ret(nodes.ref("y"))],
             [nodes.ret(nodes.ref("z"))],
         ),
         cc.if_(
             cc.ref("x"),
             [cc.ret(cc.ref("y"))],
             [cc.ret(cc.ref("z"))],
         ),
         type_lookup=[
             (condition_node, types.bool_type),
         ],
     )
示例#14
0
 def test_function_without_explicit_return_on_all_paths_returns_none_at_end(self):
     _assert_transform(
         nodes.func(
             name="f",
             args=nodes.args([]),
             body=[
                 nodes.if_(
                     nodes.ref("x"),
                     [nodes.ret(nodes.bool_literal(True))],
                     []
                 ),
             ],
             type=None
         ),
         cc.func("f", [], [
             cc.if_(
                 cc.call(cc.builtin("bool"), [cc.ref("x")]),
                 [cc.ret(cc.true)],
             ),
             cc.ret(cc.none),
         ]),
     )
示例#15
0
def declarations_in_both_if_else_branches_are_definitely_bound():
    _assert_name_is_definitely_bound(lambda generate:
        nodes.if_(nodes.bool_literal(True), [generate.assignment()], [generate.assignment()])
    )