From e3e7c60dd75ef0f06a25ddde2685868062302eeb Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sun, 24 Aug 2025 17:33:19 -0400 Subject: Move method calls --- src/compile.c | 41 +---------------------------------------- 1 file changed, 1 insertion(+), 40 deletions(-) (limited to 'src/compile.c') diff --git a/src/compile.c b/src/compile.c index 4aba2008..6c10c763 100644 --- a/src/compile.c +++ b/src/compile.c @@ -305,46 +305,7 @@ Text_t compile(env_t *env, ast_t *ast) { else return compile(env, WrapAST(ast, List, .items = new (ast_list_t, .ast = ast))); } case Lambda: return compile_lambda(env, ast); - case MethodCall: { - DeclareMatch(call, ast, MethodCall); - type_t *self_t = get_type(env, call->self); - - if (streq(call->name, "serialized")) { - if (call->args) code_err(ast, ".serialized() doesn't take any arguments"); - return Texts("generic_serialize((", compile_declaration(self_t, Text("[1]")), "){", - compile(env, call->self), "}, ", compile_type_info(self_t), ")"); - } - - type_t *self_value_t = value_type(self_t); - if (self_value_t->tag == TypeInfoType || self_value_t->tag == ModuleType) { - return compile(env, - WrapAST(ast, FunctionCall, - .fn = WrapAST(call->self, FieldAccess, .fielded = call->self, .field = call->name), - .args = call->args)); - } - - type_t *field_type = get_field_type(self_value_t, call->name); - if (field_type && field_type->tag == ClosureType) field_type = Match(field_type, ClosureType)->fn; - if (field_type && field_type->tag == FunctionType) - return compile(env, - WrapAST(ast, FunctionCall, - .fn = WrapAST(call->self, FieldAccess, .fielded = call->self, .field = call->name), - .args = call->args)); - - switch (self_value_t->tag) { - case ListType: return compile_list_method_call(env, ast); - case SetType: return compile_set_method_call(env, ast); - case TableType: return compile_table_method_call(env, ast); - default: { - DeclareMatch(methodcall, ast, MethodCall); - type_t *fn_t = get_method_type(env, methodcall->self, methodcall->name); - arg_ast_t *args = new (arg_ast_t, .value = methodcall->self, .next = methodcall->args); - binding_t *b = get_namespace_binding(env, methodcall->self, methodcall->name); - if (!b) code_err(ast, "No such method"); - return Texts(b->code, "(", compile_arguments(env, ast, Match(fn_t, FunctionType)->args, args), ")"); - } - } - } + case MethodCall: return compile_method_call(env, ast); case FunctionCall: return compile_function_call(env, ast); case Deserialize: { ast_t *value = Match(ast, Deserialize)->value; -- cgit v1.2.3