1use crate::{Extent, HasExtent};
10use crate::visit::{Visit, Visitor, VisitorMut};
11
12#[derive(Debug, Visit)]
14pub struct File {
15 pub items: Vec<Attributed<Item>>,
16 pub whitespace: Vec<Whitespace>,
17}
18
19#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
20pub enum Item {
21 AttributeContaining(AttributeContaining),
22 Const(Const),
23 Enum(Enum),
24 ExternCrate(Crate),
25 ExternBlock(ExternBlock),
26 Function(Function),
27 Impl(Impl),
28 MacroCall(MacroCall),
29 Module(Module),
30 Static(Static),
31 Struct(Struct),
32 Trait(Trait),
33 TypeAlias(TypeAlias),
34 Use(Use),
35 Union(Union),
36}
37
38#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
39pub enum Attribute {
41 DocCommentLine(Extent),
42 DocCommentBlock(Extent),
43 Literal(AttributeLiteral),
44}
45
46#[derive(Debug, HasExtent, ExtentIndex, Visit)]
54pub struct AttributeLiteral {
55 pub extent: Extent,
56 pub text: Extent,
57 pub whitespace: Vec<Whitespace>,
58}
59
60#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
61pub enum AttributeContaining {
63 DocCommentLine(Extent),
64 DocCommentBlock(Extent),
65 Literal(AttributeContainingLiteral),
66}
67
68#[derive(Debug, HasExtent, ExtentIndex, Visit)]
76pub struct AttributeContainingLiteral {
77 pub extent: Extent,
78 pub text: Extent,
79 pub whitespace: Vec<Whitespace>,
80}
81
82#[derive(Debug, HasExtent, ExtentIndex, Visit)]
90pub struct Lifetime {
91 pub extent: Extent,
92 pub name: Ident,
93}
94
95#[derive(Debug, PartialEq, Eq, HasExtent, ExtentIndex, Visit, Decompose)]
96pub enum Whitespace {
97 Comment(Comment),
98 Whitespace(Extent),
99}
100
101#[derive(Debug, PartialEq, Eq, HasExtent, ExtentIndex, Visit, Decompose)]
102pub enum Comment {
103 Line(Extent),
104 Block(Extent),
105}
106
107#[derive(Debug, HasExtent, ExtentIndex, Visit)]
115pub struct Use {
116 pub extent: Extent,
117 pub visibility: Option<Visibility>,
118 pub path: UsePath,
119 pub whitespace: Vec<Whitespace>,
120}
121
122#[derive(Debug, HasExtent, ExtentIndex, Visit)]
131pub struct UsePath {
132 pub extent: Extent,
133 pub path: Vec<Ident>,
134 pub tail: UseTail,
135 pub whitespace: Vec<Whitespace>,
136}
137
138#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
139pub enum UseTail {
140 Ident(UseTailIdent),
141 Glob(UseTailGlob),
142 Multi(UseTailMulti),
143}
144
145#[derive(Debug, HasExtent, ExtentIndex, Visit)]
154pub struct UseTailIdent {
155 pub extent: Extent,
156 pub name: Ident,
157 pub rename: Option<Ident>,
158 pub whitespace: Vec<Whitespace>,
159}
160
161#[derive(Debug, HasExtent, ExtentIndex, Visit)]
170pub struct UseTailGlob {
171 pub extent: Extent,
172}
173
174#[derive(Debug, HasExtent, ExtentIndex, Visit)]
184pub struct UseTailMulti {
185 pub extent: Extent,
186 pub paths: Vec<UsePath>,
187 pub whitespace: Vec<Whitespace>,
188}
189
190#[derive(Debug, HasExtent, ExtentIndex, Visit)]
199pub struct Function {
200 pub extent: Extent,
201 pub header: FunctionHeader,
202 pub body: Block,
203 pub whitespace: Vec<Whitespace>,
204}
205
206#[derive(Debug, HasExtent, ExtentIndex, Visit)]
217pub struct FunctionHeader {
218 pub extent: Extent,
219 pub visibility: Option<Visibility>,
220 pub qualifiers: FunctionQualifiers,
221 pub name: Ident,
222 pub generics: Option<GenericDeclarations>,
223 pub arguments: Vec<Argument>,
224 pub return_type: Option<Type>,
225 pub wheres: Vec<Where>,
226 pub whitespace: Vec<Whitespace>,
227}
228
229#[derive(Debug, HasExtent, ExtentIndex, Visit)]
238pub struct FunctionQualifiers {
239 pub extent: Extent,
240 pub is_default: Option<Extent>,
242 pub is_const: Option<Extent>,
243 pub is_unsafe: Option<Extent>,
244 pub is_async: Option<Extent>,
245 pub is_extern: Option<Extent>,
246 pub abi: Option<String>,
248 pub whitespace: Vec<Whitespace>,
249}
250
251#[derive(Debug, HasExtent, ExtentIndex, Visit)]
260pub struct TraitImplFunctionHeader {
261 pub extent: Extent,
262 pub visibility: Option<Visibility>,
263 pub qualifiers: FunctionQualifiers,
264 pub name: Ident,
265 pub generics: Option<GenericDeclarations>,
266 pub arguments: Vec<TraitImplArgument>,
267 pub return_type: Option<Type>,
268 pub wheres: Vec<Where>,
269 pub whitespace: Vec<Whitespace>,
270}
271
272#[derive(Debug, HasExtent, ExtentIndex, Visit)]
282pub struct GenericDeclarations {
283 pub extent: Extent,
284 pub lifetimes: Vec<Attributed<GenericDeclarationLifetime>>,
285 pub types: Vec<Attributed<GenericDeclarationType>>,
286 pub consts: Vec<Attributed<GenericDeclarationConst>>,
287 pub whitespace: Vec<Whitespace>,
288}
289
290#[derive(Debug, HasExtent, ExtentIndex, Visit)]
299pub struct GenericDeclarationLifetime {
300 pub extent: Extent,
301 pub name: Lifetime,
302 pub bounds: Vec<Lifetime>,
303 pub whitespace: Vec<Whitespace>,
304}
305
306#[derive(Debug, HasExtent, ExtentIndex, Visit)]
315pub struct GenericDeclarationType {
316 pub extent: Extent,
317 pub name: Ident,
318 pub bounds: Option<TraitBounds>,
319 pub default: Option<Type>,
320 pub whitespace: Vec<Whitespace>,
321}
322
323#[derive(Debug, HasExtent, ExtentIndex, Visit)]
332pub struct GenericDeclarationConst {
333 pub extent: Extent,
334 pub name: Ident,
335 pub typ: Type,
336 pub whitespace: Vec<Whitespace>,
337}
338
339#[derive(Debug, HasExtent, ExtentIndex, Visit)]
350pub struct Type {
351 pub extent: Extent,
352 pub kind: TypeKind,
353 pub additional: Vec<TypeAdditional>,
354 pub whitespace: Vec<Whitespace>,
355}
356
357#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
358pub enum TypeKind {
359 Array(TypeArray),
360 Disambiguation(TypeDisambiguation),
361 Function(TypeFunction),
362 HigherRankedTraitBounds(TypeHigherRankedTraitBounds),
363 DynTrait(TypeDynTrait),
364 ImplTrait(TypeImplTrait),
365 Named(TypeNamed),
366 Pointer(TypePointer),
367 Reference(TypeReference),
368 Slice(TypeSlice),
369 Tuple(TypeTuple),
370 Uninhabited(Extent),
371}
372
373#[derive(Debug, HasExtent, ExtentIndex, Visit)]
382pub struct TypeReference {
383 pub extent: Extent,
384 pub kind: TypeReferenceKind,
385 pub typ: Box<Type>,
386 pub whitespace: Vec<Whitespace>,
387}
388
389#[derive(Debug, HasExtent, ExtentIndex, Visit)]
399pub struct TypeReferenceKind {
400 pub extent: Extent,
401 pub lifetime: Option<Lifetime>,
402 pub mutable: Option<Extent>,
403 pub whitespace: Vec<Whitespace>,
404}
405
406#[derive(Debug, HasExtent, ExtentIndex, Visit)]
415pub struct TypePointer {
416 pub extent: Extent,
417 #[visit(ignore)]
418 pub kind: TypePointerKind,
419 pub typ: Box<Type>,
420 pub whitespace: Vec<Whitespace>,
421}
422
423#[derive(Debug, Copy, Clone, PartialEq, Eq)]
424pub enum TypePointerKind {
425 Const,
426 Mutable,
427}
428
429#[derive(Debug, HasExtent, ExtentIndex, Visit)]
438pub struct TypeArray {
439 pub extent: Extent,
440 pub typ: Box<Type>,
441 pub count: Box<Attributed<Expression>>,
442 pub whitespace: Vec<Whitespace>,
443}
444
445#[derive(Debug, HasExtent, ExtentIndex, Visit)]
454pub struct TypeHigherRankedTraitBounds {
455 pub extent: Extent,
456 pub lifetimes: Vec<Lifetime>,
457 pub child: TypeHigherRankedTraitBoundsChild,
458 pub whitespace: Vec<Whitespace>,
459}
460
461#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
462pub enum TypeHigherRankedTraitBoundsChild {
463 Named(TypeNamed),
464 Function(TypeFunction),
465 Reference(TypeReference),
466}
467
468#[derive(Debug, HasExtent, ExtentIndex, Visit)]
477pub struct TypeDynTrait {
478 pub extent: Extent,
479 pub name: TypeNamed,
480 pub whitespace: Vec<Whitespace>,
481}
482
483#[derive(Debug, HasExtent, ExtentIndex, Visit)]
492pub struct TypeImplTrait {
493 pub extent: Extent,
494 pub name: TypeNamed,
495 pub whitespace: Vec<Whitespace>,
496}
497
498#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
499pub enum TypeAdditional {
500 Named(TypeNamed),
501 Lifetime(Lifetime),
502}
503
504#[derive(Debug, HasExtent, ExtentIndex, Visit)]
513pub struct TypeNamed {
514 pub extent: Extent,
515 pub path: Vec<TypeNamedComponent>,
516 pub whitespace: Vec<Whitespace>,
517}
518
519#[derive(Debug, HasExtent, ExtentIndex, Visit)]
528pub struct TypeNamedComponent {
529 pub extent: Extent,
530 pub ident: Ident,
531 pub generics: Option<TypeGenerics>,
532 pub whitespace: Vec<Whitespace>,
533}
534
535#[derive(Debug, HasExtent, ExtentIndex, Visit)]
544pub struct TypeDisambiguation {
545 pub extent: Extent,
546 pub from_type: Box<Type>,
547 pub to_type: Option<Box<TypeNamed>>,
548 pub path: Vec<TypeNamedComponent>,
549 pub whitespace: Vec<Whitespace>,
550}
551
552#[derive(Debug, HasExtent, ExtentIndex, Visit)]
561pub struct TypeSlice {
562 pub extent: Extent,
563 pub typ: Box<Type>,
564 pub whitespace: Vec<Whitespace>,
565}
566
567#[derive(Debug, HasExtent, ExtentIndex, Visit)]
576pub struct TypeTuple {
577 pub extent: Extent,
578 pub types: Vec<Type>,
579 pub whitespace: Vec<Whitespace>,
580}
581
582#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
583pub enum TypeGenerics {
584 Function(TypeGenericsFunction),
585 Angle(TypeGenericsAngle),
586}
587
588#[derive(Debug, HasExtent, ExtentIndex, Visit)]
598pub struct TypeGenericsFunction {
599 pub extent: Extent,
600 pub types: Vec<Type>,
601 pub return_type: Option<Box<Type>>,
602 pub whitespace: Vec<Whitespace>,
603}
604
605#[derive(Debug, HasExtent, ExtentIndex, Visit)]
614pub struct TypeGenericsAngle {
615 pub extent: Extent,
616 pub members: Vec<TypeGenericsAngleMember>,
617 pub whitespace: Vec<Whitespace>,
618}
619
620#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
621pub enum TypeGenericsAngleMember {
622 Lifetime(Lifetime),
623 Type(Type),
624 AssociatedType(AssociatedType)
625}
626
627#[derive(Debug, HasExtent, ExtentIndex, Visit)]
637pub struct AssociatedType {
638 pub extent: Extent,
639 pub name: Ident,
640 pub value: AssociatedTypeValue,
641 pub whitespace: Vec<Whitespace>,
642}
643
644#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
645pub enum AssociatedTypeValue {
646 Equal(AssociatedTypeValueEqual),
647 Bound(AssociatedTypeValueBound),
648}
649
650#[derive(Debug, HasExtent, ExtentIndex, Visit)]
659pub struct AssociatedTypeValueEqual {
660 pub extent: Extent,
661 pub value: Type,
662 pub whitespace: Vec<Whitespace>,
663}
664
665#[derive(Debug, HasExtent, ExtentIndex, Visit)]
674pub struct AssociatedTypeValueBound {
675 pub extent: Extent,
676 pub bounds: TraitBounds,
677 pub whitespace: Vec<Whitespace>,
678}
679
680#[derive(Debug, HasExtent, ExtentIndex, Visit)]
689pub struct TypeFunction {
690 pub extent: Extent,
691 pub qualifiers: FunctionQualifiers,
692 pub arguments: Vec<TypeFunctionArgument>,
693 pub return_type: Option<Box<Type>>,
694 pub whitespace: Vec<Whitespace>,
695}
696
697#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
698pub enum TypeFunctionArgument {
699 Named(TypeFunctionArgumentNamed),
700 Variadic(Extent),
701}
702
703#[derive(Debug, HasExtent, ExtentIndex, Visit)]
712pub struct TypeFunctionArgumentNamed {
713 pub extent: Extent,
714 pub name: Option<Ident>,
715 pub typ: Type,
716 pub whitespace: Vec<Whitespace>,
717}
718
719#[derive(Debug, Copy, Clone, HasExtent, ExtentIndex, Visit)]
728pub struct Ident {
729 pub extent: Extent,
730}
731
732#[derive(Debug, HasExtent, ExtentIndex, Visit)]
742pub struct Path {
743 pub extent: Extent,
744 pub components: Vec<Ident>,
746 pub whitespace: Vec<Whitespace>,
747}
748
749#[derive(Debug, HasExtent, ExtentIndex, Visit)]
759pub struct PathedIdent {
760 pub extent: Extent,
761 pub components: Vec<PathComponent>,
762 pub whitespace: Vec<Whitespace>,
763}
764
765impl From<Ident> for PathedIdent {
766 fn from(other: Ident) -> PathedIdent {
767 PathedIdent {
768 extent: other.extent,
769 components: vec![
770 PathComponent {
771 extent: other.extent,
772 ident: other,
773 turbofish: None,
774 whitespace: Vec::new(),
775 },
776 ],
777 whitespace: Vec::new(),
778 }
779 }
780}
781
782#[derive(Debug, HasExtent, ExtentIndex, Visit)]
791pub struct PathComponent {
792 pub extent: Extent,
793 pub ident: Ident,
794 pub turbofish: Option<Turbofish>,
795 pub whitespace: Vec<Whitespace>,
796}
797
798#[derive(Debug, HasExtent, ExtentIndex, Visit)]
807pub struct Turbofish {
808 pub extent: Extent,
809 pub lifetimes: Vec<Lifetime>,
810 pub types: Vec<Type>,
811 pub whitespace: Vec<Whitespace>,
812}
813
814#[derive(Debug, HasExtent, ExtentIndex, Visit)]
822pub struct Const {
823 pub extent: Extent,
824 pub visibility: Option<Visibility>,
825 pub name: Ident,
826 pub typ: Type,
827 pub value: Attributed<Expression>,
828 pub whitespace: Vec<Whitespace>,
829}
830
831#[derive(Debug, HasExtent, ExtentIndex, Visit)]
839pub struct Static {
840 pub extent: Extent,
841 pub visibility: Option<Visibility>,
842 pub is_mut: Option<Extent>,
843 pub name: Ident,
844 pub typ: Type,
845 pub value: Attributed<Expression>,
846 pub whitespace: Vec<Whitespace>,
847}
848
849#[derive(Debug, HasExtent, ExtentIndex, Visit)]
858pub struct Struct {
859 pub extent: Extent,
860 pub visibility: Option<Visibility>,
861 pub name: Ident,
862 pub generics: Option<GenericDeclarations>,
863 pub wheres: Vec<Where>,
864 pub body: StructDefinitionBody,
865 pub whitespace: Vec<Whitespace>,
866}
867
868#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
869pub enum StructDefinitionBody {
870 Brace(StructDefinitionBodyBrace),
871 Tuple(StructDefinitionBodyTuple),
872 Empty(Extent),
873}
874
875#[derive(Debug, HasExtent, ExtentIndex, Visit)]
884pub struct StructDefinitionBodyBrace {
885 pub extent: Extent,
886 pub fields: Vec<Attributed<StructDefinitionFieldNamed>>,
887 pub whitespace: Vec<Whitespace>,
888}
889
890#[derive(Debug, HasExtent, ExtentIndex, Visit)]
899pub struct StructDefinitionFieldNamed {
900 pub extent: Extent,
901 pub visibility: Option<Visibility>,
902 pub name: Ident,
903 pub typ: Type,
904 pub whitespace: Vec<Whitespace>,
905}
906
907#[derive(Debug, HasExtent, ExtentIndex, Visit)]
916pub struct StructDefinitionBodyTuple {
917 pub extent: Extent,
918 pub fields: Vec<Attributed<StructDefinitionFieldUnnamed>>,
919 pub whitespace: Vec<Whitespace>,
920}
921
922#[derive(Debug, HasExtent, ExtentIndex, Visit)]
931pub struct StructDefinitionFieldUnnamed {
932 pub extent: Extent,
933 pub visibility: Option<Visibility>,
934 pub typ: Type,
935 pub whitespace: Vec<Whitespace>,
936}
937
938#[derive(Debug, HasExtent, ExtentIndex, Visit)]
946pub struct Union {
947 pub extent: Extent,
948 pub visibility: Option<Visibility>,
949 pub name: Ident,
950 pub generics: Option<GenericDeclarations>,
951 pub wheres: Vec<Where>,
952 pub fields: Vec<Attributed<StructDefinitionFieldNamed>>,
953 pub whitespace: Vec<Whitespace>,
954}
955
956#[derive(Debug, HasExtent, ExtentIndex, Visit)]
964pub struct Enum {
965 pub extent: Extent,
966 pub visibility: Option<Visibility>,
967 pub name: Ident,
968 pub generics: Option<GenericDeclarations>,
969 pub wheres: Vec<Where>,
970 pub variants: Vec<Attributed<EnumVariant>>,
971 pub whitespace: Vec<Whitespace>,
972}
973
974#[derive(Debug, HasExtent, ExtentIndex, Visit)]
983pub struct EnumVariant {
984 pub extent: Extent,
985 pub name: Ident,
986 pub body: EnumVariantBody,
987 pub whitespace: Vec<Whitespace>,
988}
989
990#[derive(Debug, Visit, Decompose)] pub enum EnumVariantBody {
992 Tuple(Vec<Attributed<StructDefinitionFieldUnnamed>>),
993 Struct(StructDefinitionBodyBrace),
994 Unit(Option<Attributed<Expression>>),
995}
996
997#[derive(Debug, Visit, Decompose)] pub enum Argument {
999 SelfArgument(SelfArgument),
1000 Named(NamedArgument),
1001}
1002
1003#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1004pub enum SelfArgument {
1005 Longhand(SelfArgumentLonghand),
1006 Shorthand(SelfArgumentShorthand),
1007}
1008
1009#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1018pub struct SelfArgumentLonghand {
1019 pub extent: Extent,
1020 pub is_mut: Option<Extent>,
1021 pub name: Ident,
1022 pub typ: Type,
1023 pub whitespace: Vec<Whitespace>,
1024}
1025
1026#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1035pub struct SelfArgumentShorthand {
1036 pub extent: Extent,
1037 pub qualifier: Option<SelfArgumentShorthandQualifier>,
1038 pub name: Ident,
1039 pub whitespace: Vec<Whitespace>,
1040}
1041
1042#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1043pub enum SelfArgumentShorthandQualifier {
1044 Reference(TypeReferenceKind),
1045 Mut(Extent),
1046}
1047
1048#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1057pub struct NamedArgument {
1058 pub extent: Extent,
1059 pub name: Pattern,
1060 pub typ: Type,
1061 pub whitespace: Vec<Whitespace>,
1062}
1063
1064#[derive(Debug, Visit, Decompose)] pub enum TraitImplArgument {
1066 SelfArgument(SelfArgument),
1067 Named(TraitImplArgumentNamed),
1068}
1069
1070#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1081pub struct TraitImplArgumentNamed {
1082 pub extent: Extent,
1083 pub name: Option<Pattern>,
1084 pub typ: Type,
1085 pub whitespace: Vec<Whitespace>,
1086}
1087
1088#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1098pub struct Where {
1099 pub extent: Extent,
1100 pub higher_ranked_trait_bounds: Vec<Lifetime>,
1101 pub kind: WhereKind,
1102 pub whitespace: Vec<Whitespace>,
1103}
1104
1105#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1106pub enum WhereKind {
1107 Lifetime(WhereLifetime),
1108 Type(WhereType),
1109}
1110
1111#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1120pub struct WhereLifetime {
1121 pub extent: Extent,
1122 pub name: Lifetime,
1123 pub bounds: Vec<Lifetime>,
1124 pub whitespace: Vec<Whitespace>,
1125}
1126
1127#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1136pub struct WhereType {
1137 pub extent: Extent,
1138 pub name: Type,
1139 pub bounds: TraitBounds,
1140 pub whitespace: Vec<Whitespace>,
1141}
1142
1143#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1152pub struct TraitBounds {
1153 pub extent: Extent,
1154 pub types: Vec<TraitBound>,
1155 pub whitespace: Vec<Whitespace>,
1156}
1157
1158#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1159pub enum TraitBound {
1160 Lifetime(TraitBoundLifetime),
1161 Normal(TraitBoundNormal),
1162 Relaxed(TraitBoundRelaxed),
1163}
1164
1165#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1175pub struct TraitBoundLifetime {
1176 pub extent: Extent,
1177 pub lifetime: Lifetime,
1178 pub whitespace: Vec<Whitespace>,
1179}
1180
1181#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1191pub struct TraitBoundNormal {
1192 pub extent: Extent,
1193 pub typ: TraitBoundType,
1194 pub whitespace: Vec<Whitespace>,
1195}
1196
1197#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1206pub struct TraitBoundRelaxed {
1207 pub extent: Extent,
1208 pub typ: TraitBoundType,
1209 pub whitespace: Vec<Whitespace>,
1210}
1211
1212#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1213pub enum TraitBoundType {
1214 Named(TypeNamed),
1215 HigherRankedTraitBounds(TypeHigherRankedTraitBounds),
1218}
1219
1220#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1230pub struct Block {
1231 pub extent: Extent,
1232 pub statements: Vec<Statement>,
1233 pub expression: Option<Attributed<Expression>>,
1234 pub whitespace: Vec<Whitespace>,
1235}
1236
1237#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1246pub struct UnsafeBlock {
1247 pub extent: Extent,
1248 pub body: Box<Block>,
1249 pub whitespace: Vec<Whitespace>,
1250}
1251
1252#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1261pub struct AsyncBlock {
1262 pub extent: Extent,
1263 pub body: Box<Block>,
1264 pub is_move: Option<Extent>,
1265 pub whitespace: Vec<Whitespace>,
1266}
1267
1268#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1277pub struct Parenthetical {
1278 pub extent: Extent,
1279 pub expression: Box<Attributed<Expression>>,
1280 pub whitespace: Vec<Whitespace>,
1281}
1282
1283#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1284pub enum Statement {
1285 Expression(Attributed<Expression>),
1286 Item(Attributed<Item>),
1287 Empty(Extent),
1288}
1289
1290#[derive(Debug)]
1298pub struct Attributed<T> {
1299 pub extent: Extent,
1300 pub attributes: Vec<Attribute>,
1301 pub value: T,
1302 pub whitespace: Vec<Whitespace>,
1303}
1304
1305impl<T> HasExtent for Attributed<T> {
1306 fn extent(&self) -> Extent {
1307 self.extent
1308 }
1309}
1310
1311impl<T> std::ops::Deref for Attributed<T> {
1312 type Target = T;
1313 fn deref(&self) -> &Self::Target { &self.value }
1314}
1315
1316macro_rules! visit_attributed {
1317 ($typ:ty, $visit:ident, $exit:ident) => {
1318 impl Visit for Attributed<$typ> {
1319 fn visit<'ast, V>(&'ast self, v: &mut V)
1320 where
1321 V: Visitor<'ast>
1322 {
1323 v.$visit(self);
1324 self.attributes.visit(v);
1325 self.value.visit(v);
1326 v.$exit(self);
1327 }
1328
1329 fn visit_mut<V>(&mut self, v: &mut V)
1330 where
1331 V: VisitorMut
1332 {
1333 v.$visit(self);
1334 self.attributes.visit_mut(v);
1335 self.value.visit_mut(v);
1336 v.$exit(self);
1337 }
1338 }
1339 };
1340}
1341
1342visit_attributed!(EnumVariant, visit_attributed_enum_variant, exit_attributed_enum_variant);
1343visit_attributed!(Expression, visit_attributed_expression, exit_attributed_expression);
1344visit_attributed!(ExternBlockMember, visit_attributed_extern_block_member, exit_attributed_extern_block_member);
1345visit_attributed!(GenericDeclarationConst, visit_attributed_generic_declaration_const, exit_attributed_generic_declaration_const);
1346visit_attributed!(GenericDeclarationLifetime, visit_attributed_generic_declaration_lifetime, exit_attributed_generic_declaration_lifetime);
1347visit_attributed!(GenericDeclarationType, visit_attributed_generic_declaration_type, exit_attributed_generic_declaration_type);
1348visit_attributed!(ImplMember, visit_attributed_impl_member, exit_attributed_impl_member);
1349visit_attributed!(Item, visit_attributed_item, exit_attributed_item);
1350visit_attributed!(StructDefinitionFieldNamed, visit_attributed_struct_definition_field_named, exit_attributed_struct_definition_field_named);
1351visit_attributed!(StructDefinitionFieldUnnamed, visit_attributed_struct_definition_field_unnamed, exit_attributed_struct_definition_field_unnamed);
1352visit_attributed!(TraitMember, visit_attributed_trait_member, exit_attributed_trait_member);
1353
1354impl From<Expression> for Attributed<Expression> {
1356 fn from(value: Expression) -> Attributed<Expression> {
1357 Attributed {
1358 extent: value.extent(),
1359 attributes: vec![],
1360 value,
1361 whitespace: Vec::new(),
1362 }
1363 }
1364}
1365
1366#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1367pub enum Expression {
1368 Array(Array),
1369 AsType(AsType),
1370 Ascription(Ascription),
1371 AsyncBlock(AsyncBlock),
1372 Binary(Binary),
1373 Block(Box<Block>),
1374 Box(ExpressionBox),
1375 Break(Break),
1376 Byte(Byte),
1377 ByteString(ByteString),
1378 Call(Call),
1379 Character(Character),
1380 Closure(Closure),
1381 Continue(Continue),
1382 Dereference(Dereference),
1383 Disambiguation(Disambiguation),
1384 FieldAccess(FieldAccess),
1385 ForLoop(ForLoop),
1386 If(If),
1387 IfLet(IfLet),
1388 Let(Let),
1389 Loop(Loop),
1390 MacroCall(MacroCall),
1391 Match(Match),
1392 Number(Number),
1393 Parenthetical(Parenthetical),
1394 Range(Range),
1395 RangeInclusive(RangeInclusive),
1396 Reference(Reference),
1397 Return(Return),
1398 Slice(Slice),
1399 String(String),
1400 Tuple(Tuple),
1401 TryOperator(TryOperator),
1402 Unary(Unary),
1403 UnsafeBlock(UnsafeBlock),
1404 Value(Value),
1405 While(While),
1406 WhileLet(WhileLet),
1407}
1408
1409impl Expression {
1410 pub(crate) fn may_terminate_statement(&self) -> bool {
1411 match *self {
1412 Expression::Block(_) |
1413 Expression::ForLoop(_) |
1414 Expression::If(_) |
1415 Expression::IfLet(_) |
1416 Expression::Loop(_) |
1417 Expression::Match(_) |
1418 Expression::UnsafeBlock(_) |
1419 Expression::While(_) |
1420 Expression::WhileLet(_) |
1421 Expression::MacroCall(MacroCall { args: MacroCallArgs::Curly(_), .. }) => true,
1422 _ => false,
1423 }
1424 }
1425}
1426
1427#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1436pub struct MacroCall {
1437 pub extent: Extent,
1438 pub name: PathedIdent,
1439 pub arg: Option<Ident>,
1440 pub args: MacroCallArgs,
1441 pub whitespace: Vec<Whitespace>,
1442}
1443
1444#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1445pub enum MacroCallArgs {
1446 Paren(Extent),
1447 Curly(Extent),
1448 Square(Extent),
1449}
1450
1451#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1460pub struct Let {
1461 pub extent: Extent,
1462 pub pattern: Pattern,
1463 pub typ: Option<Type>,
1464 pub value: Option<Box<Attributed<Expression>>>,
1465 pub whitespace: Vec<Whitespace>,
1466}
1467
1468#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1477pub struct Tuple {
1478 pub extent: Extent,
1479 pub members: Vec<Attributed<Expression>>,
1480 pub whitespace: Vec<Whitespace>,
1481}
1482
1483#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1492pub struct TryOperator {
1493 pub extent: Extent,
1494 pub target: Box<Attributed<Expression>>,
1495 pub whitespace: Vec<Whitespace>,
1496}
1497
1498#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1507pub struct FieldAccess {
1508 pub extent: Extent,
1509 pub target: Box<Attributed<Expression>>,
1510 pub field: FieldName,
1511 pub whitespace: Vec<Whitespace>,
1512}
1513
1514#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1515pub enum FieldName {
1516 Path(PathComponent),
1517 Number(Extent),
1518}
1519
1520#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1529pub struct Number {
1530 pub extent: Extent,
1531 pub is_negative: Option<Extent>,
1532 pub value: NumberValue,
1533 pub whitespace: Vec<Whitespace>,
1534}
1535
1536#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1537pub enum NumberValue {
1538 Binary(NumberBinary),
1539 Decimal(NumberDecimal),
1540 Hexadecimal(NumberHexadecimal),
1541 Octal(NumberOctal),
1542}
1543
1544#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1553pub struct NumberBinary {
1554 pub extent: Extent,
1555 pub decimal: Extent,
1556 pub fraction: Option<Extent>,
1557 pub exponent: Option<Extent>,
1558 pub suffix: Option<Extent>,
1559}
1560
1561#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1570pub struct NumberDecimal {
1571 pub extent: Extent,
1572 pub decimal: Extent,
1573 pub fraction: Option<Extent>,
1574 pub exponent: Option<Extent>,
1575 pub suffix: Option<Extent>,
1576}
1577
1578#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1587pub struct NumberHexadecimal {
1588 pub extent: Extent,
1589 pub decimal: Extent,
1590 pub fraction: Option<Extent>,
1591 pub exponent: Option<Extent>,
1592 pub suffix: Option<Extent>,
1593}
1594
1595#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1604pub struct NumberOctal {
1605 pub extent: Extent,
1606 pub decimal: Extent,
1607 pub fraction: Option<Extent>,
1608 pub exponent: Option<Extent>,
1609 pub suffix: Option<Extent>,
1610}
1611
1612#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1622pub struct Value {
1623 pub extent: Extent,
1624 pub name: PathedIdent,
1625 pub literal: Option<StructLiteral>,
1626 pub whitespace: Vec<Whitespace>,
1627}
1628
1629#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1638pub struct StructLiteral {
1639 pub extent: Extent,
1640 pub fields: Vec<StructLiteralField>,
1641 pub splat: Option<Box<Attributed<Expression>>>,
1642 pub whitespace: Vec<Whitespace>,
1643}
1644
1645#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1654pub struct StructLiteralField {
1655 pub extent: Extent,
1656 pub name: Ident,
1657 pub value: Attributed<Expression>,
1658 pub whitespace: Vec<Whitespace>,
1659}
1660
1661#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1670pub struct Call {
1671 pub extent: Extent,
1672 pub target: Box<Attributed<Expression>>,
1673 pub args: Vec<Attributed<Expression>>,
1674 pub whitespace: Vec<Whitespace>,
1675}
1676
1677#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1686pub struct ForLoop {
1687 pub extent: Extent,
1688 pub label: Option<Lifetime>,
1689 pub pattern: Pattern,
1690 pub iter: Box<Attributed<Expression>>,
1691 pub body: Box<Block>,
1692 pub whitespace: Vec<Whitespace>,
1693}
1694
1695#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1704pub struct Loop {
1705 pub extent: Extent,
1706 pub label: Option<Lifetime>,
1707 pub body: Box<Block>,
1708 pub whitespace: Vec<Whitespace>,
1709}
1710
1711#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1720pub struct IfLet {
1721 pub extent: Extent,
1722 pub pattern: Pattern,
1723 pub value: Box<Attributed<Expression>>,
1724 pub body: Box<Block>,
1725 pub whitespace: Vec<Whitespace>,
1726}
1727
1728#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1737pub struct While {
1738 pub extent: Extent,
1739 pub label: Option<Lifetime>,
1740 pub value: Box<Attributed<Expression>>,
1741 pub body: Box<Block>,
1742 pub whitespace: Vec<Whitespace>,
1743}
1744
1745#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1754pub struct WhileLet {
1755 pub extent: Extent,
1756 pub label: Option<Lifetime>,
1757 pub pattern: Pattern,
1758 pub value: Box<Attributed<Expression>>,
1759 pub body: Box<Block>,
1760 pub whitespace: Vec<Whitespace>,
1761}
1762
1763#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1773pub struct Unary {
1774 pub extent: Extent,
1775 #[visit(ignore)]
1776 pub op: UnaryOp,
1777 pub value: Box<Attributed<Expression>>,
1778 pub whitespace: Vec<Whitespace>,
1779}
1780
1781#[derive(Debug, Copy, Clone, PartialEq, Eq)]
1782pub enum UnaryOp {
1783 Negate,
1784 Not,
1785}
1786
1787#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1796pub struct Binary {
1797 pub extent: Extent,
1798 #[visit(ignore)]
1799 pub op: BinaryOp,
1800 pub lhs: Box<Attributed<Expression>>,
1801 pub rhs: Box<Attributed<Expression>>,
1802 pub whitespace: Vec<Whitespace>,
1803}
1804
1805#[derive(Debug, Copy, Clone, PartialEq, Eq)]
1806pub enum BinaryOp {
1807 Add,
1808 AddAssign,
1809 Assign,
1810 BitwiseAnd,
1811 BitwiseAndAssign,
1812 BitwiseOr,
1813 BitwiseOrAssign,
1814 BitwiseXor,
1815 BitwiseXorAssign,
1816 BooleanAnd,
1817 BooleanOr,
1818 Div,
1819 DivAssign,
1820 Equal,
1821 GreaterThan,
1822 GreaterThanOrEqual,
1823 LessThan,
1824 LessThanOrEqual,
1825 Mod,
1826 ModAssign,
1827 Mul,
1828 MulAssign,
1829 NotEqual,
1830 ShiftLeft,
1831 ShiftLeftAssign,
1832 ShiftRight,
1833 ShiftRightAssign,
1834 Sub,
1835 SubAssign,
1836}
1837
1838#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1847pub struct If {
1848 pub extent: Extent,
1849 pub condition: Box<Attributed<Expression>>,
1850 pub body: Box<Block>,
1851 pub more: Vec<If>,
1852 pub else_body: Option<Box<Block>>,
1853 pub whitespace: Vec<Whitespace>,
1854}
1855
1856#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1865pub struct Match {
1866 pub extent: Extent,
1867 pub head: Box<Attributed<Expression>>,
1868 pub arms: Vec<MatchArm>,
1869 pub whitespace: Vec<Whitespace>,
1870}
1871
1872#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1881pub struct MatchArm {
1882 pub extent: Extent,
1883 pub attributes: Vec<Attribute>,
1884 pub pattern: Vec<Pattern>,
1885 pub guard: Option<Attributed<Expression>>,
1886 pub hand: MatchHand,
1887 pub whitespace: Vec<Whitespace>,
1888}
1889
1890#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1891pub enum MatchHand {
1892 Brace(Attributed<Expression>),
1893 Expression(Attributed<Expression>),
1894}
1895
1896#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1905pub struct Range {
1907 pub extent: Extent,
1908 pub lhs: Option<Box<Attributed<Expression>>>,
1909 pub rhs: Option<Box<Attributed<Expression>>>,
1910 pub whitespace: Vec<Whitespace>,
1911}
1912
1913#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1922pub struct RangeInclusive {
1923 pub extent: Extent,
1924 pub lhs: Option<Box<Attributed<Expression>>>,
1925 #[visit(ignore)]
1926 pub operator: RangeInclusiveOperator,
1927 pub rhs: Option<Box<Attributed<Expression>>>,
1928 pub whitespace: Vec<Whitespace>,
1929}
1930
1931#[derive(Debug, HasExtent, ExtentIndex, Decompose)]
1932pub enum RangeInclusiveOperator {
1933 Legacy(Extent),
1934 Recommended(Extent),
1935}
1936
1937#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
1938pub enum Array {
1939 Explicit(ArrayExplicit),
1940 Repeated(ArrayRepeated),
1941}
1942
1943#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1952pub struct ArrayExplicit {
1953 pub extent: Extent,
1954 pub values: Vec<Attributed<Expression>>,
1955 pub whitespace: Vec<Whitespace>,
1956}
1957
1958#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1967pub struct ArrayRepeated {
1968 pub extent: Extent,
1969 pub value: Box<Attributed<Expression>>,
1970 pub count: Box<Attributed<Expression>>,
1971 pub whitespace: Vec<Whitespace>,
1972}
1973
1974#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1984pub struct ExpressionBox {
1985 pub extent: Extent,
1986 pub target: Box<Attributed<Expression>>,
1987 pub whitespace: Vec<Whitespace>,
1988}
1989
1990#[derive(Debug, HasExtent, ExtentIndex, Visit)]
1999pub struct AsType {
2000 pub extent: Extent,
2001 pub target: Box<Attributed<Expression>>,
2002 pub typ: Type,
2003 pub whitespace: Vec<Whitespace>,
2004}
2005
2006#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2015pub struct Ascription {
2016 pub extent: Extent,
2017 pub target: Box<Attributed<Expression>>,
2018 pub typ: Type,
2019 pub whitespace: Vec<Whitespace>,
2020}
2021
2022#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2031pub struct Character {
2032 pub extent: Extent,
2033 pub value: Extent,
2034}
2035
2036#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2045pub struct String {
2046 pub extent: Extent,
2047 pub value: Extent,
2048}
2049
2050#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2059pub struct Byte {
2060 pub extent: Extent,
2061 pub value: Character,
2062}
2063
2064#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2073pub struct ByteString {
2074 pub extent: Extent,
2075 pub value: String,
2076}
2077
2078#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2088pub struct Slice {
2089 pub extent: Extent,
2090 pub target: Box<Attributed<Expression>>,
2091 pub index: Box<Attributed<Expression>>,
2092 pub whitespace: Vec<Whitespace>,
2093}
2094
2095#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2104pub struct Closure {
2105 pub extent: Extent,
2106 pub is_async: Option<Extent>,
2107 pub is_move: Option<Extent>,
2108 pub args: Vec<ClosureArg>,
2109 pub return_type: Option<Type>,
2110 pub body: Box<Attributed<Expression>>,
2111 pub whitespace: Vec<Whitespace>,
2112}
2113
2114#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2123pub struct ClosureArg {
2124 pub extent: Extent,
2125 pub name: Pattern,
2126 pub typ: Option<Type>,
2127 pub whitespace: Vec<Whitespace>,
2128}
2129
2130#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2139pub struct Reference {
2140 pub extent: Extent,
2141 pub is_mutable: Option<Extent>,
2142 pub target: Box<Attributed<Expression>>,
2143 pub whitespace: Vec<Whitespace>,
2144}
2145
2146#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2155pub struct Dereference {
2156 pub extent: Extent,
2157 pub target: Box<Attributed<Expression>>,
2158 pub whitespace: Vec<Whitespace>,
2159}
2160
2161#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2170pub struct Disambiguation {
2171 pub extent: Extent,
2172 pub from_type: Type,
2173 pub to_type: Option<TypeNamed>,
2174 pub components: Vec<PathComponent>,
2175 pub whitespace: Vec<Whitespace>,
2176}
2177
2178#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2187pub struct Return {
2188 pub extent: Extent,
2189 pub value: Option<Box<Attributed<Expression>>>,
2190 pub whitespace: Vec<Whitespace>,
2191}
2192
2193#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2202pub struct Continue {
2203 pub extent: Extent,
2204 pub label: Option<Lifetime>,
2205 pub whitespace: Vec<Whitespace>,
2206}
2207
2208#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2217pub struct Break {
2218 pub extent: Extent,
2219 pub label: Option<Lifetime>,
2220 pub value: Option<Box<Attributed<Expression>>>,
2221 pub whitespace: Vec<Whitespace>,
2222}
2223
2224#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2233pub struct Pattern {
2234 pub extent: Extent,
2235 pub name: Option<PatternName>,
2236 pub kind: PatternKind,
2237 pub whitespace: Vec<Whitespace>,
2238}
2239
2240#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2250pub struct PatternName {
2251 pub extent: Extent,
2252 pub is_ref: Option<Extent>,
2253 pub is_mut: Option<Extent>,
2254 pub name: Ident,
2255 pub whitespace: Vec<Whitespace>,
2256}
2257
2258#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2259pub enum PatternKind {
2260 Box(PatternBox),
2261 Byte(PatternByte),
2262 ByteString(PatternByteString),
2263 Character(PatternCharacter),
2264 Ident(PatternIdent), MacroCall(PatternMacroCall),
2266 Number(PatternNumber),
2267 RangeExclusive(PatternRangeExclusive),
2268 RangeInclusive(PatternRangeInclusive),
2269 Reference(PatternReference),
2270 Slice(PatternSlice),
2271 String(PatternString),
2272 Struct(PatternStruct),
2273 Tuple(PatternTuple),
2274}
2275
2276#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2285pub struct PatternIdent {
2286 pub extent: Extent,
2287 pub is_ref: Option<Extent>,
2288 pub is_mut: Option<Extent>,
2289 pub ident: PathedIdent,
2290 pub tuple: Option<PatternTuple>,
2291 pub whitespace: Vec<Whitespace>,
2292}
2293
2294#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2303pub struct PatternStruct {
2304 pub extent: Extent,
2305 pub name: PathedIdent,
2306 pub fields: Vec<PatternStructField>,
2307 #[visit(ignore)]
2308 pub wildcard: bool,
2309 pub whitespace: Vec<Whitespace>,
2310}
2311
2312#[derive(Debug, Visit, Decompose)] pub enum PatternStructField {
2314 Long(PatternStructFieldLong),
2315 Short(PatternStructFieldShort),
2316}
2317
2318#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2327pub struct PatternStructFieldLong {
2328 pub extent: Extent,
2329 pub name: Ident,
2330 pub pattern: Pattern,
2331 pub whitespace: Vec<Whitespace>,
2332}
2333
2334#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2343pub struct PatternStructFieldShort {
2344 pub extent: Extent,
2345 pub ident: PatternIdent,
2346 pub whitespace: Vec<Whitespace>,
2347}
2348
2349#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2358pub struct PatternTuple {
2359 pub extent: Extent,
2360 pub members: Vec<PatternTupleMember>,
2361 pub whitespace: Vec<Whitespace>,
2362}
2363
2364#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2365pub enum PatternTupleMember {
2366 Pattern(Pattern),
2367 Wildcard(Extent),
2368}
2369
2370#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2379pub struct PatternSlice {
2380 pub extent: Extent,
2381 pub members: Vec<PatternSliceMember>,
2382 pub whitespace: Vec<Whitespace>,
2383}
2384
2385#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2386pub enum PatternSliceMember {
2387 Pattern(Pattern),
2388 Subslice(PatternSliceSubslice),
2389 Wildcard(Extent),
2390}
2391
2392#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2401pub struct PatternSliceSubslice {
2402 pub extent: Extent,
2403 pub is_ref: Option<Extent>,
2404 pub is_mut: Option<Extent>,
2405 pub name: Ident,
2406 pub whitespace: Vec<Whitespace>,
2407}
2408
2409#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2418pub struct PatternByte {
2419 pub extent: Extent,
2420 pub value: Byte,
2421}
2422
2423#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2432pub struct PatternCharacter {
2433 pub extent: Extent,
2434 pub value: Character,
2435}
2436
2437#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2446pub struct PatternByteString {
2447 pub extent: Extent,
2448 pub value: ByteString,
2449}
2450
2451#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2460pub struct PatternString {
2461 pub extent: Extent,
2462 pub value: String,
2463}
2464
2465#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2473pub struct PatternNumber {
2474 pub extent: Extent,
2475 pub is_negative: Option<Extent>,
2476 pub value: Number,
2477 pub whitespace: Vec<Whitespace>,
2478}
2479
2480#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2489pub struct PatternMacroCall {
2490 pub extent: Extent,
2491 pub value: MacroCall,
2492 pub whitespace: Vec<Whitespace>,
2493}
2494
2495#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2504pub struct PatternRangeExclusive {
2505 pub extent: Extent,
2506 pub start: PatternRangeComponent,
2507 pub end: PatternRangeComponent,
2508 pub whitespace: Vec<Whitespace>,
2509}
2510
2511#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2520pub struct PatternRangeInclusive {
2521 pub extent: Extent,
2522 pub start: PatternRangeComponent,
2523 #[visit(ignore)]
2524 pub operator: RangeInclusiveOperator,
2525 pub end: PatternRangeComponent,
2526 pub whitespace: Vec<Whitespace>,
2527}
2528
2529#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2530pub enum PatternRangeComponent {
2531 Ident(PathedIdent),
2532 Byte(Byte),
2533 Character(Character),
2534 Number(PatternNumber),
2535}
2536
2537#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2546pub struct PatternReference {
2547 pub extent: Extent,
2548 pub is_mut: Option<Extent>,
2549 pub pattern: Box<Pattern>,
2550 pub whitespace: Vec<Whitespace>,
2551}
2552
2553#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2562pub struct PatternBox {
2563 pub extent: Extent,
2564 pub pattern: Box<Pattern>,
2565 pub whitespace: Vec<Whitespace>,
2566}
2567
2568#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2576pub struct Trait {
2577 pub extent: Extent,
2578 pub visibility: Option<Visibility>,
2579 pub is_unsafe: Option<Extent>,
2580 pub is_auto: Option<Extent>,
2581 pub name: Ident,
2582 pub generics: Option<GenericDeclarations>,
2583 pub bounds: Option<TraitBounds>,
2584 pub wheres: Vec<Where>,
2585 pub members: Vec<Attributed<TraitMember>>,
2586 pub whitespace: Vec<Whitespace>,
2587}
2588
2589#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2590pub enum TraitMember {
2591 Const(TraitMemberConst),
2592 Function(TraitMemberFunction),
2593 Type(TraitMemberType),
2594 MacroCall(MacroCall),
2595}
2596
2597#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2606pub struct TraitMemberFunction {
2607 pub extent: Extent,
2608 pub header: TraitImplFunctionHeader,
2609 pub body: Option<Block>,
2610 pub whitespace: Vec<Whitespace>,
2611}
2612
2613#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2622pub struct TraitMemberType {
2623 pub extent: Extent,
2624 pub name: Ident,
2625 pub bounds: Option<TraitBounds>,
2626 pub default: Option<Type>,
2627 pub whitespace: Vec<Whitespace>,
2628}
2629
2630#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2639pub struct TraitMemberConst {
2640 pub extent: Extent,
2641 pub name: Ident,
2642 pub typ: Type,
2643 pub value: Option<Attributed<Expression>>,
2644 pub whitespace: Vec<Whitespace>,
2645}
2646
2647#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2655pub struct Impl {
2656 pub extent: Extent,
2657 pub is_unsafe: Option<Extent>,
2658 pub generics: Option<GenericDeclarations>,
2659 pub kind: ImplKind,
2660 pub wheres: Vec<Where>,
2661 pub body: Vec<Attributed<ImplMember>>,
2662 pub whitespace: Vec<Whitespace>,
2663}
2664
2665#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2666pub enum ImplKind {
2667 Trait(ImplOfTrait),
2668 Inherent(ImplOfInherent),
2669}
2670
2671#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2680pub struct ImplOfTrait {
2681 pub extent: Extent,
2682 pub is_negative: Option<Extent>,
2683 pub trait_name: Type, pub type_name: ImplOfTraitType,
2685 pub whitespace: Vec<Whitespace>,
2686}
2687
2688#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2697pub struct ImplOfInherent {
2698 pub extent: Extent,
2699 pub type_name: Type,
2700 pub whitespace: Vec<Whitespace>,
2701}
2702
2703#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2704pub enum ImplOfTraitType {
2705 Type(Type),
2706 Wildcard(Extent),
2707}
2708
2709#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2710pub enum ImplMember {
2711 Const(ImplConst),
2712 Function(ImplFunction),
2713 Type(ImplType),
2714 MacroCall(MacroCall),
2715}
2716
2717#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2726pub struct ImplFunction {
2727 pub extent: Extent,
2728 pub header: FunctionHeader,
2729 pub body: Block,
2730 pub whitespace: Vec<Whitespace>,
2731}
2732
2733#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2742pub struct ImplType {
2743 pub extent: Extent,
2744 pub name: Ident,
2745 pub typ: Type,
2746 pub whitespace: Vec<Whitespace>,
2747}
2748
2749#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2758pub struct ImplConst {
2759 pub extent: Extent,
2760 pub visibility: Option<Visibility>,
2761 pub name: Ident,
2762 pub typ: Type,
2763 pub value: Attributed<Expression>,
2764 pub whitespace: Vec<Whitespace>,
2765}
2766
2767#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2775pub struct Crate {
2776 pub extent: Extent,
2777 pub visibility: Option<Visibility>,
2778 pub name: Ident,
2779 pub rename: Option<Ident>,
2780 pub whitespace: Vec<Whitespace>,
2781}
2782
2783#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2791pub struct ExternBlock {
2792 pub extent: Extent,
2793 pub abi: Option<String>,
2794 pub members: Vec<Attributed<ExternBlockMember>>,
2795 pub whitespace: Vec<Whitespace>,
2796}
2797
2798#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2799pub enum ExternBlockMember {
2800 Function(ExternBlockMemberFunction),
2801 Static(ExternBlockMemberStatic),
2802 Type(ExternBlockMemberType),
2803}
2804
2805#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2814pub struct ExternBlockMemberStatic {
2815 pub extent: Extent,
2816 pub visibility: Option<Visibility>,
2817 pub is_mut: Option<Extent>,
2818 pub name: Ident,
2819 pub typ: Type,
2820 pub whitespace: Vec<Whitespace>,
2821}
2822
2823#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2832pub struct ExternBlockMemberType {
2833 pub extent: Extent,
2834 pub visibility: Option<Visibility>,
2835 pub name: Ident,
2836 pub whitespace: Vec<Whitespace>,
2837}
2838
2839#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2848pub struct ExternBlockMemberFunction {
2849 pub extent: Extent,
2850 pub visibility: Option<Visibility>,
2851 pub name: Ident,
2852 pub generics: Option<GenericDeclarations>,
2853 pub arguments: Vec<ExternBlockMemberFunctionArgument>,
2854 pub return_type: Option<Type>,
2855 pub wheres: Vec<Where>,
2856 pub whitespace: Vec<Whitespace>,
2857}
2858
2859#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2860pub enum ExternBlockMemberFunctionArgument {
2861 Named(ExternBlockMemberFunctionArgumentNamed),
2862 Variadic(ExternBlockMemberFunctionArgumentVariadic),
2863}
2864
2865#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2874pub struct ExternBlockMemberFunctionArgumentNamed {
2875 pub extent: Extent,
2876 pub name: Pattern,
2877 pub typ: Type,
2878 pub whitespace: Vec<Whitespace>,
2879}
2880
2881#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2890pub struct ExternBlockMemberFunctionArgumentVariadic {
2891 pub extent: Extent,
2892}
2893
2894#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2902pub struct TypeAlias {
2903 pub extent: Extent,
2904 pub visibility: Option<Visibility>,
2905 pub name: Ident,
2906 pub generics: Option<GenericDeclarations>,
2907 pub wheres: Vec<Where>,
2908 pub defn: Type,
2909 pub whitespace: Vec<Whitespace>,
2910}
2911
2912#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2920pub struct Module {
2921 pub extent: Extent,
2922 pub visibility: Option<Visibility>,
2923 pub name: Ident,
2924 pub body: Option<Vec<Attributed<Item>>>,
2925 pub whitespace: Vec<Whitespace>,
2926}
2927
2928#[derive(Debug, HasExtent, ExtentIndex, Visit, Decompose)]
2929pub enum Visibility {
2930 Public(VisibilityPublic),
2931 Crate(Extent),
2932}
2933
2934#[derive(Debug, HasExtent, ExtentIndex, Visit)]
2943pub struct VisibilityPublic {
2944 pub extent: Extent,
2945 #[visit(ignore)]
2946 pub qualifier: Option<VisibilityPublicQualifier>,
2947 pub whitespace: Vec<Whitespace>,
2948}
2949
2950#[derive(Debug)]
2951pub enum VisibilityPublicQualifier {
2952 Crate,
2953 SelfIdent,
2954 Path(Path),
2955}