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}