Skip to main content

oak_clojure/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2
3/// Element types for Clojure AST.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum ClojureElementType {
7    /// Generic token element.
8    Token,
9    /// List element.
10    List,
11    /// Vector element.
12    Vector,
13    /// Map element.
14    Map,
15    /// Set element.
16    Set,
17    /// Anonymous function element.
18    AnonFn,
19    /// Quotation element.
20    Quotation,
21    /// Metadata element.
22    Meta,
23    /// Root element.
24    Root,
25    /// Source file element.
26    SourceFile,
27    /// Error element.
28    Error,
29}
30
31impl ElementType for ClojureElementType {
32    type Role = UniversalElementRole;
33
34    fn role(&self) -> Self::Role {
35        match self {
36            Self::Root => UniversalElementRole::Root,
37            Self::SourceFile => UniversalElementRole::Root,
38            Self::Error => UniversalElementRole::Error,
39            Self::List | Self::Vector | Self::Map | Self::Set | Self::AnonFn | Self::Quotation | Self::Meta => UniversalElementRole::Expression,
40            _ => UniversalElementRole::None,
41        }
42    }
43}
44
45impl From<crate::lexer::token_type::ClojureTokenType> for ClojureElementType {
46    fn from(token: crate::lexer::token_type::ClojureTokenType) -> Self {
47        use crate::lexer::token_type::ClojureTokenType as T;
48        match token {
49            T::Token => Self::Token,
50            T::List => Self::List,
51            T::Vector => Self::Vector,
52            T::Map => Self::Map,
53            T::Set => Self::Set,
54            T::AnonFn => Self::AnonFn,
55            T::Root => Self::Root,
56            T::SourceFile => Self::SourceFile,
57            T::Error => Self::Error,
58            T::ListStart => Self::Token,
59            T::ListEnd => Self::Token,
60            T::VectorStart => Self::Token,
61            T::VectorEnd => Self::Token,
62            T::MapStart => Self::Token,
63            T::MapEnd => Self::Token,
64            T::SetStart => Self::Token,
65            T::AnonFnStart => Self::Token,
66            T::Quote => Self::Token,
67            T::Unquote => Self::Token,
68            T::UnquoteSplice => Self::Token,
69            T::Meta => Self::Token,
70            T::Whitespace => Self::Token,
71            T::Comment => Self::Token,
72            T::StringLiteral => Self::Token,
73            T::CharacterLiteral => Self::Token,
74            T::NumberLiteral => Self::Token,
75            T::KeywordLiteral => Self::Token,
76            T::Dispatch => Self::Token,
77            T::RegexLiteral => Self::Token,
78            T::Symbol => Self::Token,
79        }
80    }
81}