use serde::Serialize; #[derive(Debug, Clone, Serialize)] pub struct Identifier(pub String); #[derive(Debug, Clone, Serialize, Default)] pub struct FieldList(pub Vec<(Identifier, Visibility, TypeExpr)>); #[derive(Debug, Clone, Serialize, Default)] pub struct ParamList(pub Vec); #[derive(Debug, Clone, Serialize, Default)] pub struct Block(pub Vec); #[derive(Debug, Clone, Serialize)] pub enum TypePostfix { Ref, RefMut, } #[derive(Debug, Clone, Serialize)] pub enum Visibility { Public, Private, } #[derive(Debug, Clone, Serialize)] pub enum Attribute { /// #[test] Path(Path), /// #[name = "value"] NameValue { path: Path, value: Literal }, /// #[derive(Clone, Copy)] List { path: Path, items: Vec }, } #[derive(Debug, Clone, Serialize)] pub enum TypeExprKind { Path(Path), PathParams(Path, Vec), Tuple(Vec), } #[derive(Debug, Clone, Serialize)] pub struct TypeExpr(pub TypeExprKind, pub Vec); #[derive(Debug, Clone, Serialize)] pub struct Path(pub Vec); #[derive(Debug, Clone, Serialize)] pub enum BinaryOp { Plus, Minus, Multiply, Divide, Modulo, Equal, NotEqual, LessThan, GreaterThan, LessThanOrEqual, GreaterThanOrEqual, And, Or, } #[derive(Debug, Clone, Serialize)] pub struct TopLevel(pub TopLevelKind, pub Vec); #[derive(Debug, Clone, Serialize)] pub enum TopLevelKind { ModAttribute, Import(Path), Mod(Identifier), EnumDecl { visibility: Visibility, name: Identifier, generics: Generics, fields: Vec, }, StructDecl { visibility: Visibility, generics: Generics, name: Identifier, fields: FieldList, }, FunctionDecl(FunctionDecl), ClassDecl { visibility: Visibility, name: Identifier, generics: Generics, fields: Vec, constructor: ClassConstructor, methods: Vec, }, } #[derive(Debug, Clone, Serialize, Default)] pub struct Generics(pub Vec); #[derive(Debug, Clone, Serialize)] pub enum Generic { Lifetime(Identifier), Type(Identifier, Vec), } #[derive(Debug, Clone, Serialize)] pub enum Pattern { NamedTuple(Path, Vec), Struct(Path, Vec), Tuple(Vec), Literal(Literal), Path(Path), Id(Identifier), } #[derive(Debug, Clone, Serialize)] pub enum EnumItem { Named(Identifier), Tuple(Identifier, Vec), Struct(Identifier, FieldList), } #[derive(Debug, Clone, Serialize)] pub struct ClassConstructor { pub visibility: Visibility, pub generics: Generics, pub params: ParamList, pub body: Block, } #[derive(Debug, Clone, Serialize)] pub struct FunctionDecl { pub visibility: Visibility, pub name: Identifier, pub generics: Generics, pub params: ParamList, pub return_type: TypeExpr, pub body: Block, } #[derive(Debug, Clone, Serialize)] pub enum Postfix { FieldAccess(Identifier), Call(Vec), MacroCall(String), StructCall(Vec<(Identifier, Expression)>), Index(Expression), Binary(BinaryOp, Expression), } #[derive(Debug, Clone, Serialize)] pub enum Prefix { Ref, RefMut, Deref, New, Not, } #[derive(Debug, Clone, Serialize)] pub enum Statement { Expression(Expression), Block(Block), VarDecl(VarDeclStmt), VarAssign(VarAssignStmt), If { initial: StatementBranch, else_if: Vec, else_branch: Option>, }, While(StatementBranch), CStyleFor { init: Box, condition: Expression, update: Box, body: Box, }, For { mutable: bool, pattern: Pattern, iterator: Expression, body: Box, }, Match(Expression, Vec<(Pattern, Block)>), Return(Option), Break, Continue, } #[derive(Debug, Clone, Serialize)] pub struct VarDecl { pub mutable: bool, pub name: Pattern, pub type_: Option, } #[derive(Debug, Clone, Serialize)] pub struct VarDeclStmt { pub decl: VarDecl, pub init: Option, } #[derive(Debug, Clone, Serialize)] pub struct VarAssignStmt { pub target: Expression, pub value: Expression, } #[derive(Debug, Clone, Serialize)] pub struct StatementBranch { pub condition: Expression, pub body: Box, } #[derive(Debug, Clone, Serialize)] pub enum Expression { Literal(Literal), Path(Path), Fix { initial: Box, prefixes: Vec, postfixes: Vec, }, } #[derive(Debug, Clone, Serialize)] pub enum Literal { String(String), Int(i64), Float(f64), Bool(bool), Tuple(Vec), }