1use serde::Serialize;
2
3use super::*;
4
5#[derive(Debug, Clone, Serialize)]
6pub enum Visibility {
7 Public,
8 PublicTarget(Path),
9 Private,
10}
11
12#[derive(Debug, Clone, Serialize)]
13pub enum Attribute {
14 Path(Path),
16
17 NameValue { path: Path, value: Literal },
19
20 List { path: Path, items: Vec<Attribute> },
22}
23
24#[derive(Debug, Clone, Serialize)]
25pub struct TopLevel(pub Spanned<TopLevelKind>, pub Vec<Attribute>);
26
27#[derive(Debug, Clone, Serialize)]
28pub enum TopLevelKind {
29 ModAttribute,
30 Import(Visibility, Path),
31 Mod(Visibility, Identifier),
32 ImplDecl(ImplDecl),
33 TraitDecl {
34 visibility: Visibility,
35 name: Identifier,
36 generics: GenericsDecl,
37 requirements: Vec<TypeExpr>,
38 items: Vec<Spanned<FunctionDecl>>,
39 },
40 EnumDecl {
41 visibility: Visibility,
42 name: Identifier,
43 generics: GenericsDecl,
44 fields: Vec<Spanned<EnumItem>>,
45 },
46 StructDecl {
47 visibility: Visibility,
48 name: Identifier,
49 generics: GenericsDecl,
50 fields: Vec<Spanned<FieldDecl>>,
51 },
52 FunctionDecl(FunctionDecl),
53 ClassDecl {
54 visibility: Visibility,
55 name: Identifier,
56 generics: GenericsDecl,
57 fields: Vec<Spanned<FieldDeclStmt>>,
58 constructor: Spanned<ClassConstructor>,
59 items: Vec<ClassItem>,
60 },
61}
62
63#[derive(Debug, Clone, Serialize)]
64pub enum ClassItem {
65 Method(Spanned<FunctionDecl>),
66 ImplDecl(Spanned<ImplDecl>),
67}
68
69#[derive(Debug, Clone, Serialize, Default)]
70pub struct GenericsDecl(pub Vec<GenericDecl>);
71
72#[derive(Debug, Clone, Serialize)]
73pub enum GenericDecl {
74 Lifetime(Identifier),
75 Type(Identifier, Vec<TypeExpr>),
76}
77
78#[derive(Debug, Clone, Serialize)]
79pub enum EnumItem {
80 Named(Identifier),
81 Tuple(Identifier, Vec<TypeExpr>),
82 Struct(Identifier, Vec<FieldDecl>),
83}
84
85#[derive(Debug, Clone, Serialize)]
86pub struct ClassConstructor {
87 pub visibility: Visibility,
88 pub generics: GenericsDecl,
89 pub params: ParamList,
90 pub body: Block,
91}
92
93#[derive(Debug, Clone, Serialize)]
94pub struct FunctionDecl {
95 pub visibility: Visibility,
96 pub name: Identifier,
97 pub generics: GenericsDecl,
98 pub params: ParamList,
99 pub return_type: TypeExpr,
100 pub body: Option<Block>,
101}
102
103#[derive(Debug, Clone, Serialize)]
104pub struct ImplDecl {
105 pub generics: GenericsDecl,
106 pub target: TypeExpr,
107 pub trait_: Option<TypeExpr>,
108 pub methods: Vec<Spanned<FunctionDecl>>,
109}
110
111#[derive(Debug, Clone, Serialize)]
112pub struct FieldDecl {
113 pub visibility: Visibility,
114 pub type_: TypeExpr,
115 pub name: Identifier,
116}
117
118#[derive(Debug, Clone, Serialize)]
119pub struct FieldDeclStmt {
120 pub decl: FieldDecl,
121 pub init: Option<Expression>,
122}