use serde::Serialize; #[derive(Debug, Clone, Serialize)] pub struct Identifier(pub String); #[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, RefLifetime(Identifier), RefMutLifetime(Identifier), } #[derive(Debug, Clone, Serialize)] pub enum Visibility { Public, PublicTarget(Path), 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), Lifetime(Identifier), } #[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(Visibility, Path), Mod(Visibility, Identifier), ImplDecl(ImplDecl), TraitDecl { visibility: Visibility, name: Identifier, generics: Generics, requirements: Vec, items: Vec, }, EnumDecl { visibility: Visibility, name: Identifier, generics: Generics, fields: Vec, }, StructDecl { visibility: Visibility, name: Identifier, generics: Generics, fields: Vec, }, FunctionDecl(FunctionDecl), ClassDecl { visibility: Visibility, name: Identifier, generics: Generics, fields: Vec, constructor: ClassConstructor, items: Vec, }, } #[derive(Debug, Clone, Serialize)] pub enum ClassItem { Method(FunctionDecl), ImplDecl(ImplDecl), } #[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, Vec), } #[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: Option, } #[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 ImplDecl { pub generics: Generics, pub target: TypeExpr, pub trait_: Option, pub methods: Vec, } #[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 FieldDecl { pub visibility: Visibility, pub type_: TypeExpr, pub name: Identifier, } #[derive(Debug, Clone, Serialize)] pub struct FieldDeclStmt { pub decl: FieldDecl, 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), }