Skip to main content

oak_d/ast/
mod.rs

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