Skip to main content

oak_valkyrie/ast/
types_nodes.rs

1use super::{Expr, Identifier, NamePath, Span};
2
3/// A type expression
4#[derive(Debug, Clone, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum Type {
7    /// A named type (e.g., `String`, `i32`).
8    Named {
9        /// The type name path.
10        path: NamePath,
11        /// The source code span.
12        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
13        span: Span,
14    },
15    /// A generic type parameter.
16    Generic {
17        /// The generic parameter name.
18        name: Identifier,
19        /// The source code span.
20        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
21        span: Span,
22    },
23    /// A tuple type.
24    Tuple {
25        /// The element types.
26        elements: Vec<Type>,
27        /// The source code span.
28        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
29        span: Span,
30    },
31    /// A function type.
32    Function {
33        /// The parameter types.
34        params: Vec<Type>,
35        /// The return type.
36        return_type: Box<Type>,
37        /// The source code span.
38        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
39        span: Span,
40    },
41    /// An optional type.
42    Optional {
43        /// The inner type.
44        inner: Box<Type>,
45        /// The source code span.
46        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
47        span: Span,
48    },
49    /// An associated type projection (e.g., `Self::Item`, `T::Output`).
50    AssociatedType {
51        /// The base type (e.g., `Self` or a type parameter name).
52        base: Identifier,
53        /// The associated type name.
54        name: Identifier,
55        /// The source code span.
56        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
57        span: Span,
58    },
59    /// A qualified associated type (e.g., `<T as Trait>::Item`).
60    QualifiedAssociatedType {
61        /// The type being projected from.
62        ty: Box<Type>,
63        /// The trait providing the associated type.
64        trait_path: NamePath,
65        /// The associated type name.
66        name: Identifier,
67        /// The source code span.
68        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
69        span: Span,
70    },
71}
72
73/// A generic parameter
74#[derive(Debug, Clone, PartialEq, Eq, Hash)]
75#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
76pub struct GenericParam {
77    /// The generic parameter name.
78    pub name: Identifier,
79    /// Type constraints (bounds) for the generic parameter.
80    pub constraints: Vec<Type>,
81    /// Default type for the generic parameter.
82    pub default: Option<Type>,
83    /// The source code span.
84    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
85    pub span: Span,
86}
87
88/// A function parameter
89#[derive(Debug, Clone, PartialEq, Eq, Hash)]
90#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
91pub struct Param {
92    /// The parameter name.
93    pub name: Identifier,
94    /// Optional type annotation.
95    pub ty: Option<Type>,
96    /// Optional default value expression.
97    pub default: Option<Expr>,
98    /// The source code span.
99    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
100    pub span: Span,
101}