1use glsl_lang::ast;
4use proc_macro2::TokenStream;
5use quote::{quote, ToTokens};
6use std::{iter::once, str::FromStr};
7
8use crate::quoted::Quoted;
9
10pub trait Tokenize {
12 fn tokenize(&self, stream: &mut TokenStream);
14}
15
16impl Tokenize for bool {
17 fn tokenize(&self, stream: &mut TokenStream) {
18 self.to_tokens(stream)
19 }
20}
21
22impl Tokenize for i32 {
23 fn tokenize(&self, stream: &mut TokenStream) {
24 self.to_tokens(stream)
25 }
26}
27
28impl Tokenize for u32 {
29 fn tokenize(&self, stream: &mut TokenStream) {
30 self.to_tokens(stream)
31 }
32}
33
34impl Tokenize for f32 {
35 fn tokenize(&self, stream: &mut TokenStream) {
36 self.to_tokens(stream)
37 }
38}
39
40impl Tokenize for f64 {
41 fn tokenize(&self, stream: &mut TokenStream) {
42 self.to_tokens(stream)
43 }
44}
45
46macro_rules! impl_tokenize {
47 ($type_name:ty, $tokenizer:ident) => {
48 impl Tokenize for $type_name {
49 fn tokenize(&self, stream: &mut TokenStream) {
50 stream.extend(once($tokenizer(self)))
51 }
52 }
53 };
54}
55
56impl_tokenize!(ast::TypeName, tokenize_type_name);
57impl_tokenize!(
58 ast::TypeSpecifierNonArray,
59 tokenize_type_specifier_non_array
60);
61impl_tokenize!(ast::TypeSpecifier, tokenize_type_specifier);
62impl_tokenize!(ast::UnaryOp, tokenize_unary_op);
63impl_tokenize!(ast::StructFieldSpecifier, tokenize_struct_field);
64impl_tokenize!(ast::StructSpecifier, tokenize_struct_non_declaration);
65impl_tokenize!(ast::StorageQualifier, tokenize_storage_qualifier);
66impl_tokenize!(ast::LayoutQualifier, tokenize_layout_qualifier);
67impl_tokenize!(ast::PrecisionQualifier, tokenize_precision_qualifier);
68impl_tokenize!(
69 ast::InterpolationQualifier,
70 tokenize_interpolation_qualifier
71);
72impl_tokenize!(ast::TypeQualifier, tokenize_type_qualifier);
73impl_tokenize!(ast::TypeQualifierSpec, tokenize_type_qualifier_spec);
74impl_tokenize!(ast::FullySpecifiedType, tokenize_fully_specified_type);
75impl_tokenize!(ast::ArraySpecifier, tokenize_array_spec);
76impl_tokenize!(ast::Expr, tokenize_expr);
77impl_tokenize!(ast::Declaration, tokenize_declaration);
78impl_tokenize!(ast::FunctionPrototype, tokenize_function_prototype);
79impl_tokenize!(ast::InitDeclaratorList, tokenize_init_declarator_list);
80impl_tokenize!(ast::SingleDeclaration, tokenize_single_declaration);
81impl_tokenize!(ast::Initializer, tokenize_initializer);
82impl_tokenize!(ast::FunIdentifier, tokenize_function_identifier);
83impl_tokenize!(ast::AssignmentOp, tokenize_assignment_op);
84impl_tokenize!(ast::ExprStatement, tokenize_expr_statement);
85impl_tokenize!(ast::SelectionStatement, tokenize_selection_statement);
86impl_tokenize!(ast::SwitchStatement, tokenize_switch_statement);
87impl_tokenize!(ast::CaseLabel, tokenize_case_label);
88impl_tokenize!(ast::IterationStatement, tokenize_iteration_statement);
89impl_tokenize!(ast::JumpStatement, tokenize_jump_statement);
90impl_tokenize!(ast::Condition, tokenize_condition);
91impl_tokenize!(ast::Statement, tokenize_statement);
92impl_tokenize!(ast::CompoundStatement, tokenize_compound_statement);
93impl_tokenize!(ast::FunctionDefinition, tokenize_function_definition);
94impl_tokenize!(ast::ExternalDeclaration, tokenize_external_declaration);
95impl_tokenize!(ast::TranslationUnit, tokenize_translation_unit);
96impl_tokenize!(ast::Preprocessor, tokenize_preprocessor);
97impl_tokenize!(ast::PreprocessorDefine, tokenize_preprocessor_define);
98impl_tokenize!(ast::PreprocessorElseIf, tokenize_preprocessor_elseif);
99impl_tokenize!(ast::PreprocessorError, tokenize_preprocessor_error);
100impl_tokenize!(ast::PreprocessorIf, tokenize_preprocessor_if);
101impl_tokenize!(ast::PreprocessorIfDef, tokenize_preprocessor_ifdef);
102impl_tokenize!(ast::PreprocessorIfNDef, tokenize_preprocessor_ifndef);
103impl_tokenize!(ast::PreprocessorInclude, tokenize_preprocessor_include);
104impl_tokenize!(ast::PreprocessorLine, tokenize_preprocessor_line);
105impl_tokenize!(ast::PreprocessorPragma, tokenize_preprocessor_pragma);
106impl_tokenize!(ast::PreprocessorUndef, tokenize_preprocessor_undef);
107impl_tokenize!(ast::PreprocessorVersion, tokenize_preprocessor_version);
108impl_tokenize!(
109 ast::PreprocessorVersionProfile,
110 tokenize_preprocessor_version_profile
111);
112impl_tokenize!(
113 ast::PreprocessorExtensionName,
114 tokenize_preprocessor_extension_name
115);
116impl_tokenize!(
117 ast::PreprocessorExtensionBehavior,
118 tokenize_preprocessor_extension_behavior
119);
120impl_tokenize!(ast::PreprocessorExtension, tokenize_preprocessor_extension);
121
122fn tokenize_path(p: &ast::Path) -> TokenStream {
123 let span = tokenize_span(&p.span);
124 let p = &p.content;
125
126 match p {
127 ast::PathData::Absolute(ref s) => {
128 quote! { glsl_lang::ast::Path::new(glsl_lang::ast::PathData::Absolute(#s.to_owned()), #span) }
129 }
130 ast::PathData::Relative(ref s) => {
131 quote! { glsl_lang::ast::Path::new(glsl_lang::ast::PathData::Relative(#s.to_owned()), #span) }
132 }
133 }
134}
135
136fn tokenize_rs_ident(rs_ident: &str) -> TokenStream {
137 TokenStream::from_str(rs_ident).expect("invalid rust code in interpolation")
138}
139
140fn tokenize_identifier(i: &ast::Identifier) -> TokenStream {
141 if let Some(rs_ident) = i.as_rs_ident() {
142 tokenize_rs_ident(rs_ident)
143 } else {
144 let t = i.0.to_owned().quote();
146 let span = tokenize_span(&i.span);
147 quote! { glsl_lang::ast::Identifier::new(glsl_lang::ast::IdentifierData(#t), #span) }
148 }
149}
150
151fn tokenize_type_name(tn: &ast::TypeName) -> TokenStream {
152 let t = tn.0.to_owned().quote();
153 let span = tokenize_span(&tn.span);
154 quote! { glsl_lang::ast::TypeName::new(glsl_lang::ast::TypeNameData(#t), #span) }
155}
156
157fn tokenize_type_specifier_non_array(t: &ast::TypeSpecifierNonArray) -> TokenStream {
158 let span = tokenize_span(&t.span);
159 let t = match **t {
160 ast::TypeSpecifierNonArrayData::Void => {
161 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Void }
162 }
163 ast::TypeSpecifierNonArrayData::Bool => {
164 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Bool }
165 }
166 ast::TypeSpecifierNonArrayData::Int => {
167 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Int }
168 }
169 ast::TypeSpecifierNonArrayData::UInt => {
170 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UInt }
171 }
172 ast::TypeSpecifierNonArrayData::Float => {
173 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Float }
174 }
175 ast::TypeSpecifierNonArrayData::Double => {
176 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Double }
177 }
178 ast::TypeSpecifierNonArrayData::Vec2 => {
179 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Vec2 }
180 }
181 ast::TypeSpecifierNonArrayData::Vec3 => {
182 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Vec3 }
183 }
184 ast::TypeSpecifierNonArrayData::Vec4 => {
185 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Vec4 }
186 }
187 ast::TypeSpecifierNonArrayData::DVec2 => {
188 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DVec2 }
189 }
190 ast::TypeSpecifierNonArrayData::DVec3 => {
191 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DVec3 }
192 }
193 ast::TypeSpecifierNonArrayData::DVec4 => {
194 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DVec4 }
195 }
196 ast::TypeSpecifierNonArrayData::BVec2 => {
197 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::BVec2 }
198 }
199 ast::TypeSpecifierNonArrayData::BVec3 => {
200 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::BVec3 }
201 }
202 ast::TypeSpecifierNonArrayData::BVec4 => {
203 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::BVec4 }
204 }
205 ast::TypeSpecifierNonArrayData::IVec2 => {
206 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IVec2 }
207 }
208 ast::TypeSpecifierNonArrayData::IVec3 => {
209 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IVec3 }
210 }
211 ast::TypeSpecifierNonArrayData::IVec4 => {
212 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IVec4 }
213 }
214 ast::TypeSpecifierNonArrayData::UVec2 => {
215 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UVec2 }
216 }
217 ast::TypeSpecifierNonArrayData::UVec3 => {
218 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UVec3 }
219 }
220 ast::TypeSpecifierNonArrayData::UVec4 => {
221 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UVec4 }
222 }
223 ast::TypeSpecifierNonArrayData::Mat2 => {
224 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat2 }
225 }
226 ast::TypeSpecifierNonArrayData::Mat3 => {
227 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat3 }
228 }
229 ast::TypeSpecifierNonArrayData::Mat4 => {
230 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat4 }
231 }
232 ast::TypeSpecifierNonArrayData::Mat22 => {
233 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat22 }
234 }
235 ast::TypeSpecifierNonArrayData::Mat23 => {
236 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat23 }
237 }
238 ast::TypeSpecifierNonArrayData::Mat24 => {
239 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat24 }
240 }
241 ast::TypeSpecifierNonArrayData::Mat32 => {
242 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat32 }
243 }
244 ast::TypeSpecifierNonArrayData::Mat33 => {
245 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat33 }
246 }
247 ast::TypeSpecifierNonArrayData::Mat34 => {
248 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat34 }
249 }
250 ast::TypeSpecifierNonArrayData::Mat42 => {
251 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat42 }
252 }
253 ast::TypeSpecifierNonArrayData::Mat43 => {
254 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat43 }
255 }
256 ast::TypeSpecifierNonArrayData::Mat44 => {
257 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Mat44 }
258 }
259 ast::TypeSpecifierNonArrayData::DMat2 => {
260 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat2 }
261 }
262 ast::TypeSpecifierNonArrayData::DMat3 => {
263 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat3 }
264 }
265 ast::TypeSpecifierNonArrayData::DMat4 => {
266 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat4 }
267 }
268 ast::TypeSpecifierNonArrayData::DMat22 => {
269 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat22 }
270 }
271 ast::TypeSpecifierNonArrayData::DMat23 => {
272 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat23 }
273 }
274 ast::TypeSpecifierNonArrayData::DMat24 => {
275 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat24 }
276 }
277 ast::TypeSpecifierNonArrayData::DMat32 => {
278 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat32 }
279 }
280 ast::TypeSpecifierNonArrayData::DMat33 => {
281 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat33 }
282 }
283 ast::TypeSpecifierNonArrayData::DMat34 => {
284 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat34 }
285 }
286 ast::TypeSpecifierNonArrayData::DMat42 => {
287 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat42 }
288 }
289 ast::TypeSpecifierNonArrayData::DMat43 => {
290 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat43 }
291 }
292 ast::TypeSpecifierNonArrayData::DMat44 => {
293 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::DMat44 }
294 }
295 ast::TypeSpecifierNonArrayData::Sampler1D => {
296 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler1D }
297 }
298 ast::TypeSpecifierNonArrayData::Image1D => {
299 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Image1D }
300 }
301 ast::TypeSpecifierNonArrayData::Sampler2D => {
302 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler2D }
303 }
304 ast::TypeSpecifierNonArrayData::Image2D => {
305 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Image2D }
306 }
307 ast::TypeSpecifierNonArrayData::Sampler3D => {
308 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler3D }
309 }
310 ast::TypeSpecifierNonArrayData::Image3D => {
311 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Image3D }
312 }
313 ast::TypeSpecifierNonArrayData::SamplerCube => {
314 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::SamplerCube }
315 }
316 ast::TypeSpecifierNonArrayData::ImageCube => {
317 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ImageCube }
318 }
319 ast::TypeSpecifierNonArrayData::Sampler2DRect => {
320 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler2DRect }
321 }
322 ast::TypeSpecifierNonArrayData::Image2DRect => {
323 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Image2DRect }
324 }
325 ast::TypeSpecifierNonArrayData::Sampler1DArray => {
326 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler1DArray }
327 }
328 ast::TypeSpecifierNonArrayData::Image1DArray => {
329 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Image1DArray }
330 }
331 ast::TypeSpecifierNonArrayData::Sampler2DArray => {
332 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler2DArray }
333 }
334 ast::TypeSpecifierNonArrayData::Image2DArray => {
335 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Image2DArray }
336 }
337 ast::TypeSpecifierNonArrayData::SamplerBuffer => {
338 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::SamplerBuffer }
339 }
340 ast::TypeSpecifierNonArrayData::ImageBuffer => {
341 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ImageBuffer }
342 }
343 ast::TypeSpecifierNonArrayData::Sampler2DMs => {
344 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler2DMs }
345 }
346 ast::TypeSpecifierNonArrayData::Image2DMs => {
347 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Image2DMs }
348 }
349 ast::TypeSpecifierNonArrayData::Sampler2DMsArray => {
350 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler2DMsArray }
351 }
352 ast::TypeSpecifierNonArrayData::Image2DMsArray => {
353 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Image2DMsArray }
354 }
355 ast::TypeSpecifierNonArrayData::SamplerCubeArray => {
356 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::SamplerCubeArray }
357 }
358 ast::TypeSpecifierNonArrayData::ImageCubeArray => {
359 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ImageCubeArray }
360 }
361 ast::TypeSpecifierNonArrayData::Sampler1DShadow => {
362 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler1DShadow }
363 }
364 ast::TypeSpecifierNonArrayData::Sampler2DShadow => {
365 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler2DShadow }
366 }
367 ast::TypeSpecifierNonArrayData::Sampler2DRectShadow => {
368 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler2DRectShadow }
369 }
370 ast::TypeSpecifierNonArrayData::Sampler1DArrayShadow => {
371 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler1DArrayShadow }
372 }
373 ast::TypeSpecifierNonArrayData::Sampler2DArrayShadow => {
374 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler2DArrayShadow }
375 }
376 ast::TypeSpecifierNonArrayData::SamplerCubeShadow => {
377 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::SamplerCubeShadow }
378 }
379 ast::TypeSpecifierNonArrayData::SamplerCubeArrayShadow => {
380 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::SamplerCubeArrayShadow }
381 }
382 ast::TypeSpecifierNonArrayData::ISampler1D => {
383 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISampler1D }
384 }
385 ast::TypeSpecifierNonArrayData::IImage1D => {
386 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImage1D }
387 }
388 ast::TypeSpecifierNonArrayData::ISampler2D => {
389 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISampler2D }
390 }
391 ast::TypeSpecifierNonArrayData::IImage2D => {
392 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImage2D }
393 }
394 ast::TypeSpecifierNonArrayData::ISampler3D => {
395 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISampler3D }
396 }
397 ast::TypeSpecifierNonArrayData::IImage3D => {
398 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImage3D }
399 }
400 ast::TypeSpecifierNonArrayData::ISamplerCube => {
401 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISamplerCube }
402 }
403 ast::TypeSpecifierNonArrayData::IImageCube => {
404 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImageCube }
405 }
406 ast::TypeSpecifierNonArrayData::ISampler2DRect => {
407 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISampler2DRect }
408 }
409 ast::TypeSpecifierNonArrayData::IImage2DRect => {
410 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImage2DRect }
411 }
412 ast::TypeSpecifierNonArrayData::ISampler1DArray => {
413 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISampler1DArray }
414 }
415 ast::TypeSpecifierNonArrayData::IImage1DArray => {
416 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImage1DArray }
417 }
418 ast::TypeSpecifierNonArrayData::ISampler2DArray => {
419 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISampler2DArray }
420 }
421 ast::TypeSpecifierNonArrayData::IImage2DArray => {
422 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImage2DArray }
423 }
424 ast::TypeSpecifierNonArrayData::ISamplerBuffer => {
425 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISamplerBuffer }
426 }
427 ast::TypeSpecifierNonArrayData::IImageBuffer => {
428 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImageBuffer }
429 }
430 ast::TypeSpecifierNonArrayData::ISampler2DMs => {
431 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISampler2DMs }
432 }
433 ast::TypeSpecifierNonArrayData::IImage2DMs => {
434 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImage2DMs }
435 }
436 ast::TypeSpecifierNonArrayData::ISampler2DMsArray => {
437 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISampler2DMsArray }
438 }
439 ast::TypeSpecifierNonArrayData::IImage2DMsArray => {
440 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImage2DMsArray }
441 }
442 ast::TypeSpecifierNonArrayData::ISamplerCubeArray => {
443 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISamplerCubeArray }
444 }
445 ast::TypeSpecifierNonArrayData::IImageCubeArray => {
446 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::IImageCubeArray }
447 }
448 ast::TypeSpecifierNonArrayData::AtomicUInt => {
449 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::AtomicUInt }
450 }
451 ast::TypeSpecifierNonArrayData::USampler1D => {
452 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USampler1D }
453 }
454 ast::TypeSpecifierNonArrayData::UImage1D => {
455 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImage1D }
456 }
457 ast::TypeSpecifierNonArrayData::USampler2D => {
458 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USampler2D }
459 }
460 ast::TypeSpecifierNonArrayData::UImage2D => {
461 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImage2D }
462 }
463 ast::TypeSpecifierNonArrayData::USampler3D => {
464 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USampler3D }
465 }
466 ast::TypeSpecifierNonArrayData::UImage3D => {
467 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImage3D }
468 }
469 ast::TypeSpecifierNonArrayData::USamplerCube => {
470 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USamplerCube }
471 }
472 ast::TypeSpecifierNonArrayData::UImageCube => {
473 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImageCube }
474 }
475 ast::TypeSpecifierNonArrayData::USampler2DRect => {
476 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USampler2DRect }
477 }
478 ast::TypeSpecifierNonArrayData::UImage2DRect => {
479 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImage2DRect }
480 }
481 ast::TypeSpecifierNonArrayData::USampler1DArray => {
482 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USampler1DArray }
483 }
484 ast::TypeSpecifierNonArrayData::UImage1DArray => {
485 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImage1DArray }
486 }
487 ast::TypeSpecifierNonArrayData::USampler2DArray => {
488 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USampler2DArray }
489 }
490 ast::TypeSpecifierNonArrayData::UImage2DArray => {
491 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImage2DArray }
492 }
493 ast::TypeSpecifierNonArrayData::USamplerBuffer => {
494 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USamplerBuffer }
495 }
496 ast::TypeSpecifierNonArrayData::UImageBuffer => {
497 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImageBuffer }
498 }
499 ast::TypeSpecifierNonArrayData::USampler2DMs => {
500 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USampler2DMs }
501 }
502 ast::TypeSpecifierNonArrayData::UImage2DMs => {
503 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImage2DMs }
504 }
505 ast::TypeSpecifierNonArrayData::USampler2DMsArray => {
506 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USampler2DMsArray }
507 }
508 ast::TypeSpecifierNonArrayData::UImage2DMsArray => {
509 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImage2DMsArray }
510 }
511 ast::TypeSpecifierNonArrayData::USamplerCubeArray => {
512 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USamplerCubeArray }
513 }
514 ast::TypeSpecifierNonArrayData::UImageCubeArray => {
515 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::UImageCubeArray }
516 }
517
518 ast::TypeSpecifierNonArrayData::Texture1D => {
520 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Texture1D }
521 }
522 ast::TypeSpecifierNonArrayData::Texture2D => {
523 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Texture2D }
524 }
525 ast::TypeSpecifierNonArrayData::Texture3D => {
526 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Texture3D }
527 }
528 ast::TypeSpecifierNonArrayData::TextureCube => {
529 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::TextureCube }
530 }
531 ast::TypeSpecifierNonArrayData::Texture2DRect => {
532 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Texture2DRect }
533 }
534 ast::TypeSpecifierNonArrayData::Texture1DArray => {
535 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Texture1DArray }
536 }
537 ast::TypeSpecifierNonArrayData::Texture2DArray => {
538 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Texture2DArray }
539 }
540 ast::TypeSpecifierNonArrayData::TextureBuffer => {
541 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::TextureBuffer }
542 }
543 ast::TypeSpecifierNonArrayData::Texture2DMs => {
544 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Texture2DMs }
545 }
546 ast::TypeSpecifierNonArrayData::Texture2DMsArray => {
547 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Texture2DMsArray }
548 }
549 ast::TypeSpecifierNonArrayData::TextureCubeArray => {
550 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::TextureCubeArray }
551 }
552 ast::TypeSpecifierNonArrayData::ITexture1D => {
553 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITexture1D }
554 }
555 ast::TypeSpecifierNonArrayData::ITexture2D => {
556 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITexture2D }
557 }
558 ast::TypeSpecifierNonArrayData::ITexture3D => {
559 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITexture3D }
560 }
561 ast::TypeSpecifierNonArrayData::ITextureCube => {
562 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITextureCube }
563 }
564 ast::TypeSpecifierNonArrayData::ITexture2DRect => {
565 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITexture2DRect }
566 }
567 ast::TypeSpecifierNonArrayData::ITexture1DArray => {
568 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITexture1DArray }
569 }
570 ast::TypeSpecifierNonArrayData::ITexture2DArray => {
571 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITexture2DArray }
572 }
573 ast::TypeSpecifierNonArrayData::ITextureBuffer => {
574 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITextureBuffer }
575 }
576 ast::TypeSpecifierNonArrayData::ITexture2DMs => {
577 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITexture2DMs }
578 }
579 ast::TypeSpecifierNonArrayData::ITexture2DMsArray => {
580 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITexture2DMsArray }
581 }
582 ast::TypeSpecifierNonArrayData::ITextureCubeArray => {
583 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ITextureCubeArray }
584 }
585 ast::TypeSpecifierNonArrayData::Sampler => {
586 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Sampler }
587 }
588 ast::TypeSpecifierNonArrayData::SamplerShadow => {
589 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::SamplerShadow }
590 }
591 ast::TypeSpecifierNonArrayData::SubpassInput => {
592 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::SubpassInput }
593 }
594 ast::TypeSpecifierNonArrayData::ISubpassInput => {
595 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISubpassInput }
596 }
597 ast::TypeSpecifierNonArrayData::USubpassInput => {
598 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USubpassInput }
599 }
600 ast::TypeSpecifierNonArrayData::SubpassInputMs => {
601 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::SubpassInputMs }
602 }
603 ast::TypeSpecifierNonArrayData::ISubpassInputMs => {
604 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::ISubpassInputMs }
605 }
606 ast::TypeSpecifierNonArrayData::USubpassInputMs => {
607 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::USubpassInputMs }
608 }
609
610 ast::TypeSpecifierNonArrayData::Struct(ref s) => {
612 let s = tokenize_struct_non_declaration(s);
613 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::Struct(#s) }
614 }
615
616 ast::TypeSpecifierNonArrayData::TypeName(ref tn) => {
617 let tn = tokenize_type_name(tn);
618 quote! { glsl_lang::ast::TypeSpecifierNonArrayData::TypeName(#tn) }
619 }
620 };
621
622 quote! { glsl_lang::ast::TypeSpecifierNonArray::new(#t, #span) }
623}
624
625fn tokenize_type_specifier(t: &ast::TypeSpecifier) -> TokenStream {
626 let span = tokenize_span(&t.span);
627 let data = {
628 let ty = tokenize_type_specifier_non_array(&t.ty);
629 let array_specifier = t.array_specifier.as_ref().map(tokenize_array_spec).quote();
630
631 quote! {
632 glsl_lang::ast::TypeSpecifierData {
633 ty: #ty,
634 array_specifier: #array_specifier
635 }
636 }
637 };
638
639 quote! {
640 glsl_lang::ast::TypeSpecifier::new(#data, #span)
641 }
642}
643
644fn tokenize_fully_specified_type(t: &ast::FullySpecifiedType) -> TokenStream {
645 let span = tokenize_span(&t.span);
646 let t = {
647 let qual = t.qualifier.as_ref().map(tokenize_type_qualifier).quote();
648 let ty = tokenize_type_specifier(&t.ty);
649
650 quote! {
651 glsl_lang::ast::FullySpecifiedTypeData {
652 qualifier: #qual,
653 ty: #ty
654 }
655 }
656 };
657
658 quote! { glsl_lang::ast::FullySpecifiedType::new(#t, #span) }
659}
660
661fn tokenize_struct_non_declaration(s: &ast::StructSpecifier) -> TokenStream {
662 let span = tokenize_span(&s.span);
663 let s = {
664 let name = s.name.as_ref().map(tokenize_type_name);
665 let fields = s.fields.iter().map(tokenize_struct_field);
666
667 quote! {
668 glsl_lang::ast::StructSpecifierData {
669 name: Some(#name),
670 fields: vec![#(#fields),*]
671 }
672 }
673 };
674
675 quote! { glsl_lang::ast::StructSpecifier::new(#s, #span) }
676}
677
678fn tokenize_struct_field(field: &ast::StructFieldSpecifier) -> TokenStream {
679 let span = tokenize_span(&field.span);
680 let field = {
681 let qual = field
682 .qualifier
683 .as_ref()
684 .map(tokenize_type_qualifier)
685 .quote();
686 let ty = tokenize_type_specifier(&field.ty);
687 let identifiers = field.identifiers.iter().map(tokenize_arrayed_identifier);
688
689 quote! {
690 glsl_lang::ast::StructFieldSpecifierData {
691 qualifier: #qual,
692 ty: #ty,
693 identifiers: vec![#(#identifiers),*]
694 }
695 }
696 };
697
698 quote! { glsl_lang::ast::StructFieldSpecifier::new(#field, #span) }
699}
700
701fn tokenize_array_spec(a: &ast::ArraySpecifier) -> TokenStream {
702 let span = tokenize_span(&a.span);
703 let a = {
704 let dimensions = a.dimensions.iter().map(tokenize_array_spec_dim);
705
706 quote! {
707 glsl_lang::ast::ArraySpecifierData { dimensions: vec![#(#dimensions),*] }
708 }
709 };
710
711 quote! { glsl_lang::ast::ArraySpecifier::new(#a, #span) }
712}
713
714fn tokenize_array_spec_dim(a: &ast::ArraySpecifierDimension) -> TokenStream {
715 let span = tokenize_span(&a.span);
716 let a = match a.content {
717 ast::ArraySpecifierDimensionData::Unsized => {
718 quote! { glsl_lang::ast::ArraySpecifierDimensionData::Unsized }
719 }
720 ast::ArraySpecifierDimensionData::ExplicitlySized(ref e) => {
721 let expr = (&tokenize_expr(e)).quote();
722 quote! { glsl_lang::ast::ArraySpecifierDimensionData::ExplicitlySized(#expr) }
723 }
724 };
725
726 quote! { glsl_lang::ast::ArraySpecifierDimension::new(#a, #span) }
727}
728
729fn tokenize_arrayed_identifier(identifier: &ast::ArrayedIdentifier) -> TokenStream {
730 let span = tokenize_span(&identifier.span);
731 let identifier = {
732 let ident = tokenize_identifier(&identifier.ident);
733 let array_spec = identifier
734 .array_spec
735 .as_ref()
736 .map(tokenize_array_spec)
737 .quote();
738
739 quote! {
740 glsl_lang::ast::ArrayedIdentifierData::new(#ident, #array_spec)
741 }
742 };
743
744 quote! { glsl_lang::ast::ArrayedIdentifier::new(#identifier, #span) }
745}
746
747fn tokenize_type_qualifier(q: &ast::TypeQualifier) -> TokenStream {
748 let span = tokenize_span(&q.span);
749 let q = {
750 let quals = q.qualifiers.iter().map(tokenize_type_qualifier_spec);
751
752 quote! {
753 glsl_lang::ast::TypeQualifierData {
754 qualifiers: vec![#(#quals),*]
755 }
756 }
757 };
758
759 quote! { glsl_lang::ast::TypeQualifier::new(#q, #span) }
760}
761
762fn tokenize_type_qualifier_spec(q: &ast::TypeQualifierSpec) -> TokenStream {
763 let span = tokenize_span(&q.span);
764 let q = match **q {
765 ast::TypeQualifierSpecData::Storage(ref s) => {
766 let s = tokenize_storage_qualifier(s);
767 quote! { glsl_lang::ast::TypeQualifierSpecData::Storage(#s) }
768 }
769
770 ast::TypeQualifierSpecData::Layout(ref l) => {
771 let l = tokenize_layout_qualifier(l);
772 quote! { glsl_lang::ast::TypeQualifierSpecData::Layout(#l) }
773 }
774
775 ast::TypeQualifierSpecData::Precision(ref p) => {
776 let p = tokenize_precision_qualifier(p);
777 quote! { glsl_lang::ast::TypeQualifierSpecData::Precision(#p) }
778 }
779
780 ast::TypeQualifierSpecData::Interpolation(ref i) => {
781 let i = tokenize_interpolation_qualifier(i);
782 quote! { glsl_lang::ast::TypeQualifierSpecData::Interpolation(#i) }
783 }
784
785 ast::TypeQualifierSpecData::Invariant => {
786 quote! { glsl_lang::ast::TypeQualifierSpecData::Invariant }
787 }
788
789 ast::TypeQualifierSpecData::Precise => {
790 quote! { glsl_lang::ast::TypeQualifierSpecData::Precise }
791 }
792 };
793
794 quote! { glsl_lang::ast::TypeQualifierSpec::new(#q, #span) }
795}
796
797fn tokenize_storage_qualifier(q: &ast::StorageQualifier) -> TokenStream {
798 let span = tokenize_span(&q.span);
799 let q = match **q {
800 ast::StorageQualifierData::Const => {
801 quote! { glsl_lang::ast::StorageQualifierData::Const }
802 }
803 ast::StorageQualifierData::InOut => {
804 quote! { glsl_lang::ast::StorageQualifierData::InOut }
805 }
806 ast::StorageQualifierData::In => quote! { glsl_lang::ast::StorageQualifierData::In },
807 ast::StorageQualifierData::Out => quote! { glsl_lang::ast::StorageQualifierData::Out },
808 ast::StorageQualifierData::Centroid => {
809 quote! { glsl_lang::ast::StorageQualifierData::Centroid }
810 }
811 ast::StorageQualifierData::Patch => {
812 quote! { glsl_lang::ast::StorageQualifierData::Patch }
813 }
814 ast::StorageQualifierData::Sample => {
815 quote! { glsl_lang::ast::StorageQualifierData::Sample }
816 }
817 ast::StorageQualifierData::Uniform => {
818 quote! { glsl_lang::ast::StorageQualifierData::Uniform }
819 }
820 ast::StorageQualifierData::Buffer => {
821 quote! { glsl_lang::ast::StorageQualifierData::Buffer }
822 }
823 ast::StorageQualifierData::Shared => {
824 quote! { glsl_lang::ast::StorageQualifierData::Shared }
825 }
826 ast::StorageQualifierData::Coherent => {
827 quote! { glsl_lang::ast::StorageQualifierData::Coherent }
828 }
829 ast::StorageQualifierData::Volatile => {
830 quote! { glsl_lang::ast::StorageQualifierData::Volatile }
831 }
832 ast::StorageQualifierData::Restrict => {
833 quote! { glsl_lang::ast::StorageQualifierData::Restrict }
834 }
835 ast::StorageQualifierData::ReadOnly => {
836 quote! { glsl_lang::ast::StorageQualifierData::ReadOnly }
837 }
838 ast::StorageQualifierData::WriteOnly => {
839 quote! { glsl_lang::ast::StorageQualifierData::WriteOnly }
840 }
841 ast::StorageQualifierData::Attribute => {
842 quote! { glsl_lang::ast::StorageQualifierData::Attribute }
843 }
844 ast::StorageQualifierData::Varying => {
845 quote! { glsl_lang::ast::StorageQualifierData::Varying }
846 }
847
848 ast::StorageQualifierData::Subroutine(ref n) => {
849 let n = n.iter().map(tokenize_type_specifier);
850
851 quote! {
852 glsl_lang::ast::StorageQualifierData::Subroutine(vec![#(#n),*])
853 }
854 }
855 };
856
857 quote! { glsl_lang::ast::StorageQualifier::new(#q, #span) }
858}
859
860fn tokenize_layout_qualifier(l: &ast::LayoutQualifier) -> TokenStream {
861 let span = tokenize_span(&l.span);
862 let l = {
863 let ids = l.ids.iter().map(tokenize_layout_qualifier_spec);
864
865 quote! {
866 glsl_lang::ast::LayoutQualifierData {
867 ids: vec![#(#ids),*]
868 }
869 }
870 };
871
872 quote! { glsl_lang::ast::LayoutQualifier::new(#l, #span) }
873}
874
875fn tokenize_layout_qualifier_spec(l: &ast::LayoutQualifierSpec) -> TokenStream {
876 let span = tokenize_span(&l.span);
877 let l = match l.content {
878 ast::LayoutQualifierSpecData::Identifier(ref i, ref e) => {
879 let i = tokenize_identifier(i);
880 let expr = e.as_ref().map(|e| (&tokenize_expr(e)).quote()).quote();
881 quote! { glsl_lang::ast::LayoutQualifierSpecData::Identifier(#i, #expr) }
882 }
883
884 ast::LayoutQualifierSpecData::Shared => {
885 quote! { glsl_lang::ast::LayoutQualifierSpecData::Shared }
886 }
887 };
888
889 quote! { glsl_lang::ast::LayoutQualifierSpec::new(#l, #span) }
890}
891
892fn tokenize_precision_qualifier(p: &ast::PrecisionQualifier) -> TokenStream {
893 let span = tokenize_span(&p.span);
894 let p = match p.content {
895 ast::PrecisionQualifierData::High => {
896 quote! { glsl_lang::ast::PrecisionQualifierData::High }
897 }
898 ast::PrecisionQualifierData::Medium => {
899 quote! { glsl_lang::ast::PrecisionQualifierData::Medium }
900 }
901 ast::PrecisionQualifierData::Low => quote! { glsl_lang::ast::PrecisionQualifierData::Low },
902 };
903
904 quote! { glsl_lang::ast::PrecisionQualifier::new(#p, #span) }
905}
906
907fn tokenize_interpolation_qualifier(i: &ast::InterpolationQualifier) -> TokenStream {
908 let span = tokenize_span(&i.span);
909 let i = match i.content {
910 ast::InterpolationQualifierData::Smooth => {
911 quote! { glsl_lang::ast::InterpolationQualifierData::Smooth }
912 }
913 ast::InterpolationQualifierData::Flat => {
914 quote! { glsl_lang::ast::InterpolationQualifierData::Flat }
915 }
916 ast::InterpolationQualifierData::NoPerspective => {
917 quote! { glsl_lang::ast::InterpolationQualifierData::NoPerspective }
918 }
919 };
920
921 quote! { glsl_lang::ast::InterpolationQualifier::new(#i, #span) }
922}
923
924fn tokenize_expr(expr: &ast::Expr) -> TokenStream {
925 if let Some(rs_ident) = expr.as_rs_ident() {
926 return tokenize_rs_ident(rs_ident);
927 }
928
929 let span = tokenize_span(&expr.span);
930 let expr = match expr.content {
931 ast::ExprData::Variable(ref i) => {
932 let i = tokenize_identifier(i);
933 quote! { glsl_lang::ast::ExprData::Variable(#i) }
934 }
935
936 ast::ExprData::IntConst(ref x) => quote! { glsl_lang::ast::ExprData::IntConst(#x) },
937
938 ast::ExprData::UIntConst(ref x) => quote! { glsl_lang::ast::ExprData::UIntConst(#x) },
939
940 ast::ExprData::BoolConst(ref x) => quote! { glsl_lang::ast::ExprData::BoolConst(#x) },
941
942 ast::ExprData::FloatConst(ref x) => quote! { glsl_lang::ast::ExprData::FloatConst(#x) },
943
944 ast::ExprData::DoubleConst(ref x) => quote! { glsl_lang::ast::ExprData::DoubleConst(#x) },
945
946 ast::ExprData::Unary(ref op, ref e) => {
947 let op = tokenize_unary_op(op);
948 let e = (&tokenize_expr(e)).quote();
949 quote! { glsl_lang::ast::ExprData::Unary(#op, #e) }
950 }
951
952 ast::ExprData::Binary(ref op, ref l, ref r) => {
953 let op = tokenize_binary_op(op);
954 let l = (&tokenize_expr(l)).quote();
955 let r = (&tokenize_expr(r)).quote();
956 quote! { glsl_lang::ast::ExprData::Binary(#op, #l, #r) }
957 }
958
959 ast::ExprData::Ternary(ref c, ref s, ref e) => {
960 let c = (&tokenize_expr(c)).quote();
961 let s = (&tokenize_expr(s)).quote();
962 let e = (&tokenize_expr(e)).quote();
963 quote! { glsl_lang::ast::ExprData::Ternary(#c, #s, #e) }
964 }
965
966 ast::ExprData::Assignment(ref v, ref op, ref e) => {
967 let v = (&tokenize_expr(v)).quote();
968 let op = tokenize_assignment_op(op);
969 let e = (&tokenize_expr(e)).quote();
970 quote! { glsl_lang::ast::ExprData::Assignment(#v, #op, #e) }
971 }
972
973 ast::ExprData::Bracket(ref e, ref a) => {
974 let e = (&tokenize_expr(e)).quote();
975 let a = tokenize_expr(a);
976 quote! { glsl_lang::ast::ExprData::Bracket(#e, #a) }
977 }
978
979 ast::ExprData::FunCall(ref fun, ref args) => {
980 let fun = tokenize_function_identifier(fun);
981 let args = args.iter().map(tokenize_expr);
982 quote! { glsl_lang::ast::ExprData::FunCall(#fun, vec![#(#args),*]) }
983 }
984
985 ast::ExprData::Dot(ref e, ref i) => {
986 let e = (&tokenize_expr(e)).quote();
987 let i = tokenize_identifier(i);
988
989 quote! { glsl_lang::ast::ExprData::Dot(#e, #i) }
990 }
991
992 ast::ExprData::PostInc(ref e) => {
993 let e = (&tokenize_expr(e)).quote();
994 quote! { glsl_lang::ast::ExprData::PostInc(#e) }
995 }
996
997 ast::ExprData::PostDec(ref e) => {
998 let e = (&tokenize_expr(e)).quote();
999 quote! { glsl_lang::ast::ExprData::PostDec(#e) }
1000 }
1001
1002 ast::ExprData::Comma(ref a, ref b) => {
1003 let a = (&tokenize_expr(a)).quote();
1004 let b = (&tokenize_expr(b)).quote();
1005 quote! { glsl_lang::ast::ExprData::Comma(#a, #b) }
1006 }
1007 };
1008
1009 quote! { glsl_lang::ast::Expr::new(#expr, #span) }
1010}
1011
1012fn tokenize_unary_op(op: &ast::UnaryOp) -> TokenStream {
1013 let span = tokenize_span(&op.span);
1014 let op = match op.content {
1015 ast::UnaryOpData::Inc => quote! { glsl_lang::ast::UnaryOpData::Inc },
1016 ast::UnaryOpData::Dec => quote! { glsl_lang::ast::UnaryOpData::Dec },
1017 ast::UnaryOpData::Add => quote! { glsl_lang::ast::UnaryOpData::Add },
1018 ast::UnaryOpData::Minus => quote! { glsl_lang::ast::UnaryOpData::Minus },
1019 ast::UnaryOpData::Not => quote! { glsl_lang::ast::UnaryOpData::Not },
1020 ast::UnaryOpData::Complement => quote! { glsl_lang::ast::UnaryOpData::Complement },
1021 };
1022
1023 quote! { glsl_lang::ast::UnaryOp::new(#op, #span) }
1024}
1025
1026fn tokenize_binary_op(op: &ast::BinaryOp) -> TokenStream {
1027 let span = tokenize_span(&op.span);
1028 let op = match op.content {
1029 ast::BinaryOpData::Or => quote! { glsl_lang::ast::BinaryOpData::Or },
1030 ast::BinaryOpData::Xor => quote! { glsl_lang::ast::BinaryOpData::Xor },
1031 ast::BinaryOpData::And => quote! { glsl_lang::ast::BinaryOpData::And },
1032 ast::BinaryOpData::BitOr => quote! { glsl_lang::ast::BinaryOpData::BitOr },
1033 ast::BinaryOpData::BitXor => quote! { glsl_lang::ast::BinaryOpData::BitXor },
1034 ast::BinaryOpData::BitAnd => quote! { glsl_lang::ast::BinaryOpData::BitAnd },
1035 ast::BinaryOpData::Equal => quote! { glsl_lang::ast::BinaryOpData::Equal },
1036 ast::BinaryOpData::NonEqual => quote! { glsl_lang::ast::BinaryOpData::NonEqual },
1037 ast::BinaryOpData::Lt => quote! { glsl_lang::ast::BinaryOpData::Lt },
1038 ast::BinaryOpData::Gt => quote! { glsl_lang::ast::BinaryOpData::Gt },
1039 ast::BinaryOpData::Lte => quote! { glsl_lang::ast::BinaryOpData::Lte },
1040 ast::BinaryOpData::Gte => quote! { glsl_lang::ast::BinaryOpData::Gte },
1041 ast::BinaryOpData::LShift => quote! { glsl_lang::ast::BinaryOpData::LShift },
1042 ast::BinaryOpData::RShift => quote! { glsl_lang::ast::BinaryOpData::RShift },
1043 ast::BinaryOpData::Add => quote! { glsl_lang::ast::BinaryOpData::Add },
1044 ast::BinaryOpData::Sub => quote! { glsl_lang::ast::BinaryOpData::Sub },
1045 ast::BinaryOpData::Mult => quote! { glsl_lang::ast::BinaryOpData::Mult },
1046 ast::BinaryOpData::Div => quote! { glsl_lang::ast::BinaryOpData::Div },
1047 ast::BinaryOpData::Mod => quote! { glsl_lang::ast::BinaryOpData::Mod },
1048 };
1049
1050 quote! { glsl_lang::ast::BinaryOp::new(#op, #span) }
1051}
1052
1053fn tokenize_assignment_op(op: &ast::AssignmentOp) -> TokenStream {
1054 let span = tokenize_span(&op.span);
1055 let op = match op.content {
1056 ast::AssignmentOpData::Equal => quote! { glsl_lang::ast::AssignmentOpData::Equal },
1057 ast::AssignmentOpData::Mult => quote! { glsl_lang::ast::AssignmentOpData::Mult },
1058 ast::AssignmentOpData::Div => quote! { glsl_lang::ast::AssignmentOpData::Div },
1059 ast::AssignmentOpData::Mod => quote! { glsl_lang::ast::AssignmentOpData::Mod },
1060 ast::AssignmentOpData::Add => quote! { glsl_lang::ast::AssignmentOpData::Add },
1061 ast::AssignmentOpData::Sub => quote! { glsl_lang::ast::AssignmentOpData::Sub },
1062 ast::AssignmentOpData::LShift => quote! { glsl_lang::ast::AssignmentOpData::LShift },
1063 ast::AssignmentOpData::RShift => quote! { glsl_lang::ast::AssignmentOpData::RShift },
1064 ast::AssignmentOpData::And => quote! { glsl_lang::ast::AssignmentOpData::And },
1065 ast::AssignmentOpData::Xor => quote! { glsl_lang::ast::AssignmentOpData::Xor },
1066 ast::AssignmentOpData::Or => quote! { AssignmentOpData::Or },
1067 };
1068
1069 quote! { glsl_lang::ast::AssignmentOp::new(#op, #span) }
1070}
1071
1072fn tokenize_function_identifier(i: &ast::FunIdentifier) -> TokenStream {
1073 if let Some(rs_ident) = i.as_rs_ident() {
1074 return tokenize_rs_ident(rs_ident);
1075 }
1076
1077 let span = tokenize_span(&i.span);
1078 let i = match i.content {
1079 ast::FunIdentifierData::TypeSpecifier(ref n) => {
1080 let n = (&tokenize_type_specifier(n)).quote();
1081 quote! { glsl_lang::ast::FunIdentifierData::TypeSpecifier(#n) }
1082 }
1083
1084 ast::FunIdentifierData::Expr(ref e) => {
1085 let e = (&tokenize_expr(e)).quote();
1086 quote! { glsl_lang::ast::FunIdentifierData::Expr(#e) }
1087 }
1088 };
1089
1090 quote! { glsl_lang::ast::FunIdentifier::new(#i, #span) }
1091}
1092
1093fn tokenize_declaration(d: &ast::Declaration) -> TokenStream {
1094 let decl = match **d {
1095 ast::DeclarationData::FunctionPrototype(ref proto) => {
1096 let p = tokenize_function_prototype(proto);
1097 quote! { glsl_lang::ast::DeclarationData::FunctionPrototype(#p) }
1098 }
1099
1100 ast::DeclarationData::InitDeclaratorList(ref list) => {
1101 let l = tokenize_init_declarator_list(list);
1102 quote! { glsl_lang::ast::DeclarationData::InitDeclaratorList(#l) }
1103 }
1104
1105 ast::DeclarationData::Precision(ref qual, ref ty) => {
1106 let qual = tokenize_precision_qualifier(qual);
1107 let ty = tokenize_type_specifier(ty);
1108 quote! { glsl_lang::ast::DeclarationData::Precision(#qual, #ty) }
1109 }
1110
1111 ast::DeclarationData::Block(ref block) => {
1112 let block = tokenize_block(block);
1113 quote! { glsl_lang::ast::DeclarationData::Block(#block) }
1114 }
1115
1116 ast::DeclarationData::Invariant(ref ident) => {
1117 let ident = tokenize_identifier(ident);
1118 quote! { glsl_lang::ast::DeclarationData::Invariant(#ident) }
1119 }
1120
1121 ast::DeclarationData::TypeOnly(ref q) => {
1122 let q = tokenize_type_qualifier(q);
1123 quote! { glsl_lang::ast::DeclarationData::TypeOnly(#q) }
1124 }
1125 };
1126
1127 let span = tokenize_span(&d.span);
1128 quote! { glsl_lang::ast::Declaration::new(#decl, #span) }
1129}
1130
1131fn tokenize_function_prototype(fp: &ast::FunctionPrototype) -> TokenStream {
1132 let ty = tokenize_fully_specified_type(&fp.ty);
1133 let name = tokenize_identifier(&fp.name);
1134 let params = fp
1135 .parameters
1136 .iter()
1137 .map(tokenize_function_parameter_declaration);
1138
1139 let span = tokenize_span(&fp.span);
1140 quote! {
1141 glsl_lang::ast::FunctionPrototype::new(
1142 glsl_lang::ast::FunctionPrototypeData {
1143 ty: #ty,
1144 name: #name,
1145 parameters: vec![#(#params),*]
1146 },
1147 #span
1148 )
1149 }
1150}
1151
1152fn tokenize_function_parameter_declaration(p: &ast::FunctionParameterDeclaration) -> TokenStream {
1153 let decl = match **p {
1154 ast::FunctionParameterDeclarationData::Named(ref qual, ref fpd) => {
1155 let qual = qual.as_ref().map(tokenize_type_qualifier).quote();
1156 let fpd = tokenize_function_parameter_declarator(fpd);
1157 quote! { glsl_lang::ast::FunctionParameterDeclarationData::Named(#qual, #fpd) }
1158 }
1159
1160 ast::FunctionParameterDeclarationData::Unnamed(ref qual, ref ty) => {
1161 let qual = qual.as_ref().map(tokenize_type_qualifier).quote();
1162 let ty = tokenize_type_specifier(ty);
1163 quote! { glsl_lang::ast::FunctionParameterDeclarationData::Unnamed(#qual, #ty) }
1164 }
1165 };
1166
1167 let span = tokenize_span(&p.span);
1168 quote! { glsl_lang::ast::FunctionParameterDeclaration::new(#decl, #span) }
1169}
1170
1171fn tokenize_function_parameter_declarator(p: &ast::FunctionParameterDeclarator) -> TokenStream {
1172 let span = tokenize_span(&p.span);
1173 let p = {
1174 let ty = tokenize_type_specifier(&p.ty);
1175 let ident = tokenize_arrayed_identifier(&p.ident);
1176
1177 quote! {
1178 glsl_lang::ast::FunctionParameterDeclaratorData {
1179 ty: #ty,
1180 ident: #ident
1181 }
1182 }
1183 };
1184
1185 quote! { glsl_lang::ast::FunctionParameterDeclarator::new(#p, #span) }
1186}
1187
1188fn tokenize_init_declarator_list(i: &ast::InitDeclaratorList) -> TokenStream {
1189 let span = tokenize_span(&i.span);
1190 let i = {
1191 let head = tokenize_single_declaration(&i.head);
1192 let tail = i.tail.iter().map(tokenize_single_declaration_no_type);
1193
1194 quote! {
1195 glsl_lang::ast::InitDeclaratorListData {
1196 head: #head,
1197 tail: vec![#(#tail),*]
1198 }
1199 }
1200 };
1201
1202 quote! { glsl_lang::ast::InitDeclaratorList::new(#i, #span) }
1203}
1204
1205fn tokenize_single_declaration(d: &ast::SingleDeclaration) -> TokenStream {
1206 let span = tokenize_span(&d.span);
1207 let d = {
1208 let ty = tokenize_fully_specified_type(&d.ty);
1209 let name = d.name.as_ref().map(tokenize_identifier).quote();
1210 let array_specifier = d.array_specifier.as_ref().map(tokenize_array_spec).quote();
1211 let initializer = d.initializer.as_ref().map(tokenize_initializer).quote();
1212
1213 quote! {
1214 glsl_lang::ast::SingleDeclarationData {
1215 ty: #ty,
1216 name: #name,
1217 array_specifier: #array_specifier,
1218 initializer: #initializer
1219 }
1220 }
1221 };
1222
1223 quote! { glsl_lang::ast::SingleDeclaration::new(#d, #span) }
1224}
1225
1226fn tokenize_single_declaration_no_type(d: &ast::SingleDeclarationNoType) -> TokenStream {
1227 let span = tokenize_span(&d.span);
1228 let d = {
1229 let ident = tokenize_arrayed_identifier(&d.ident);
1230 let initializer = d.initializer.as_ref().map(tokenize_initializer).quote();
1231
1232 quote! {
1233 glsl_lang::ast::SingleDeclarationNoTypeData {
1234 ident: #ident,
1235 initializer: #initializer
1236 }
1237 }
1238 };
1239
1240 quote! { glsl_lang::ast::SingleDeclarationNoType::new(#d, #span) }
1241}
1242
1243fn tokenize_initializer(i: &ast::Initializer) -> TokenStream {
1244 let span = tokenize_span(&i.span);
1245 let i = match i.content {
1246 ast::InitializerData::Simple(ref e) => {
1247 let e = (&tokenize_expr(e)).quote();
1248 quote! { glsl_lang::ast::InitializerData::Simple(#e) }
1249 }
1250
1251 ast::InitializerData::List(ref list) => {
1252 let l = list.iter().map(tokenize_initializer);
1253 quote! { glsl_lang::ast::InitializerData::List(vec![#(#l),*]) }
1254 }
1255 };
1256
1257 quote! { glsl_lang::ast::Initializer::new(#i, #span) }
1258}
1259
1260fn tokenize_block(b: &ast::Block) -> TokenStream {
1261 let span = tokenize_span(&b.span);
1262 let b = {
1263 let qual = tokenize_type_qualifier(&b.qualifier);
1264 let name = tokenize_identifier(&b.name);
1265 let fields = b.fields.iter().map(tokenize_struct_field);
1266 let identifier = b
1267 .identifier
1268 .as_ref()
1269 .map(tokenize_arrayed_identifier)
1270 .quote();
1271
1272 quote! {
1273 glsl_lang::ast::BlockData {
1274 qualifier: #qual,
1275 name: #name,
1276 fields: vec![#(#fields),*],
1277 identifier: #identifier
1278 }
1279 }
1280 };
1281
1282 quote! { glsl_lang::ast::Block::new(#b, #span) }
1283}
1284
1285fn tokenize_function_definition(fd: &ast::FunctionDefinition) -> TokenStream {
1286 let p = tokenize_function_prototype(&fd.prototype);
1287 let s = tokenize_compound_statement(&fd.statement);
1288
1289 let span = tokenize_span(&fd.span);
1290 quote! {
1291 glsl_lang::ast::FunctionDefinition::new(
1292 glsl_lang::ast::FunctionDefinitionData {
1293 prototype: #p,
1294 statement: #s
1295 },
1296 #span
1297 )
1298 }
1299}
1300
1301fn tokenize_compound_statement(cst: &ast::CompoundStatement) -> TokenStream {
1302 let s = cst.statement_list.iter().map(tokenize_statement);
1303
1304 let span = tokenize_span(&cst.span);
1305 quote! {
1306 glsl_lang::ast::CompoundStatement::new(
1307 glsl_lang::ast::CompoundStatementData {
1308 statement_list: vec![#(#s),*]
1309 },
1310 #span
1311 )
1312 }
1313}
1314
1315fn tokenize_statement(sst: &ast::Statement) -> TokenStream {
1316 let st = match **sst {
1317 ast::StatementData::Declaration(ref d) => {
1318 let d = tokenize_declaration(d);
1319 quote! { glsl_lang::ast::StatementData::Declaration(#d) }
1320 }
1321
1322 ast::StatementData::Expression(ref e) => {
1323 let e = tokenize_expr_statement(e);
1324 quote! { glsl_lang::ast::StatementData::Expression(#e) }
1325 }
1326
1327 ast::StatementData::Selection(ref s) => {
1328 let s = tokenize_selection_statement(s);
1329 quote! { glsl_lang::ast::StatementData::Selection(#s) }
1330 }
1331
1332 ast::StatementData::Switch(ref s) => {
1333 let s = tokenize_switch_statement(s);
1334 quote! { glsl_lang::ast::StatementData::Switch(#s) }
1335 }
1336
1337 ast::StatementData::CaseLabel(ref cl) => {
1338 let cl = tokenize_case_label(cl);
1339 quote! { glsl_lang::ast::StatementData::CaseLabel(#cl) }
1340 }
1341
1342 ast::StatementData::Iteration(ref i) => {
1343 let i = tokenize_iteration_statement(i);
1344 quote! { glsl_lang::ast::StatementData::Iteration(#i) }
1345 }
1346
1347 ast::StatementData::Jump(ref j) => {
1348 let j = tokenize_jump_statement(j);
1349 quote! { glsl_lang::ast::StatementData::Jump(#j) }
1350 }
1351
1352 ast::StatementData::Compound(ref c) => {
1353 let c = tokenize_compound_statement(c);
1354 quote! { glsl_lang::ast::StatementData::Compound(#c) }
1355 }
1356 };
1357
1358 let span = tokenize_span(&sst.span);
1359 quote! { glsl_lang::ast::Statement::new(#st, #span) }
1360}
1361
1362fn tokenize_expr_statement(est: &ast::ExprStatement) -> TokenStream {
1363 let span = tokenize_span(&est.span);
1364 let est = {
1365 let e = est.0.as_ref().map(tokenize_expr).quote();
1366 quote! { glsl_lang::ast::ExprStatementData(#e) }
1367 };
1368
1369 quote! { glsl_lang::ast::ExprStatement::new(#est, #span) }
1370}
1371
1372fn tokenize_selection_statement(sst: &ast::SelectionStatement) -> TokenStream {
1373 let span = tokenize_span(&sst.span);
1374 let sst = {
1375 let cond = (&tokenize_expr(&sst.cond)).quote();
1376 let rest = tokenize_selection_rest_statement(&sst.rest);
1377
1378 quote! {
1379 glsl_lang::ast::SelectionStatementData {
1380 cond: #cond,
1381 rest: #rest
1382 }
1383 }
1384 };
1385
1386 quote! { glsl_lang::ast::SelectionStatement::new(#sst, #span) }
1387}
1388
1389fn tokenize_selection_rest_statement(sst: &ast::SelectionRestStatement) -> TokenStream {
1390 let span = tokenize_span(&sst.span);
1391 let sst = match sst.content {
1392 ast::SelectionRestStatementData::Statement(ref if_st) => {
1393 let e = (&tokenize_statement(if_st)).quote();
1394 quote! { glsl_lang::ast::SelectionRestStatementData::Statement(#e) }
1395 }
1396
1397 ast::SelectionRestStatementData::Else(ref if_st, ref else_st) => {
1398 let if_st = (&tokenize_statement(if_st)).quote();
1399 let else_st = (&tokenize_statement(else_st)).quote();
1400 quote! { glsl_lang::ast::SelectionRestStatementData::Else(#if_st, #else_st) }
1401 }
1402 };
1403
1404 quote! { glsl_lang::ast::SelectionRestStatement::new(#sst, #span) }
1405}
1406
1407fn tokenize_switch_statement(sst: &ast::SwitchStatement) -> TokenStream {
1408 let span = tokenize_span(&sst.span);
1409 let sst = {
1410 let head = (&tokenize_expr(&sst.head)).quote();
1411 let body = sst.body.iter().map(tokenize_statement);
1412
1413 quote! {
1414 glsl_lang::ast::SwitchStatementData {
1415 head: #head,
1416 body: vec![#(#body),*]
1417 }
1418 }
1419 };
1420
1421 quote! { glsl_lang::ast::SwitchStatement::new(#sst, #span) }
1422}
1423
1424fn tokenize_case_label(cl: &ast::CaseLabel) -> TokenStream {
1425 let span = tokenize_span(&cl.span);
1426 let cl = match cl.content {
1427 ast::CaseLabelData::Case(ref e) => {
1428 let e = (&tokenize_expr(e)).quote();
1429 quote! { glsl_lang::ast::CaseLabelData::Case(#e) }
1430 }
1431
1432 ast::CaseLabelData::Def => quote! { glsl_lang::ast::CaseLabelData::Def },
1433 };
1434
1435 quote! { glsl_lang::ast::CaseLabel::new(#cl, #span) }
1436}
1437
1438fn tokenize_iteration_statement(ist: &ast::IterationStatement) -> TokenStream {
1439 let span = tokenize_span(&ist.span);
1440 let ist = match ist.content {
1441 ast::IterationStatementData::While(ref cond, ref body) => {
1442 let cond = tokenize_condition(cond);
1443 let body = (&tokenize_statement(body)).quote();
1444 quote! { glsl_lang::ast::IterationStatementData::While(#cond, #body) }
1445 }
1446
1447 ast::IterationStatementData::DoWhile(ref body, ref cond) => {
1448 let body = (&tokenize_statement(body)).quote();
1449 let cond = (&tokenize_expr(cond)).quote();
1450 quote! { glsl_lang::ast::IterationStatementData::DoWhile(#body, #cond) }
1451 }
1452
1453 ast::IterationStatementData::For(ref init, ref rest, ref body) => {
1454 let init = tokenize_for_init_statement(init);
1455 let rest = tokenize_for_rest_statement(rest);
1456 let body = (&tokenize_statement(body)).quote();
1457 quote! { glsl_lang::ast::IterationStatementData::For(#init, #rest, #body) }
1458 }
1459 };
1460
1461 quote! { glsl_lang::ast::IterationStatement::new(#ist, #span) }
1462}
1463
1464fn tokenize_condition(c: &ast::Condition) -> TokenStream {
1465 let span = tokenize_span(&c.span);
1466 let c = match c.content {
1467 ast::ConditionData::Expr(ref e) => {
1468 let e = (&tokenize_expr(e)).quote();
1469 quote! { glsl_lang::ast::ConditionData::Expr(#e) }
1470 }
1471
1472 ast::ConditionData::Assignment(ref ty, ref name, ref initializer) => {
1473 let ty = (&tokenize_fully_specified_type(ty)).quote();
1474 let name = tokenize_identifier(name);
1475 let initializer = tokenize_initializer(initializer);
1476
1477 quote! { glsl_lang::ast::ConditionData::Assignment(#ty, #name, #initializer) }
1478 }
1479 };
1480
1481 quote! { glsl_lang::ast::Condition::new(#c, #span) }
1482}
1483
1484fn tokenize_for_init_statement(i: &ast::ForInitStatement) -> TokenStream {
1485 let span = tokenize_span(&i.span);
1486 let i = match i.content {
1487 ast::ForInitStatementData::Expression(ref expr) => {
1488 let e = expr.as_ref().map(tokenize_expr).quote();
1489 quote! { glsl_lang::ast::ForInitStatementData::Expression(#e) }
1490 }
1491
1492 ast::ForInitStatementData::Declaration(ref d) => {
1493 let d = (&tokenize_declaration(d)).quote();
1494 quote! { glsl_lang::ast::ForInitStatementData::Declaration(#d) }
1495 }
1496 };
1497
1498 quote! { glsl_lang::ast::ForInitStatement::new(#i, #span) }
1499}
1500
1501fn tokenize_for_rest_statement(r: &ast::ForRestStatement) -> TokenStream {
1502 let span = tokenize_span(&r.span);
1503 let r = {
1504 let cond = r.condition.as_ref().map(tokenize_condition).quote();
1505 let post = r
1506 .post_expr
1507 .as_ref()
1508 .map(|e| (&tokenize_expr(e)).quote())
1509 .quote();
1510
1511 quote! {
1512 glsl_lang::ast::ForRestStatement {
1513 condition: #cond,
1514 post: #post
1515 }
1516 }
1517 };
1518
1519 quote! { glsl_lang::ast::ForRestStatement::new(#r, #span) }
1520}
1521
1522fn tokenize_jump_statement(j: &ast::JumpStatement) -> TokenStream {
1523 let span = tokenize_span(&j.span);
1524 let j = match j.content {
1525 ast::JumpStatementData::Continue => quote! { glsl_lang::ast::JumpStatementData::Continue },
1526 ast::JumpStatementData::Break => quote! { glsl_lang::ast::JumpStatementData::Break },
1527 ast::JumpStatementData::Discard => quote! { glsl_lang::ast::JumpStatementData::Discard },
1528 ast::JumpStatementData::Return(ref e) => {
1529 let e = e.as_ref().map(|e| (&tokenize_expr(e)).quote()).quote();
1530 quote! { glsl_lang::ast::JumpStatementData::Return(#e) }
1531 }
1532 };
1533
1534 quote! { glsl_lang::ast::JumpStatement::new(#j, #span) }
1535}
1536
1537fn tokenize_preprocessor(pp: &ast::Preprocessor) -> TokenStream {
1538 let decl = match **pp {
1539 ast::PreprocessorData::Define(ref pd) => {
1540 let pd = tokenize_preprocessor_define(pd);
1541 quote! { glsl_lang::ast::PreprocessorData::Define(#pd) }
1542 }
1543
1544 ast::PreprocessorData::Else => {
1545 quote! { glsl_lang::ast::PreprocessorData::Else }
1546 }
1547
1548 ast::PreprocessorData::ElseIf(ref pei) => {
1549 let pei = tokenize_preprocessor_elseif(pei);
1550 quote! { glsl_lang::ast::PreprocessorData::ElseIf(#pei) }
1551 }
1552
1553 ast::PreprocessorData::EndIf => {
1554 quote! { glsl_lang::ast::PreprocessorData::EndIf }
1555 }
1556
1557 ast::PreprocessorData::Error(ref pe) => {
1558 let pe = tokenize_preprocessor_error(pe);
1559 quote! { glsl_lang::ast::PreprocessorData::Error(#pe) }
1560 }
1561
1562 ast::PreprocessorData::If(ref pi) => {
1563 let pi = tokenize_preprocessor_if(pi);
1564 quote! { glsl_lang::ast::PreprocessorData::If(#pi) }
1565 }
1566
1567 ast::PreprocessorData::IfDef(ref pid) => {
1568 let pid = tokenize_preprocessor_ifdef(pid);
1569 quote! { glsl_lang::ast::PreprocessorData::IfDef(#pid) }
1570 }
1571
1572 ast::PreprocessorData::IfNDef(ref pind) => {
1573 let pind = tokenize_preprocessor_ifndef(pind);
1574 quote! { glsl_lang::ast::PreprocessorData::IfNDef(#pind) }
1575 }
1576
1577 ast::PreprocessorData::Include(ref pi) => {
1578 let pi = tokenize_preprocessor_include(pi);
1579 quote! { glsl_lang::ast::PreprocessorData::Include(#pi) }
1580 }
1581
1582 ast::PreprocessorData::Line(ref pl) => {
1583 let pl = tokenize_preprocessor_line(pl);
1584 quote! { glsl_lang::ast::PreprocessorData::Line(#pl) }
1585 }
1586
1587 ast::PreprocessorData::Pragma(ref pp) => {
1588 let pp = tokenize_preprocessor_pragma(pp);
1589 quote! { glsl_lang::ast::PreprocessorData::Pragma(#pp) }
1590 }
1591
1592 ast::PreprocessorData::Undef(ref pu) => {
1593 let pu = tokenize_preprocessor_undef(pu);
1594 quote! { glsl_lang::ast::PreprocessorData::Undef(#pu) }
1595 }
1596
1597 ast::PreprocessorData::Version(ref pv) => {
1598 let pv = tokenize_preprocessor_version(pv);
1599 quote! { glsl_lang::ast::PreprocessorData::Version(#pv) }
1600 }
1601
1602 ast::PreprocessorData::Extension(ref pe) => {
1603 let pe = tokenize_preprocessor_extension(pe);
1604 quote! { glsl_lang::ast::PreprocessorData::Extension(#pe) }
1605 }
1606 };
1607
1608 let span = tokenize_span(&pp.span);
1609 quote! { glsl_lang::ast::Preprocessor::new(#decl, #span) }
1610}
1611
1612fn tokenize_preprocessor_define(pd: &ast::PreprocessorDefine) -> TokenStream {
1613 let span = tokenize_span(&pd.span);
1614 let pd = match pd.content {
1615 ast::PreprocessorDefineData::ObjectLike {
1616 ref ident,
1617 ref value,
1618 } => {
1619 let ident = tokenize_identifier(ident);
1620 let value = value.quote();
1621
1622 quote! {
1623 glsl_lang::ast::PreprocessorDefineData::ObjectLike {
1624 ident: #ident,
1625 value: #value
1626 }
1627 }
1628 }
1629
1630 ast::PreprocessorDefineData::FunctionLike {
1631 ref ident,
1632 ref args,
1633 ref value,
1634 } => {
1635 let ident = tokenize_identifier(ident);
1636 let args = args.iter().map(tokenize_identifier);
1637 let value = value.quote();
1638
1639 quote! {
1640 glsl_lang::ast::PreprocessorDefineData::FunctionLike {
1641 ident: #ident,
1642 args: vec![#(#args),*],
1643 value: #value
1644 }
1645 }
1646 }
1647 };
1648
1649 quote! { glsl_lang::ast::PreprocessorDefine::new(#pd, #span) }
1650}
1651
1652fn tokenize_preprocessor_elseif(pei: &ast::PreprocessorElseIf) -> TokenStream {
1653 let span = tokenize_span(&pei.span);
1654 let pei = {
1655 let condition = pei.condition.quote();
1656
1657 quote! {
1658 glsl_lang::ast::PreprocessorElseIfData {
1659 condition: #condition
1660 }
1661 }
1662 };
1663
1664 quote! { glsl_lang::ast::PreprocessorElseIf::new(#pei, #span) }
1665}
1666
1667fn tokenize_preprocessor_error(pe: &ast::PreprocessorError) -> TokenStream {
1668 let span = tokenize_span(&pe.span);
1669 let pe = {
1670 let message = &pe.message;
1671
1672 quote! {
1673 glsl_lang::ast::PreprocessorErrorData {
1674 message: #message.to_owned()
1675 }
1676 }
1677 };
1678
1679 quote! { glsl_lang::ast::PreprocessorError::new(#pe, #span) }
1680}
1681
1682fn tokenize_preprocessor_if(pi: &ast::PreprocessorIf) -> TokenStream {
1683 let span = tokenize_span(&pi.span);
1684 let pi = {
1685 let condition = pi.condition.quote();
1686
1687 quote! {
1688 glsl_lang::ast::PreprocessorIfData {
1689 condition: #condition
1690 }
1691 }
1692 };
1693
1694 quote! { glsl_lang::ast::PreprocessorIf::new(#pi, #span) }
1695}
1696
1697fn tokenize_preprocessor_ifdef(pid: &ast::PreprocessorIfDef) -> TokenStream {
1698 let span = tokenize_span(&pid.span);
1699 let pid = {
1700 let ident = tokenize_identifier(&pid.ident);
1701
1702 quote! {
1703 glsl_lang::ast::PreprocessorIfDefData {
1704 ident: #ident
1705 }
1706 }
1707 };
1708
1709 quote! { glsl_lang::ast::PreprocessorIfDef::new(#pid, #span) }
1710}
1711
1712fn tokenize_preprocessor_ifndef(pind: &ast::PreprocessorIfNDef) -> TokenStream {
1713 let span = tokenize_span(&pind.span);
1714 let pind = {
1715 let ident = tokenize_identifier(&pind.ident);
1716
1717 quote! {
1718 glsl_lang::ast::PreprocessorIfNDefData {
1719 ident: #ident
1720 }
1721 }
1722 };
1723
1724 quote! { glsl_lang::ast::PreprocessorIfNDef::new(#pind, #span) }
1725}
1726
1727fn tokenize_preprocessor_include(pi: &ast::PreprocessorInclude) -> TokenStream {
1728 let span = tokenize_span(&pi.span);
1729 let pi = {
1730 let path = tokenize_path(&pi.path);
1731
1732 quote! {
1733 glsl_lang::ast::PreprocessorIncludeData {
1734 path: #path
1735 }
1736 }
1737 };
1738
1739 quote! { glsl_lang::ast::PreprocessorInclude::new(#pi, #span) }
1740}
1741
1742fn tokenize_preprocessor_line(pl: &ast::PreprocessorLine) -> TokenStream {
1743 let span = tokenize_span(&pl.span);
1744 let pl = {
1745 let line = pl.line;
1746 let source_string_number = pl.source_string_number.quote();
1747
1748 quote! {
1749 glsl_lang::ast::PreprocessorLineData {
1750 line: #line,
1751 source_string_number: #source_string_number
1752 }
1753 }
1754 };
1755
1756 quote! { glsl_lang::ast::PreprocessorLine::new(#pl, #span) }
1757}
1758
1759fn tokenize_preprocessor_pragma(pp: &ast::PreprocessorPragma) -> TokenStream {
1760 let span = tokenize_span(&pp.span);
1761 let pp = {
1762 let command = &pp.command;
1763
1764 quote! {
1765 glsl_lang::ast::PreprocessorPragmaData {
1766 command: #command.to_owned()
1767 }
1768 }
1769 };
1770
1771 quote! { glsl_lang::ast::PreprocessorPragma::new(#pp, #span) }
1772}
1773
1774fn tokenize_preprocessor_undef(pu: &ast::PreprocessorUndef) -> TokenStream {
1775 let span = tokenize_span(&pu.span);
1776 let pu = {
1777 let name = tokenize_identifier(&pu.name);
1778
1779 quote! {
1780 glsl_lang::ast::PreprocessorUndefData {
1781 name: #name
1782 }
1783 }
1784 };
1785
1786 quote! { glsl_lang::ast::PreprocessorUndef::new(#pu, #span) }
1787}
1788
1789fn tokenize_preprocessor_version(pv: &ast::PreprocessorVersion) -> TokenStream {
1790 let span = tokenize_span(&pv.span);
1791 let pv = {
1792 let version = pv.version;
1793 let profile = pv
1794 .profile
1795 .as_ref()
1796 .map(tokenize_preprocessor_version_profile)
1797 .quote();
1798
1799 quote! {
1800 glsl_lang::ast::PreprocessorVersionData {
1801 version: #version,
1802 profile: #profile
1803 }
1804 }
1805 };
1806
1807 quote! { glsl_lang::ast::PreprocessorVersion::new(#pv, #span) }
1808}
1809
1810fn tokenize_preprocessor_version_profile(profile: &ast::PreprocessorVersionProfile) -> TokenStream {
1811 let span = tokenize_span(&profile.span);
1812 let profile = match profile.content {
1813 ast::PreprocessorVersionProfileData::Core => {
1814 quote! { glsl_lang::ast::PreprocessorVersionProfileData::Core }
1815 }
1816 ast::PreprocessorVersionProfileData::Compatibility => {
1817 quote! { glsl_lang::ast::PreprocessorVersionProfileData::Compatibility }
1818 }
1819 ast::PreprocessorVersionProfileData::Es => {
1820 quote! { glsl_lang::ast::PreprocessorVersionProfileData::Es }
1821 }
1822 };
1823
1824 quote! { glsl_lang::ast::PreprocessorVersionProfile::new(#profile, #span) }
1825}
1826
1827fn tokenize_preprocessor_extension(pe: &ast::PreprocessorExtension) -> TokenStream {
1828 let span = tokenize_span(&pe.span);
1829 let pe = {
1830 let name = tokenize_preprocessor_extension_name(&pe.name);
1831 let behavior = pe
1832 .behavior
1833 .as_ref()
1834 .map(tokenize_preprocessor_extension_behavior)
1835 .quote();
1836
1837 quote! {
1838 glsl_lang::ast::PreprocessorExtensionData {
1839 name: #name,
1840 behavior: #behavior
1841 }
1842 }
1843 };
1844
1845 quote! { glsl_lang::ast::PreprocessorExtension::new(#pe, #span) }
1846}
1847
1848fn tokenize_preprocessor_extension_name(name: &ast::PreprocessorExtensionName) -> TokenStream {
1849 let span = tokenize_span(&name.span);
1850 let name = match name.content {
1851 ast::PreprocessorExtensionNameData::All => {
1852 quote! { glsl_lang::ast::PreprocessorExtensionNameData::All }
1853 }
1854 ast::PreprocessorExtensionNameData::Specific(ref n) => {
1855 let n = n.quote();
1856 quote! { glsl_lang::ast::PreprocessorExtensionNameData::Specific(#n) }
1857 }
1858 };
1859
1860 quote! { glsl_lang::ast::PreprocessorExtensionName::new(#name, #span) }
1861}
1862
1863fn tokenize_preprocessor_extension_behavior(
1864 behavior: &ast::PreprocessorExtensionBehavior,
1865) -> TokenStream {
1866 let span = tokenize_span(&behavior.span);
1867 let behavior = match behavior.content {
1868 ast::PreprocessorExtensionBehaviorData::Require => {
1869 quote! { glsl_lang::ast::PreprocessorExtensionBehaviorData::Require }
1870 }
1871 ast::PreprocessorExtensionBehaviorData::Enable => {
1872 quote! { glsl_lang::ast::PreprocessorExtensionBehaviorData::Enable }
1873 }
1874 ast::PreprocessorExtensionBehaviorData::Warn => {
1875 quote! { glsl_lang::ast::PreprocessorExtensionBehaviorData::Warn }
1876 }
1877 ast::PreprocessorExtensionBehaviorData::Disable => {
1878 quote! { glsl_lang::ast::PreprocessorExtensionBehaviorData::Disable }
1879 }
1880 };
1881
1882 quote! { glsl_lang::ast::PreprocessorExtensionBehavior::new(#behavior, #span) }
1883}
1884
1885fn tokenize_text_size(text_size: glsl_lang::ast::TextSize) -> TokenStream {
1886 let inner = u32::from(text_size);
1887 quote! { glsl_lang::ast::TextSize::from(#inner) }
1888}
1889
1890fn tokenize_text_range(text_range: glsl_lang::ast::TextRange) -> TokenStream {
1891 let start = tokenize_text_size(text_range.start());
1892 let end = tokenize_text_size(text_range.end());
1893 quote! { glsl_lang::ast::TextRange::new(#start, #end) }
1894}
1895
1896fn tokenize_span(s: &Option<ast::NodeSpan>) -> TokenStream {
1897 if let Some(s) = s {
1898 let source_id = u32::from(s.source_id());
1899 let range = tokenize_text_range(s.range());
1900
1901 quote! { Some(glsl_lang::ast::NodeSpan::new(#source_id.into(), #range)) }
1902 } else {
1903 quote! { None }
1904 }
1905}
1906
1907fn tokenize_external_declaration(ed: &ast::ExternalDeclaration) -> TokenStream {
1908 let contents = match **ed {
1909 ast::ExternalDeclarationData::Preprocessor(ref pp) => {
1910 let pp = tokenize_preprocessor(pp);
1911 quote! { glsl_lang::ast::ExternalDeclarationData::Preprocessor(#pp) }
1912 }
1913
1914 ast::ExternalDeclarationData::FunctionDefinition(ref fd) => {
1915 let fd = tokenize_function_definition(fd);
1916 quote! { glsl_lang::ast::ExternalDeclarationData::FunctionDefinition(#fd) }
1917 }
1918
1919 ast::ExternalDeclarationData::Declaration(ref d) => {
1920 let d = tokenize_declaration(d);
1921 quote! { glsl_lang::ast::ExternalDeclarationData::Declaration(#d) }
1922 }
1923 };
1924
1925 let span = tokenize_span(&ed.span);
1926 quote! { glsl_lang::ast::Node::new(#contents, #span) }
1927}
1928
1929fn tokenize_translation_unit(tu: &ast::TranslationUnit) -> TokenStream {
1930 let tu = (tu.0).iter().map(tokenize_external_declaration);
1931 quote! { glsl_lang::ast::TranslationUnit(vec![#(#tu),*]) }
1932}