Skip to main content

oak_delphi/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4/// Identifier in Delphi
5#[derive(Debug, PartialEq, Eq, Clone)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct Identifier {
8    /// The name of the identifier.
9    pub name: String,
10    /// The span of the identifier in the source text.
11    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
12    pub span: Range<usize>,
13}
14
15/// Delphi AST root node.
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[derive(Debug, Clone, PartialEq)]
18pub struct DelphiRoot {
19    /// Items in the Delphi source.
20    pub items: Vec<DelphiItem>,
21    /// Source span.
22    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
23    pub span: core::range::Range<usize>,
24}
25
26impl DelphiRoot {
27    /// Creates a new `DelphiRoot`.
28    pub fn new(items: Vec<DelphiItem>, span: core::range::Range<usize>) -> Self {
29        Self { items, span }
30    }
31}
32
33/// Top-level items in Delphi language
34#[derive(Debug, PartialEq, Clone)]
35#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
36pub enum DelphiItem {
37    /// A Delphi program.
38    Program(DelphiProgram),
39    /// A Delphi unit.
40    Unit(DelphiUnit),
41    /// A Delphi statement.
42    Statement(DelphiStatement),
43}
44
45/// Represents a Delphi program
46#[derive(Debug, PartialEq, Clone)]
47#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
48pub struct DelphiProgram {
49    /// The name of the program.
50    pub name: Identifier,
51    /// The statements in the program.
52    pub statements: Vec<DelphiStatement>,
53    /// The span of the program in the source text.
54    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
55    pub span: Range<usize>,
56}
57
58/// Represents a Delphi unit
59#[derive(Debug, PartialEq, Clone)]
60#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
61pub struct DelphiUnit {
62    /// The name of the unit.
63    pub name: Identifier,
64    /// The interface section of the unit.
65    pub interface_section: Vec<DelphiStatement>,
66    /// The implementation section of the unit.
67    pub implementation_section: Vec<DelphiStatement>,
68    /// The span of the unit in the source text.
69    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70    pub span: Range<usize>,
71}
72
73/// Represents various statements in Delphi language
74#[derive(Debug, PartialEq, Clone)]
75#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
76pub enum DelphiStatement {
77    /// Empty statement
78    Empty {
79        /// The span of the empty statement.
80        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
81        span: Range<usize>,
82    },
83}