Restored function calling

This commit is contained in:
Johan B.W. de Vries 2022-09-17 19:31:43 +02:00
parent 4b46483895
commit 58f74d3e1d
2 changed files with 30 additions and 6 deletions

View File

@ -83,8 +83,12 @@ def expression(ctx: 'Context', inp: ourlang.Expression) -> 'TypeVar':
if isinstance(inp, ourlang.FunctionCall): if isinstance(inp, ourlang.FunctionCall):
assert inp.function.returns_type_var is not None assert inp.function.returns_type_var is not None
if inp.function.posonlyargs:
raise NotImplementedError('TODO: Functions with arguments') for param, expr in zip(inp.function.posonlyargs, inp.arguments):
assert param.type_var is not None
arg = expression(ctx, expr)
ctx.unify(param.type_var, arg)
return inp.function.returns_type_var return inp.function.returns_type_var
@ -105,6 +109,8 @@ def function(ctx: 'Context', inp: ourlang.Function) -> None:
def module_constant_def(ctx: 'Context', inp: ourlang.ModuleConstantDef) -> None: def module_constant_def(ctx: 'Context', inp: ourlang.ModuleConstantDef) -> None:
inp.type_var = _convert_old_type(ctx, inp.type, inp.name) inp.type_var = _convert_old_type(ctx, inp.type, inp.name)
constant(ctx, inp.constant) constant(ctx, inp.constant)
assert inp.constant.type_var is not None
ctx.unify(inp.type_var, inp.constant.type_var) ctx.unify(inp.type_var, inp.constant.type_var)
def module(inp: ourlang.Module) -> None: def module(inp: ourlang.Module) -> None:

View File

@ -3,6 +3,7 @@ import pytest
from .helpers import Suite from .helpers import Suite
ALL_INT_TYPES = ['u8', 'u32', 'u64', 'i32', 'i64'] ALL_INT_TYPES = ['u8', 'u32', 'u64', 'i32', 'i64']
COMLETE_INT_TYPES = ['u32', 'u64', 'i32', 'i64']
ALL_FLOAT_TYPES = ['f32', 'f64'] ALL_FLOAT_TYPES = ['f32', 'f64']
TYPE_MAP = { TYPE_MAP = {
@ -45,7 +46,7 @@ def testEntry() -> {type_}:
assert TYPE_MAP[type_] == type(result.returned_value) assert TYPE_MAP[type_] == type(result.returned_value)
@pytest.mark.integration_test @pytest.mark.integration_test
@pytest.mark.parametrize('type_', ALL_INT_TYPES) @pytest.mark.parametrize('type_', COMLETE_INT_TYPES)
def test_addition_int(type_): def test_addition_int(type_):
code_py = f""" code_py = f"""
@exported @exported
@ -73,7 +74,7 @@ def testEntry() -> {type_}:
assert TYPE_MAP[type_] == type(result.returned_value) assert TYPE_MAP[type_] == type(result.returned_value)
@pytest.mark.integration_test @pytest.mark.integration_test
@pytest.mark.parametrize('type_', ALL_INT_TYPES) @pytest.mark.parametrize('type_', COMLETE_INT_TYPES)
def test_subtraction_int(type_): def test_subtraction_int(type_):
code_py = f""" code_py = f"""
@exported @exported
@ -390,8 +391,8 @@ def helper(left: i32, right: i32) -> i32:
assert 7 == result.returned_value assert 7 == result.returned_value
@pytest.mark.integration_test @pytest.mark.integration_test
@pytest.mark.parametrize('type_', COMPLETE_SIMPLE_TYPES) @pytest.mark.parametrize('type_', COMLETE_INT_TYPES)
def test_call_with_expression(type_): def test_call_with_expression_int(type_):
code_py = f""" code_py = f"""
@exported @exported
def testEntry() -> {type_}: def testEntry() -> {type_}:
@ -406,6 +407,23 @@ def helper(left: {type_}, right: {type_}) -> {type_}:
assert 22 == result.returned_value assert 22 == result.returned_value
assert TYPE_MAP[type_] == type(result.returned_value) assert TYPE_MAP[type_] == type(result.returned_value)
@pytest.mark.integration_test
@pytest.mark.parametrize('type_', ALL_FLOAT_TYPES)
def test_call_with_expression_float(type_):
code_py = f"""
@exported
def testEntry() -> {type_}:
return helper(10.078125 + 90.046875, 63.0 + 5.0)
def helper(left: {type_}, right: {type_}) -> {type_}:
return left - right
"""
result = Suite(code_py).run_code()
assert 32.125 == result.returned_value
assert TYPE_MAP[type_] == type(result.returned_value)
@pytest.mark.integration_test @pytest.mark.integration_test
@pytest.mark.skip('Not yet implemented') @pytest.mark.skip('Not yet implemented')
def test_assign(): def test_assign():