Skip to main content

oak_racket/parser/
element_type.rs

1use crate::lexer::TokenType;
2use oak_core::language::UniversalElementRole;
3
4/// Element types for the Racket language parser.
5///
6/// This enum represents all possible element types in Racket,
7/// including expressions, statements, and special constructs.
8#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub enum ElementType {
11    /// Expression element.
12    Expression,
13
14    /// Statement element.
15    Statement,
16
17    /// For loop construct.
18    For,
19
20    /// List comprehension construct.
21    ListComprehension,
22
23    /// Block element.
24    Block,
25    /// Identifier element.
26    Identifier,
27    /// Number literal element.
28    Number,
29    /// String literal element.
30    String,
31    /// Boolean literal element.
32    Boolean,
33    /// Binary expression element.
34    BinaryExpression,
35    /// Unary expression element.
36    UnaryExpression,
37    /// Function call element.
38    Call,
39    /// Index access element.
40    Index,
41    /// Tuple element.
42    Tuple,
43    /// List element.
44    List,
45    /// Map/dictionary element.
46    Map,
47
48    /// End of file marker.
49    Eof,
50}
51
52impl oak_core::language::ElementType for ElementType {
53    type Role = UniversalElementRole;
54
55    fn role(&self) -> Self::Role {
56        match self {
57            ElementType::Expression => UniversalElementRole::Expression,
58            ElementType::Statement => UniversalElementRole::Statement,
59            ElementType::For => UniversalElementRole::Statement,
60            ElementType::ListComprehension => UniversalElementRole::Expression,
61            ElementType::Block => UniversalElementRole::Container,
62            ElementType::Identifier => UniversalElementRole::Reference,
63            ElementType::Number | ElementType::String | ElementType::Boolean => UniversalElementRole::Value,
64            ElementType::BinaryExpression | ElementType::UnaryExpression => UniversalElementRole::Expression,
65            ElementType::Call => UniversalElementRole::Call,
66            ElementType::Index => UniversalElementRole::Expression,
67            ElementType::Tuple | ElementType::List | ElementType::Map => UniversalElementRole::Container,
68            ElementType::Eof => UniversalElementRole::None,
69        }
70    }
71}
72
73impl From<TokenType> for ElementType {
74    fn from(token_type: TokenType) -> Self {
75        match token_type {
76            TokenType::For => ElementType::For,
77            TokenType::In => ElementType::Expression,
78            TokenType::Identifier => ElementType::Identifier,
79            TokenType::Number => ElementType::Number,
80            TokenType::String => ElementType::String,
81            TokenType::Boolean => ElementType::Boolean,
82            TokenType::LParen | TokenType::RParen | TokenType::LBracket | TokenType::RBracket | TokenType::LBrace | TokenType::RBrace | TokenType::Comma | TokenType::Dot | TokenType::Colon | TokenType::Semicolon => ElementType::Expression,
83            TokenType::Plus
84            | TokenType::Minus
85            | TokenType::Multiply
86            | TokenType::Divide
87            | TokenType::Modulo
88            | TokenType::Equals
89            | TokenType::NotEquals
90            | TokenType::LessThan
91            | TokenType::LessThanOrEqual
92            | TokenType::GreaterThan
93            | TokenType::GreaterThanOrEqual
94            | TokenType::And
95            | TokenType::Or
96            | TokenType::Not => ElementType::Expression,
97            TokenType::Comment | TokenType::Whitespace => ElementType::Expression,
98            TokenType::Require | TokenType::Provide | TokenType::Struct | TokenType::Class | TokenType::Match | TokenType::WithHandlers | TokenType::Raise => ElementType::Expression,
99            TokenType::Eof => ElementType::Eof,
100        }
101    }
102}