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
+12 -2
View File
@@ -28,6 +28,8 @@ typedef enum {
AST_ENUM_VARIANT, // Color::Red
AST_INDEX_EXPR, // arr[i]
AST_ARRAY_ASSIGN_STMT,// arr[i] = expr
AST_IMPL_BLOCK, // impl StructName { fn method(...) ... }
AST_METHOD_CALL, // receiver.method(args)
} AstKind;
typedef enum {
@@ -58,7 +60,8 @@ struct AstNode {
struct { struct AstNode** functions; size_t fn_count;
struct AstNode** structs; size_t struct_count;
struct AstNode** type_aliases; size_t alias_count;
struct AstNode** enums; size_t enum_count; } program;
struct AstNode** enums; size_t enum_count;
struct AstNode** impls; size_t impl_count; } program;
// AST_FUNCTION
struct { const char* name; struct AstNode** params; size_t param_count;
TypeKind return_type; const char* return_struct_type_name;
@@ -108,6 +111,10 @@ struct AstNode {
struct { struct AstNode* array; struct AstNode* index; } index_expr;
// AST_ARRAY_ASSIGN_STMT
struct { const char* name; struct AstNode* index; struct AstNode* value; } array_assign;
// AST_IMPL_BLOCK
struct { const char* struct_name; struct AstNode** methods; size_t method_count; } impl_block;
// AST_METHOD_CALL
struct { struct AstNode* receiver; const char* method_name; struct AstNode** args; size_t arg_count; } method_call;
} as;
};
@@ -115,7 +122,8 @@ struct AstNode {
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);
AstNode* ast_make_function(void* alloc, const char* name, AstNode** params, size_t pcount,
TypeKind ret, const char* ret_struct_name, AstNode* body, SourceLoc loc);
AstNode* ast_make_parameter(void* alloc, const char* name, TypeKind type, const char* struct_type_name, SourceLoc loc);
@@ -145,5 +153,7 @@ AstNode* ast_make_enum_decl(void* alloc, const char* name, const char** variants
AstNode* ast_make_enum_variant(void* alloc, const char* enum_name, const char* variant_name, SourceLoc loc);
AstNode* ast_make_index_expr(void* alloc, AstNode* array, AstNode* index, SourceLoc loc);
AstNode* ast_make_array_assign(void* alloc, const char* name, AstNode* index, AstNode* value, SourceLoc loc);
AstNode* ast_make_impl_block(void* alloc, const char* struct_name, AstNode** methods, size_t count, SourceLoc loc);
AstNode* ast_make_method_call(void* alloc, AstNode* receiver, const char* method, AstNode** args, size_t count, SourceLoc loc);
#endif