Skip to main content

oak_delphi/ast/
mod.rs

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