1use std::{fmt, iter::FromIterator};
22
23#[cfg(feature = "serde")]
24use rserde::{Deserialize, Serialize};
25
26pub use lang_util::{
27 node::{Node, NodeDisplay},
28 position::NodeSpan,
29 FileId, NodeContent, NodeContentDisplay, SmolStr, TextRange, TextSize,
30};
31
32macro_rules! impl_node_content {
33 (
34 $(#[$m:meta])* $v:vis type $t:ident = Node<$tdata:ident>;
35 ) => {
36 impl NodeContent for $tdata {}
37
38 $(#[$m])* $v type $t = Node<$tdata>;
39
40 impl From<Node<$tdata>> for $tdata {
41 fn from(node: Node<$tdata>) -> Self {
42 node.content
43 }
44 }
45 };
46}
47
48#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Hash, NodeContentDisplay)]
50#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
51#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
52#[lang_util(display(leaf))]
53pub struct IdentifierData(#[lang_util(display(extra))] pub SmolStr);
54
55impl_node_content! {
56 pub type Identifier = Node<IdentifierData>;
58}
59
60impl IdentifierData {
61 pub fn as_rs_ident(&self) -> Option<&str> {
68 if self.0.starts_with('#') & self.0.ends_with(')') {
69 let s = self.0[1..self.0.len() - 1].trim();
71 Some(s[1..].trim())
73 } else {
74 None
75 }
76 }
77
78 pub fn as_str(&self) -> &str {
80 self.0.as_str()
81 }
82}
83
84impl From<&str> for IdentifierData {
85 fn from(ident: &str) -> Self {
86 Self(ident.into())
87 }
88}
89
90impl fmt::Display for IdentifierData {
91 fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
92 self.0.fmt(f)
93 }
94}
95
96#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Hash, NodeContentDisplay)]
98#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
99#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
100#[lang_util(display(leaf))]
101pub struct TypeNameData(pub SmolStr);
102
103impl_node_content! {
104 pub type TypeName = Node<TypeNameData>;
106}
107
108impl TypeNameData {
109 pub fn as_str(&self) -> &str {
111 self.0.as_str()
112 }
113}
114
115impl From<IdentifierData> for TypeNameData {
116 fn from(ident: IdentifierData) -> Self {
117 Self(ident.0)
118 }
119}
120
121impl From<&str> for TypeNameData {
122 fn from(ident: &str) -> Self {
123 Self(ident.into())
124 }
125}
126
127impl fmt::Display for TypeNameData {
128 fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
129 self.0.fmt(f)
130 }
131}
132
133#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
135#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
136#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
137pub enum PathData {
138 Absolute(String),
140 Relative(String),
142}
143
144impl_node_content! {
145 pub type Path = Node<PathData>;
147}
148
149#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
151#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
152#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
153pub enum TypeSpecifierNonArrayData {
154 #[lang_util(display(extra = "void"))]
156 Void,
157 #[lang_util(display(extra = "bool"))]
159 Bool,
160 #[lang_util(display(extra = "int"))]
162 Int,
163 #[lang_util(display(extra = "uint"))]
165 UInt,
166 #[lang_util(display(extra = "float"))]
168 Float,
169 #[lang_util(display(extra = "double"))]
171 Double,
172 #[lang_util(display(extra = "vec2"))]
174 Vec2,
175 #[lang_util(display(extra = "vec3"))]
177 Vec3,
178 #[lang_util(display(extra = "vec4"))]
180 Vec4,
181 #[lang_util(display(extra = "dvec2"))]
183 DVec2,
184 #[lang_util(display(extra = "dvec3"))]
186 DVec3,
187 #[lang_util(display(extra = "dvec4"))]
189 DVec4,
190 #[lang_util(display(extra = "bvec2"))]
192 BVec2,
193 #[lang_util(display(extra = "bvec3"))]
195 BVec3,
196 #[lang_util(display(extra = "bvec4"))]
198 BVec4,
199 #[lang_util(display(extra = "ivec2"))]
201 IVec2,
202 #[lang_util(display(extra = "ivec3"))]
204 IVec3,
205 #[lang_util(display(extra = "ivec4"))]
207 IVec4,
208 #[lang_util(display(extra = "uvec2"))]
210 UVec2,
211 #[lang_util(display(extra = "uvec3"))]
213 UVec3,
214 #[lang_util(display(extra = "uvec4"))]
216 UVec4,
217 #[lang_util(display(extra = "mat2"))]
219 Mat2,
220 #[lang_util(display(extra = "mat3"))]
222 Mat3,
223 #[lang_util(display(extra = "mat4"))]
225 Mat4,
226 #[lang_util(display(extra = "mat2x2"))]
228 Mat22,
229 #[lang_util(display(extra = "mat2x3"))]
231 Mat23,
232 #[lang_util(display(extra = "mat2x4"))]
234 Mat24,
235 #[lang_util(display(extra = "mat3x2"))]
237 Mat32,
238 #[lang_util(display(extra = "mat3x3"))]
240 Mat33,
241 #[lang_util(display(extra = "mat3x4"))]
243 Mat34,
244 #[lang_util(display(extra = "mat4x2"))]
246 Mat42,
247 #[lang_util(display(extra = "mat4x3"))]
249 Mat43,
250 #[lang_util(display(extra = "mat4x4"))]
252 Mat44,
253 #[lang_util(display(extra = "dmat2"))]
255 DMat2,
256 #[lang_util(display(extra = "dmat3"))]
258 DMat3,
259 #[lang_util(display(extra = "dmat4"))]
261 DMat4,
262 #[lang_util(display(extra = "dmat2x2"))]
264 DMat22,
265 #[lang_util(display(extra = "dmat2x3"))]
267 DMat23,
268 #[lang_util(display(extra = "dmat2x4"))]
270 DMat24,
271 #[lang_util(display(extra = "dmat3x2"))]
273 DMat32,
274 #[lang_util(display(extra = "dmat3x3"))]
276 DMat33,
277 #[lang_util(display(extra = "dmat3x4"))]
279 DMat34,
280 #[lang_util(display(extra = "dmat4x2"))]
282 DMat42,
283 #[lang_util(display(extra = "dmat4x3"))]
285 DMat43,
286 #[lang_util(display(extra = "dmat4x4"))]
288 DMat44,
289 #[lang_util(display(extra = "sampler1D"))]
292 Sampler1D,
293 #[lang_util(display(extra = "image1D"))]
295 Image1D,
296 #[lang_util(display(extra = "sampler2D"))]
298 Sampler2D,
299 #[lang_util(display(extra = "image2D"))]
301 Image2D,
302 #[lang_util(display(extra = "sampler3D"))]
304 Sampler3D,
305 #[lang_util(display(extra = "image3D"))]
307 Image3D,
308 #[lang_util(display(extra = "samplerCube"))]
310 SamplerCube,
311 #[lang_util(display(extra = "imageCube"))]
313 ImageCube,
314 #[lang_util(display(extra = "sampler2DRect"))]
316 Sampler2DRect,
317 #[lang_util(display(extra = "image2DRect"))]
319 Image2DRect,
320 #[lang_util(display(extra = "sampler1DArray"))]
322 Sampler1DArray,
323 #[lang_util(display(extra = "image1DArray"))]
325 Image1DArray,
326 #[lang_util(display(extra = "sampler2DArray"))]
328 Sampler2DArray,
329 #[lang_util(display(extra = "image2DArray"))]
331 Image2DArray,
332 #[lang_util(display(extra = "samplerBuffer"))]
334 SamplerBuffer,
335 #[lang_util(display(extra = "imageBuffer"))]
337 ImageBuffer,
338 #[lang_util(display(extra = "sampler2DMS"))]
340 Sampler2DMs,
341 #[lang_util(display(extra = "image2DMS"))]
343 Image2DMs,
344 #[lang_util(display(extra = "sampler2DMSArray"))]
346 Sampler2DMsArray,
347 #[lang_util(display(extra = "image2DMSArray"))]
349 Image2DMsArray,
350 #[lang_util(display(extra = "samplerCubeArray"))]
352 SamplerCubeArray,
353 #[lang_util(display(extra = "imageCubeArray"))]
355 ImageCubeArray,
356 #[lang_util(display(extra = "sampler1DShadow"))]
358 Sampler1DShadow,
359 #[lang_util(display(extra = "sampler2DShadow"))]
361 Sampler2DShadow,
362 #[lang_util(display(extra = "sampler2DRectShadow"))]
364 Sampler2DRectShadow,
365 #[lang_util(display(extra = "sampler1DArrayShadow"))]
367 Sampler1DArrayShadow,
368 #[lang_util(display(extra = "sampler2DArrayShadow"))]
370 Sampler2DArrayShadow,
371 #[lang_util(display(extra = "samplerCubeShadow"))]
373 SamplerCubeShadow,
374 #[lang_util(display(extra = "samplerCubeArrayShadow"))]
376 SamplerCubeArrayShadow,
377 #[lang_util(display(extra = "isampler1D"))]
380 ISampler1D,
381 #[lang_util(display(extra = "iimage1D"))]
383 IImage1D,
384 #[lang_util(display(extra = "isampler2D"))]
386 ISampler2D,
387 #[lang_util(display(extra = "iimage2D"))]
389 IImage2D,
390 #[lang_util(display(extra = "isampler3D"))]
392 ISampler3D,
393 #[lang_util(display(extra = "iimage3D"))]
395 IImage3D,
396 #[lang_util(display(extra = "isamplerCube"))]
398 ISamplerCube,
399 #[lang_util(display(extra = "iimageCube"))]
401 IImageCube,
402 #[lang_util(display(extra = "isampler2DRect"))]
404 ISampler2DRect,
405 #[lang_util(display(extra = "iimage2DRect"))]
407 IImage2DRect,
408 #[lang_util(display(extra = "isampler1DArray"))]
410 ISampler1DArray,
411 #[lang_util(display(extra = "iimage1DArray"))]
413 IImage1DArray,
414 #[lang_util(display(extra = "isampler2DArray"))]
416 ISampler2DArray,
417 #[lang_util(display(extra = "iimage2DArray"))]
419 IImage2DArray,
420 #[lang_util(display(extra = "isamplerBuffer"))]
422 ISamplerBuffer,
423 #[lang_util(display(extra = "iimageBuffer"))]
425 IImageBuffer,
426 #[lang_util(display(extra = "isampler2DMS"))]
428 ISampler2DMs,
429 #[lang_util(display(extra = "iimage2DMS"))]
431 IImage2DMs,
432 #[lang_util(display(extra = "isampler2DMSArray"))]
434 ISampler2DMsArray,
435 #[lang_util(display(extra = "iimage2DMSArray"))]
437 IImage2DMsArray,
438 #[lang_util(display(extra = "isamplerCubeArray"))]
440 ISamplerCubeArray,
441 #[lang_util(display(extra = "iimageCubeArray"))]
443 IImageCubeArray,
444 #[lang_util(display(extra = "atomic_uint"))]
447 AtomicUInt,
448 #[lang_util(display(extra = "usampler1D"))]
450 USampler1D,
451 #[lang_util(display(extra = "uimage1D"))]
453 UImage1D,
454 #[lang_util(display(extra = "usampler2D"))]
456 USampler2D,
457 #[lang_util(display(extra = "uimage2D"))]
459 UImage2D,
460 #[lang_util(display(extra = "usampler3D"))]
462 USampler3D,
463 #[lang_util(display(extra = "uimage3D"))]
465 UImage3D,
466 #[lang_util(display(extra = "usamplerCube"))]
468 USamplerCube,
469 #[lang_util(display(extra = "uimageCube"))]
471 UImageCube,
472 #[lang_util(display(extra = "usampler2DRect"))]
474 USampler2DRect,
475 #[lang_util(display(extra = "uimage2DRect"))]
477 UImage2DRect,
478 #[lang_util(display(extra = "usampler1DArray"))]
480 USampler1DArray,
481 #[lang_util(display(extra = "uimage1DArray"))]
483 UImage1DArray,
484 #[lang_util(display(extra = "usampler2DArray"))]
486 USampler2DArray,
487 #[lang_util(display(extra = "uimage2DArray"))]
489 UImage2DArray,
490 #[lang_util(display(extra = "usamplerBuffer"))]
492 USamplerBuffer,
493 #[lang_util(display(extra = "uimageBuffer"))]
495 UImageBuffer,
496 #[lang_util(display(extra = "usampler2DMS"))]
498 USampler2DMs,
499 #[lang_util(display(extra = "uimage2DMS"))]
501 UImage2DMs,
502 #[lang_util(display(extra = "usampler2DMSArray"))]
504 USampler2DMsArray,
505 #[lang_util(display(extra = "uimage2DMSArray"))]
507 UImage2DMsArray,
508 #[lang_util(display(extra = "usamplerCubeArray"))]
510 USamplerCubeArray,
511 #[lang_util(display(extra = "uimageCubeArray"))]
513 UImageCubeArray,
514
515 #[lang_util(display(extra = "texture1D"))]
518 Texture1D,
519 #[lang_util(display(extra = "texture2D"))]
521 Texture2D,
522 #[lang_util(display(extra = "texture3D"))]
524 Texture3D,
525 #[lang_util(display(extra = "textureCube"))]
527 TextureCube,
528 #[lang_util(display(extra = "texture2DRect"))]
530 Texture2DRect,
531 #[lang_util(display(extra = "texture1DArray"))]
533 Texture1DArray,
534 #[lang_util(display(extra = "texture2DArray"))]
536 Texture2DArray,
537 #[lang_util(display(extra = "textureBuffer"))]
539 TextureBuffer,
540 #[lang_util(display(extra = "texture2DMS"))]
542 Texture2DMs,
543 #[lang_util(display(extra = "texture2DMSArray"))]
545 Texture2DMsArray,
546 #[lang_util(display(extra = "textureCubeArray"))]
548 TextureCubeArray,
549 #[lang_util(display(extra = "itexture1D"))]
551 ITexture1D,
552 #[lang_util(display(extra = "itexture2D"))]
554 ITexture2D,
555 #[lang_util(display(extra = "itexture3D"))]
557 ITexture3D,
558 #[lang_util(display(extra = "itextureCube"))]
560 ITextureCube,
561 #[lang_util(display(extra = "itexture2DRect"))]
563 ITexture2DRect,
564 #[lang_util(display(extra = "itexture1DArray"))]
566 ITexture1DArray,
567 #[lang_util(display(extra = "itexture2DArray"))]
569 ITexture2DArray,
570 #[lang_util(display(extra = "itextureBuffer"))]
572 ITextureBuffer,
573 #[lang_util(display(extra = "itexture2DMS"))]
575 ITexture2DMs,
576 #[lang_util(display(extra = "itexture2DMSArray"))]
578 ITexture2DMsArray,
579 #[lang_util(display(extra = "itextureCubeArray"))]
581 ITextureCubeArray,
582 #[lang_util(display(extra = "sampler"))]
584 Sampler,
585 #[lang_util(display(extra = "samplerShadow"))]
587 SamplerShadow,
588 #[lang_util(display(extra = "subpassInput"))]
590 SubpassInput,
591 #[lang_util(display(extra = "isubpassInput"))]
593 ISubpassInput,
594 #[lang_util(display(extra = "usubpassInput"))]
596 USubpassInput,
597 #[lang_util(display(extra = "subpassInputMS"))]
599 SubpassInputMs,
600 #[lang_util(display(extra = "isubpassInputMS"))]
602 ISubpassInputMs,
603 #[lang_util(display(extra = "usubpassInputMS"))]
605 USubpassInputMs,
606
607 #[lang_util(display(extra = "struct"))]
610 Struct(StructSpecifier),
611 TypeName(TypeName),
613}
614
615impl_node_content! {
616 pub type TypeSpecifierNonArray = Node<TypeSpecifierNonArrayData>;
618}
619
620impl From<TypeName> for TypeSpecifierNonArrayData {
621 fn from(tn: TypeName) -> Self {
622 Self::TypeName(tn)
623 }
624}
625
626#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
628#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
629#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
630pub struct TypeSpecifierData {
631 pub ty: TypeSpecifierNonArray,
633 pub array_specifier: Option<ArraySpecifier>,
635}
636
637impl_node_content! {
638 pub type TypeSpecifier = Node<TypeSpecifierData>;
640}
641
642impl From<TypeSpecifierNonArray> for TypeSpecifierData {
643 fn from(ty: TypeSpecifierNonArray) -> Self {
644 Self {
645 ty,
646 array_specifier: None,
647 }
648 }
649}
650
651impl From<TypeSpecifierNonArrayData> for TypeSpecifierData {
652 fn from(ty: TypeSpecifierNonArrayData) -> Self {
653 Self {
654 ty: ty.into(),
655 array_specifier: None,
656 }
657 }
658}
659
660#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
662#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
663#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
664pub struct StructSpecifierData {
665 pub name: Option<TypeName>,
667 pub fields: Vec<StructFieldSpecifier>,
669}
670
671impl_node_content! {
672 pub type StructSpecifier = Node<StructSpecifierData>;
674}
675
676#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
678#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
679#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
680pub struct StructFieldSpecifierData {
681 pub qualifier: Option<TypeQualifier>,
683 pub ty: TypeSpecifier,
685 pub identifiers: Vec<ArrayedIdentifier>, }
688
689impl_node_content! {
690 pub type StructFieldSpecifier = Node<StructFieldSpecifierData>;
692}
693
694#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
696#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
697#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
698pub struct ArrayedIdentifierData {
699 pub ident: Identifier,
701 pub array_spec: Option<ArraySpecifier>,
703}
704
705impl_node_content! {
706 pub type ArrayedIdentifier = Node<ArrayedIdentifierData>;
708}
709
710impl ArrayedIdentifierData {
711 pub fn new<I, AS>(ident: I, array_spec: AS) -> Self
713 where
714 I: Into<Identifier>,
715 AS: Into<Option<ArraySpecifier>>,
716 {
717 Self {
718 ident: ident.into(),
719 array_spec: array_spec.into(),
720 }
721 }
722}
723
724impl From<&str> for ArrayedIdentifierData {
725 fn from(ident: &str) -> Self {
726 Self {
727 ident: IdentifierData::from(ident).into(),
728 array_spec: None,
729 }
730 }
731}
732
733#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
735#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
736#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
737pub struct TypeQualifierData {
738 pub qualifiers: Vec<TypeQualifierSpec>,
740}
741
742impl_node_content! {
743 pub type TypeQualifier = Node<TypeQualifierData>;
745}
746
747#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
749#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
750#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
751pub enum TypeQualifierSpecData {
752 Storage(StorageQualifier),
754 Layout(LayoutQualifier),
756 Precision(PrecisionQualifier),
758 Interpolation(InterpolationQualifier),
760 Invariant,
762 Precise,
764}
765
766impl_node_content! {
767 pub type TypeQualifierSpec = Node<TypeQualifierSpecData>;
769}
770
771#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
773#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
774#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
775pub enum StorageQualifierData {
776 #[lang_util(display(extra = "const"))]
778 Const,
779 #[lang_util(display(extra = "inout"))]
781 InOut,
782 #[lang_util(display(extra = "in"))]
784 In,
785 #[lang_util(display(extra = "out"))]
787 Out,
788 #[lang_util(display(extra = "centroid"))]
790 Centroid,
791 #[lang_util(display(extra = "patch"))]
793 Patch,
794 #[lang_util(display(extra = "sample"))]
796 Sample,
797 #[lang_util(display(extra = "uniform"))]
799 Uniform,
800 #[lang_util(display(extra = "buffer"))]
802 Buffer,
803 #[lang_util(display(extra = "shared"))]
805 Shared,
806 #[lang_util(display(extra = "coherent"))]
808 Coherent,
809 #[lang_util(display(extra = "volatile"))]
811 Volatile,
812 #[lang_util(display(extra = "restrict"))]
814 Restrict,
815 #[lang_util(display(extra = "readonly"))]
817 ReadOnly,
818 #[lang_util(display(extra = "writeonly"))]
820 WriteOnly,
821 #[lang_util(display(extra = "attribute"))]
823 Attribute,
824 #[lang_util(display(extra = "varying"))]
826 Varying,
827 #[lang_util(display(extra = "subroutine"))]
831 Subroutine(Vec<TypeSpecifier>),
832}
833
834impl_node_content! {
835 pub type StorageQualifier = Node<StorageQualifierData>;
837}
838
839#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
841#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
842#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
843pub struct LayoutQualifierData {
844 pub ids: Vec<LayoutQualifierSpec>,
846}
847
848impl_node_content! {
849 pub type LayoutQualifier = Node<LayoutQualifierData>;
851}
852
853#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
855#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
856#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
857pub enum LayoutQualifierSpecData {
858 Identifier(Identifier, Option<Box<Expr>>),
860 #[lang_util(display(extra = "shared"))]
862 Shared,
863}
864
865impl_node_content! {
866 pub type LayoutQualifierSpec = Node<LayoutQualifierSpecData>;
868}
869
870#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
872#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
873#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
874pub enum PrecisionQualifierData {
875 #[lang_util(display(extra = "high"))]
877 High,
878 #[lang_util(display(extra = "medium"))]
880 Medium,
881 #[lang_util(display(extra = "low"))]
883 Low,
884}
885
886impl_node_content! {
887 pub type PrecisionQualifier = Node<PrecisionQualifierData>;
889}
890
891#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
893#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
894#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
895pub enum InterpolationQualifierData {
896 #[lang_util(display(extra = "smooth"))]
898 Smooth,
899 #[lang_util(display(extra = "flat"))]
901 Flat,
902 #[lang_util(display(extra = "noperspective"))]
904 NoPerspective,
905}
906
907impl_node_content! {
908 pub type InterpolationQualifier = Node<InterpolationQualifierData>;
910}
911
912#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
914#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
915#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
916pub struct FullySpecifiedTypeData {
917 pub qualifier: Option<TypeQualifier>,
919 pub ty: TypeSpecifier,
921}
922
923impl_node_content! {
924 pub type FullySpecifiedType = Node<FullySpecifiedTypeData>;
926}
927
928impl FullySpecifiedTypeData {
929 pub fn new(ty: TypeSpecifierNonArray) -> Self {
932 Self {
933 qualifier: None,
934 ty: TypeSpecifierData {
935 ty,
936 array_specifier: None,
937 }
938 .into(),
939 }
940 }
941}
942
943impl From<TypeSpecifierNonArrayData> for FullySpecifiedTypeData {
944 fn from(ty: TypeSpecifierNonArrayData) -> Self {
945 Self::new(ty.into())
946 }
947}
948
949#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
951#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
952#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
953pub struct ArraySpecifierData {
954 pub dimensions: Vec<ArraySpecifierDimension>,
956}
957
958impl_node_content! {
959 pub type ArraySpecifier = Node<ArraySpecifierData>;
961}
962
963#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
965#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
966#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
967pub enum ArraySpecifierDimensionData {
968 Unsized,
970 ExplicitlySized(Box<Expr>),
972}
973
974impl_node_content! {
975 pub type ArraySpecifierDimension = Node<ArraySpecifierDimensionData>;
977}
978
979#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
981#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
982#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
983pub enum DeclarationData {
984 FunctionPrototype(FunctionPrototype),
986 InitDeclaratorList(InitDeclaratorList),
988 Precision(PrecisionQualifier, TypeSpecifier),
990 Block(Block),
992 Invariant(Identifier),
994 TypeOnly(TypeQualifier),
996}
997
998impl_node_content! {
999 pub type Declaration = Node<DeclarationData>;
1001}
1002
1003#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1006#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1007#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1008pub struct BlockData {
1009 pub qualifier: TypeQualifier,
1011 pub name: Identifier,
1013 pub fields: Vec<StructFieldSpecifier>,
1015 pub identifier: Option<ArrayedIdentifier>,
1017}
1018
1019impl_node_content! {
1020 pub type Block = Node<BlockData>;
1022}
1023
1024#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1026#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1027#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1028pub enum FunIdentifierData {
1029 TypeSpecifier(Box<TypeSpecifier>),
1031 Expr(Box<Expr>),
1033}
1034
1035impl_node_content! {
1036 pub type FunIdentifier = Node<FunIdentifierData>;
1038}
1039
1040impl FunIdentifierData {
1041 pub fn ident(i: impl Into<IdentifierData>) -> Self {
1043 Self::Expr(Box::new(ExprData::Variable(i.into().into()).into()))
1044 }
1045
1046 pub fn as_ident(&self) -> Option<&Identifier> {
1048 match self {
1049 Self::Expr(expr) => match &***expr {
1050 ExprData::Variable(ident) => Some(ident),
1051 _ => None,
1052 },
1053 _ => None,
1054 }
1055 }
1056
1057 pub fn as_ident_mut(&mut self) -> Option<&mut Identifier> {
1059 match self {
1060 Self::Expr(expr) => match &mut ***expr {
1061 ExprData::Variable(ident) => Some(ident),
1062 _ => None,
1063 },
1064 _ => None,
1065 }
1066 }
1067
1068 pub fn as_rs_ident(&self) -> Option<&str> {
1070 if let Some(ident) = self.as_ident() {
1071 ident.as_rs_ident()
1072 } else {
1073 None
1074 }
1075 }
1076}
1077
1078#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1080#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1081#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1082pub struct FunctionPrototypeData {
1083 pub ty: FullySpecifiedType,
1085 pub name: Identifier,
1087 pub parameters: Vec<FunctionParameterDeclaration>,
1089}
1090
1091impl_node_content! {
1092 pub type FunctionPrototype = Node<FunctionPrototypeData>;
1094}
1095
1096#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1098#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1099#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1100pub enum FunctionParameterDeclarationData {
1101 Named(Option<TypeQualifier>, FunctionParameterDeclarator),
1103 Unnamed(Option<TypeQualifier>, TypeSpecifier),
1105}
1106
1107impl_node_content! {
1108 pub type FunctionParameterDeclaration = Node<FunctionParameterDeclarationData>;
1110}
1111
1112#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1114#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1115#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1116pub struct FunctionParameterDeclaratorData {
1117 pub ty: TypeSpecifier,
1119 pub ident: ArrayedIdentifier,
1121}
1122
1123impl_node_content! {
1124 pub type FunctionParameterDeclarator = Node<FunctionParameterDeclaratorData>;
1126}
1127
1128#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1130#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1131#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1132pub struct InitDeclaratorListData {
1133 pub head: SingleDeclaration,
1135 pub tail: Vec<SingleDeclarationNoType>,
1137}
1138
1139impl_node_content! {
1140 pub type InitDeclaratorList = Node<InitDeclaratorListData>;
1142}
1143
1144#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1146#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1147#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1148pub struct SingleDeclarationData {
1149 pub ty: FullySpecifiedType,
1151 pub name: Option<Identifier>,
1153 pub array_specifier: Option<ArraySpecifier>,
1155 pub initializer: Option<Initializer>,
1157}
1158
1159impl_node_content! {
1160 pub type SingleDeclaration = Node<SingleDeclarationData>;
1162}
1163
1164#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1166#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1167#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1168pub struct SingleDeclarationNoTypeData {
1169 pub ident: ArrayedIdentifier,
1171 pub initializer: Option<Initializer>,
1173}
1174
1175impl_node_content! {
1176 pub type SingleDeclarationNoType = Node<SingleDeclarationNoTypeData>;
1178}
1179
1180#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1182#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1183#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1184pub enum InitializerData {
1185 Simple(Box<Expr>),
1187 List(Vec<Initializer>),
1189}
1190
1191impl_node_content! {
1192 pub type Initializer = Node<InitializerData>;
1194}
1195
1196impl From<ExprData> for InitializerData {
1197 fn from(e: ExprData) -> Self {
1198 Self::Simple(Box::new(e.into()))
1199 }
1200}
1201
1202impl From<Expr> for InitializerData {
1203 fn from(e: Expr) -> Self {
1204 Self::Simple(Box::new(e))
1205 }
1206}
1207
1208#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1216#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1217#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1218pub enum ExprData {
1219 Variable(Identifier),
1221 IntConst(i32),
1223 UIntConst(u32),
1225 BoolConst(bool),
1227 FloatConst(f32),
1229 DoubleConst(f64),
1231 Unary(UnaryOp, Box<Expr>),
1233 Binary(BinaryOp, Box<Expr>, Box<Expr>),
1235 Ternary(Box<Expr>, Box<Expr>, Box<Expr>),
1237 Assignment(Box<Expr>, AssignmentOp, Box<Expr>),
1240 Bracket(Box<Expr>, Box<Expr>),
1242 FunCall(FunIdentifier, Vec<Expr>),
1244 Dot(Box<Expr>, Identifier),
1246 PostInc(Box<Expr>),
1248 PostDec(Box<Expr>),
1250 Comma(Box<Expr>, Box<Expr>),
1252}
1253
1254impl_node_content! {
1255 pub type Expr = Node<ExprData>;
1257}
1258
1259impl ExprData {
1260 pub fn variable(name: impl Into<IdentifierData>) -> Self {
1262 Self::Variable(name.into().into())
1263 }
1264
1265 pub fn as_rs_ident(&self) -> Option<&str> {
1267 match self {
1268 Self::Variable(ident) => ident.as_rs_ident(),
1269 _ => None,
1270 }
1271 }
1272}
1273
1274impl From<i32> for ExprData {
1275 fn from(x: i32) -> ExprData {
1276 Self::IntConst(x)
1277 }
1278}
1279
1280impl From<u32> for ExprData {
1281 fn from(x: u32) -> ExprData {
1282 Self::UIntConst(x)
1283 }
1284}
1285
1286impl From<bool> for ExprData {
1287 fn from(x: bool) -> ExprData {
1288 Self::BoolConst(x)
1289 }
1290}
1291
1292impl From<f32> for ExprData {
1293 fn from(x: f32) -> ExprData {
1294 Self::FloatConst(x)
1295 }
1296}
1297
1298impl From<f64> for ExprData {
1299 fn from(x: f64) -> ExprData {
1300 Self::DoubleConst(x)
1301 }
1302}
1303
1304#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1306#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1307#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1308pub enum UnaryOpData {
1309 #[lang_util(display(extra = "++"))]
1311 Inc,
1312 #[lang_util(display(extra = "--"))]
1314 Dec,
1315 #[lang_util(display(extra = "+"))]
1317 Add,
1318 #[lang_util(display(extra = "-"))]
1320 Minus,
1321 #[lang_util(display(extra = "!"))]
1323 Not,
1324 #[lang_util(display(extra = "~"))]
1326 Complement,
1327}
1328
1329impl_node_content! {
1330 pub type UnaryOp = Node<UnaryOpData>;
1332}
1333
1334#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1336#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1337#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1338pub enum BinaryOpData {
1339 #[lang_util(display(extra = "||"))]
1341 Or,
1342 #[lang_util(display(extra = "^^"))]
1344 Xor,
1345 #[lang_util(display(extra = "&&"))]
1347 And,
1348 #[lang_util(display(extra = "|"))]
1350 BitOr,
1351 #[lang_util(display(extra = "^"))]
1353 BitXor,
1354 #[lang_util(display(extra = "&"))]
1356 BitAnd,
1357 #[lang_util(display(extra = "=="))]
1359 Equal,
1360 #[lang_util(display(extra = "!="))]
1362 NonEqual,
1363 #[lang_util(display(extra = "<"))]
1365 Lt,
1366 #[lang_util(display(extra = ">"))]
1368 Gt,
1369 #[lang_util(display(extra = "<="))]
1371 Lte,
1372 #[lang_util(display(extra = ">="))]
1374 Gte,
1375 #[lang_util(display(extra = "<<"))]
1377 LShift,
1378 #[lang_util(display(extra = ">>"))]
1380 RShift,
1381 #[lang_util(display(extra = "+"))]
1383 Add,
1384 #[lang_util(display(extra = "-"))]
1386 Sub,
1387 #[lang_util(display(extra = "*"))]
1389 Mult,
1390 #[lang_util(display(extra = "/"))]
1392 Div,
1393 #[lang_util(display(extra = "%"))]
1395 Mod,
1396}
1397
1398impl_node_content! {
1399 pub type BinaryOp = Node<BinaryOpData>;
1401}
1402
1403#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1405#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1406#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1407pub enum AssignmentOpData {
1408 #[lang_util(display(extra = "="))]
1410 Equal,
1411 #[lang_util(display(extra = "*"))]
1413 Mult,
1414 #[lang_util(display(extra = "/="))]
1416 Div,
1417 #[lang_util(display(extra = "%="))]
1419 Mod,
1420 #[lang_util(display(extra = "+="))]
1422 Add,
1423 #[lang_util(display(extra = "-="))]
1425 Sub,
1426 #[lang_util(display(extra = "<<="))]
1428 LShift,
1429 #[lang_util(display(extra = ">>="))]
1431 RShift,
1432 #[lang_util(display(extra = "&="))]
1434 And,
1435 #[lang_util(display(extra = "^="))]
1437 Xor,
1438 #[lang_util(display(extra = "|="))]
1440 Or,
1441}
1442
1443impl_node_content! {
1444 pub type AssignmentOp = Node<AssignmentOpData>;
1446}
1447
1448#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1450#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1451#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1452pub struct TranslationUnit(pub Vec<ExternalDeclaration>);
1453
1454impl NodeContent for TranslationUnit {}
1455
1456#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1458#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1459#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1460pub enum ExternalDeclarationData {
1461 Preprocessor(Preprocessor),
1463 FunctionDefinition(FunctionDefinition),
1465 Declaration(Declaration),
1467}
1468
1469impl_node_content! {
1470 pub type ExternalDeclaration = Node<ExternalDeclarationData>;
1472}
1473
1474#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1476#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1477#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1478pub struct FunctionDefinitionData {
1479 pub prototype: FunctionPrototype,
1481 pub statement: CompoundStatement,
1483}
1484
1485impl_node_content! {
1486 pub type FunctionDefinition = Node<FunctionDefinitionData>;
1488}
1489
1490#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1492#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1493#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1494pub struct CompoundStatementData {
1495 pub statement_list: Vec<Statement>,
1497}
1498
1499impl_node_content! {
1500 pub type CompoundStatement = Node<CompoundStatementData>;
1502}
1503
1504impl FromIterator<Statement> for CompoundStatementData {
1505 fn from_iter<T>(iter: T) -> Self
1506 where
1507 T: IntoIterator<Item = Statement>,
1508 {
1509 Self {
1510 statement_list: iter.into_iter().collect(),
1511 }
1512 }
1513}
1514
1515#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1517#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1518#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1519pub enum StatementData {
1520 Declaration(Declaration),
1522 Expression(ExprStatement),
1524 Selection(SelectionStatement),
1526 Switch(SwitchStatement),
1528 CaseLabel(CaseLabel),
1530 Iteration(IterationStatement),
1532 Jump(JumpStatement),
1534 Compound(CompoundStatement),
1536}
1537
1538impl_node_content! {
1539 pub type Statement = Node<StatementData>;
1541}
1542
1543impl StatementData {
1544 pub fn declare_var<T, N, A, I>(ty: T, name: N, array_specifier: A, initializer: I) -> Self
1550 where
1551 T: Into<FullySpecifiedTypeData>,
1552 N: Into<IdentifierData>,
1553 A: Into<Option<ArraySpecifier>>,
1554 I: Into<Option<Initializer>>,
1555 {
1556 Self::Declaration(
1557 DeclarationData::InitDeclaratorList(
1558 InitDeclaratorListData {
1559 head: SingleDeclarationData {
1560 ty: ty.into().into(),
1561 name: Some(name.into().into()),
1562 array_specifier: array_specifier.into(),
1563 initializer: initializer.into(),
1564 }
1565 .into(),
1566 tail: Vec::new(),
1567 }
1568 .into(),
1569 )
1570 .into(),
1571 )
1572 }
1573}
1574
1575#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1577#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1578#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1579pub struct ExprStatementData(pub Option<Expr>);
1580
1581impl_node_content! {
1582 pub type ExprStatement = Node<ExprStatementData>;
1584}
1585
1586#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1588#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1589#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1590pub struct SelectionStatementData {
1591 pub cond: Box<Expr>,
1593 pub rest: SelectionRestStatement,
1595}
1596
1597impl_node_content! {
1598 pub type SelectionStatement = Node<SelectionStatementData>;
1600}
1601
1602#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1604#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1605#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1606pub enum ConditionData {
1607 Expr(Expr),
1609 Assignment(Box<FullySpecifiedType>, Identifier, Initializer),
1611}
1612
1613impl_node_content! {
1614 pub type Condition = Node<ConditionData>;
1616}
1617
1618#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1620#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1621#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1622pub enum SelectionRestStatementData {
1623 Statement(Box<Statement>),
1625 Else(Box<Statement>, Box<Statement>),
1627}
1628
1629impl_node_content! {
1630 pub type SelectionRestStatement = Node<SelectionRestStatementData>;
1632}
1633
1634#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1636#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1637#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1638pub struct SwitchStatementData {
1639 pub head: Box<Expr>,
1641 pub body: Vec<Statement>,
1643}
1644
1645impl_node_content! {
1646 pub type SwitchStatement = Node<SwitchStatementData>;
1648}
1649
1650#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1652#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1653#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1654pub enum CaseLabelData {
1655 Case(Box<Expr>),
1657 Def,
1659}
1660
1661impl_node_content! {
1662 pub type CaseLabel = Node<CaseLabelData>;
1664}
1665
1666#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1668#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1669#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1670pub enum IterationStatementData {
1671 #[lang_util(display(extra = "while"))]
1673 While(Condition, Box<Statement>),
1674 #[lang_util(display(extra = "do"))]
1676 DoWhile(Box<Statement>, Box<Expr>),
1677 #[lang_util(display(extra = "for"))]
1679 For(ForInitStatement, ForRestStatement, Box<Statement>),
1680}
1681
1682impl_node_content! {
1683 pub type IterationStatement = Node<IterationStatementData>;
1685}
1686
1687#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1689#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1690#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1691pub enum ForInitStatementData {
1692 Expression(Option<Expr>),
1694 Declaration(Box<Declaration>),
1696}
1697
1698impl_node_content! {
1699 pub type ForInitStatement = Node<ForInitStatementData>;
1701}
1702
1703#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1705#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1706#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1707pub struct ForRestStatementData {
1708 pub condition: Option<Condition>,
1710 pub post_expr: Option<Box<Expr>>,
1712}
1713
1714impl_node_content! {
1715 pub type ForRestStatement = Node<ForRestStatementData>;
1717}
1718
1719#[derive(Clone, Debug, PartialEq, NodeContentDisplay)]
1721#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1722#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1723pub enum JumpStatementData {
1724 #[lang_util(display(extra = "continue"))]
1726 Continue,
1727 #[lang_util(display(extra = "break"))]
1729 Break,
1730 #[lang_util(display(extra = "return"))]
1732 Return(Option<Box<Expr>>),
1733 #[lang_util(display(extra = "discard"))]
1735 Discard,
1736}
1737
1738impl_node_content! {
1739 pub type JumpStatement = Node<JumpStatementData>;
1741}
1742
1743#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1749#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1750#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1751pub enum PreprocessorData {
1752 #[lang_util(display(extra = "#define"))]
1754 Define(PreprocessorDefine),
1755 #[lang_util(display(extra = "#else"))]
1757 Else,
1758 #[lang_util(display(extra = "#elseif"))]
1760 ElseIf(PreprocessorElseIf),
1761 #[lang_util(display(extra = "#endif"))]
1763 EndIf,
1764 #[lang_util(display(extra = "#error"))]
1766 Error(PreprocessorError),
1767 #[lang_util(display(extra = "#if"))]
1769 If(PreprocessorIf),
1770 #[lang_util(display(extra = "#ifdef"))]
1772 IfDef(PreprocessorIfDef),
1773 #[lang_util(display(extra = "#ifndef"))]
1775 IfNDef(PreprocessorIfNDef),
1776 #[lang_util(display(extra = "#include"))]
1778 Include(PreprocessorInclude),
1779 #[lang_util(display(extra = "#line"))]
1781 Line(PreprocessorLine),
1782 #[lang_util(display(extra = "#pragma"))]
1784 Pragma(PreprocessorPragma),
1785 #[lang_util(display(extra = "#undef"))]
1787 Undef(PreprocessorUndef),
1788 #[lang_util(display(extra = "#version"))]
1790 Version(PreprocessorVersion),
1791 #[lang_util(display(extra = "#extension"))]
1793 Extension(PreprocessorExtension),
1794}
1795
1796impl_node_content! {
1797 pub type Preprocessor = Node<PreprocessorData>;
1799}
1800
1801#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1805#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1806#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1807pub enum PreprocessorDefineData {
1808 ObjectLike {
1810 ident: Identifier,
1812 value: String,
1814 },
1815
1816 FunctionLike {
1818 ident: Identifier,
1820 args: Vec<Identifier>,
1822 value: String,
1824 },
1825}
1826
1827impl_node_content! {
1828 pub type PreprocessorDefine = Node<PreprocessorDefineData>;
1830}
1831
1832#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1834#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1835#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1836pub struct PreprocessorElseIfData {
1837 #[lang_util(display(extra))]
1839 pub condition: String,
1840}
1841
1842impl_node_content! {
1843 pub type PreprocessorElseIf = Node<PreprocessorElseIfData>;
1845}
1846
1847#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1849#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1850#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1851pub struct PreprocessorErrorData {
1852 #[lang_util(display(extra))]
1854 pub message: String,
1855}
1856
1857impl_node_content! {
1858 pub type PreprocessorError = Node<PreprocessorErrorData>;
1860}
1861
1862#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1864#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1865#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1866pub struct PreprocessorIfData {
1867 #[lang_util(display(extra))]
1869 pub condition: String,
1870}
1871
1872impl_node_content! {
1873 pub type PreprocessorIf = Node<PreprocessorIfData>;
1875}
1876
1877#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1879#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1880#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1881pub struct PreprocessorIfDefData {
1882 #[lang_util(display(extra))]
1884 pub ident: Identifier,
1885}
1886
1887impl_node_content! {
1888 pub type PreprocessorIfDef = Node<PreprocessorIfDefData>;
1890}
1891
1892#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1894#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1895#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1896pub struct PreprocessorIfNDefData {
1897 #[lang_util(display(extra))]
1899 pub ident: Identifier,
1900}
1901
1902impl_node_content! {
1903 pub type PreprocessorIfNDef = Node<PreprocessorIfNDefData>;
1905}
1906
1907#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1909#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1910#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1911pub struct PreprocessorIncludeData {
1912 pub path: Path,
1914}
1915
1916impl_node_content! {
1917 pub type PreprocessorInclude = Node<PreprocessorIncludeData>;
1919}
1920
1921#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1923#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1924#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1925pub struct PreprocessorLineData {
1926 #[lang_util(display(extra))]
1928 pub line: u32,
1929 pub source_string_number: Option<u32>,
1931}
1932
1933impl_node_content! {
1934 pub type PreprocessorLine = Node<PreprocessorLineData>;
1936}
1937
1938#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1941#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1942#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1943pub struct PreprocessorPragmaData {
1944 #[lang_util(display(extra))]
1946 pub command: String,
1947}
1948
1949impl_node_content! {
1950 pub type PreprocessorPragma = Node<PreprocessorPragmaData>;
1952}
1953
1954#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1956#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1957#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1958pub struct PreprocessorUndefData {
1959 #[lang_util(display(extra))]
1961 pub name: Identifier,
1962}
1963
1964impl_node_content! {
1965 pub type PreprocessorUndef = Node<PreprocessorUndefData>;
1967}
1968
1969#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1971#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1972#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1973pub struct PreprocessorVersionData {
1974 #[lang_util(display(extra))]
1976 pub version: u16,
1977 pub profile: Option<PreprocessorVersionProfile>,
1979}
1980
1981impl_node_content! {
1982 pub type PreprocessorVersion = Node<PreprocessorVersionData>;
1984}
1985
1986#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
1988#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1989#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
1990pub enum PreprocessorVersionProfileData {
1991 #[lang_util(display(extra = "core"))]
1993 Core,
1994 #[lang_util(display(extra = "compatibility"))]
1996 Compatibility,
1997 #[lang_util(display(extra = "es"))]
1999 Es,
2000}
2001
2002impl_node_content! {
2003 pub type PreprocessorVersionProfile = Node<PreprocessorVersionProfileData>;
2005}
2006
2007#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
2009#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2010#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
2011pub struct PreprocessorExtensionData {
2012 pub name: PreprocessorExtensionName,
2014 pub behavior: Option<PreprocessorExtensionBehavior>,
2016}
2017
2018impl_node_content! {
2019 pub type PreprocessorExtension = Node<PreprocessorExtensionData>;
2021}
2022
2023#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
2025#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2026#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
2027pub enum PreprocessorExtensionNameData {
2028 #[lang_util(display(extra = "all"))]
2030 All,
2031 Specific(SmolStr),
2033}
2034
2035impl_node_content! {
2036 pub type PreprocessorExtensionName = Node<PreprocessorExtensionNameData>;
2038}
2039
2040#[derive(Clone, Debug, PartialEq, Eq, NodeContentDisplay)]
2042#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2043#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
2044pub enum PreprocessorExtensionBehaviorData {
2045 #[lang_util(display(extra = "require"))]
2047 Require,
2048 #[lang_util(display(extra = "enable"))]
2050 Enable,
2051 #[lang_util(display(extra = "warn"))]
2053 Warn,
2054 #[lang_util(display(extra = "disable"))]
2056 Disable,
2057}
2058
2059impl_node_content! {
2060 pub type PreprocessorExtensionBehavior = Node<PreprocessorExtensionBehaviorData>;
2062}
2063
2064#[derive(Debug, Clone, PartialEq, Eq, NodeContentDisplay)]
2066#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2067#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
2068pub enum CommentData {
2069 Single(String),
2071 Multi(String),
2073}
2074
2075impl_node_content! {
2076 pub type Comment = Node<CommentData>;
2078}
2079
2080impl CommentData {
2081 pub fn text(&self) -> &str {
2083 match self {
2084 Self::Single(s) => s,
2085 Self::Multi(s) => s,
2086 }
2087 }
2088
2089 pub fn is_single(&self) -> bool {
2091 matches!(self, Self::Multi(_))
2092 }
2093
2094 pub fn is_multi(&self) -> bool {
2096 matches!(self, Self::Multi(_))
2097 }
2098}