Skip to main content

mist_parser/ast/
top_level.rs

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    /// #[test]
15    Path(Path),
16
17    /// #[name = "value"]
18    NameValue { path: Path, value: Literal },
19
20    /// #[derive(Clone, Copy)]
21    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}