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