oak_racket/parser/
element_type.rs1use crate::lexer::TokenType;
2use oak_core::language::UniversalElementRole;
3
4#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub enum ElementType {
11 Expression,
13
14 Statement,
16
17 For,
19
20 ListComprehension,
22
23 Block,
25 Identifier,
27 Number,
29 String,
31 Boolean,
33 BinaryExpression,
35 UnaryExpression,
37 Call,
39 Index,
41 Tuple,
43 List,
45 Map,
47
48 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}