1use oak_core::{ElementType, UniversalElementRole};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum SchemeElementType {
7 SourceFile,
9 Whitespace,
11 Newline,
13 Comment,
15 LineComment,
17 NumberLiteral,
19 StringLiteral,
21 CharacterLiteral,
23 BooleanLiteral,
25 Identifier,
27 Symbol,
29 Keyword,
31 Define,
33 Lambda,
35 If,
37 Cond,
39 Case,
41 Let,
43 LetStar,
45 Letrec,
47 Begin,
49 Do,
51 Quote,
53 Quasiquote,
55 Unquote,
57 UnquoteSplicing,
59 And,
61 Or,
63 Not,
65 Set,
67 LeftParen,
69 RightParen,
71 LeftBracket,
73 RightBracket,
75 LeftBrace,
77 RightBrace,
79 Dot,
81 Hash,
83 Quote_,
85 Quasiquote_,
87 Unquote_,
89 UnquoteSplicing_,
91 List,
93 Quotation,
95 Error,
97 Eof,
99}
100
101impl ElementType for SchemeElementType {
102 type Role = UniversalElementRole;
103
104 fn role(&self) -> Self::Role {
105 match self {
106 Self::SourceFile => UniversalElementRole::Root,
107 Self::Error => UniversalElementRole::Error,
108 Self::List => UniversalElementRole::Expression,
109 Self::Quotation => UniversalElementRole::Expression,
110 _ => UniversalElementRole::None,
111 }
112 }
113}
114
115impl From<crate::lexer::token_type::SchemeTokenType> for SchemeElementType {
116 fn from(token: crate::lexer::token_type::SchemeTokenType) -> Self {
117 use crate::lexer::token_type::SchemeTokenType as T;
118 match token {
119 T::SourceFile => SchemeElementType::SourceFile,
120 T::Whitespace => SchemeElementType::Whitespace,
121 T::Newline => SchemeElementType::Newline,
122 T::Comment => SchemeElementType::Comment,
123 T::LineComment => SchemeElementType::LineComment,
124 T::NumberLiteral => SchemeElementType::NumberLiteral,
125 T::StringLiteral => SchemeElementType::StringLiteral,
126 T::CharacterLiteral => SchemeElementType::CharacterLiteral,
127 T::BooleanLiteral => SchemeElementType::BooleanLiteral,
128 T::Identifier => SchemeElementType::Identifier,
129 T::Symbol => SchemeElementType::Symbol,
130 T::Keyword => SchemeElementType::Keyword,
131 T::Define => SchemeElementType::Define,
132 T::Lambda => SchemeElementType::Lambda,
133 T::If => SchemeElementType::If,
134 T::Cond => SchemeElementType::Cond,
135 T::Case => SchemeElementType::Case,
136 T::Let => SchemeElementType::Let,
137 T::LetStar => SchemeElementType::LetStar,
138 T::Letrec => SchemeElementType::Letrec,
139 T::Begin => SchemeElementType::Begin,
140 T::Do => SchemeElementType::Do,
141 T::Quote => SchemeElementType::Quote,
142 T::Quasiquote => SchemeElementType::Quasiquote,
143 T::Unquote => SchemeElementType::Unquote,
144 T::UnquoteSplicing => SchemeElementType::UnquoteSplicing,
145 T::And => SchemeElementType::And,
146 T::Or => SchemeElementType::Or,
147 T::Not => SchemeElementType::Not,
148 T::Set => SchemeElementType::Set,
149 T::LeftParen => SchemeElementType::LeftParen,
150 T::RightParen => SchemeElementType::RightParen,
151 T::LeftBracket => SchemeElementType::LeftBracket,
152 T::RightBracket => SchemeElementType::RightBracket,
153 T::LeftBrace => SchemeElementType::LeftBrace,
154 T::RightBrace => SchemeElementType::RightBrace,
155 T::Dot => SchemeElementType::Dot,
156 T::Hash => SchemeElementType::Hash,
157 T::Quote_ => SchemeElementType::Quote_,
158 T::Quasiquote_ => SchemeElementType::Quasiquote_,
159 T::Unquote_ => SchemeElementType::Unquote_,
160 T::UnquoteSplicing_ => SchemeElementType::UnquoteSplicing_,
161 T::Error => SchemeElementType::Error,
162 T::Eof => SchemeElementType::Eof,
163 }
164 }
165}