Skip to main content

oak_d/ast/
mod.rs

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