Skip to main content

oak_hlsl/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4/// Identifier with name and source span.
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[derive(Clone, Debug, PartialEq, Eq, Hash)]
7pub struct Identifier {
8    /// Identifier name.
9    pub name: String,
10    /// Source code span.
11    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
12    pub span: Range<usize>,
13}
14
15/// Root node of the HLSL AST.
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[derive(Clone, Debug, PartialEq, Eq, Hash)]
18pub struct HlslRoot {
19    /// Top-level declarations.
20    pub declarations: Vec<Declaration>,
21}
22
23/// Top-level declaration types in HLSL.
24#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
25#[derive(Clone, Debug, PartialEq, Eq, Hash)]
26pub enum Declaration {
27    /// Function declaration.
28    Function(Function),
29    /// Variable declaration.
30    Variable(Variable),
31    /// Struct declaration.
32    Struct(Struct),
33}
34
35/// Function declaration.
36#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
37#[derive(Clone, Debug, PartialEq, Eq, Hash)]
38pub struct Function {
39    /// Function name.
40    pub name: Identifier,
41    /// Return type.
42    pub return_type: String,
43    /// Function parameters.
44    pub parameters: Vec<Parameter>,
45    /// Source code span.
46    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
47    pub span: Range<usize>,
48}
49
50/// Function parameter.
51#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
52#[derive(Clone, Debug, PartialEq, Eq, Hash)]
53pub struct Parameter {
54    /// Parameter name.
55    pub name: Identifier,
56    /// Parameter type.
57    pub type_name: String,
58    /// Source code span.
59    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
60    pub span: Range<usize>,
61}
62
63/// Variable declaration.
64#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
65#[derive(Clone, Debug, PartialEq, Eq, Hash)]
66pub struct Variable {
67    /// Variable name.
68    pub name: Identifier,
69    /// Variable type.
70    pub type_name: String,
71    /// Source code span.
72    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
73    pub span: Range<usize>,
74}
75
76/// Struct declaration.
77#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
78#[derive(Clone, Debug, PartialEq, Eq, Hash)]
79pub struct Struct {
80    /// Struct name.
81    pub name: Identifier,
82    /// Struct members.
83    pub members: Vec<Variable>,
84    /// Source code span.
85    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
86    pub span: Range<usize>,
87}