Example #1
0
def type_of_type_union_is_metatype_of_unioned_types():
    type_bindings = {
        "str": types.meta_type(types.str_type),
        "int": types.meta_type(types.int_type),
    }
    node = nodes.type_union([nodes.ref("str"), nodes.ref("int")])
    inferred_type = infer(node, type_bindings=type_bindings)
    assert types.is_meta_type(inferred_type)
    assert_equal(types.union(types.str_type, types.int_type), inferred_type.type)
def type_of_function_signature_is_metatype_of_function():
    type_bindings = {
        "str": types.meta_type(types.str_type),
        "int": types.meta_type(types.int_type),
    }
    node = nodes.signature(
        args=[nodes.signature_arg(nodes.ref("int"))],
        returns=nodes.ref("str")
    )
    inferred_type = infer(node, type_bindings=type_bindings)
    assert types.is_meta_type(inferred_type)
    assert_equal(types.func([types.int_type], types.str_type), inferred_type.type)
def type_of_generic_function_signature_is_metatype_of_function():
    node = nodes.signature(
        type_params=[nodes.formal_type_parameter("T")],
        args=[nodes.signature_arg(nodes.ref("T"))],
        returns=nodes.ref("T")
    )
    inferred_type = infer(node)
    assert types.is_meta_type(inferred_type)
    assert types.is_generic_func(inferred_type.type)
    formal_type_param, = inferred_type.type.formal_type_params
    assert_equal(
        types.func([formal_type_param], formal_type_param),
        inferred_type.type.instantiate([formal_type_param]),
    )
def type_of_structural_type_is_as_definition():
    type_bindings = {
        "str": types.meta_type(types.str_type),
        "int": types.meta_type(types.int_type),
    }
    node = nodes.structural_type("Song", [
        ("description", nodes.ref("str")),
        ("length", nodes.ref("int")),
    ])
    
    context = update_context(node, type_bindings=type_bindings)
    declared_type = context.lookup_name("Song")
    
    assert types.is_meta_type(declared_type)
    expected_type = types.structural_type("Song", [
        types.attr("description", types.str_type),
        types.attr("length", types.int_type),
    ])
    assert types.is_equivalent_type(expected_type, declared_type.type)