Example #1
0
def generic_specifiers_can_define_multiple_formal_type_parameters():
    source = """
#:generic T1, T2, R
class A:
    pass
"""
    note = _parse_generic_note(source)
    expected = [
        nodes.formal_type_parameter("T1"),
        nodes.formal_type_parameter("T2"),
        nodes.formal_type_parameter("R"),
    ]
    assert_equal(expected, note)
Example #2
0
def can_parse_signature_comment_with_one_formal_type_parameter():
    expected_signature = nodes.signature(
        type_params=[nodes.formal_type_parameter("T")],
        args=[nodes.signature_arg(nodes.ref("T"))],
        returns=nodes.ref("T")
    )
    assert_equal(expected_signature, parse_explicit_type("T => T -> T"))
Example #3
0
def type_parameters_of_function_are_definitely_bound():
    param = nodes.formal_type_parameter("T")
    arg_ref = nodes.ref("T")
    returns_ref = nodes.ref("T")
    explicit_type = nodes.signature(type_params=[param], args=[nodes.signature_arg(arg_ref)], returns=returns_ref)
    func_node = nodes.func("f", nodes.arguments([]), [], type=explicit_type)
    
    _updated_bindings(func_node)
Example #4
0
def generic_specifiers_use_generic_keyword():
    source = """
#:generic T
class A:
    pass
"""
    note = _parse_generic_note(source)
    assert_equal([nodes.formal_type_parameter("T")], note)
def names_in_function_signature_are_not_declared_in_outer_scope():
    explicit_type = nodes.signature(
        type_params=[nodes.formal_type_parameter("T")],
        args=[],
        returns=nodes.ref("T"),
    )
    node = nodes.func("f", nodes.arguments([]), [], type=explicit_type)
    
    declarations = find_declarations(node)
    assert not declarations.is_declared("T")
def can_type_check_generic_function_with_type_parameters():
    signature = nodes.signature(
        type_params=[nodes.formal_type_parameter("T")],
        args=[
            nodes.signature_arg(nodes.ref("T")),
        ],
        returns=nodes.ref("T"),
    )
    args = nodes.arguments([
        nodes.argument("value"),
    ])
    node = nodes.func("f", args=args, body=[nodes.ret(nodes.ref("value"))], type=signature)
    assert_equal(types.func([types.int_type], types.int_type), _infer_func_type(node).instantiate([types.int_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]),
    )
Example #8
0
 def test_does_not_redeclare_variables_with_same_name_as_type_parameter(self):
     _assert_transform(
         nodes.func(
             name="f",
             args=nodes.args([]),
             body=[],
             type=nodes.signature(
                 type_params=[nodes.formal_type_parameter("T")],
                 args=[],
                 returns=nodes.ref("T"),
             ),
         ),
         cc.func("f", [], [
             cc.ret(cc.none),
         ])
     )
def generic_function_definition_signature_has_names_resolved():
    param = nodes.formal_type_parameter("T")
    arg_ref = nodes.ref("T")
    return_ref = nodes.ref("T")
    
    signature = nodes.signature(
        type_params=[param],
        args=[nodes.signature_arg(arg_ref)],
        returns=return_ref,
    )
    node = nodes.func("f", nodes.arguments([]), [], type=signature)
    
    declarations = _create_declarations(["f"])
    references = resolve(node, declarations)
    assert not declarations.is_declared("T")
    assert_is(references.referenced_declaration(param), references.referenced_declaration(arg_ref))
    assert_is(references.referenced_declaration(param), references.referenced_declaration(return_ref))
Example #10
0
def formal_type_parameter_is_resolved_to_type_declaration():
    node = nodes.formal_type_parameter("T")
    
    declarations = _create_declarations(["T"])
    references = resolve(node, declarations)
    assert_is(declarations.declaration("T"), references.referenced_declaration(node))
Example #11
0
def test_parse_class_with_generics():
    expected_node = nodes.class_("Option", [], type_params=[nodes.formal_type_parameter("T")])
    _assert_statement_parse(expected_node, "#:generic T\nclass Option:\n  pass")
def declarations_in_class_include_formal_type_parameters():
    node = nodes.class_("Option", [], type_params=[nodes.formal_type_parameter("T")])
    
    declarations = _declarations_in(node)
    assert isinstance(declarations.declaration("T"), name_declaration.TypeDeclarationNode)
def declarations_in_function_include_type_parameter_declarations():
    explicit_type = nodes.signature(type_params=[nodes.formal_type_parameter("T")], args=[], returns=nodes.ref("none"))
    node = nodes.func("f", nodes.arguments([]), [], type=explicit_type)
    
    declarations = _declarations_in(node)
    assert isinstance(declarations.declaration("T"), name_declaration.TypeDeclarationNode)
def formal_type_parameter_is_declared():
    node = nodes.formal_type_parameter("T")
    
    declarations = find_declarations(node)
    assert_equal("T", declarations.declaration("T").name)
    assert isinstance(declarations.declaration("T"), name_declaration.TypeDeclarationNode)
def name_of_instantiation_of_generic_class_includes_type_parameters():
    node = nodes.class_("Option", [], type_params=[nodes.formal_type_parameter("T")])
    class_type = _infer_class_type(node, [])
    assert_equal("Option[int]", class_type(types.int_type).name)