glsl_lang_quote/
tokenize.rs

1//! The [`Tokenize`] trait, turning [glsl](https://crates.io/crates/glsl) into [`TokenStream`]s.
2
3use glsl_lang::ast;
4use proc_macro2::TokenStream;
5use quote::{quote, ToTokens};
6use std::{iter::once, str::FromStr};
7
8use crate::quoted::Quoted;
9
10/// Tokenize a value into a stream of tokens.
11pub trait Tokenize {
12    /// Inject self into a [`TokenStream`].
13    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        // Regular identifier
145        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        // GL_KHR_vulkan_glsl types
519        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        // end GL_KHR_vulkan_glsl types
611        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}