1#![allow(clippy::large_enum_variant)]
24
25use std::{fmt, iter::FromIterator};
26
27#[cfg(feature = "serde")]
28use rserde::{Deserialize, Serialize};
29
30pub use lang_util::{
31 node::{Node, NodeDisplay},
32 position::NodeSpan,
33 FileId, NodeContent, NodeContentDisplay, SmolStr, TextRange, TextSize,
34};
35
36macro_rules! impl_node_content {
37 (
38 $(#[$m:meta])* $v:vis type $t:ident = Node<$tdata:ident>;
39 ) => {
40 impl NodeContent for $tdata {}
41
42 $(#[$m])* $v type $t = Node<$tdata>;
43
44 impl From<Node<$tdata>> for $tdata {
45 fn from(node: Node<$tdata>) -> Self {
46 node.content
47 }
48 }
49 };
50}
51
52#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Hash, NodeContentDisplay)]
54#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
55#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
56#[lang_util(display(leaf))]
57pub struct IdentifierData(#[lang_util(display(extra))] pub SmolStr);
58
59impl_node_content! {
60 pub type Identifier = Node<IdentifierData>;
62}
63
64impl IdentifierData {
65 pub fn as_rs_ident(&self) -> Option<&str> {
72 if self.0.starts_with('#') & self.0.ends_with(')') {
73 let s = self.0[1..self.0.len() - 1].trim();
75 Some(s[1..].trim())
77 } else {
78 None
79 }
80 }
81
82 pub fn as_str(&self) -> &str {
84 self.0.as_str()
85 }
86}
87
88impl From<&str> for IdentifierData {
89 fn from(ident: &str) -> Self {
90 Self(ident.into())
91 }
92}
93
94impl fmt::Display for IdentifierData {
95 fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
96 self.0.fmt(f)
97 }
98}
99
100#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Hash, NodeContentDisplay)]
102#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
103#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
104#[lang_util(display(leaf))]
105pub struct TypeNameData(pub SmolStr);
106
107impl_node_content! {
108 pub type TypeName = Node<TypeNameData>;
110}
111
112impl TypeNameData {
113 pub fn as_str(&self) -> &str {
115 self.0.as_str()
116 }
117}
118
119impl From<IdentifierData> for TypeNameData {
120 fn from(ident: IdentifierData) -> Self {
121 Self(ident.0)
122 }
123}
124
125impl From<&str> for TypeNameData {
126 fn from(ident: &str) -> Self {
127 Self(ident.into())
128 }
129}
130
131impl fmt::Display for TypeNameData {
132 fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
133 self.0.fmt(f)
134 }
135}
136
137#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
139#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
140#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
141pub enum PathData {
142 Absolute(String),
144 Relative(String),
146}
147
148impl_node_content! {
149 pub type Path = Node<PathData>;
151}
152
153#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
155#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
156#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
157pub enum TypeSpecifierNonArrayData {
158 #[lang_util(display(extra = "void"))]
160 Void,
161 #[lang_util(display(extra = "bool"))]
163 Bool,
164 #[lang_util(display(extra = "int"))]
166 Int,
167 #[lang_util(display(extra = "uint"))]
169 UInt,
170 #[lang_util(display(extra = "float"))]
172 Float,
173 #[lang_util(display(extra = "double"))]
175 Double,
176 #[lang_util(display(extra = "vec2"))]
178 Vec2,
179 #[lang_util(display(extra = "vec3"))]
181 Vec3,
182 #[lang_util(display(extra = "vec4"))]
184 Vec4,
185 #[lang_util(display(extra = "dvec2"))]
187 DVec2,
188 #[lang_util(display(extra = "dvec3"))]
190 DVec3,
191 #[lang_util(display(extra = "dvec4"))]
193 DVec4,
194 #[lang_util(display(extra = "bvec2"))]
196 BVec2,
197 #[lang_util(display(extra = "bvec3"))]
199 BVec3,
200 #[lang_util(display(extra = "bvec4"))]
202 BVec4,
203 #[lang_util(display(extra = "ivec2"))]
205 IVec2,
206 #[lang_util(display(extra = "ivec3"))]
208 IVec3,
209 #[lang_util(display(extra = "ivec4"))]
211 IVec4,
212 #[lang_util(display(extra = "uvec2"))]
214 UVec2,
215 #[lang_util(display(extra = "uvec3"))]
217 UVec3,
218 #[lang_util(display(extra = "uvec4"))]
220 UVec4,
221 #[lang_util(display(extra = "mat2"))]
223 Mat2,
224 #[lang_util(display(extra = "mat3"))]
226 Mat3,
227 #[lang_util(display(extra = "mat4"))]
229 Mat4,
230 #[lang_util(display(extra = "mat2x2"))]
232 Mat22,
233 #[lang_util(display(extra = "mat2x3"))]
235 Mat23,
236 #[lang_util(display(extra = "mat2x4"))]
238 Mat24,
239 #[lang_util(display(extra = "mat3x2"))]
241 Mat32,
242 #[lang_util(display(extra = "mat3x3"))]
244 Mat33,
245 #[lang_util(display(extra = "mat3x4"))]
247 Mat34,
248 #[lang_util(display(extra = "mat4x2"))]
250 Mat42,
251 #[lang_util(display(extra = "mat4x3"))]
253 Mat43,
254 #[lang_util(display(extra = "mat4x4"))]
256 Mat44,
257 #[lang_util(display(extra = "dmat2"))]
259 DMat2,
260 #[lang_util(display(extra = "dmat3"))]
262 DMat3,
263 #[lang_util(display(extra = "dmat4"))]
265 DMat4,
266 #[lang_util(display(extra = "dmat2x2"))]
268 DMat22,
269 #[lang_util(display(extra = "dmat2x3"))]
271 DMat23,
272 #[lang_util(display(extra = "dmat2x4"))]
274 DMat24,
275 #[lang_util(display(extra = "dmat3x2"))]
277 DMat32,
278 #[lang_util(display(extra = "dmat3x3"))]
280 DMat33,
281 #[lang_util(display(extra = "dmat3x4"))]
283 DMat34,
284 #[lang_util(display(extra = "dmat4x2"))]
286 DMat42,
287 #[lang_util(display(extra = "dmat4x3"))]
289 DMat43,
290 #[lang_util(display(extra = "dmat4x4"))]
292 DMat44,
293 #[lang_util(display(extra = "sampler1D"))]
296 Sampler1D,
297 #[lang_util(display(extra = "image1D"))]
299 Image1D,
300 #[lang_util(display(extra = "sampler2D"))]
302 Sampler2D,
303 #[lang_util(display(extra = "image2D"))]
305 Image2D,
306 #[lang_util(display(extra = "sampler3D"))]
308 Sampler3D,
309 #[lang_util(display(extra = "image3D"))]
311 Image3D,
312 #[lang_util(display(extra = "samplerCube"))]
314 SamplerCube,
315 #[lang_util(display(extra = "imageCube"))]
317 ImageCube,
318 #[lang_util(display(extra = "sampler2DRect"))]
320 Sampler2DRect,
321 #[lang_util(display(extra = "image2DRect"))]
323 Image2DRect,
324 #[lang_util(display(extra = "sampler1DArray"))]
326 Sampler1DArray,
327 #[lang_util(display(extra = "image1DArray"))]
329 Image1DArray,
330 #[lang_util(display(extra = "sampler2DArray"))]
332 Sampler2DArray,
333 #[lang_util(display(extra = "image2DArray"))]
335 Image2DArray,
336 #[lang_util(display(extra = "samplerBuffer"))]
338 SamplerBuffer,
339 #[lang_util(display(extra = "imageBuffer"))]
341 ImageBuffer,
342 #[lang_util(display(extra = "sampler2DMS"))]
344 Sampler2DMs,
345 #[lang_util(display(extra = "image2DMS"))]
347 Image2DMs,
348 #[lang_util(display(extra = "sampler2DMSArray"))]
350 Sampler2DMsArray,
351 #[lang_util(display(extra = "image2DMSArray"))]
353 Image2DMsArray,
354 #[lang_util(display(extra = "samplerCubeArray"))]
356 SamplerCubeArray,
357 #[lang_util(display(extra = "imageCubeArray"))]
359 ImageCubeArray,
360 #[lang_util(display(extra = "sampler1DShadow"))]
362 Sampler1DShadow,
363 #[lang_util(display(extra = "sampler2DShadow"))]
365 Sampler2DShadow,
366 #[lang_util(display(extra = "sampler2DRectShadow"))]
368 Sampler2DRectShadow,
369 #[lang_util(display(extra = "sampler1DArrayShadow"))]
371 Sampler1DArrayShadow,
372 #[lang_util(display(extra = "sampler2DArrayShadow"))]
374 Sampler2DArrayShadow,
375 #[lang_util(display(extra = "samplerCubeShadow"))]
377 SamplerCubeShadow,
378 #[lang_util(display(extra = "samplerCubeArrayShadow"))]
380 SamplerCubeArrayShadow,
381 #[lang_util(display(extra = "isampler1D"))]
384 ISampler1D,
385 #[lang_util(display(extra = "iimage1D"))]
387 IImage1D,
388 #[lang_util(display(extra = "isampler2D"))]
390 ISampler2D,
391 #[lang_util(display(extra = "iimage2D"))]
393 IImage2D,
394 #[lang_util(display(extra = "isampler3D"))]
396 ISampler3D,
397 #[lang_util(display(extra = "iimage3D"))]
399 IImage3D,
400 #[lang_util(display(extra = "isamplerCube"))]
402 ISamplerCube,
403 #[lang_util(display(extra = "iimageCube"))]
405 IImageCube,
406 #[lang_util(display(extra = "isampler2DRect"))]
408 ISampler2DRect,
409 #[lang_util(display(extra = "iimage2DRect"))]
411 IImage2DRect,
412 #[lang_util(display(extra = "isampler1DArray"))]
414 ISampler1DArray,
415 #[lang_util(display(extra = "iimage1DArray"))]
417 IImage1DArray,
418 #[lang_util(display(extra = "isampler2DArray"))]
420 ISampler2DArray,
421 #[lang_util(display(extra = "iimage2DArray"))]
423 IImage2DArray,
424 #[lang_util(display(extra = "isamplerBuffer"))]
426 ISamplerBuffer,
427 #[lang_util(display(extra = "iimageBuffer"))]
429 IImageBuffer,
430 #[lang_util(display(extra = "isampler2DMS"))]
432 ISampler2DMs,
433 #[lang_util(display(extra = "iimage2DMS"))]
435 IImage2DMs,
436 #[lang_util(display(extra = "isampler2DMSArray"))]
438 ISampler2DMsArray,
439 #[lang_util(display(extra = "iimage2DMSArray"))]
441 IImage2DMsArray,
442 #[lang_util(display(extra = "isamplerCubeArray"))]
444 ISamplerCubeArray,
445 #[lang_util(display(extra = "iimageCubeArray"))]
447 IImageCubeArray,
448 #[lang_util(display(extra = "atomic_uint"))]
451 AtomicUInt,
452 #[lang_util(display(extra = "usampler1D"))]
454 USampler1D,
455 #[lang_util(display(extra = "uimage1D"))]
457 UImage1D,
458 #[lang_util(display(extra = "usampler2D"))]
460 USampler2D,
461 #[lang_util(display(extra = "uimage2D"))]
463 UImage2D,
464 #[lang_util(display(extra = "usampler3D"))]
466 USampler3D,
467 #[lang_util(display(extra = "uimage3D"))]
469 UImage3D,
470 #[lang_util(display(extra = "usamplerCube"))]
472 USamplerCube,
473 #[lang_util(display(extra = "uimageCube"))]
475 UImageCube,
476 #[lang_util(display(extra = "usampler2DRect"))]
478 USampler2DRect,
479 #[lang_util(display(extra = "uimage2DRect"))]
481 UImage2DRect,
482 #[lang_util(display(extra = "usampler1DArray"))]
484 USampler1DArray,
485 #[lang_util(display(extra = "uimage1DArray"))]
487 UImage1DArray,
488 #[lang_util(display(extra = "usampler2DArray"))]
490 USampler2DArray,
491 #[lang_util(display(extra = "uimage2DArray"))]
493 UImage2DArray,
494 #[lang_util(display(extra = "usamplerBuffer"))]
496 USamplerBuffer,
497 #[lang_util(display(extra = "uimageBuffer"))]
499 UImageBuffer,
500 #[lang_util(display(extra = "usampler2DMS"))]
502 USampler2DMs,
503 #[lang_util(display(extra = "uimage2DMS"))]
505 UImage2DMs,
506 #[lang_util(display(extra = "usampler2DMSArray"))]
508 USampler2DMsArray,
509 #[lang_util(display(extra = "uimage2DMSArray"))]
511 UImage2DMsArray,
512 #[lang_util(display(extra = "usamplerCubeArray"))]
514 USamplerCubeArray,
515 #[lang_util(display(extra = "uimageCubeArray"))]
517 UImageCubeArray,
518
519 #[lang_util(display(extra = "texture1D"))]
522 Texture1D,
523 #[lang_util(display(extra = "texture2D"))]
525 Texture2D,
526 #[lang_util(display(extra = "texture3D"))]
528 Texture3D,
529 #[lang_util(display(extra = "textureCube"))]
531 TextureCube,
532 #[lang_util(display(extra = "texture2DRect"))]
534 Texture2DRect,
535 #[lang_util(display(extra = "texture1DArray"))]
537 Texture1DArray,
538 #[lang_util(display(extra = "texture2DArray"))]
540 Texture2DArray,
541 #[lang_util(display(extra = "textureBuffer"))]
543 TextureBuffer,
544 #[lang_util(display(extra = "texture2DMS"))]
546 Texture2DMs,
547 #[lang_util(display(extra = "texture2DMSArray"))]
549 Texture2DMsArray,
550 #[lang_util(display(extra = "textureCubeArray"))]
552 TextureCubeArray,
553 #[lang_util(display(extra = "itexture1D"))]
555 ITexture1D,
556 #[lang_util(display(extra = "itexture2D"))]
558 ITexture2D,
559 #[lang_util(display(extra = "itexture3D"))]
561 ITexture3D,
562 #[lang_util(display(extra = "itextureCube"))]
564 ITextureCube,
565 #[lang_util(display(extra = "itexture2DRect"))]
567 ITexture2DRect,
568 #[lang_util(display(extra = "itexture1DArray"))]
570 ITexture1DArray,
571 #[lang_util(display(extra = "itexture2DArray"))]
573 ITexture2DArray,
574 #[lang_util(display(extra = "itextureBuffer"))]
576 ITextureBuffer,
577 #[lang_util(display(extra = "itexture2DMS"))]
579 ITexture2DMs,
580 #[lang_util(display(extra = "itexture2DMSArray"))]
582 ITexture2DMsArray,
583 #[lang_util(display(extra = "itextureCubeArray"))]
585 ITextureCubeArray,
586 #[lang_util(display(extra = "sampler"))]
588 Sampler,
589 #[lang_util(display(extra = "samplerShadow"))]
591 SamplerShadow,
592 #[lang_util(display(extra = "subpassInput"))]
594 SubpassInput,
595 #[lang_util(display(extra = "isubpassInput"))]
597 ISubpassInput,
598 #[lang_util(display(extra = "usubpassInput"))]
600 USubpassInput,
601 #[lang_util(display(extra = "subpassInputMS"))]
603 SubpassInputMs,
604 #[lang_util(display(extra = "isubpassInputMS"))]
606 ISubpassInputMs,
607 #[lang_util(display(extra = "usubpassInputMS"))]
609 USubpassInputMs,
610
611 #[lang_util(display(extra = "struct"))]
614 Struct(StructSpecifier),
615 TypeName(TypeName),
617}
618
619impl_node_content! {
620 pub type TypeSpecifierNonArray = Node<TypeSpecifierNonArrayData>;
622}
623
624impl From<TypeName> for TypeSpecifierNonArrayData {
625 fn from(tn: TypeName) -> Self {
626 Self::TypeName(tn)
627 }
628}
629
630#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
632#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
633#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
634pub struct TypeSpecifierData {
635 pub ty: TypeSpecifierNonArray,
637 pub array_specifier: Option<ArraySpecifier>,
639}
640
641impl_node_content! {
642 pub type TypeSpecifier = Node<TypeSpecifierData>;
644}
645
646impl From<TypeSpecifierNonArray> for TypeSpecifierData {
647 fn from(ty: TypeSpecifierNonArray) -> Self {
648 Self {
649 ty,
650 array_specifier: None,
651 }
652 }
653}
654
655impl From<TypeSpecifierNonArrayData> for TypeSpecifierData {
656 fn from(ty: TypeSpecifierNonArrayData) -> Self {
657 Self {
658 ty: ty.into(),
659 array_specifier: None,
660 }
661 }
662}
663
664#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
666#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
667#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
668pub struct StructSpecifierData {
669 pub name: Option<TypeName>,
671 pub fields: Vec<StructFieldSpecifier>,
673}
674
675impl_node_content! {
676 pub type StructSpecifier = Node<StructSpecifierData>;
678}
679
680#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
682#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
683#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
684pub struct StructFieldSpecifierData {
685 pub qualifier: Option<TypeQualifier>,
687 pub ty: TypeSpecifier,
689 pub identifiers: Vec<ArrayedIdentifier>, }
692
693impl_node_content! {
694 pub type StructFieldSpecifier = Node<StructFieldSpecifierData>;
696}
697
698#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
700#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
701#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
702pub struct ArrayedIdentifierData {
703 pub ident: Identifier,
705 pub array_spec: Option<ArraySpecifier>,
707}
708
709impl_node_content! {
710 pub type ArrayedIdentifier = Node<ArrayedIdentifierData>;
712}
713
714impl ArrayedIdentifierData {
715 pub fn new<I, AS>(ident: I, array_spec: AS) -> Self
717 where
718 I: Into<Identifier>,
719 AS: Into<Option<ArraySpecifier>>,
720 {
721 Self {
722 ident: ident.into(),
723 array_spec: array_spec.into(),
724 }
725 }
726}
727
728impl From<&str> for ArrayedIdentifierData {
729 fn from(ident: &str) -> Self {
730 Self {
731 ident: IdentifierData::from(ident).into(),
732 array_spec: None,
733 }
734 }
735}
736
737#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
739#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
740#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
741pub struct TypeQualifierData {
742 pub qualifiers: Vec<TypeQualifierSpec>,
744}
745
746impl_node_content! {
747 pub type TypeQualifier = Node<TypeQualifierData>;
749}
750
751#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
753#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
754#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
755pub enum TypeQualifierSpecData {
756 Storage(StorageQualifier),
758 Layout(LayoutQualifier),
760 Precision(PrecisionQualifier),
762 Interpolation(InterpolationQualifier),
764 Invariant,
766 Precise,
768}
769
770impl_node_content! {
771 pub type TypeQualifierSpec = Node<TypeQualifierSpecData>;
773}
774
775#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
777#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
778#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
779pub enum StorageQualifierData {
780 #[lang_util(display(extra = "const"))]
782 Const,
783 #[lang_util(display(extra = "inout"))]
785 InOut,
786 #[lang_util(display(extra = "in"))]
788 In,
789 #[lang_util(display(extra = "out"))]
791 Out,
792 #[lang_util(display(extra = "centroid"))]
794 Centroid,
795 #[lang_util(display(extra = "patch"))]
797 Patch,
798 #[lang_util(display(extra = "sample"))]
800 Sample,
801 #[lang_util(display(extra = "uniform"))]
803 Uniform,
804 #[lang_util(display(extra = "buffer"))]
806 Buffer,
807 #[lang_util(display(extra = "shared"))]
809 Shared,
810 #[lang_util(display(extra = "coherent"))]
812 Coherent,
813 #[lang_util(display(extra = "volatile"))]
815 Volatile,
816 #[lang_util(display(extra = "restrict"))]
818 Restrict,
819 #[lang_util(display(extra = "readonly"))]
821 ReadOnly,
822 #[lang_util(display(extra = "writeonly"))]
824 WriteOnly,
825 #[lang_util(display(extra = "attribute"))]
827 Attribute,
828 #[lang_util(display(extra = "varying"))]
830 Varying,
831 #[lang_util(display(extra = "subroutine"))]
835 Subroutine(Vec<TypeSpecifier>),
836}
837
838impl_node_content! {
839 pub type StorageQualifier = Node<StorageQualifierData>;
841}
842
843#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
845#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
846#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
847pub struct LayoutQualifierData {
848 pub ids: Vec<LayoutQualifierSpec>,
850}
851
852impl_node_content! {
853 pub type LayoutQualifier = Node<LayoutQualifierData>;
855}
856
857#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
859#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
860#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
861pub enum LayoutQualifierSpecData {
862 Identifier(Identifier, Option<Box<Expr>>),
864 #[lang_util(display(extra = "shared"))]
866 Shared,
867}
868
869impl_node_content! {
870 pub type LayoutQualifierSpec = Node<LayoutQualifierSpecData>;
872}
873
874#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
876#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
877#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
878pub enum PrecisionQualifierData {
879 #[lang_util(display(extra = "high"))]
881 High,
882 #[lang_util(display(extra = "medium"))]
884 Medium,
885 #[lang_util(display(extra = "low"))]
887 Low,
888}
889
890impl_node_content! {
891 pub type PrecisionQualifier = Node<PrecisionQualifierData>;
893}
894
895#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
897#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
898#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
899pub enum InterpolationQualifierData {
900 #[lang_util(display(extra = "smooth"))]
902 Smooth,
903 #[lang_util(display(extra = "flat"))]
905 Flat,
906 #[lang_util(display(extra = "noperspective"))]
908 NoPerspective,
909}
910
911impl_node_content! {
912 pub type InterpolationQualifier = Node<InterpolationQualifierData>;
914}
915
916#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
918#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
919#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
920pub struct FullySpecifiedTypeData {
921 pub qualifier: Option<TypeQualifier>,
923 pub ty: TypeSpecifier,
925}
926
927impl_node_content! {
928 pub type FullySpecifiedType = Node<FullySpecifiedTypeData>;
930}
931
932impl FullySpecifiedTypeData {
933 pub fn new(ty: TypeSpecifierNonArray) -> Self {
936 Self {
937 qualifier: None,
938 ty: TypeSpecifierData {
939 ty,
940 array_specifier: None,
941 }
942 .into(),
943 }
944 }
945}
946
947impl From<TypeSpecifierNonArrayData> for FullySpecifiedTypeData {
948 fn from(ty: TypeSpecifierNonArrayData) -> Self {
949 Self::new(ty.into())
950 }
951}
952
953#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
955#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
956#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
957pub struct ArraySpecifierData {
958 pub dimensions: Vec<ArraySpecifierDimension>,
960}
961
962impl_node_content! {
963 pub type ArraySpecifier = Node<ArraySpecifierData>;
965}
966
967#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
969#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
970#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
971pub enum ArraySpecifierDimensionData {
972 Unsized,
974 ExplicitlySized(Box<Expr>),
976}
977
978impl_node_content! {
979 pub type ArraySpecifierDimension = Node<ArraySpecifierDimensionData>;
981}
982
983#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
985#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
986#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
987pub enum DeclarationData {
988 FunctionPrototype(FunctionPrototype),
990 InitDeclaratorList(InitDeclaratorList),
992 Precision(PrecisionQualifier, TypeSpecifier),
994 Block(Block),
996 Invariant(Identifier),
998 TypeOnly(TypeQualifier),
1000}
1001
1002impl_node_content! {
1003 pub type Declaration = Node<DeclarationData>;
1005}
1006
1007#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1010#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1011#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1012pub struct BlockData {
1013 pub qualifier: TypeQualifier,
1015 pub name: Identifier,
1017 pub fields: Vec<StructFieldSpecifier>,
1019 pub identifier: Option<ArrayedIdentifier>,
1021}
1022
1023impl_node_content! {
1024 pub type Block = Node<BlockData>;
1026}
1027
1028#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1030#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1031#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1032pub enum FunIdentifierData {
1033 TypeSpecifier(Box<TypeSpecifier>),
1035 Expr(Box<Expr>),
1037}
1038
1039impl_node_content! {
1040 pub type FunIdentifier = Node<FunIdentifierData>;
1042}
1043
1044impl FunIdentifierData {
1045 pub fn ident(i: impl Into<IdentifierData>) -> Self {
1047 Self::Expr(Box::new(ExprData::Variable(i.into().into()).into()))
1048 }
1049
1050 pub fn as_ident(&self) -> Option<&Identifier> {
1052 match self {
1053 Self::Expr(expr) => match &***expr {
1054 ExprData::Variable(ident) => Some(ident),
1055 _ => None,
1056 },
1057 _ => None,
1058 }
1059 }
1060
1061 pub fn as_ident_mut(&mut self) -> Option<&mut Identifier> {
1063 match self {
1064 Self::Expr(expr) => match &mut ***expr {
1065 ExprData::Variable(ident) => Some(ident),
1066 _ => None,
1067 },
1068 _ => None,
1069 }
1070 }
1071
1072 pub fn as_rs_ident(&self) -> Option<&str> {
1074 if let Some(ident) = self.as_ident() {
1075 ident.as_rs_ident()
1076 } else {
1077 None
1078 }
1079 }
1080}
1081
1082#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1084#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1085#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1086pub struct FunctionPrototypeData {
1087 pub ty: FullySpecifiedType,
1089 pub name: Identifier,
1091 pub parameters: Vec<FunctionParameterDeclaration>,
1093}
1094
1095impl_node_content! {
1096 pub type FunctionPrototype = Node<FunctionPrototypeData>;
1098}
1099
1100#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1102#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1103#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1104pub enum FunctionParameterDeclarationData {
1105 Named(Option<TypeQualifier>, FunctionParameterDeclarator),
1107 Unnamed(Option<TypeQualifier>, TypeSpecifier),
1109}
1110
1111impl_node_content! {
1112 pub type FunctionParameterDeclaration = Node<FunctionParameterDeclarationData>;
1114}
1115
1116#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1118#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1119#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1120pub struct FunctionParameterDeclaratorData {
1121 pub ty: TypeSpecifier,
1123 pub ident: ArrayedIdentifier,
1125}
1126
1127impl_node_content! {
1128 pub type FunctionParameterDeclarator = Node<FunctionParameterDeclaratorData>;
1130}
1131
1132#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1134#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1135#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1136pub struct InitDeclaratorListData {
1137 pub head: SingleDeclaration,
1139 pub tail: Vec<SingleDeclarationNoType>,
1141}
1142
1143impl_node_content! {
1144 pub type InitDeclaratorList = Node<InitDeclaratorListData>;
1146}
1147
1148#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1150#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1151#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1152pub struct SingleDeclarationData {
1153 pub ty: FullySpecifiedType,
1155 pub name: Option<Identifier>,
1157 pub array_specifier: Option<ArraySpecifier>,
1159 pub initializer: Option<Initializer>,
1161}
1162
1163impl_node_content! {
1164 pub type SingleDeclaration = Node<SingleDeclarationData>;
1166}
1167
1168#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1170#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1171#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1172pub struct SingleDeclarationNoTypeData {
1173 pub ident: ArrayedIdentifier,
1175 pub initializer: Option<Initializer>,
1177}
1178
1179impl_node_content! {
1180 pub type SingleDeclarationNoType = Node<SingleDeclarationNoTypeData>;
1182}
1183
1184#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1186#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1187#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1188pub enum InitializerData {
1189 Simple(Box<Expr>),
1191 List(Vec<Initializer>),
1193}
1194
1195impl_node_content! {
1196 pub type Initializer = Node<InitializerData>;
1198}
1199
1200impl From<ExprData> for InitializerData {
1201 fn from(e: ExprData) -> Self {
1202 Self::Simple(Box::new(e.into()))
1203 }
1204}
1205
1206impl From<Expr> for InitializerData {
1207 fn from(e: Expr) -> Self {
1208 Self::Simple(Box::new(e))
1209 }
1210}
1211
1212#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1220#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1221#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1222pub enum ExprData {
1223 Variable(Identifier),
1225 IntConst(i32),
1227 UIntConst(u32),
1229 BoolConst(bool),
1231 FloatConst(f32),
1233 DoubleConst(f64),
1235 Unary(UnaryOp, Box<Expr>),
1237 Binary(BinaryOp, Box<Expr>, Box<Expr>),
1239 Ternary(Box<Expr>, Box<Expr>, Box<Expr>),
1241 Assignment(Box<Expr>, AssignmentOp, Box<Expr>),
1244 Bracket(Box<Expr>, Box<Expr>),
1246 FunCall(FunIdentifier, Vec<Expr>),
1248 Dot(Box<Expr>, Identifier),
1250 PostInc(Box<Expr>),
1252 PostDec(Box<Expr>),
1254 Comma(Box<Expr>, Box<Expr>),
1256}
1257
1258impl_node_content! {
1259 pub type Expr = Node<ExprData>;
1261}
1262
1263impl ExprData {
1264 pub fn variable(name: impl Into<IdentifierData>) -> Self {
1266 Self::Variable(name.into().into())
1267 }
1268
1269 pub fn as_rs_ident(&self) -> Option<&str> {
1271 match self {
1272 Self::Variable(ident) => ident.as_rs_ident(),
1273 _ => None,
1274 }
1275 }
1276}
1277
1278impl From<i32> for ExprData {
1279 fn from(x: i32) -> ExprData {
1280 Self::IntConst(x)
1281 }
1282}
1283
1284impl From<u32> for ExprData {
1285 fn from(x: u32) -> ExprData {
1286 Self::UIntConst(x)
1287 }
1288}
1289
1290impl From<bool> for ExprData {
1291 fn from(x: bool) -> ExprData {
1292 Self::BoolConst(x)
1293 }
1294}
1295
1296impl From<f32> for ExprData {
1297 fn from(x: f32) -> ExprData {
1298 Self::FloatConst(x)
1299 }
1300}
1301
1302impl From<f64> for ExprData {
1303 fn from(x: f64) -> ExprData {
1304 Self::DoubleConst(x)
1305 }
1306}
1307
1308#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1310#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1311#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1312pub enum UnaryOpData {
1313 #[lang_util(display(extra = "++"))]
1315 Inc,
1316 #[lang_util(display(extra = "--"))]
1318 Dec,
1319 #[lang_util(display(extra = "+"))]
1321 Add,
1322 #[lang_util(display(extra = "-"))]
1324 Minus,
1325 #[lang_util(display(extra = "!"))]
1327 Not,
1328 #[lang_util(display(extra = "~"))]
1330 Complement,
1331}
1332
1333impl_node_content! {
1334 pub type UnaryOp = Node<UnaryOpData>;
1336}
1337
1338#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1340#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1341#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1342pub enum BinaryOpData {
1343 #[lang_util(display(extra = "||"))]
1345 Or,
1346 #[lang_util(display(extra = "^^"))]
1348 Xor,
1349 #[lang_util(display(extra = "&&"))]
1351 And,
1352 #[lang_util(display(extra = "|"))]
1354 BitOr,
1355 #[lang_util(display(extra = "^"))]
1357 BitXor,
1358 #[lang_util(display(extra = "&"))]
1360 BitAnd,
1361 #[lang_util(display(extra = "=="))]
1363 Equal,
1364 #[lang_util(display(extra = "!="))]
1366 NonEqual,
1367 #[lang_util(display(extra = "<"))]
1369 Lt,
1370 #[lang_util(display(extra = ">"))]
1372 Gt,
1373 #[lang_util(display(extra = "<="))]
1375 Lte,
1376 #[lang_util(display(extra = ">="))]
1378 Gte,
1379 #[lang_util(display(extra = "<<"))]
1381 LShift,
1382 #[lang_util(display(extra = ">>"))]
1384 RShift,
1385 #[lang_util(display(extra = "+"))]
1387 Add,
1388 #[lang_util(display(extra = "-"))]
1390 Sub,
1391 #[lang_util(display(extra = "*"))]
1393 Mult,
1394 #[lang_util(display(extra = "/"))]
1396 Div,
1397 #[lang_util(display(extra = "%"))]
1399 Mod,
1400}
1401
1402impl_node_content! {
1403 pub type BinaryOp = Node<BinaryOpData>;
1405}
1406
1407#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1409#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1410#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1411pub enum AssignmentOpData {
1412 #[lang_util(display(extra = "="))]
1414 Equal,
1415 #[lang_util(display(extra = "*"))]
1417 Mult,
1418 #[lang_util(display(extra = "/="))]
1420 Div,
1421 #[lang_util(display(extra = "%="))]
1423 Mod,
1424 #[lang_util(display(extra = "+="))]
1426 Add,
1427 #[lang_util(display(extra = "-="))]
1429 Sub,
1430 #[lang_util(display(extra = "<<="))]
1432 LShift,
1433 #[lang_util(display(extra = ">>="))]
1435 RShift,
1436 #[lang_util(display(extra = "&="))]
1438 And,
1439 #[lang_util(display(extra = "^="))]
1441 Xor,
1442 #[lang_util(display(extra = "|="))]
1444 Or,
1445}
1446
1447impl_node_content! {
1448 pub type AssignmentOp = Node<AssignmentOpData>;
1450}
1451
1452#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1454#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1455#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1456pub struct TranslationUnit(pub Vec<ExternalDeclaration>);
1457
1458impl NodeContent for TranslationUnit {}
1459
1460#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1462#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1463#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1464pub enum ExternalDeclarationData {
1465 Preprocessor(Preprocessor),
1467 FunctionDefinition(FunctionDefinition),
1469 Declaration(Declaration),
1471}
1472
1473impl_node_content! {
1474 pub type ExternalDeclaration = Node<ExternalDeclarationData>;
1476}
1477
1478#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1480#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1481#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1482pub struct FunctionDefinitionData {
1483 pub prototype: FunctionPrototype,
1485 pub statement: CompoundStatement,
1487}
1488
1489impl_node_content! {
1490 pub type FunctionDefinition = Node<FunctionDefinitionData>;
1492}
1493
1494#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1496#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1497#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1498pub struct CompoundStatementData {
1499 pub statement_list: Vec<Statement>,
1501}
1502
1503impl_node_content! {
1504 pub type CompoundStatement = Node<CompoundStatementData>;
1506}
1507
1508impl FromIterator<Statement> for CompoundStatementData {
1509 fn from_iter<T>(iter: T) -> Self
1510 where
1511 T: IntoIterator<Item = Statement>,
1512 {
1513 Self {
1514 statement_list: iter.into_iter().collect(),
1515 }
1516 }
1517}
1518
1519#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1521#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1522#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1523pub enum StatementData {
1524 Declaration(Declaration),
1526 Expression(ExprStatement),
1528 Selection(SelectionStatement),
1530 Switch(SwitchStatement),
1532 CaseLabel(CaseLabel),
1534 Iteration(IterationStatement),
1536 Jump(JumpStatement),
1538 Compound(CompoundStatement),
1540}
1541
1542impl_node_content! {
1543 pub type Statement = Node<StatementData>;
1545}
1546
1547impl StatementData {
1548 pub fn declare_var<T, N, A, I>(ty: T, name: N, array_specifier: A, initializer: I) -> Self
1554 where
1555 T: Into<FullySpecifiedTypeData>,
1556 N: Into<IdentifierData>,
1557 A: Into<Option<ArraySpecifier>>,
1558 I: Into<Option<Initializer>>,
1559 {
1560 Self::Declaration(
1561 DeclarationData::InitDeclaratorList(
1562 InitDeclaratorListData {
1563 head: SingleDeclarationData {
1564 ty: ty.into().into(),
1565 name: Some(name.into().into()),
1566 array_specifier: array_specifier.into(),
1567 initializer: initializer.into(),
1568 }
1569 .into(),
1570 tail: Vec::new(),
1571 }
1572 .into(),
1573 )
1574 .into(),
1575 )
1576 }
1577}
1578
1579#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1581#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1582#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1583pub struct ExprStatementData(pub Option<Expr>);
1584
1585impl_node_content! {
1586 pub type ExprStatement = Node<ExprStatementData>;
1588}
1589
1590#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1592#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1593#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1594pub struct SelectionStatementData {
1595 pub cond: Box<Expr>,
1597 pub rest: SelectionRestStatement,
1599}
1600
1601impl_node_content! {
1602 pub type SelectionStatement = Node<SelectionStatementData>;
1604}
1605
1606#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1608#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1609#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1610pub enum ConditionData {
1611 Expr(Expr),
1613 Assignment(Box<FullySpecifiedType>, Identifier, Initializer),
1615}
1616
1617impl_node_content! {
1618 pub type Condition = Node<ConditionData>;
1620}
1621
1622#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1624#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1625#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1626pub enum SelectionRestStatementData {
1627 Statement(Box<Statement>),
1629 Else(Box<Statement>, Box<Statement>),
1631}
1632
1633impl_node_content! {
1634 pub type SelectionRestStatement = Node<SelectionRestStatementData>;
1636}
1637
1638#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1640#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1641#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1642pub struct SwitchStatementData {
1643 pub head: Box<Expr>,
1645 pub body: Vec<Statement>,
1647}
1648
1649impl_node_content! {
1650 pub type SwitchStatement = Node<SwitchStatementData>;
1652}
1653
1654#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1656#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1657#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1658pub enum CaseLabelData {
1659 Case(Box<Expr>),
1661 Def,
1663}
1664
1665impl_node_content! {
1666 pub type CaseLabel = Node<CaseLabelData>;
1668}
1669
1670#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1672#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1673#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1674pub enum IterationStatementData {
1675 #[lang_util(display(extra = "while"))]
1677 While(Condition, Box<Statement>),
1678 #[lang_util(display(extra = "do"))]
1680 DoWhile(Box<Statement>, Box<Expr>),
1681 #[lang_util(display(extra = "for"))]
1683 For(ForInitStatement, ForRestStatement, Box<Statement>),
1684}
1685
1686impl_node_content! {
1687 pub type IterationStatement = Node<IterationStatementData>;
1689}
1690
1691#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1693#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1694#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1695pub enum ForInitStatementData {
1696 Expression(Option<Expr>),
1698 Declaration(Box<Declaration>),
1700}
1701
1702impl_node_content! {
1703 pub type ForInitStatement = Node<ForInitStatementData>;
1705}
1706
1707#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1709#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1710#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1711pub struct ForRestStatementData {
1712 pub condition: Option<Condition>,
1714 pub post_expr: Option<Box<Expr>>,
1716}
1717
1718impl_node_content! {
1719 pub type ForRestStatement = Node<ForRestStatementData>;
1721}
1722
1723#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1725#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1726#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1727pub enum JumpStatementData {
1728 #[lang_util(display(extra = "continue"))]
1730 Continue,
1731 #[lang_util(display(extra = "break"))]
1733 Break,
1734 #[lang_util(display(extra = "return"))]
1736 Return(Option<Box<Expr>>),
1737 #[lang_util(display(extra = "discard"))]
1739 Discard,
1740}
1741
1742impl_node_content! {
1743 pub type JumpStatement = Node<JumpStatementData>;
1745}
1746
1747#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1753#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1754#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1755pub enum PreprocessorData {
1756 #[lang_util(display(extra = "#define"))]
1758 Define(PreprocessorDefine),
1759 #[lang_util(display(extra = "#else"))]
1761 Else,
1762 #[lang_util(display(extra = "#elseif"))]
1764 ElseIf(PreprocessorElseIf),
1765 #[lang_util(display(extra = "#endif"))]
1767 EndIf,
1768 #[lang_util(display(extra = "#error"))]
1770 Error(PreprocessorError),
1771 #[lang_util(display(extra = "#if"))]
1773 If(PreprocessorIf),
1774 #[lang_util(display(extra = "#ifdef"))]
1776 IfDef(PreprocessorIfDef),
1777 #[lang_util(display(extra = "#ifndef"))]
1779 IfNDef(PreprocessorIfNDef),
1780 #[lang_util(display(extra = "#include"))]
1782 Include(PreprocessorInclude),
1783 #[lang_util(display(extra = "#line"))]
1785 Line(PreprocessorLine),
1786 #[lang_util(display(extra = "#pragma"))]
1788 Pragma(PreprocessorPragma),
1789 #[lang_util(display(extra = "#undef"))]
1791 Undef(PreprocessorUndef),
1792 #[lang_util(display(extra = "#version"))]
1794 Version(PreprocessorVersion),
1795 #[lang_util(display(extra = "#extension"))]
1797 Extension(PreprocessorExtension),
1798}
1799
1800impl_node_content! {
1801 pub type Preprocessor = Node<PreprocessorData>;
1803}
1804
1805#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1809#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1810#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1811pub enum PreprocessorDefineData {
1812 ObjectLike {
1814 ident: Identifier,
1816 value: String,
1818 },
1819
1820 FunctionLike {
1822 ident: Identifier,
1824 args: Vec<Identifier>,
1826 value: String,
1828 },
1829}
1830
1831impl_node_content! {
1832 pub type PreprocessorDefine = Node<PreprocessorDefineData>;
1834}
1835
1836#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1838#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1839#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1840pub struct PreprocessorElseIfData {
1841 #[lang_util(display(extra))]
1843 pub condition: String,
1844}
1845
1846impl_node_content! {
1847 pub type PreprocessorElseIf = Node<PreprocessorElseIfData>;
1849}
1850
1851#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1853#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1854#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1855pub struct PreprocessorErrorData {
1856 #[lang_util(display(extra))]
1858 pub message: String,
1859}
1860
1861impl_node_content! {
1862 pub type PreprocessorError = Node<PreprocessorErrorData>;
1864}
1865
1866#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1868#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1869#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1870pub struct PreprocessorIfData {
1871 #[lang_util(display(extra))]
1873 pub condition: String,
1874}
1875
1876impl_node_content! {
1877 pub type PreprocessorIf = Node<PreprocessorIfData>;
1879}
1880
1881#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1883#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1884#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1885pub struct PreprocessorIfDefData {
1886 #[lang_util(display(extra))]
1888 pub ident: Identifier,
1889}
1890
1891impl_node_content! {
1892 pub type PreprocessorIfDef = Node<PreprocessorIfDefData>;
1894}
1895
1896#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1898#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1899#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1900pub struct PreprocessorIfNDefData {
1901 #[lang_util(display(extra))]
1903 pub ident: Identifier,
1904}
1905
1906impl_node_content! {
1907 pub type PreprocessorIfNDef = Node<PreprocessorIfNDefData>;
1909}
1910
1911#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1913#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1914#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1915pub struct PreprocessorIncludeData {
1916 pub path: Path,
1918}
1919
1920impl_node_content! {
1921 pub type PreprocessorInclude = Node<PreprocessorIncludeData>;
1923}
1924
1925#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1927#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1928#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1929pub struct PreprocessorLineData {
1930 #[lang_util(display(extra))]
1932 pub line: u32,
1933 pub source_string_number: Option<u32>,
1935}
1936
1937impl_node_content! {
1938 pub type PreprocessorLine = Node<PreprocessorLineData>;
1940}
1941
1942#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1945#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1946#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1947pub struct PreprocessorPragmaData {
1948 #[lang_util(display(extra))]
1950 pub command: String,
1951}
1952
1953impl_node_content! {
1954 pub type PreprocessorPragma = Node<PreprocessorPragmaData>;
1956}
1957
1958#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1960#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1961#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1962pub struct PreprocessorUndefData {
1963 #[lang_util(display(extra))]
1965 pub name: Identifier,
1966}
1967
1968impl_node_content! {
1969 pub type PreprocessorUndef = Node<PreprocessorUndefData>;
1971}
1972
1973#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1975#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1976#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1977pub struct PreprocessorVersionData {
1978 #[lang_util(display(extra))]
1980 pub version: u16,
1981 pub profile: Option<PreprocessorVersionProfile>,
1983}
1984
1985impl_node_content! {
1986 pub type PreprocessorVersion = Node<PreprocessorVersionData>;
1988}
1989
1990#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1992#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1993#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1994pub enum PreprocessorVersionProfileData {
1995 #[lang_util(display(extra = "core"))]
1997 Core,
1998 #[lang_util(display(extra = "compatibility"))]
2000 Compatibility,
2001 #[lang_util(display(extra = "es"))]
2003 Es,
2004}
2005
2006impl_node_content! {
2007 pub type PreprocessorVersionProfile = Node<PreprocessorVersionProfileData>;
2009}
2010
2011#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
2013#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2014#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
2015pub struct PreprocessorExtensionData {
2016 pub name: PreprocessorExtensionName,
2018 pub behavior: Option<PreprocessorExtensionBehavior>,
2020}
2021
2022impl_node_content! {
2023 pub type PreprocessorExtension = Node<PreprocessorExtensionData>;
2025}
2026
2027#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
2029#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2030#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
2031pub enum PreprocessorExtensionNameData {
2032 #[lang_util(display(extra = "all"))]
2034 All,
2035 Specific(SmolStr),
2037}
2038
2039impl_node_content! {
2040 pub type PreprocessorExtensionName = Node<PreprocessorExtensionNameData>;
2042}
2043
2044#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
2046#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2047#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
2048pub enum PreprocessorExtensionBehaviorData {
2049 #[lang_util(display(extra = "require"))]
2051 Require,
2052 #[lang_util(display(extra = "enable"))]
2054 Enable,
2055 #[lang_util(display(extra = "warn"))]
2057 Warn,
2058 #[lang_util(display(extra = "disable"))]
2060 Disable,
2061}
2062
2063impl_node_content! {
2064 pub type PreprocessorExtensionBehavior = Node<PreprocessorExtensionBehaviorData>;
2066}
2067
2068#[derive(Debug, Clone, PartialEq, Eq, NodeContentDisplay)]
2070#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2071#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
2072pub enum CommentData {
2073 Single(String),
2075 Multi(String),
2077}
2078
2079impl_node_content! {
2080 pub type Comment = Node<CommentData>;
2082}
2083
2084impl CommentData {
2085 pub fn text(&self) -> &str {
2087 match self {
2088 Self::Single(s) => s,
2089 Self::Multi(s) => s,
2090 }
2091 }
2092
2093 pub fn is_single(&self) -> bool {
2095 matches!(self, Self::Multi(_))
2096 }
2097
2098 pub fn is_multi(&self) -> bool {
2100 matches!(self, Self::Multi(_))
2101 }
2102}