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:
+12
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user