feat: add algebraic enums (tagged unions) support
- Generate tagged unions in C backend for enums with data
- Add HirEnumVariant type with fields and namedFields
- Support _Tag and _Data field access in sema
- Support enum variant constants (Result_Ok, Result_Err)
- Support _Data union field access (Ok_0, Err_0, etc.)
- Add algebraic_enums.bux example
Example:
enum Result {
Ok(int),
Err(String)
}
let r: Result = Result { tag: Result_Ok };
r.data.Ok_0 = 42;
This commit is contained in:
+6
-1
@@ -124,11 +124,16 @@ type
|
||||
body*: HirNode
|
||||
isPublic*: bool
|
||||
|
||||
HirEnumVariant* = object
|
||||
name*: string
|
||||
fields*: seq[Type] # Positional fields for algebraic enums
|
||||
namedFields*: seq[tuple[name: string, typ: Type]] # Named fields
|
||||
|
||||
HirModule* = object
|
||||
funcs*: seq[HirFunc]
|
||||
externFuncs*: seq[HirFunc] # Functions declared with extern (no body)
|
||||
structs*: seq[tuple[name: string, fields: seq[tuple[name: string, typ: Type]]]]
|
||||
enums*: seq[tuple[name: string, variants: seq[string]]]
|
||||
enums*: seq[tuple[name: string, variants: seq[HirEnumVariant]]]
|
||||
consts*: seq[tuple[name: string, typ: Type, value: HirNode]]
|
||||
|
||||
# Constructor helpers
|
||||
|
||||
Reference in New Issue
Block a user