glsl_lang_pp/last/
token.rs1use crate::{
2 parser::SyntaxKind,
3 processor::event::TokenLike,
4 types::{
5 keywords::KeywordAtom,
6 token::ErrorKind,
7 type_names::{TypeNameAtom, TypeNameState},
8 Token, TypeName,
9 },
10};
11
12pub(super) fn token_from_syntax_kind(
13 value: &impl TokenLike,
14 version: u16,
15 target_vulkan: bool,
16 is_type_name: impl Fn(&TypeNameAtom) -> TypeNameState,
17) -> (Token, Option<TypeNameState>) {
18 use Token::*;
19 let kind = value.kind();
20
21 match kind {
23 SyntaxKind::PP_EMPTY
24 | SyntaxKind::PP_INCLUDE
25 | SyntaxKind::PP_INCLUDE_PATH
26 | SyntaxKind::PP_DEFINE
27 | SyntaxKind::PP_DEFINE_ARGS
28 | SyntaxKind::PP_DEFINE_ARG
29 | SyntaxKind::PP_DEFINE_BODY
30 | SyntaxKind::PP_UNDEF
31 | SyntaxKind::PP_IDENT
32 | SyntaxKind::PP_IF
33 | SyntaxKind::PP_IF_EXPR
34 | SyntaxKind::PP_IFDEF
35 | SyntaxKind::PP_IFNDEF
36 | SyntaxKind::PP_ELSE
37 | SyntaxKind::PP_ELIF
38 | SyntaxKind::PP_ENDIF
39 | SyntaxKind::PP_ERROR
40 | SyntaxKind::PP_ERROR_BODY
41 | SyntaxKind::PP_PRAGMA
42 | SyntaxKind::PP_PRAGMA_BODY
43 | SyntaxKind::PP_EXTENSION
44 | SyntaxKind::PP_VERSION
45 | SyntaxKind::PP_VERSION_NUMBER
46 | SyntaxKind::PP_VERSION_PROFILE
47 | SyntaxKind::PP_LINE
48 | SyntaxKind::PP_LINE_BODY
49 | SyntaxKind::ERROR
50 | SyntaxKind::ROOT
51 | SyntaxKind::_LAST
52 | SyntaxKind::QUOTE_STRING
53 | SyntaxKind::ANGLE_STRING
54 | SyntaxKind::BACKSLASH
55 | SyntaxKind::DEFINED
56 | SyntaxKind::PP_CONCAT
57 | SyntaxKind::PP_CONCAT_OP => {
58 return (ERROR(ErrorKind::InvalidToken), None);
59 }
60 SyntaxKind::IDENT_KW => {}
62 SyntaxKind::DIGITS => {}
63 SyntaxKind::LEFT_OP => {
64 return (LEFT_OP, None);
65 }
66 SyntaxKind::RIGHT_OP => {
67 return (RIGHT_OP, None);
68 }
69 SyntaxKind::INC_OP => {
70 return (INC_OP, None);
71 }
72 SyntaxKind::DEC_OP => {
73 return (DEC_OP, None);
74 }
75 SyntaxKind::LE_OP => {
76 return (LE_OP, None);
77 }
78 SyntaxKind::GE_OP => {
79 return (GE_OP, None);
80 }
81 SyntaxKind::EQ_OP => {
82 return (EQ_OP, None);
83 }
84 SyntaxKind::NE_OP => {
85 return (NE_OP, None);
86 }
87 SyntaxKind::AND_OP => {
88 return (AND_OP, None);
89 }
90 SyntaxKind::OR_OP => {
91 return (OR_OP, None);
92 }
93 SyntaxKind::XOR_OP => {
94 return (XOR_OP, None);
95 }
96 SyntaxKind::MUL_ASSIGN => {
97 return (MUL_ASSIGN, None);
98 }
99 SyntaxKind::DIV_ASSIGN => {
100 return (DIV_ASSIGN, None);
101 }
102 SyntaxKind::ADD_ASSIGN => {
103 return (ADD_ASSIGN, None);
104 }
105 SyntaxKind::MOD_ASSIGN => {
106 return (MOD_ASSIGN, None);
107 }
108 SyntaxKind::LEFT_ASSIGN => {
109 return (LEFT_ASSIGN, None);
110 }
111 SyntaxKind::RIGHT_ASSIGN => {
112 return (RIGHT_ASSIGN, None);
113 }
114 SyntaxKind::AND_ASSIGN => {
115 return (AND_ASSIGN, None);
116 }
117 SyntaxKind::XOR_ASSIGN => {
118 return (XOR_ASSIGN, None);
119 }
120 SyntaxKind::OR_ASSIGN => {
121 return (OR_ASSIGN, None);
122 }
123 SyntaxKind::SUB_ASSIGN => {
124 return (SUB_ASSIGN, None);
125 }
126 SyntaxKind::LPAREN => {
127 return (LPAREN, None);
128 }
129 SyntaxKind::RPAREN => {
130 return (RPAREN, None);
131 }
132 SyntaxKind::LBRACKET => {
133 return (LBRACKET, None);
134 }
135 SyntaxKind::RBRACKET => {
136 return (RBRACKET, None);
137 }
138 SyntaxKind::LBRACE => {
139 return (LBRACE, None);
140 }
141 SyntaxKind::RBRACE => {
142 return (RBRACE, None);
143 }
144 SyntaxKind::PERIOD => {
145 return (PERIOD, None);
146 }
147 SyntaxKind::COMMA => {
148 return (COMMA, None);
149 }
150 SyntaxKind::COLON => {
151 return (COLON, None);
152 }
153 SyntaxKind::EQUAL => {
154 return (EQUAL, None);
155 }
156 SyntaxKind::SEMICOLON => {
157 return (SEMICOLON, None);
158 }
159 SyntaxKind::BANG => {
160 return (BANG, None);
161 }
162 SyntaxKind::DASH => {
163 return (DASH, None);
164 }
165 SyntaxKind::TILDE => {
166 return (TILDE, None);
167 }
168 SyntaxKind::PLUS => {
169 return (PLUS, None);
170 }
171 SyntaxKind::ASTERISK => {
172 return (ASTERISK, None);
173 }
174 SyntaxKind::SLASH => {
175 return (SLASH, None);
176 }
177 SyntaxKind::PERCENT => {
178 return (PERCENT, None);
179 }
180 SyntaxKind::LANGLE => {
181 return (LANGLE, None);
182 }
183 SyntaxKind::RANGLE => {
184 return (RANGLE, None);
185 }
186 SyntaxKind::BAR => {
187 return (BAR, None);
188 }
189 SyntaxKind::CARET => {
190 return (CARET, None);
191 }
192 SyntaxKind::AMPERSAND => {
193 return (AMPERSAND, None);
194 }
195 SyntaxKind::QUESTION => {
196 return (QUESTION, None);
197 }
198 SyntaxKind::HASH => {
199 return (HASH, None);
200 }
201 SyntaxKind::WS | SyntaxKind::NEWLINE => {
202 return (WS, None);
203 }
204 SyntaxKind::COMMENT => {
205 return (COMMENT, None);
206 }
207 }
208
209 let text = value.text().to_string();
211 if kind == SyntaxKind::IDENT_KW {
212 let keyword_atom = KeywordAtom::from(text.as_ref());
214
215 if let Some(keyword) = Token::parse_kw(&keyword_atom) {
216 return (keyword, None);
217 }
218
219 if let Some((type_name, state)) =
221 TypeName::parse(text.as_ref(), version, target_vulkan, is_type_name)
222 {
223 return (TYPE_NAME(type_name), state);
224 }
225
226 (IDENT(text.into()), None)
228 } else if kind == SyntaxKind::DIGITS {
229 (Token::parse_digits(&text), None)
230 } else {
231 unreachable!()
232 }
233}