glsl_lang_lexer/
token.rs

1use lang_util::SmolStr;
2
3#[derive(Debug, Clone, PartialEq, lang_util::Token)]
4#[allow(missing_docs)]
5pub enum Token {
6    #[lang_util(token = "const", kind = "storage qualifier", kind = "type qualifier")]
7    Const,
8    #[lang_util(token = "bool", kind = "type name")]
9    Bool,
10    #[lang_util(token = "float", kind = "type name")]
11    Float,
12    #[lang_util(token = "int", kind = "type name")]
13    Int,
14    #[lang_util(token = "uint", kind = "type name")]
15    UInt,
16    #[lang_util(token = "double", kind = "type name")]
17    Double,
18    #[lang_util(token = "bvec2", kind = "type name")]
19    BVec2,
20    #[lang_util(token = "bvec3", kind = "type name")]
21    BVec3,
22    #[lang_util(token = "bvec4", kind = "type name")]
23    BVec4,
24    #[lang_util(token = "ivec2", kind = "type name")]
25    IVec2,
26    #[lang_util(token = "ivec3", kind = "type name")]
27    IVec3,
28    #[lang_util(token = "ivec4", kind = "type name")]
29    IVec4,
30    #[lang_util(token = "uvec2", kind = "type name")]
31    UVec2,
32    #[lang_util(token = "uvec3", kind = "type name")]
33    UVec3,
34    #[lang_util(token = "uvec4", kind = "type name")]
35    UVec4,
36    #[lang_util(token = "vec2", kind = "type name")]
37    Vec2,
38    #[lang_util(token = "vec3", kind = "type name")]
39    Vec3,
40    #[lang_util(token = "vec4", kind = "type name")]
41    Vec4,
42    #[lang_util(token = "mat2", kind = "type name")]
43    Mat2,
44    #[lang_util(token = "mat3", kind = "type name")]
45    Mat3,
46    #[lang_util(token = "mat4", kind = "type name")]
47    Mat4,
48    #[lang_util(token = "mat2x2", kind = "type name")]
49    Mat2x2,
50    #[lang_util(token = "mat2x3", kind = "type name")]
51    Mat2x3,
52    #[lang_util(token = "mat2x4", kind = "type name")]
53    Mat2x4,
54    #[lang_util(token = "mat3x2", kind = "type name")]
55    Mat3x2,
56    #[lang_util(token = "mat3x3", kind = "type name")]
57    Mat3x3,
58    #[lang_util(token = "mat3x4", kind = "type name")]
59    Mat3x4,
60    #[lang_util(token = "mat4x2", kind = "type name")]
61    Mat4x2,
62    #[lang_util(token = "mat4x3", kind = "type name")]
63    Mat4x3,
64    #[lang_util(token = "mat4x4", kind = "type name")]
65    Mat4x4,
66    #[lang_util(token = "dvec2", kind = "type name")]
67    DVec2,
68    #[lang_util(token = "dvec3", kind = "type name")]
69    DVec3,
70    #[lang_util(token = "dvec4", kind = "type name")]
71    DVec4,
72    #[lang_util(token = "dmat2", kind = "type name")]
73    DMat2,
74    #[lang_util(token = "dmat3", kind = "type name")]
75    DMat3,
76    #[lang_util(token = "dmat4", kind = "type name")]
77    DMat4,
78    #[lang_util(token = "dmat2x2", kind = "type name")]
79    DMat2x2,
80    #[lang_util(token = "dmat2x3", kind = "type name")]
81    DMat2x3,
82    #[lang_util(token = "dmat2x4", kind = "type name")]
83    DMat2x4,
84    #[lang_util(token = "dmat3x2", kind = "type name")]
85    DMat3x2,
86    #[lang_util(token = "dmat3x3", kind = "type name")]
87    DMat3x3,
88    #[lang_util(token = "dmat3x4", kind = "type name")]
89    DMat3x4,
90    #[lang_util(token = "dmat4x2", kind = "type name")]
91    DMat4x2,
92    #[lang_util(token = "dmat4x3", kind = "type name")]
93    DMat4x3,
94    #[lang_util(token = "dmat4x4", kind = "type name")]
95    DMat4x4,
96    #[lang_util(
97        token = "centroid",
98        kind = "storage qualifier",
99        kind = "type qualifier"
100    )]
101    Centroid,
102    #[lang_util(token = "in", kind = "storage qualifier", kind = "type qualifier")]
103    In,
104    #[lang_util(token = "out", kind = "storage qualifier", kind = "type qualifier")]
105    Out,
106    #[lang_util(token = "inout", kind = "storage qualifier", kind = "type qualifier")]
107    InOut,
108    #[lang_util(token = "uniform", kind = "storage qualifier", kind = "type qualifier")]
109    Uniform,
110    #[lang_util(token = "patch", kind = "storage qualifier", kind = "type qualifier")]
111    Patch,
112    #[lang_util(token = "sample", kind = "storage qualifier", kind = "type qualifier")]
113    Sample,
114    #[lang_util(token = "buffer", kind = "storage qualifier", kind = "type qualifier")]
115    Buffer,
116    #[lang_util(token = "shared", kind = "storage qualifier", kind = "type qualifier")]
117    Shared,
118    #[lang_util(
119        token = "coherent",
120        kind = "storage qualifier",
121        kind = "type qualifier"
122    )]
123    Coherent,
124    #[lang_util(
125        token = "volatile",
126        kind = "storage qualifier",
127        kind = "type qualifier"
128    )]
129    Volatile,
130    #[lang_util(
131        token = "restrict",
132        kind = "storage qualifier",
133        kind = "type qualifier"
134    )]
135    Restrict,
136    #[lang_util(
137        token = "readonly",
138        kind = "storage qualifier",
139        kind = "type qualifier"
140    )]
141    ReadOnly,
142    #[lang_util(
143        token = "writeonly",
144        kind = "storage qualifier",
145        kind = "type qualifier"
146    )]
147    WriteOnly,
148    #[lang_util(
149        token = "attribute",
150        kind = "storage qualifier",
151        kind = "type qualifier"
152    )]
153    Attribute,
154    #[lang_util(token = "varying", kind = "storage qualifier", kind = "type qualifier")]
155    Varying,
156    #[lang_util(
157        token = "noperspective",
158        kind = "interpolation qualifier",
159        kind = "type qualifier"
160    )]
161    NoPerspective,
162    #[lang_util(
163        token = "flat",
164        kind = "interpolation qualifier",
165        kind = "type qualifier"
166    )]
167    Flat,
168    #[lang_util(
169        token = "smooth",
170        kind = "interpolation qualifier",
171        kind = "type qualifier"
172    )]
173    Smooth,
174    #[lang_util(token = "layout", kind = "layout qualifier", kind = "type qualifier")]
175    Layout,
176    #[lang_util(token = "atomic_uint", kind = "type name")]
177    AtomicUInt,
178    #[lang_util(token = "sampler1D", kind = "type name")]
179    Sampler1D,
180    #[lang_util(
181        token = "sampler1DShadow",
182        kind = "type name",
183        kind = "vulkan type name"
184    )]
185    Sampler1DShadow,
186    #[lang_util(
187        token = "sampler1DArray",
188        kind = "type name",
189        kind = "vulkan type name"
190    )]
191    Sampler1DArray,
192    #[lang_util(
193        token = "sampler1DArrayShadow",
194        kind = "type name",
195        kind = "vulkan type name"
196    )]
197    Sampler1DArrayShadow,
198    #[lang_util(token = "isampler1D", kind = "type name")]
199    ISampler1D,
200    #[lang_util(
201        token = "isampler1DArray",
202        kind = "type name",
203        kind = "vulkan type name"
204    )]
205    ISampler1DArray,
206    #[lang_util(token = "usampler1D", kind = "type name")]
207    USampler1D,
208    #[lang_util(
209        token = "usampler1DArray",
210        kind = "type name",
211        kind = "vulkan type name"
212    )]
213    USampler1DArray,
214    #[lang_util(token = "sampler2D", kind = "type name")]
215    Sampler2D,
216    #[lang_util(
217        token = "sampler2DShadow",
218        kind = "type name",
219        kind = "vulkan type name"
220    )]
221    Sampler2DShadow,
222    #[lang_util(
223        token = "sampler2DArray",
224        kind = "type name",
225        kind = "vulkan type name"
226    )]
227    Sampler2DArray,
228    #[lang_util(
229        token = "sampler2DArrayShadow",
230        kind = "type name",
231        kind = "vulkan type name"
232    )]
233    Sampler2DArrayShadow,
234    #[lang_util(token = "isampler2D", kind = "type name")]
235    ISampler2D,
236    #[lang_util(
237        token = "isampler2DArray",
238        kind = "type name",
239        kind = "vulkan type name"
240    )]
241    ISampler2DArray,
242    #[lang_util(token = "usampler2D", kind = "type name")]
243    USampler2D,
244    #[lang_util(
245        token = "usampler2DArray",
246        kind = "type name",
247        kind = "vulkan type name"
248    )]
249    USampler2DArray,
250    #[lang_util(token = "sampler2DRect", kind = "type name")]
251    Sampler2DRect,
252    #[lang_util(
253        token = "sampler2DRectShadow",
254        kind = "type name",
255        kind = "vulkan type name"
256    )]
257    Sampler2DRectShadow,
258    #[lang_util(
259        token = "isampler2DRect",
260        kind = "type name",
261        kind = "vulkan type name"
262    )]
263    ISampler2DRect,
264    #[lang_util(
265        token = "usampler2DRect",
266        kind = "type name",
267        kind = "vulkan type name"
268    )]
269    USampler2DRect,
270    #[lang_util(token = "sampler2DMS", kind = "type name")]
271    Sampler2DMs,
272    #[lang_util(token = "isampler2DMS", kind = "type name")]
273    ISampler2DMs,
274    #[lang_util(token = "usampler2DMS", kind = "type name")]
275    USampler2DMs,
276    #[lang_util(
277        token = "sampler2DMSArray",
278        kind = "type name",
279        kind = "vulkan type name"
280    )]
281    Sampler2DMsArray,
282    #[lang_util(
283        token = "isampler2DMSArray",
284        kind = "type name",
285        kind = "vulkan type name"
286    )]
287    ISampler2DMsArray,
288    #[lang_util(
289        token = "usampler2DMSArray",
290        kind = "type name",
291        kind = "vulkan type name"
292    )]
293    USampler2DMsArray,
294    #[lang_util(token = "sampler3D", kind = "type name")]
295    Sampler3D,
296    #[lang_util(token = "isampler3D", kind = "type name")]
297    ISampler3D,
298    #[lang_util(token = "usampler3D", kind = "type name")]
299    USampler3D,
300    #[lang_util(token = "samplerCube", kind = "type name")]
301    SamplerCube,
302    #[lang_util(
303        token = "samplerCubeShadow",
304        kind = "type name",
305        kind = "vulkan type name"
306    )]
307    SamplerCubeShadow,
308    #[lang_util(token = "isamplerCube", kind = "type name")]
309    ISamplerCube,
310    #[lang_util(token = "usamplerCube", kind = "type name")]
311    USamplerCube,
312    #[lang_util(
313        token = "samplerCubeArray",
314        kind = "type name",
315        kind = "vulkan type name"
316    )]
317    SamplerCubeArray,
318    #[lang_util(
319        token = "samplerCubeArrayShadow",
320        kind = "type name",
321        kind = "vulkan type name"
322    )]
323    SamplerCubeArrayShadow,
324    #[lang_util(
325        token = "isamplerCubeArray",
326        kind = "type name",
327        kind = "vulkan type name"
328    )]
329    ISamplerCubeArray,
330    #[lang_util(
331        token = "usamplerCubeArray",
332        kind = "type name",
333        kind = "vulkan type name"
334    )]
335    USamplerCubeArray,
336    #[lang_util(token = "samplerBuffer", kind = "type name")]
337    SamplerBuffer,
338    #[lang_util(
339        token = "isamplerBuffer",
340        kind = "type name",
341        kind = "vulkan type name"
342    )]
343    ISamplerBuffer,
344    #[lang_util(
345        token = "usamplerBuffer",
346        kind = "type name",
347        kind = "vulkan type name"
348    )]
349    USamplerBuffer,
350    #[lang_util(token = "image1D", kind = "type name")]
351    Image1D,
352    #[lang_util(token = "iimage1D", kind = "type name")]
353    IImage1D,
354    #[lang_util(token = "uimage1D", kind = "type name")]
355    UImage1D,
356    #[lang_util(token = "image1DArray", kind = "type name")]
357    Image1DArray,
358    #[lang_util(token = "iimage1DArray", kind = "type name")]
359    IImage1DArray,
360    #[lang_util(token = "uimage1DArray", kind = "type name")]
361    UImage1DArray,
362    #[lang_util(token = "image2D", kind = "type name")]
363    Image2D,
364    #[lang_util(token = "iimage2D", kind = "type name")]
365    IImage2D,
366    #[lang_util(token = "uimage2D", kind = "type name")]
367    UImage2D,
368    #[lang_util(token = "image2DArray", kind = "type name")]
369    Image2DArray,
370    #[lang_util(token = "iimage2DArray", kind = "type name")]
371    IImage2DArray,
372    #[lang_util(token = "uimage2DArray", kind = "type name")]
373    UImage2DArray,
374    #[lang_util(token = "image2DRect", kind = "type name")]
375    Image2DRect,
376    #[lang_util(token = "iimage2DRect", kind = "type name")]
377    IImage2DRect,
378    #[lang_util(token = "uimage2DRect", kind = "type name")]
379    UImage2DRect,
380    #[lang_util(token = "image2DMS", kind = "type name")]
381    Image2DMs,
382    #[lang_util(token = "iimage2DMS", kind = "type name")]
383    IImage2DMs,
384    #[lang_util(token = "uimage2DMS", kind = "type name")]
385    UImage2DMs,
386    #[lang_util(
387        token = "image2DMSArray",
388        kind = "type name",
389        kind = "vulkan type name"
390    )]
391    Image2DMsArray,
392    #[lang_util(
393        token = "iimage2DMSArray",
394        kind = "type name",
395        kind = "vulkan type name"
396    )]
397    IImage2DMsArray,
398    #[lang_util(
399        token = "uimage2DMSArray",
400        kind = "type name",
401        kind = "vulkan type name"
402    )]
403    UImage2DMsArray,
404    #[lang_util(token = "image3D", kind = "type name")]
405    Image3D,
406    #[lang_util(token = "iimage3D", kind = "type name")]
407    IImage3D,
408    #[lang_util(token = "uimage3D", kind = "type name")]
409    UImage3D,
410    #[lang_util(token = "imageCube", kind = "type name")]
411    ImageCube,
412    #[lang_util(token = "iimageCube", kind = "type name")]
413    IImageCube,
414    #[lang_util(token = "uimageCube", kind = "type name")]
415    UImageCube,
416    #[lang_util(
417        token = "imageCubeArray",
418        kind = "type name",
419        kind = "vulkan type name"
420    )]
421    ImageCubeArray,
422    #[lang_util(
423        token = "iimageCubeArray",
424        kind = "type name",
425        kind = "vulkan type name"
426    )]
427    IImageCubeArray,
428    #[lang_util(
429        token = "uimageCubeArray",
430        kind = "type name",
431        kind = "vulkan type name"
432    )]
433    UImageCubeArray,
434    #[lang_util(token = "imageBuffer", kind = "type name")]
435    ImageBuffer,
436    #[lang_util(token = "iimageBuffer", kind = "type name")]
437    IImageBuffer,
438    #[lang_util(token = "uimageBuffer", kind = "type name")]
439    UImageBuffer,
440
441    // Begin Vulkan-target keywords
442    #[lang_util(token = "texture1D")]
443    Texture1D,
444    #[lang_util(token = "texture1DArray")]
445    Texture1DArray,
446    #[lang_util(token = "itexture1D")]
447    ITexture1D,
448    #[lang_util(token = "itexture1DArray")]
449    ITexture1DArray,
450    #[lang_util(token = "utexture1D")]
451    UTexture1D,
452    #[lang_util(token = "utexture1DArray")]
453    UTexture1DArray,
454    #[lang_util(token = "texture2D")]
455    Texture2D,
456    #[lang_util(token = "texture2DArray")]
457    Texture2DArray,
458    #[lang_util(token = "itexture2D")]
459    ITexture2D,
460    #[lang_util(token = "itexture2DArray")]
461    ITexture2DArray,
462    #[lang_util(token = "utexture2D")]
463    UTexture2D,
464    #[lang_util(token = "utexture2DArray")]
465    UTexture2DArray,
466    #[lang_util(token = "texture2DRect")]
467    Texture2DRect,
468    #[lang_util(token = "itexture2DRect")]
469    ITexture2DRect,
470    #[lang_util(token = "utexture2DRect")]
471    UTexture2DRect,
472    #[lang_util(token = "texture2DMS")]
473    Texture2DMs,
474    #[lang_util(token = "itexture2DMS")]
475    ITexture2DMs,
476    #[lang_util(token = "utexture2DMS")]
477    UTexture2DMs,
478    #[lang_util(token = "texture2DMSArray")]
479    Texture2DMsArray,
480    #[lang_util(token = "itexture2DMSArray")]
481    ITexture2DMsArray,
482    #[lang_util(token = "utexture2DMSArray")]
483    UTexture2DMsArray,
484    #[lang_util(token = "texture3D")]
485    Texture3D,
486    #[lang_util(token = "itexture3D")]
487    ITexture3D,
488    #[lang_util(token = "utexture3D")]
489    UTexture3D,
490    #[lang_util(token = "textureCube")]
491    TextureCube,
492    #[lang_util(token = "itextureCube")]
493    ITextureCube,
494    #[lang_util(token = "utextureCube")]
495    UTextureCube,
496    #[lang_util(token = "textureCubeArray")]
497    TextureCubeArray,
498    #[lang_util(token = "itextureCubeArray")]
499    ITextureCubeArray,
500    #[lang_util(token = "utextureCubeArray")]
501    UTextureCubeArray,
502    #[lang_util(token = "textureBuffer")]
503    TextureBuffer,
504    #[lang_util(token = "itextureBuffer")]
505    ITextureBuffer,
506    #[lang_util(token = "utextureBuffer")]
507    UTextureBuffer,
508    #[lang_util(token = "sampler")]
509    Sampler,
510    #[lang_util(token = "samplerShadow")]
511    SamplerShadow,
512    #[lang_util(token = "subpassInput")]
513    SubpassInput,
514    #[lang_util(token = "isubpassInput")]
515    ISubpassInput,
516    #[lang_util(token = "usubpassInput")]
517    USubpassInput,
518    #[lang_util(token = "subpassInputMS")]
519    SubpassInputMs,
520    #[lang_util(token = "isubpassInputMS")]
521    ISubpassInputMs,
522    #[lang_util(token = "usubpassInputMS")]
523    USubpassInputMs,
524    // End Vulkan-target keywords
525    #[lang_util(token = "struct", kind = "struct", kind = "keyword")]
526    Struct,
527    #[lang_util(token = "void", kind = "type name")]
528    Void,
529    #[lang_util(token = "while", kind = "keyword")]
530    While,
531    #[lang_util(token = "break", kind = "keyword")]
532    Break,
533    #[lang_util(token = "continue", kind = "keyword")]
534    Continue,
535    #[lang_util(token = "do", kind = "keyword")]
536    Do,
537    #[lang_util(token = "else", kind = "keyword")]
538    Else,
539    #[lang_util(token = "for", kind = "keyword")]
540    For,
541    #[lang_util(token = "if", kind = "keyword")]
542    If,
543    #[lang_util(token = "discard", kind = "keyword")]
544    Discard,
545    #[lang_util(token = "return", kind = "keyword")]
546    Return,
547    #[lang_util(token = "switch", kind = "keyword")]
548    Switch,
549    #[lang_util(token = "case", kind = "keyword")]
550    Case,
551    #[lang_util(token = "default", kind = "keyword")]
552    Default,
553    #[lang_util(
554        token = "subroutine",
555        kind = "storage qualifier",
556        kind = "type qualifier"
557    )]
558    Subroutine,
559    #[lang_util(parser = "ident", kind = "identifier")]
560    Identifier(SmolStr),
561    #[lang_util(parser = "ty_name", kind = "type name")]
562    TypeName(SmolStr), // Cast from Identifier depending on known type names
563    #[lang_util(parser = "float_constant", kind = "literal")]
564    FloatConstant(f32),
565    #[lang_util(parser = "int_constant", kind = "literal")]
566    IntConstant(i32),
567    #[lang_util(parser = "uint_constant", kind = "literal")]
568    UIntConstant(u32),
569    #[lang_util(parser = "bool_constant", kind = "literal")]
570    BoolConstant(bool),
571    #[lang_util(parser = "double_constant", kind = "literal")]
572    DoubleConstant(f64),
573    #[lang_util(token = "<<", kind = "binary operator", kind = "operator")]
574    LeftOp,
575    #[lang_util(token = ">>", kind = "binary operator", kind = "operator")]
576    RightOp,
577    #[lang_util(token = "++", kind = "unary operator", kind = "operator")]
578    IncOp,
579    #[lang_util(token = "--", kind = "unary operator", kind = "operator")]
580    DecOp,
581    #[lang_util(token = "<=", kind = "binary operator", kind = "operator")]
582    LeOp,
583    #[lang_util(token = ">=", kind = "binary operator", kind = "operator")]
584    GeOp,
585    #[lang_util(token = "==", kind = "binary operator", kind = "operator")]
586    EqOp,
587    #[lang_util(token = "!=", kind = "binary operator", kind = "operator")]
588    NeOp,
589    #[lang_util(token = "&&", kind = "binary operator", kind = "operator")]
590    AndOp,
591    #[lang_util(token = "||", kind = "binary operator", kind = "operator")]
592    OrOp,
593    #[lang_util(token = "^^", kind = "binary operator", kind = "operator")]
594    XorOp,
595    #[lang_util(token = "*=", kind = "binary operator", kind = "operator")]
596    MulAssign,
597    #[lang_util(token = "/=", kind = "binary operator", kind = "operator")]
598    DivAssign,
599    #[lang_util(token = "+=", kind = "binary operator", kind = "operator")]
600    AddAssign,
601    #[lang_util(token = "%=", kind = "binary operator", kind = "operator")]
602    ModAssign,
603    #[lang_util(token = "<<=", kind = "binary operator", kind = "operator")]
604    LeftAssign,
605    #[lang_util(token = ">>=", kind = "binary operator", kind = "operator")]
606    RightAssign,
607    #[lang_util(token = "&=", kind = "binary operator", kind = "operator")]
608    AndAssign,
609    #[lang_util(token = "^=", kind = "binary operator", kind = "operator")]
610    XorAssign,
611    #[lang_util(token = "|=", kind = "binary operator", kind = "operator")]
612    OrAssign,
613    #[lang_util(token = "-=", kind = "binary operator", kind = "operator")]
614    SubAssign,
615    #[lang_util(token = "(")]
616    LeftParen,
617    #[lang_util(token = ")")]
618    RightParen,
619    #[lang_util(token = "[")]
620    LeftBracket,
621    #[lang_util(token = "]")]
622    RightBracket,
623    #[lang_util(token = "{")]
624    LeftBrace,
625    #[lang_util(token = "}")]
626    RightBrace,
627    #[lang_util(token = ".", kind = "binary operator", kind = "operator")]
628    Dot,
629    #[lang_util(token = ",", kind = "operator")]
630    Comma,
631    #[lang_util(token = ":", kind = "operator")]
632    Colon,
633    #[lang_util(token = "=", kind = "binary operator", kind = "operator")]
634    Equal,
635    #[lang_util(token = ";")]
636    Semicolon,
637    #[lang_util(token = "!", kind = "unary operator", kind = "operator")]
638    Bang,
639    #[lang_util(
640        token = "-",
641        kind = "binary operator",
642        kind = "unary operator",
643        kind = "operator"
644    )]
645    Dash,
646    #[lang_util(token = "~", kind = "unary operator", kind = "operator")]
647    Tilde,
648    #[lang_util(
649        token = "+",
650        kind = "binary operator",
651        kind = "unary operator",
652        kind = "operator"
653    )]
654    Plus,
655    #[lang_util(token = "*", kind = "binary operator", kind = "operator")]
656    Star,
657    #[lang_util(token = "/", kind = "binary operator", kind = "operator")]
658    Slash,
659    #[lang_util(token = "%", kind = "binary operator", kind = "operator")]
660    Percent,
661    #[lang_util(token = "<", kind = "binary operator", kind = "operator")]
662    LeftAngle,
663    #[lang_util(token = ">", kind = "binary operator", kind = "operator")]
664    RightAngle,
665    #[lang_util(token = "|", kind = "binary operator", kind = "operator")]
666    VerticalBar,
667    #[lang_util(token = "^", kind = "binary operator", kind = "operator")]
668    Caret,
669    #[lang_util(token = "&", kind = "binary operator", kind = "operator")]
670    Ampersand,
671    #[lang_util(token = "?", kind = "operator")]
672    Question,
673    #[lang_util(token = "invariant")]
674    Invariant,
675    #[lang_util(token = "precise", kind = "type qualifier")]
676    Precise,
677    #[lang_util(token = "highp", kind = "precision qualifier", kind = "type qualifier")]
678    HighPrecision,
679    #[lang_util(
680        token = "mediump",
681        kind = "precision qualifier",
682        kind = "type qualifier"
683    )]
684    MediumPrecision,
685    #[lang_util(token = "lowp", kind = "precision qualifier", kind = "type qualifier")]
686    LowPrecision,
687    #[lang_util(token = "precision")]
688    Precision,
689
690    // TODO: Line continuation can happen inside tokens
691    #[lang_util(display = "<whitespace>", parser(display), kind = "trivia")]
692    Whitespace,
693    #[lang_util(display = "<single line comment>", parser(display), kind = "trivia")]
694    SingleLineComment,
695    #[lang_util(display = "<multi line comment>", parser(display), kind = "trivia")]
696    MultiLineComment,
697
698    // TODO: Line continuations in preprocessor pragmas?
699    #[lang_util(display = "#define", parser(display), kind = "preprocessor directive")]
700    PpDefine,
701    #[lang_util(display = "#else", parser(display), kind = "preprocessor directive")]
702    PpElse,
703    #[lang_util(display = "#elif", parser(display), kind = "preprocessor directive")]
704    PpElif,
705    #[lang_util(display = "#endif", parser(display), kind = "preprocessor directive")]
706    PpEndIf,
707    #[lang_util(display = "#error", parser(display), kind = "preprocessor directive")]
708    PpError,
709    #[lang_util(display = "#if", parser(display), kind = "preprocessor directive")]
710    PpIf,
711    #[lang_util(display = "#ifdef", parser(display), kind = "preprocessor directive")]
712    PpIfDef,
713    #[lang_util(display = "#ifndef", parser(display), kind = "preprocessor directive")]
714    PpIfNDef,
715    #[lang_util(display = "#include", parser(display), kind = "preprocessor directive")]
716    PpInclude,
717    #[lang_util(display = "#line", parser(display), kind = "preprocessor directive")]
718    PpLine,
719    #[lang_util(display = "#pragma", parser(display), kind = "preprocessor directive")]
720    PpPragma,
721    #[lang_util(display = "#undef", parser(display), kind = "preprocessor directive")]
722    PpUndef,
723    #[lang_util(display = "#version", parser(display), kind = "preprocessor directive")]
724    PpVersion,
725    #[lang_util(
726        display = "#extension",
727        parser(display),
728        kind = "preprocessor directive"
729    )]
730    PpExtension,
731
732    #[lang_util(
733        display = "<preprocessor string>",
734        parser(display),
735        kind = "preprocessor string"
736    )]
737    PpRest(String),
738
739    #[lang_util(display = "core", parser(display), kind = "version profile")]
740    PpCore,
741    #[lang_util(display = "compatibility", parser(display), kind = "version profile")]
742    PpCompatibility,
743    #[lang_util(display = "es", parser(display), kind = "version profile")]
744    PpEs,
745
746    #[lang_util(display = "require", parser(display), kind = "extension behavior")]
747    PpExtRequire,
748    #[lang_util(display = "enable", parser(display), kind = "extension behavior")]
749    PpExtEnable,
750    #[lang_util(display = "warn", parser(display), kind = "extension behavior")]
751    PpExtWarn,
752    #[lang_util(display = "disable", parser(display), kind = "extension behavior")]
753    PpExtDisable,
754
755    #[lang_util(display = "<{}>", parser(display), kind = "include path")]
756    PpPathAbsolute(String),
757    #[lang_util(display = "\"{}\"", parser(display), kind = "include path")]
758    PpPathRelative(String),
759
760    #[lang_util(display = "<invalid token>", parser(display), kind = "error")]
761    Error,
762}
763
764impl Token {
765    /// Return `true` if this token is a preprocessor token
766    pub fn is_pp(&self) -> bool {
767        matches!(
768            self,
769            Self::PpDefine
770                | Self::PpElse
771                | Self::PpElif
772                | Self::PpEndIf
773                | Self::PpError
774                | Self::PpIf
775                | Self::PpIfDef
776                | Self::PpIfNDef
777                | Self::PpInclude
778                | Self::PpLine
779                | Self::PpPragma
780                | Self::PpUndef
781                | Self::PpVersion
782                | Self::PpExtension
783        )
784    }
785
786    /// Return this token's inner text as a string slice
787    pub fn as_str(&self) -> &str {
788        match self {
789            Self::Identifier(s) => s,
790            Self::TypeName(s) => s,
791            Self::PpPathRelative(s) => s,
792            Self::PpPathAbsolute(s) => s,
793            _ => panic!("cannot convert token {:?}, to str", self),
794        }
795    }
796}
797
798macro_rules! impl_from {
799    ($t:ty => $i:ident) => {
800        impl From<Token> for $t {
801            fn from(value: Token) -> Self {
802                match value {
803                    Token::$i(i) => i,
804                    other => panic!(concat!("cannot convert {:?} into ", stringify!($i)), other),
805                }
806            }
807        }
808    };
809}
810
811impl_from!(i32 => IntConstant);
812impl_from!(u32 => UIntConstant);
813impl_from!(f32 => FloatConstant);
814impl_from!(f64 => DoubleConstant);
815impl_from!(bool => BoolConstant);
816
817impl From<Token> for String {
818    fn from(value: Token) -> Self {
819        match value {
820            Token::PpRest(s) => s,
821            other => panic!("cannot convert {:?} into String", other),
822        }
823    }
824}