ast/
item.rs

1use core::fmt;
2
3use interner::Symbol;
4use span::source::FileId;
5use span::{Span, Spanned};
6
7use crate::Path;
8use crate::{types::Type, Block, Expression, Statement};
9
10#[derive(Debug)]
11pub enum VariableConstness {
12    Const(Span),
13    Let(Span),
14}
15
16#[derive(Debug)]
17pub struct Field {
18    pub name: Spanned<Symbol>,
19    pub ty: Type,
20    pub span: Span,
21}
22
23#[derive(Debug)]
24pub struct Param {
25    pub name: Spanned<Symbol>,
26    pub ty: Type,
27    pub span: Span,
28}
29
30#[derive(Debug)]
31pub enum UseTarget {
32    Path(Path),
33    Type(Type),
34}
35
36#[derive(Debug)]
37pub enum ItemKind {
38    Variable {
39        constness: VariableConstness,
40        name: Spanned<Symbol>,
41        ty: Option<Type>,
42        init: Option<Expression>,
43        semicolon: Span,
44    },
45    Function {
46        kw_extern: Option<Span>,
47        kw_fn: Span,
48        name: Spanned<Symbol>,
49        params: Box<[Param]>,
50        variadic_span: Option<Span>,
51        return_type: Option<Type>,
52        body: Option<Block<Statement>>,
53        semicolon: Option<Span>,
54    },
55    Struct {
56        kw_struct: Span,
57        name: Spanned<Symbol>,
58        fields: Block<Field>,
59    },
60    Use {
61        kw_use: Span,
62        src: UseTarget,
63        kw_as: Option<Span>,
64        as_name: Option<Spanned<Symbol>>,
65        semicolon: Span,
66    },
67    Mod(Module),
68}
69
70#[derive(Debug)]
71pub enum ModuleBody {
72    Inline(Block<Item>),
73    Slf(Box<[Item]>, FileId),
74    Extern {
75        semicolon: Span,
76        items: Box<[Item]>,
77        id: FileId,
78    }
79}
80
81#[derive(Debug)]
82pub struct Module {
83    pub name: Spanned<Symbol>,
84    pub span: Span,
85    pub body: ModuleBody,
86}
87
88pub struct Item {
89    pub kind: ItemKind,
90    pub span: Span,
91}
92
93impl fmt::Debug for Item {
94    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:#?}", self.kind) }
95}