Example #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()])
    )
def while_loop_has_child_names_resolved():
    _assert_children_resolved(
        lambda ref: nodes.while_(ref, [], []),
    )
    _assert_children_resolved(
        lambda ref: nodes.while_(nodes.bool_literal(True), [nodes.expression_statement(ref)], []),
    )
    _assert_children_resolved(
        lambda ref: nodes.while_(nodes.bool_literal(True), [], [nodes.expression_statement(ref)]),
    )
def assert_statement_has_child_names_resolved():
    _assert_children_resolved(
        lambda ref: nodes.assert_(ref),
    )
    _assert_children_resolved(
        lambda ref: nodes.assert_(nodes.bool_literal(False), ref),
    )
Example #4
0
def break_is_not_valid_in_while_loop_else_body():
    break_node = nodes.break_()
    node = nodes.while_(nodes.bool_literal(True), [], [break_node])
    error = assert_raises(errors.TypeCheckError,
        lambda: check_loop_control(node, False))
    assert_equal(break_node, error.node)
    assert_equal("'break' outside loop", str(error))
Example #5
0
def break_is_not_valid_in_function_in_while_loop_body():
    break_node = nodes.break_()
    func_node = nodes.func("f", nodes.args([]), [break_node], type=None)
    node = nodes.while_(nodes.bool_literal(True), [func_node], [])
    error = assert_raises(errors.TypeCheckError,
        lambda: check_loop_control(node, False))
    assert_equal(break_node, error.node)
    assert_equal("'break' outside loop", str(error))
Example #6
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)
Example #7
0
def children_of_while_loop_are_checked():
    _assert_child_expression_is_checked(lambda generate:
        nodes.while_(generate.unbound_ref(), [], [])
    )
    _assert_child_statement_is_checked(lambda generate:
        nodes.while_(
            nodes.bool_literal(True),
            [generate.unbound_ref_statement()],
            []
        )
    )
    _assert_child_statement_is_checked(lambda generate:
        nodes.while_(
            nodes.bool_literal(True),
            [],
            [generate.unbound_ref_statement()]
        )
    )
Example #8
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)
def first_argument_in_method_signature_can_be_strict_supertype_of_class():
    node = nodes.class_("User", [
        nodes.func(
            name="is_person",
            args=nodes.args([nodes.arg("self")]),
            body=[nodes.ret(nodes.bool_literal(True))],
            type=nodes.signature(
                args=[nodes.signature_arg(nodes.ref("object"))],
                returns=nodes.ref("bool")
            ),
        )
    ])
    class_type = _infer_class_type(node, ["is_person"])
    assert_equal(types.func([], types.bool_type), class_type.attrs.type_of("is_person"))
def attributes_with_function_type_defined_in_class_definition_body_are_bound_to_class_type():
    node = nodes.class_("User", [
        nodes.func(
            name="is_person",
            args=nodes.args([nodes.arg("self")]),
            body=[nodes.ret(nodes.bool_literal(True))],
            type=nodes.signature(
                args=[nodes.signature_arg(nodes.ref("Self"))],
                returns=nodes.ref("bool")
            ),
        ),
    ])
    class_type = _infer_class_type(node, ["is_person"])
    assert_equal(types.func([], types.bool_type), class_type.attrs.type_of("is_person"))
def methods_must_have_at_least_one_argument():
    func_node = nodes.func(
        name="is_person",
        args=nodes.args([]),
        body=[nodes.ret(nodes.bool_literal(True))],
        type=nodes.signature(
            args=[],
            returns=nodes.ref("bool")
        )
    )
    node = nodes.class_("User", [func_node])
    try:
        _infer_class_type(node, ["is_person"])
        assert False, "Expected error"
    except errors.MethodHasNoArgumentsError as error:
        assert_equal(func_node, error.node)
        assert_equal("'is_person' method must have at least one argument", str(error))
Example #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"))
def self_argument_in_method_signature_cannot_be_unrelated_type():
    func_node = nodes.func(
        name="is_person",
        args=nodes.args([nodes.arg("self")]),
        body=[nodes.ret(nodes.bool_literal(True))],
        type=nodes.signature(
            args=[nodes.signature_arg(nodes.ref("bool"))],
            returns=nodes.ref("bool")
        ),
    )
    node = nodes.class_("User", [func_node])
    try:
        _infer_class_type(node, ["is_person"])
        assert False, "Expected error"
    except errors.UnexpectedReceiverTypeError as error:
        assert_equal(func_node, error.node)
        assert_equal(types.bool_type, error.receiver_type)
        assert_equal("first argument of methods should have Self type but was 'bool'", str(error))
Example #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),
         ]),
     )
Example #15
0
def break_is_valid_in_while_loop_body():
    node = nodes.while_(nodes.bool_literal(True), [nodes.break_()])
    check_loop_control(node, False)
Example #16
0
 def test_transform(self):
     _assert_transform(nodes.bool_literal(True), cc.true)
     _assert_transform(nodes.bool_literal(False), cc.false)
Example #17
0
def bool_has_no_references():
    _assert_no_references(nodes.bool_literal(True))
Example #18
0
def while_loop_has_else_body_type_checked():
    assert_statement_is_type_checked(
        lambda bad_statement:
            nodes.while_(nodes.bool_literal(True), [], [bad_statement])
    )
Example #19
0
def test_parse_booleans():
    _assert_expression_parse(nodes.bool_literal(True), "True")
    _assert_expression_parse(nodes.bool_literal(False), "False")
Example #20
0
def declarations_in_both_body_and_else_body_of_while_loop_are_not_definitely_bound():
    _assert_name_is_not_definitely_bound(lambda generate:
        nodes.while_(nodes.bool_literal(True), [generate.assignment()], [generate.assignment()])
    )
def attributes_defined_in_class_definition_body_are_present_on_meta_type():
    node = nodes.class_("User", [
        nodes.assign([nodes.ref("is_person")], nodes.bool_literal(True)),
    ])
    meta_type = _infer_meta_type(node, ["is_person"])
    assert_equal(types.bool_type, meta_type.attrs.type_of("is_person"))
Example #22
0
def can_infer_type_of_boolean_literal():
    assert_equal(types.bool_type, infer(nodes.bool_literal(True)))
Example #23
0
 def boolean_is_literal(self):
     assert is_literal(nodes.bool_literal(True))
Example #24
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()])
    )
def assert_message_is_type_checked():
    assert_expression_is_type_checked(
        lambda bad_expr: nodes.assert_(nodes.bool_literal(False), bad_expr)
    )