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:
+23
-1
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user