Improve Zig AST developer experience
- Convert string-based type discrimination to type-safe enums - ContainerKind (struct, enum, union, opaque) - LiteralKind (int, float, string, char) - LoopKind (for, while) - Remove duplicate AST nodes (consolidated init lists, removed unused types) - Add comprehensive helper functions for all AST constructions - Implement formatters for all AST nodes (expressions, statements, types) - Add typed literal constructors: IntLit, FloatLit, StringLit, CharLit - Improve documentation and add deprecation notices This makes the AST more intuitive and type-safe for developers.
This commit is contained in:
@@ -2,9 +2,10 @@
|
||||
package zig
|
||||
|
||||
// Root is the top-level node of a Zig source file.
|
||||
// It represents the entire compilation unit.
|
||||
type Root struct {
|
||||
ContainerDocComment DocComment // //! Doc Comment (optional)
|
||||
ContainerMembers []*ContainerMember
|
||||
ContainerDocComment DocComment // Module-level doc comment using //!
|
||||
ContainerMembers []*ContainerMember // Top-level declarations and fields
|
||||
}
|
||||
|
||||
type ContainerMember struct {
|
||||
@@ -111,11 +112,21 @@ type ParamDecl struct {
|
||||
Type TypeExpr // 'anytype' if empty
|
||||
}
|
||||
|
||||
// ContainerKind represents the kind of container (struct, enum, union, opaque).
|
||||
type ContainerKind int
|
||||
|
||||
const (
|
||||
ContainerStruct ContainerKind = iota
|
||||
ContainerEnum
|
||||
ContainerUnion
|
||||
ContainerOpaque
|
||||
)
|
||||
|
||||
// ContainerDecl represents a struct, enum, union, or opaque declaration.
|
||||
type ContainerDecl struct {
|
||||
Extern bool
|
||||
Packed bool
|
||||
Kind string // "struct", "enum", "union", "opaque"
|
||||
Kind ContainerKind
|
||||
TagType TypeExpr // Optional (for enum/union)
|
||||
Fields []*ContainerMember
|
||||
DocComment DocComment
|
||||
@@ -226,10 +237,18 @@ type ContinueStmt struct {
|
||||
|
||||
func (*ContinueStmt) isStmt() {}
|
||||
|
||||
// LoopKind represents the kind of loop (for or while).
|
||||
type LoopKind int
|
||||
|
||||
const (
|
||||
LoopFor LoopKind = iota
|
||||
LoopWhile
|
||||
)
|
||||
|
||||
// LoopStmt represents a for/while loop statement.
|
||||
type LoopStmt struct {
|
||||
Inline bool // True if 'inline' is present
|
||||
Kind string // "for" or "while"
|
||||
Kind LoopKind // For or While
|
||||
Prefix LoopPrefix // ForPrefix or WhilePrefix
|
||||
Body Stmt // Loop body
|
||||
Else Stmt // Optional else branch
|
||||
@@ -331,9 +350,19 @@ type Identifier struct {
|
||||
Name string // The identifier name
|
||||
}
|
||||
|
||||
// LiteralKind represents the kind of literal.
|
||||
type LiteralKind int
|
||||
|
||||
const (
|
||||
LiteralInt LiteralKind = iota
|
||||
LiteralFloat
|
||||
LiteralString
|
||||
LiteralChar
|
||||
)
|
||||
|
||||
// Literal represents a literal value (int, float, string, char).
|
||||
type Literal struct {
|
||||
Kind string // "int", "float", "string", "char"
|
||||
Kind LiteralKind
|
||||
Value string // The literal value as a string
|
||||
}
|
||||
|
||||
@@ -391,15 +420,14 @@ type NosuspendExpr struct {
|
||||
Expr Expr // The expression to evaluate with nosuspend
|
||||
}
|
||||
|
||||
// ContinueExpr represents a 'continue' expression.
|
||||
type ContinueExpr struct {
|
||||
Label string // Optional label
|
||||
}
|
||||
|
||||
// Expr is any expression.
|
||||
// This is an empty interface to allow maximum flexibility.
|
||||
// Consider using type switches when working with expressions.
|
||||
type Expr interface{}
|
||||
|
||||
// TypeExpr is any type expression.
|
||||
// This is an empty interface to allow maximum flexibility.
|
||||
// Consider using type switches when working with type expressions.
|
||||
type TypeExpr interface{}
|
||||
|
||||
// PrefixTypeExpr represents a type with a string prefix. Examples include optionals and pointers.
|
||||
@@ -500,43 +528,14 @@ type AwaitExpr struct {
|
||||
// UnreachableExpr represents the 'unreachable' keyword.
|
||||
type UnreachableExpr struct{}
|
||||
|
||||
// EmptyInitListExpr represents an empty initializer list '{}'.
|
||||
type EmptyInitListExpr struct{}
|
||||
|
||||
// PositionalInitListExpr represents a positional initializer list '{expr, ...}'.
|
||||
type PositionalInitListExpr struct {
|
||||
Values []Expr // Expressions in order
|
||||
}
|
||||
|
||||
// FieldInitListExpr represents a field initializer list '{.field = expr, ...}'.
|
||||
type FieldInitListExpr struct {
|
||||
Fields []*FieldInit // Field initializers
|
||||
}
|
||||
|
||||
// SwitchProngPayload represents a switch prong payload (|*x, y|).
|
||||
type SwitchProngPayload struct {
|
||||
Pointer bool
|
||||
Names []string
|
||||
}
|
||||
|
||||
// SwitchProngCase represents a single case in a switch prong.
|
||||
type SwitchProngCase struct {
|
||||
Expr Expr // The case expression
|
||||
To Expr // Optional, for ranges
|
||||
}
|
||||
|
||||
// SwitchProngFull represents a full switch prong with cases and payload.
|
||||
type SwitchProngFull struct {
|
||||
Inline bool
|
||||
Cases []*SwitchProngCase // One or more cases
|
||||
Payload *SwitchProngPayload // Optional
|
||||
Expr Expr // The result expression
|
||||
}
|
||||
|
||||
// SwitchElseProng represents an 'else' prong in a switch.
|
||||
type SwitchElseProng struct {
|
||||
Expr Expr // The result expression
|
||||
}
|
||||
// Note: The following types were removed as they were duplicates:
|
||||
// - EmptyInitListExpr (use InitListExpr with Empty=true)
|
||||
// - PositionalInitListExpr (use InitListExpr with Values)
|
||||
// - FieldInitListExpr (use InitListExpr with Fields)
|
||||
// - SwitchProngPayload (use Payload)
|
||||
// - SwitchProngCase (use SwitchCase)
|
||||
// - SwitchProngFull (use SwitchProng)
|
||||
// - SwitchElseProng (use SwitchProng with SwitchCase.IsElse=true)
|
||||
|
||||
// VarPattern represents a variable pattern for destructuring or multiple variable declarations.
|
||||
type VarPattern struct {
|
||||
|
Reference in New Issue
Block a user