Skip to main content

oak_d/ast/
mod.rs

1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4/// Represents an identifier in D source code.
5#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
6pub struct Identifier {
7    /// The textual name of the identifier
8    pub name: String,
9    /// Source code span where this identifier appears
10    #[serde(with = "oak_core::serde_range")]
11    pub span: Range<usize>,
12}
13
14/// Strongly-typed AST root node representing the entire D source file.
15#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
16pub struct DRoot {
17    /// Collection of top-level items in the D file
18    pub items: Vec<Item>,
19}
20
21/// Top-level items that can appear in a D source file.
22#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
23pub enum Item {
24    /// A module declaration
25    Module(Module),
26    /// An import declaration
27    Import(Import),
28    /// A class definition
29    Class(Class),
30    /// A struct definition
31    Struct(Struct),
32    /// A function definition
33    Function(Function),
34}
35
36/// Represents a module declaration in D.
37#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
38pub struct Module {
39    pub name: Identifier,
40    #[serde(with = "oak_core::serde_range")]
41    pub span: Range<usize>,
42}
43
44/// Represents an import declaration in D.
45#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
46pub struct Import {
47    pub path: Vec<Identifier>,
48    #[serde(with = "oak_core::serde_range")]
49    pub span: Range<usize>,
50}
51
52/// Represents a class definition in D.
53#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
54pub struct Class {
55    pub name: Identifier,
56    #[serde(with = "oak_core::serde_range")]
57    pub span: Range<usize>,
58}
59
60/// Represents a struct definition in D.
61#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
62pub struct Struct {
63    pub name: Identifier,
64    #[serde(with = "oak_core::serde_range")]
65    pub span: Range<usize>,
66}
67
68/// Represents a function definition in D.
69#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
70pub struct Function {
71    pub name: Identifier,
72    #[serde(with = "oak_core::serde_range")]
73    pub span: Range<usize>,
74}