feat: struct方法 impl (P1 #9)

- lexer: TOK_IMPL 关键字
- ast: AST_IMPL_BLOCK, AST_METHOD_CALL + AST_PROGRAM impls数组
- parser: impl StructName { fn ... } + p.method() 方法调用
- sema: 方法名mangle(StructName$method), self参数, 类型检查
- codegen: METHOD_CALL→mangled函数调用(recv为第一参数)
- 新增集成测试: 19_struct_method.l

P1 4项全部完成: type alias + enum + array + impl
测试: 145 通过 (41+15+65+24)
This commit is contained in:
2026-06-05 14:30:24 +08:00
parent 2923e7574d
commit 9f6e695ba8
11 changed files with 340 additions and 20 deletions
+23 -1
View File
@@ -13,7 +13,8 @@
AstNode* ast_make_program(void* alloc, AstNode** fns, size_t fn_count,
AstNode** structs, size_t struct_count,
AstNode** aliases, size_t alias_count,
AstNode** enums, size_t enum_count, SourceLoc loc) {
AstNode** enums, size_t enum_count,
AstNode** impls, size_t impl_count, SourceLoc loc) {
NEW(alloc, AST_PROGRAM);
n->as.program.functions = fns;
n->as.program.fn_count = fn_count;
@@ -23,6 +24,8 @@ AstNode* ast_make_program(void* alloc, AstNode** fns, size_t fn_count,
n->as.program.alias_count = alias_count;
n->as.program.enums = enums;
n->as.program.enum_count = enum_count;
n->as.program.impls = impls;
n->as.program.impl_count = impl_count;
return n;
}
@@ -221,3 +224,22 @@ AstNode* ast_make_array_assign(void* alloc, const char* name, AstNode* index, As
n->as.array_assign.value = value;
return n;
}
AstNode* ast_make_impl_block(void* alloc, const char* struct_name, AstNode** methods,
size_t count, SourceLoc loc) {
NEW(alloc, AST_IMPL_BLOCK);
n->as.impl_block.struct_name = struct_name;
n->as.impl_block.methods = methods;
n->as.impl_block.method_count = count;
return n;
}
AstNode* ast_make_method_call(void* alloc, AstNode* receiver, const char* method,
AstNode** args, size_t count, SourceLoc loc) {
NEW(alloc, AST_METHOD_CALL);
n->as.method_call.receiver = receiver;
n->as.method_call.method_name = method;
n->as.method_call.args = args;
n->as.method_call.arg_count = count;
return n;
}