aboutsummaryrefslogtreecommitdiff
path: root/xtask/src
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-05-13 10:09:46 +0100
committerGitHub <[email protected]>2020-05-13 10:09:46 +0100
commit9594fe33fabeb2f97afad86c3a5d5ed79e3d54d8 (patch)
tree85c8c2cb648a8fafc4fe7f098527c9b728821bbc /xtask/src
parentf4aec8a22e401fe8441470cf5c9ab37988486219 (diff)
parentb22cf23ad1355af5b039f6da19aa69f57ed47b97 (diff)
Merge #4083
4083: Smol documentation for ast nodes r=matklad a=Veetaha There is a tremendous amount of TODOs to clarify the topics I am not certain about. Please @matklad, @edwin0cheng review carefully, I even left some mentions of your names in todos to put your attention where you most probably can give comments. In order to simplify the review, I separated the codegen (i.e. changes in `ast/generated/nodes.rs`) from `ast_src` changes (they in fact just duplicate one another) into two commits. Also, I had to hack a little bit to let the docs be generated as doc comments and not as doc attributes because it's easier to read them this way and IIRC we don't support hints for `#[doc = ""]` attributes for now... Closes #3682 Co-authored-by: veetaha <[email protected]>
Diffstat (limited to 'xtask/src')
-rw-r--r--xtask/src/ast_src.rs1499
-rw-r--r--xtask/src/codegen/gen_syntax.rs25
2 files changed, 1510 insertions, 14 deletions
diff --git a/xtask/src/ast_src.rs b/xtask/src/ast_src.rs
index fe3eb85de..394a7bc88 100644
--- a/xtask/src/ast_src.rs
+++ b/xtask/src/ast_src.rs
@@ -230,6 +230,7 @@ pub(crate) struct AstSrc<'a> {
230} 230}
231 231
232pub(crate) struct AstNodeSrc<'a> { 232pub(crate) struct AstNodeSrc<'a> {
233 pub(crate) doc: &'a [&'a str],
233 pub(crate) name: &'a str, 234 pub(crate) name: &'a str,
234 pub(crate) traits: &'a [&'a str], 235 pub(crate) traits: &'a [&'a str],
235 pub(crate) fields: &'a [Field<'a>], 236 pub(crate) fields: &'a [Field<'a>],
@@ -247,6 +248,7 @@ pub(crate) enum FieldSrc<'a> {
247} 248}
248 249
249pub(crate) struct AstEnumSrc<'a> { 250pub(crate) struct AstEnumSrc<'a> {
251 pub(crate) doc: &'a [&'a str],
250 pub(crate) name: &'a str, 252 pub(crate) name: &'a str,
251 pub(crate) traits: &'a [&'a str], 253 pub(crate) traits: &'a [&'a str],
252 pub(crate) variants: &'a [&'a str], 254 pub(crate) variants: &'a [&'a str],
@@ -254,12 +256,14 @@ pub(crate) struct AstEnumSrc<'a> {
254 256
255macro_rules! ast_nodes { 257macro_rules! ast_nodes {
256 ($( 258 ($(
259 $(#[doc = $doc:expr])+
257 struct $name:ident$(: $($trait:ident),*)? { 260 struct $name:ident$(: $($trait:ident),*)? {
258 $($field_name:ident $(![$token:tt])? $(: $ty:tt)?),*$(,)? 261 $($field_name:ident $(![$token:tt])? $(: $ty:tt)?),*$(,)?
259 } 262 }
260 )*) => { 263 )*) => {
261 [$( 264 [$(
262 AstNodeSrc { 265 AstNodeSrc {
266 doc: &[$($doc),*],
263 name: stringify!($name), 267 name: stringify!($name),
264 traits: &[$($(stringify!($trait)),*)?], 268 traits: &[$($(stringify!($trait)),*)?],
265 fields: &[ 269 fields: &[
@@ -288,12 +292,14 @@ macro_rules! field {
288 292
289macro_rules! ast_enums { 293macro_rules! ast_enums {
290 ($( 294 ($(
295 $(#[doc = $doc:expr])+
291 enum $name:ident $(: $($trait:ident),*)? { 296 enum $name:ident $(: $($trait:ident),*)? {
292 $($variant:ident),*$(,)? 297 $($variant:ident),*$(,)?
293 } 298 }
294 )*) => { 299 )*) => {
295 [$( 300 [$(
296 AstEnumSrc { 301 AstEnumSrc {
302 doc: &[$($doc),*],
297 name: stringify!($name), 303 name: stringify!($name),
298 traits: &[$($(stringify!($trait)),*)?], 304 traits: &[$($(stringify!($trait)),*)?],
299 variants: &[$(stringify!($variant)),*], 305 variants: &[$(stringify!($variant)),*],
@@ -305,10 +311,35 @@ macro_rules! ast_enums {
305pub(crate) const AST_SRC: AstSrc = AstSrc { 311pub(crate) const AST_SRC: AstSrc = AstSrc {
306 tokens: &["Whitespace", "Comment", "String", "RawString"], 312 tokens: &["Whitespace", "Comment", "String", "RawString"],
307 nodes: &ast_nodes! { 313 nodes: &ast_nodes! {
314 /// The entire Rust source file. Includes all top-level inner attributes and module items.
315 ///
316 /// [Reference](https://doc.rust-lang.org/reference/crates-and-source-files.html)
308 struct SourceFile: ModuleItemOwner, AttrsOwner, DocCommentsOwner { 317 struct SourceFile: ModuleItemOwner, AttrsOwner, DocCommentsOwner {
309 modules: [Module], 318 modules: [Module],
310 } 319 }
311 320
321 /// Function definition either with body or not.
322 /// Includes all of its attributes and doc comments.
323 ///
324 /// ```
325 /// ❰
326 /// /// Docs
327 /// #[attr]
328 /// pub extern "C" fn foo<T>(#[attr] Patern {p}: Pattern) -> u32
329 /// where
330 /// T: Debug
331 /// {
332 /// 42
333 /// }
334 /// ❱
335 ///
336 /// extern "C" {
337 /// ❰ fn fn_decl(also_variadic_ffi: u32, ...) -> u32; ❱
338 /// }
339 /// ```
340 ///
341 /// - [Reference](https://doc.rust-lang.org/reference/items/functions.html)
342 /// - [Nomicon](https://doc.rust-lang.org/nomicon/ffi.html#variadic-functions)
312 struct FnDef: VisibilityOwner, NameOwner, TypeParamsOwner, DocCommentsOwner, AttrsOwner { 343 struct FnDef: VisibilityOwner, NameOwner, TypeParamsOwner, DocCommentsOwner, AttrsOwner {
313 Abi, 344 Abi,
314 T![const], 345 T![const],
@@ -322,42 +353,201 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
322 T![;] 353 T![;]
323 } 354 }
324 355
356 /// Return type annotation.
357 ///
358 /// ```
359 /// fn foo(a: u32) ❰ -> Option<u32> ❱ { Some(a) }
360 /// ```
361 ///
362 /// [Reference](https://doc.rust-lang.org/reference/items/functions.html)
325 struct RetType { T![->], TypeRef } 363 struct RetType { T![->], TypeRef }
326 364
365 /// Struct definition.
366 /// Includes all of its attributes and doc comments.
367 ///
368 /// ```
369 /// ❰
370 /// /// Docs
371 /// #[attr]
372 /// struct Foo<T> where T: Debug {
373 /// /// Docs
374 /// #[attr]
375 /// pub a: u32,
376 /// b: T,
377 /// }
378 /// ❱
379 ///
380 /// ❰ struct Foo; ❱
381 /// ❰ struct Foo<T>(#[attr] T) where T: Debug; ❱
382 /// ```
383 ///
384 /// [Reference](https://doc.rust-lang.org/reference/items/structs.html)
327 struct StructDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner { 385 struct StructDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner {
328 T![struct], 386 T![struct],
329 FieldDefList, 387 FieldDefList,
330 T![;] 388 T![;]
331 } 389 }
332 390
391 /// Union definition.
392 /// Includes all of its attributes and doc comments.
393 ///
394 /// ```
395 /// ❰
396 /// /// Docs
397 /// #[attr]
398 /// pub union Foo<T> where T: Debug {
399 /// /// Docs
400 /// #[attr]
401 /// a: T,
402 /// b: u32,
403 /// }
404 /// ❱
405 /// ```
406 ///
407 /// [Reference](https://doc.rust-lang.org/reference/items/unions.html)
333 struct UnionDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner { 408 struct UnionDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner {
334 T![union], 409 T![union],
335 RecordFieldDefList, 410 RecordFieldDefList,
336 } 411 }
337 412
413 /// Record field definition list including enclosing curly braces.
414 ///
415 /// ```
416 /// struct Foo // same for union
417 /// ❰
418 /// {
419 /// a: u32,
420 /// b: bool,
421 /// }
422 /// ❱
423 /// ```
424 ///
425 /// [Reference](https://doc.rust-lang.org/reference/items/structs.html)
338 struct RecordFieldDefList { T!['{'], fields: [RecordFieldDef], T!['}'] } 426 struct RecordFieldDefList { T!['{'], fields: [RecordFieldDef], T!['}'] }
427
428 /// Record field definition including its attributes and doc comments.
429 ///
430 /// ` ``
431 /// same for union
432 /// struct Foo {
433 /// ❰
434 /// /// Docs
435 /// #[attr]
436 /// pub a: u32
437 /// ❱
438 ///
439 /// ❰ b: bool ❱
440 /// }
441 /// ```
442 ///
443 /// [Reference](https://doc.rust-lang.org/reference/items/structs.html)
339 struct RecordFieldDef: VisibilityOwner, NameOwner, AttrsOwner, DocCommentsOwner, TypeAscriptionOwner { } 444 struct RecordFieldDef: VisibilityOwner, NameOwner, AttrsOwner, DocCommentsOwner, TypeAscriptionOwner { }
340 445
446 /// Tuple field definition list including enclosing parens.
447 ///
448 /// ```
449 /// struct Foo ❰ (u32, String, Vec<u32>) ❱;
450 /// ```
451 ///
452 /// [Reference](https://doc.rust-lang.org/reference/items/structs.html)
341 struct TupleFieldDefList { T!['('], fields: [TupleFieldDef], T![')'] } 453 struct TupleFieldDefList { T!['('], fields: [TupleFieldDef], T![')'] }
454
455 /// Tuple field definition including its attributes.
456 ///
457 /// ```
458 /// struct Foo(❰ #[attr] u32 ❱);
459 /// ```
460 ///
461 /// [Reference](https://doc.rust-lang.org/reference/items/structs.html)
342 struct TupleFieldDef: VisibilityOwner, AttrsOwner { 462 struct TupleFieldDef: VisibilityOwner, AttrsOwner {
343 TypeRef, 463 TypeRef,
344 } 464 }
345 465
466 /// Enum definition.
467 /// Includes all of its attributes and doc comments.
468 ///
469 /// ```
470 /// ❰
471 /// /// Docs
472 /// #[attr]
473 /// pub enum Foo<T> where T: Debug {
474 /// /// Docs
475 /// #[attr]
476 /// Bar,
477 /// Baz(#[attr] u32),
478 /// Bruh {
479 /// a: u32,
480 /// /// Docs
481 /// #[attr]
482 /// b: T,
483 /// }
484 /// }
485 /// ❱
486 /// ```
487 ///
488 /// [Reference](https://doc.rust-lang.org/reference/items/enumerations.html)
346 struct EnumDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner { 489 struct EnumDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner {
347 T![enum], 490 T![enum],
348 variant_list: EnumVariantList, 491 variant_list: EnumVariantList,
349 } 492 }
493
494 /// Enum variant definition list including enclosing curly braces.
495 ///
496 /// ```
497 /// enum Foo
498 /// ❰
499 /// {
500 /// Bar,
501 /// Baz(u32),
502 /// Bruh {
503 /// a: u32
504 /// }
505 /// }
506 /// ❱
507 /// ```
508 ///
509 /// [Reference](https://doc.rust-lang.org/reference/items/enumerations.html)
350 struct EnumVariantList { 510 struct EnumVariantList {
351 T!['{'], 511 T!['{'],
352 variants: [EnumVariant], 512 variants: [EnumVariant],
353 T!['}'] 513 T!['}']
354 } 514 }
515
516 /// Enum variant definition including its attributes and discriminant value definition.
517 ///
518 /// ```
519 /// enum Foo {
520 /// ❰
521 /// /// Docs
522 /// #[attr]
523 /// Bar
524 /// ❱
525 ///
526 /// // same for tuple and record variants
527 /// }
528 /// ```
529 ///
530 /// [Reference](https://doc.rust-lang.org/reference/items/enumerations.html)
355 struct EnumVariant: VisibilityOwner, NameOwner, DocCommentsOwner, AttrsOwner { 531 struct EnumVariant: VisibilityOwner, NameOwner, DocCommentsOwner, AttrsOwner {
356 FieldDefList, 532 FieldDefList,
357 T![=], 533 T![=],
358 Expr 534 Expr
359 } 535 }
360 536
537 /// Trait definition.
538 /// Includes all of its attributes and doc comments.
539 ///
540 /// ```
541 /// ❰
542 /// /// Docs
543 /// #[attr]
544 /// pub unsafe trait Foo<T>: Debug where T: Debug {
545 /// // ...
546 /// }
547 /// ❱
548 /// ```
549 ///
550 /// [Reference](https://doc.rust-lang.org/reference/items/traits.html)
361 struct TraitDef: VisibilityOwner, NameOwner, AttrsOwner, DocCommentsOwner, TypeParamsOwner, TypeBoundsOwner { 551 struct TraitDef: VisibilityOwner, NameOwner, AttrsOwner, DocCommentsOwner, TypeParamsOwner, TypeBoundsOwner {
362 T![unsafe], 552 T![unsafe],
363 T![auto], 553 T![auto],
@@ -365,18 +555,73 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
365 ItemList, 555 ItemList,
366 } 556 }
367 557
558 /// Module definition either with body or not.
559 /// Includes all of its inner and outer attributes, module items, doc comments.
560 ///
561 /// ```
562 /// ❰
563 /// /// Docs
564 /// #[attr]
565 /// pub mod foo;
566 /// ❱
567 ///
568 /// ❰
569 /// /// Docs
570 /// #[attr]
571 /// pub mod bar {
572 /// //! Inner docs
573 /// #![inner_attr]
574 /// }
575 /// ❱
576 /// ```
577 ///
578 /// [Reference](https://doc.rust-lang.org/reference/items/modules.html)
368 struct Module: VisibilityOwner, NameOwner, AttrsOwner, DocCommentsOwner { 579 struct Module: VisibilityOwner, NameOwner, AttrsOwner, DocCommentsOwner {
369 T![mod], 580 T![mod],
370 ItemList, 581 ItemList,
371 T![;] 582 T![;]
372 } 583 }
373 584
585 /// Item defintion list.
586 /// This is used for both top-level items and impl block items.
587 ///
588 /// ```
589 /// ❰
590 /// fn foo {}
591 /// struct Bar;
592 /// enum Baz;
593 /// trait Bruh;
594 /// const BRUUH: u32 = 42;
595 /// ❱
596 ///
597 /// impl Foo
598 /// ❰
599 /// {
600 /// fn bar() {}
601 /// const BAZ: u32 = 42;
602 /// }
603 /// ❱
604 /// ```
605 ///
606 /// [Reference](https://doc.rust-lang.org/reference/items.html)
374 struct ItemList: ModuleItemOwner { 607 struct ItemList: ModuleItemOwner {
375 T!['{'], 608 T!['{'],
376 assoc_items: [AssocItem], 609 assoc_items: [AssocItem],
377 T!['}'] 610 T!['}']
378 } 611 }
379 612
613 /// Constant variable definition.
614 /// Includes all of its attributes and doc comments.
615 ///
616 /// ```
617 /// ❰
618 /// /// Docs
619 /// #[attr]
620 /// pub const FOO: u32 = 42;
621 /// ❱
622 /// ```
623 ///
624 /// [Reference](https://doc.rust-lang.org/reference/items/constant-items.html)
380 struct ConstDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner, TypeAscriptionOwner { 625 struct ConstDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner, TypeAscriptionOwner {
381 T![default], 626 T![default],
382 T![const], 627 T![const],
@@ -385,6 +630,19 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
385 T![;] 630 T![;]
386 } 631 }
387 632
633
634 /// Static variable definition.
635 /// Includes all of its attributes and doc comments.
636 ///
637 /// ```
638 /// ❰
639 /// /// Docs
640 /// #[attr]
641 /// pub static mut FOO: u32 = 42;
642 /// ❱
643 /// ```
644 ///
645 /// [Reference](https://doc.rust-lang.org/reference/items/static-items.html)
388 struct StaticDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner, TypeAscriptionOwner { 646 struct StaticDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner, TypeAscriptionOwner {
389 T![static], 647 T![static],
390 T![mut], 648 T![mut],
@@ -393,6 +651,24 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
393 T![;] 651 T![;]
394 } 652 }
395 653
654 /// Type alias definition.
655 /// Includes associated type clauses with type bounds.
656 ///
657 /// ```
658 /// ❰
659 /// /// Docs
660 /// #[attr]
661 /// pub type Foo<T> where T: Debug = T;
662 /// ❱
663 ///
664 /// trait Bar {
665 /// ❰ type Baz: Debug; ❱
666 /// ❰ type Bruh = String; ❱
667 /// ❰ type Bruuh: Debug = u32; ❱
668 /// }
669 /// ```
670 ///
671 /// [Reference](https://doc.rust-lang.org/reference/items/type-aliases.html)
396 struct TypeAliasDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner, TypeBoundsOwner { 672 struct TypeAliasDef: VisibilityOwner, NameOwner, TypeParamsOwner, AttrsOwner, DocCommentsOwner, TypeBoundsOwner {
397 T![default], 673 T![default],
398 T![type], 674 T![type],
@@ -401,6 +677,20 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
401 T![;] 677 T![;]
402 } 678 }
403 679
680 /// Inherent and trait impl definition.
681 /// Includes all of its inner and outer attributes.
682 ///
683 /// ```
684 /// ❰
685 /// #[attr]
686 /// unsafe impl<T> const !Foo for Bar where T: Debug {
687 /// #![inner_attr]
688 /// // ...
689 /// }
690 /// ❱
691 /// ```
692 ///
693 /// [Reference](https://doc.rust-lang.org/reference/items/implementations.html)
404 struct ImplDef: TypeParamsOwner, AttrsOwner, DocCommentsOwner { 694 struct ImplDef: TypeParamsOwner, AttrsOwner, DocCommentsOwner {
405 T![default], 695 T![default],
406 T![const], 696 T![const],
@@ -411,76 +701,611 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
411 ItemList, 701 ItemList,
412 } 702 }
413 703
704
705 /// Parenthesized type reference.
706 /// Note: parens are only used for grouping, this is not a tuple type.
707 ///
708 /// ```
709 /// // This is effectively just `u32`.
710 /// // Single-item tuple must be defined with a trailing comma: `(u32,)`
711 /// type Foo = ❰ (u32) ❱;
712 ///
713 /// let bar: &'static ❰ (dyn Debug) ❱ = "bruh";
714 /// ```
414 struct ParenType { T!['('], TypeRef, T![')'] } 715 struct ParenType { T!['('], TypeRef, T![')'] }
716
717 /// Unnamed tuple type.
718 ///
719 /// ```
720 /// let foo: ❰ (u32, bool) ❱ = (42, true);
721 /// ```
722 ///
723 /// [Reference](https://doc.rust-lang.org/reference/types/tuple.html)
415 struct TupleType { T!['('], fields: [TypeRef], T![')'] } 724 struct TupleType { T!['('], fields: [TypeRef], T![')'] }
725
726 /// The never type (i.e. the exclamation point).
727 ///
728 /// ```
729 /// type T = ❰ ! ❱;
730 ///
731 /// fn no_return() -> ❰ ! ❱ {
732 /// loop {}
733 /// }
734 /// ```
735 ///
736 /// [Reference](https://doc.rust-lang.org/reference/types/never.html)
416 struct NeverType { T![!] } 737 struct NeverType { T![!] }
738
739 /// Path to a type.
740 /// Includes single identifier type names and elaborate paths with
741 /// generic parameters.
742 ///
743 /// ```
744 /// type Foo = ❰ String ❱;
745 /// type Bar = ❰ std::vec::Vec<T> ❱;
746 /// type Baz = ❰ ::bruh::<Bruuh as Iterator>::Item ❱;
747 /// ```
748 ///
749 /// [Reference](https://doc.rust-lang.org/reference/paths.html)
417 struct PathType { Path } 750 struct PathType { Path }
751
752 /// Raw pointer type.
753 ///
754 /// ```
755 /// type Foo = ❰ *const u32 ❱;
756 /// type Bar = ❰ *mut u32 ❱;
757 /// ```
758 ///
759 /// [Reference](https://doc.rust-lang.org/reference/types/pointer.html#raw-pointers-const-and-mut)
418 struct PointerType { T![*], T![const], T![mut], TypeRef } 760 struct PointerType { T![*], T![const], T![mut], TypeRef }
761
762 /// Array type.
763 ///
764 /// ```
765 /// type Foo = ❰ [u32; 24 - 3] ❱;
766 /// ```
767 ///
768 /// [Reference](https://doc.rust-lang.org/reference/types/array.html)
419 struct ArrayType { T!['['], TypeRef, T![;], Expr, T![']'] } 769 struct ArrayType { T!['['], TypeRef, T![;], Expr, T![']'] }
770
771 /// Slice type.
772 ///
773 /// ```
774 /// type Foo = ❰ [u8] ❱;
775 /// ```
776 ///
777 /// [Reference](https://doc.rust-lang.org/reference/types/slice.html)
420 struct SliceType { T!['['], TypeRef, T![']'] } 778 struct SliceType { T!['['], TypeRef, T![']'] }
779
780 /// Reference type.
781 ///
782 /// ```
783 /// type Foo = ❰ &'static str ❱;
784 /// ```
785 ///
786 /// [Reference](https://doc.rust-lang.org/reference/types/pointer.html)
421 struct ReferenceType { T![&], T![lifetime], T![mut], TypeRef } 787 struct ReferenceType { T![&], T![lifetime], T![mut], TypeRef }
788
789 /// Placeholder type (i.e. the underscore).
790 ///
791 /// ```
792 /// let foo: ❰ _ ❱ = 42_u32;
793 /// ```
794 ///
795 /// [Reference](https://doc.rust-lang.org/reference/types/inferred.html)
422 struct PlaceholderType { T![_] } 796 struct PlaceholderType { T![_] }
797
798 /// Function pointer type (not to be confused with `Fn*` family of traits).
799 ///
800 /// ```
801 /// type Foo = ❰ async fn(#[attr] u32, named: bool) -> u32 ❱;
802 ///
803 /// type Bar = ❰ extern "C" fn(variadic: u32, #[attr] ...) ❱;
804 /// ```
805 ///
806 /// [Reference](https://doc.rust-lang.org/reference/types/function-pointer.html)
423 struct FnPointerType { Abi, T![unsafe], T![fn], ParamList, RetType } 807 struct FnPointerType { Abi, T![unsafe], T![fn], ParamList, RetType }
808
809 /// Higher order type.
810 ///
811 /// ```
812 /// type Foo = ❰ for<'a> fn(&'a str) ❱;
813 /// ```
814 ///
815 /// [Reference](https://doc.rust-lang.org/nomicon/hrtb.html)
424 struct ForType { T![for], TypeParamList, TypeRef } 816 struct ForType { T![for], TypeParamList, TypeRef }
817
818 /// Opaque `impl Trait` type.
819 ///
820 /// ```
821 /// fn foo(bar: ❰ impl Debug + Eq ❱) {}
822 /// ```
823 ///
824 /// [Reference](https://doc.rust-lang.org/reference/types/impl-trait.html)
425 struct ImplTraitType: TypeBoundsOwner { T![impl] } 825 struct ImplTraitType: TypeBoundsOwner { T![impl] }
826
827 /// Trait object type.
828 ///
829 /// ```
830 /// type Foo = ❰ dyn Debug ❱;
831 /// ```
832 ///
833 /// [Reference](https://doc.rust-lang.org/reference/types/trait-object.html)
426 struct DynTraitType: TypeBoundsOwner { T![dyn] } 834 struct DynTraitType: TypeBoundsOwner { T![dyn] }
427 835
836 /// Tuple literal.
837 ///
838 /// ```
839 /// ❰ (42, true) ❱;
840 /// ```
841 ///
842 /// [Reference](https://doc.rust-lang.org/reference/expressions/tuple-expr.html)
428 struct TupleExpr: AttrsOwner { T!['('], exprs: [Expr], T![')'] } 843 struct TupleExpr: AttrsOwner { T!['('], exprs: [Expr], T![')'] }
844
845 /// Array literal.
846 ///
847 /// ```
848 /// ❰ [#![inner_attr] true, false, true] ❱;
849 ///
850 /// ❰ ["baz"; 24] ❱;
851 /// ```
852 ///
853 /// [Reference](https://doc.rust-lang.org/reference/expressions/array-expr.html)
429 struct ArrayExpr: AttrsOwner { T!['['], exprs: [Expr], T![;], T![']'] } 854 struct ArrayExpr: AttrsOwner { T!['['], exprs: [Expr], T![;], T![']'] }
855
856 /// Parenthesized expression.
857 /// Note: parens are only used for grouping, this is not a tuple literal.
858 ///
859 /// ```
860 /// ❰ (#![inner_attr] 2 + 2) ❱ * 2;
861 /// ```
862 ///
863 /// [Reference](https://doc.rust-lang.org/reference/expressions/grouped-expr.html)
430 struct ParenExpr: AttrsOwner { T!['('], Expr, T![')'] } 864 struct ParenExpr: AttrsOwner { T!['('], Expr, T![')'] }
431 struct PathExpr { Path } 865
866 /// Path to a symbol in expression context.
867 /// Includes single identifier variable names and elaborate paths with
868 /// generic parameters.
869 ///
870 /// ```
871 /// ❰ Some::<i32> ❱;
872 /// ❰ foo ❱ + 42;
873 /// ❰ Vec::<i32>::push ❱;
874 /// ❰ <[i32]>::reverse ❱;
875 /// ❰ <String as std::borrow::Borrow<str>>::borrow ❱;
876 /// ```
877 ///
878 /// [Reference](https://doc.rust-lang.org/reference/expressions/path-expr.html)
879 struct PathExpr { Path }
880
881 /// Anonymous callable object literal a.k.a. closure, lambda or functor.
882 ///
883 /// ```
884 /// ❰ || 42 ❱;
885 /// ❰ |a: u32| val + 1 ❱;
886 /// ❰ async |#[attr] Pattern(_): Pattern| { bar } ❱;
887 /// ❰ move || baz ❱;
888 /// ❰ || -> u32 { closure_with_ret_type_annotation_requires_block_expr } ❱
889 /// ```
890 ///
891 /// [Reference](https://doc.rust-lang.org/reference/expressions/closure-expr.html)
432 struct LambdaExpr: AttrsOwner { 892 struct LambdaExpr: AttrsOwner {
433 T![static], 893 T![static], // Note(@matklad): I belive this is (used to be?) syntax for generators
434 T![async], 894 T![async],
435 T![move], 895 T![move],
436 ParamList, 896 ParamList,
437 RetType, 897 RetType,
438 body: Expr, 898 body: Expr,
439 } 899 }
900
901 /// If expression. Includes both regular `if` and `if let` forms.
902 /// Beware that `else if` is a special case syntax sugar, because in general
903 /// there has to be block expression after `else`.
904 ///
905 /// ```
906 /// ❰ if bool_cond { 42 } ❱
907 /// ❰ if bool_cond { 42 } else { 24 } ❱
908 /// ❰ if bool_cond { 42 } else if bool_cond2 { 42 } ❱
909 ///
910 /// ❰
911 /// if let Pattern(foo) = bar {
912 /// foo
913 /// } else {
914 /// panic!();
915 /// }
916 /// ❱
917 /// ```
918 ///
919 /// [Reference](https://doc.rust-lang.org/reference/expressions/if-expr.html)
440 struct IfExpr: AttrsOwner { T![if], Condition } 920 struct IfExpr: AttrsOwner { T![if], Condition }
921
922 /// Unconditional loop expression.
923 ///
924 /// ```
925 /// ❰
926 /// loop {
927 /// // yeah, it's that simple...
928 /// }
929 /// ❱
930 /// ```
931 ///
932 /// [Reference](https://doc.rust-lang.org/reference/expressions/loop-expr.html)
441 struct LoopExpr: AttrsOwner, LoopBodyOwner { T![loop] } 933 struct LoopExpr: AttrsOwner, LoopBodyOwner { T![loop] }
934
935 /// Block expression with an optional prefix (label, try ketword,
936 /// unsafe keyword, async keyword...).
937 ///
938 /// ```
939 /// ❰
940 /// 'label: try {
941 /// None?
942 /// }
943 /// ❱
944 /// ```
945 ///
946 /// - [try block](https://doc.rust-lang.org/unstable-book/language-features/try-blocks.html)
947 /// - [unsafe block](https://doc.rust-lang.org/reference/expressions/block-expr.html#unsafe-blocks)
948 /// - [async block](https://doc.rust-lang.org/reference/expressions/block-expr.html#async-blocks)
442 struct EffectExpr: AttrsOwner { Label, T![try], T![unsafe], T![async], BlockExpr } 949 struct EffectExpr: AttrsOwner { Label, T![try], T![unsafe], T![async], BlockExpr }
950
951
952 /// For loop expression.
953 /// Note: record struct literals are not valid as iterable expression
954 /// due to ambiguity.
955 ///
956 /// ```
957 /// ❰
958 /// for i in (0..4) {
959 /// dbg!(i);
960 /// }
961 /// ❱
962 /// ```
963 ///
964 /// [Reference](https://doc.rust-lang.org/reference/expressions/loop-expr.html#iterator-loops)
443 struct ForExpr: AttrsOwner, LoopBodyOwner { 965 struct ForExpr: AttrsOwner, LoopBodyOwner {
444 T![for], 966 T![for],
445 Pat, 967 Pat,
446 T![in], 968 T![in],
447 iterable: Expr, 969 iterable: Expr,
448 } 970 }
971
972 /// While loop expression. Includes both regular `while` and `while let` forms.
973 ///
974 /// ```
975 /// ❰
976 /// while bool_cond {
977 /// 42;
978 /// }
979 /// ❱
980 /// ❰
981 /// while let Pattern(foo) = bar {
982 /// bar += 1;
983 /// }
984 /// ❱
985 /// ```
986 ///
987 /// [Reference](https://doc.rust-lang.org/reference/expressions/loop-expr.html#predicate-loops)
449 struct WhileExpr: AttrsOwner, LoopBodyOwner { T![while], Condition } 988 struct WhileExpr: AttrsOwner, LoopBodyOwner { T![while], Condition }
989
990 /// Continue expression.
991 ///
992 /// ```
993 /// while bool_cond {
994 /// ❰ continue ❱;
995 /// }
996 ///
997 /// 'outer: loop {
998 /// loop {
999 /// ❰ continue 'outer ❱;
1000 /// }
1001 /// }
1002 ///
1003 /// ```
1004 ///
1005 /// [Reference](https://doc.rust-lang.org/reference/expressions/loop-expr.html#continue-expressions)
450 struct ContinueExpr: AttrsOwner { T![continue], T![lifetime] } 1006 struct ContinueExpr: AttrsOwner { T![continue], T![lifetime] }
1007
1008 /// Break expression.
1009 ///
1010 /// ```
1011 /// while bool_cond {
1012 /// ❰ break ❱;
1013 /// }
1014 /// 'outer: loop {
1015 /// for foo in bar {
1016 /// ❰ break 'outer ❱;
1017 /// }
1018 /// }
1019 /// 'outer: loop {
1020 /// loop {
1021 /// ❰ break 'outer 42 ❱;
1022 /// }
1023 /// }
1024 /// ```
1025 ///
1026 /// [Refernce](https://doc.rust-lang.org/reference/expressions/loop-expr.html#break-expressions)
451 struct BreakExpr: AttrsOwner { T![break], T![lifetime], Expr } 1027 struct BreakExpr: AttrsOwner { T![break], T![lifetime], Expr }
1028
1029 /// Label.
1030 ///
1031 /// ```
1032 /// ❰ 'outer: ❱ loop {}
1033 ///
1034 /// let foo = ❰ 'bar: ❱ loop {}
1035 ///
1036 /// ❰ 'baz: ❱ {
1037 /// break 'baz;
1038 /// }
1039 /// ```
1040 ///
1041 /// [Reference](https://doc.rust-lang.org/reference/expressions/loop-expr.html?highlight=label#loop-labels)
1042 /// [Labels for blocks RFC](https://github.com/rust-lang/rfcs/blob/master/text/2046-label-break-value.md)
452 struct Label { T![lifetime] } 1043 struct Label { T![lifetime] }
1044
1045 /// Block expression. Includes unsafe blocks and block labels.
1046 ///
1047 /// ```
1048 /// let foo = ❰
1049 /// {
1050 /// #![inner_attr]
1051 /// ❰ { } ❱
1052 ///
1053 /// ❰ 'label: { break 'label } ❱
1054 /// }
1055 /// ❱;
1056 /// ```
1057 ///
1058 /// [Reference](https://doc.rust-lang.org/reference/expressions/block-expr.html)
1059 /// [Labels for blocks RFC](https://github.com/rust-lang/rfcs/blob/master/text/2046-label-break-value.md)
453 struct BlockExpr: AttrsOwner, ModuleItemOwner { 1060 struct BlockExpr: AttrsOwner, ModuleItemOwner {
454 T!['{'], statements: [Stmt], Expr, T!['}'], 1061 T!['{'], statements: [Stmt], Expr, T!['}'],
455 } 1062 }
1063
1064 /// Return expression.
1065 ///
1066 /// ```
1067 /// || ❰ return 42 ❱;
1068 ///
1069 /// fn bar() {
1070 /// ❰ return ❱;
1071 /// }
1072 /// ```
1073 ///
1074 /// [Reference](https://doc.rust-lang.org/reference/expressions/return-expr.html)
456 struct ReturnExpr: AttrsOwner { Expr } 1075 struct ReturnExpr: AttrsOwner { Expr }
1076
1077 /// Call expression (not to be confused with method call expression, it is
1078 /// a separate ast node).
1079 ///
1080 /// ```
1081 /// ❰ foo() ❱;
1082 /// ❰ &str::len("bar") ❱;
1083 /// ❰ <&str as PartialEq<&str>>::eq(&"", &"") ❱;
1084 /// ```
1085 ///
1086 /// [Reference](https://doc.rust-lang.org/reference/expressions/call-expr.html)
457 struct CallExpr: ArgListOwner { Expr } 1087 struct CallExpr: ArgListOwner { Expr }
1088
1089 /// Method call expression.
1090 ///
1091 /// ```
1092 /// ❰ receiver_expr.method() ❱;
1093 /// ❰ receiver_expr.method::<T>(42, true) ❱;
1094 ///
1095 /// ❰ ❰ ❰ foo.bar() ❱ .baz() ❱ .bruh() ❱;
1096 /// ```
1097 ///
1098 /// [Reference](https://doc.rust-lang.org/reference/expressions/method-call-expr.html)
458 struct MethodCallExpr: AttrsOwner, ArgListOwner { 1099 struct MethodCallExpr: AttrsOwner, ArgListOwner {
459 Expr, T![.], NameRef, TypeArgList, 1100 Expr, T![.], NameRef, TypeArgList,
460 } 1101 }
1102
1103 /// Index expression a.k.a. subscript operator call.
1104 ///
1105 /// ```
1106 /// ❰ foo[42] ❱;
1107 /// ```
1108 ///
1109 /// [Reference](https://doc.rust-lang.org/reference/expressions/array-expr.html)
461 struct IndexExpr: AttrsOwner { T!['['], T![']'] } 1110 struct IndexExpr: AttrsOwner { T!['['], T![']'] }
1111
1112 /// Field access expression.
1113 ///
1114 /// ```
1115 /// ❰ expr.bar ❱;
1116 ///
1117 /// ❰ ❰ ❰ foo.bar ❱ .baz ❱ .bruh ❱;
1118 /// ```
1119 ///
1120 /// [Reference](https://doc.rust-lang.org/reference/expressions/field-expr.html)
462 struct FieldExpr: AttrsOwner { Expr, T![.], NameRef } 1121 struct FieldExpr: AttrsOwner { Expr, T![.], NameRef }
1122
1123 /// Await operator call expression.
1124 ///
1125 /// ```
1126 /// ❰ expr.await ❱;
1127 /// ```
1128 ///
1129 /// [Reference](https://doc.rust-lang.org/reference/expressions/await-expr.html)
463 struct AwaitExpr: AttrsOwner { Expr, T![.], T![await] } 1130 struct AwaitExpr: AttrsOwner { Expr, T![.], T![await] }
1131
1132 /// The question mark operator call.
1133 ///
1134 /// ```
1135 /// ❰ expr? ❱;
1136 /// ```
1137 ///
1138 /// [Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator)
464 struct TryExpr: AttrsOwner { Expr, T![?] } 1139 struct TryExpr: AttrsOwner { Expr, T![?] }
1140
1141 /// Type cast expression.
1142 ///
1143 /// ```
1144 /// ❰ expr as T ❱;
1145 /// ```
1146 ///
1147 /// [Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#type-cast-expressions)
465 struct CastExpr: AttrsOwner { Expr, T![as], TypeRef } 1148 struct CastExpr: AttrsOwner { Expr, T![as], TypeRef }
1149
1150
1151 /// Borrow operator call.
1152 ///
1153 /// ```
1154 /// ❰ &foo ❱;
1155 /// ❰ &mut bar ❱;
1156 /// ```
1157 ///
1158 /// [Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#borrow-operators)
466 struct RefExpr: AttrsOwner { T![&], T![raw], T![mut], Expr } 1159 struct RefExpr: AttrsOwner { T![&], T![raw], T![mut], Expr }
1160
1161 /// Prefix operator call. This is either `!` or `*` or `-`.
1162 ///
1163 /// ```
1164 /// ❰ !foo ❱;
1165 /// ❰ *bar ❱;
1166 /// ❰ -42 ❱;
1167 /// ```
1168 ///
1169 /// [Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html)
467 struct PrefixExpr: AttrsOwner { /*PrefixOp,*/ Expr } 1170 struct PrefixExpr: AttrsOwner { /*PrefixOp,*/ Expr }
1171
1172 /// Box operator call.
1173 ///
1174 /// ```
1175 /// ❰ box 42 ❱;
1176 /// ```
1177 ///
1178 /// [RFC](https://github.com/rust-lang/rfcs/blob/0806be4f282144cfcd55b1d20284b43f87cbe1c6/text/0809-box-and-in-for-stdlib.md)
468 struct BoxExpr: AttrsOwner { T![box], Expr } 1179 struct BoxExpr: AttrsOwner { T![box], Expr }
1180
1181 /// Range operator call.
1182 ///
1183 /// ```
1184 /// ❰ 0..42 ❱;
1185 /// ❰ ..42 ❱;
1186 /// ❰ 0.. ❱;
1187 /// ❰ .. ❱;
1188 /// ❰ 0..=42 ❱;
1189 /// ❰ ..=42 ❱;
1190 /// ```
1191 ///
1192 /// [Reference](https://doc.rust-lang.org/reference/expressions/range-expr.html)
469 struct RangeExpr: AttrsOwner { /*RangeOp*/ } 1193 struct RangeExpr: AttrsOwner { /*RangeOp*/ }
1194
1195
1196 /// Binary operator call.
1197 /// Includes all arithmetic, logic, bitwise and assignment operators.
1198 ///
1199 /// ```
1200 /// ❰ 2 + ❰ 2 * 2 ❱ ❱;
1201 /// ❰ ❰ true && false ❱ || true ❱;
1202 /// ```
1203 ///
1204 /// [Reference](https://doc.rust-lang.org/reference/expressions/operator-expr.html#arithmetic-and-logical-binary-operators)
470 struct BinExpr: AttrsOwner { /*BinOp*/ } 1205 struct BinExpr: AttrsOwner { /*BinOp*/ }
1206
1207
1208 /// [Raw] string, [raw] byte string, char, byte, integer, float or bool literal.
1209 ///
1210 /// ```
1211 /// ❰ "str" ❱;
1212 /// ❰ br##"raw byte str"## ❱;
1213 /// ❰ 'c' ❱;
1214 /// ❰ b'c' ❱;
1215 /// ❰ 42 ❱;
1216 /// ❰ 1e9 ❱;
1217 /// ❰ true ❱;
1218 /// ```
1219 ///
1220 /// [Reference](https://doc.rust-lang.org/reference/expressions/literal-expr.html)
471 struct Literal { /*LiteralToken*/ } 1221 struct Literal { /*LiteralToken*/ }
472 1222
1223 /// Match expression.
1224 ///
1225 /// ```
1226 /// ❰
1227 /// match expr {
1228 /// Pat1 => {}
1229 /// Pat2(_) => 42,
1230 /// }
1231 /// ❱
1232 /// ```
1233 ///
1234 /// [Reference](https://doc.rust-lang.org/reference/expressions/match-expr.html)
473 struct MatchExpr: AttrsOwner { T![match], Expr, MatchArmList } 1235 struct MatchExpr: AttrsOwner { T![match], Expr, MatchArmList }
1236
1237 /// Match arm list part of match expression. Includes its inner attributes.
1238 ///
1239 /// ```
1240 /// match expr
1241 /// ❰
1242 /// {
1243 /// #![inner_attr]
1244 /// Pat1 => {}
1245 /// Pat2(_) => 42,
1246 /// }
1247 /// ❱
1248 /// ```
1249 ///
1250 /// [Reference](https://doc.rust-lang.org/reference/expressions/match-expr.html)
474 struct MatchArmList: AttrsOwner { T!['{'], arms: [MatchArm], T!['}'] } 1251 struct MatchArmList: AttrsOwner { T!['{'], arms: [MatchArm], T!['}'] }
1252
1253
1254 /// Match arm.
1255 /// Note: record struct literals are not valid as target match expression
1256 /// due to ambiguity.
1257 /// ```
1258 /// match expr {
1259 /// ❰ #[attr] Pattern(it) if bool_cond => it ❱,
1260 /// }
1261 /// ```
1262 ///
1263 /// [Reference](https://doc.rust-lang.org/reference/expressions/match-expr.html)
475 struct MatchArm: AttrsOwner { 1264 struct MatchArm: AttrsOwner {
476 pat: Pat, 1265 pat: Pat,
477 guard: MatchGuard, 1266 guard: MatchGuard,
478 T![=>], 1267 T![=>],
479 Expr, 1268 Expr,
480 } 1269 }
1270
1271 /// Match guard.
1272 ///
1273 /// ```
1274 /// match expr {
1275 /// Pattern(it) ❰ if bool_cond ❱ => it,
1276 /// }
1277 /// ```
1278 ///
1279 /// [Reference](https://doc.rust-lang.org/reference/expressions/match-expr.html#match-guards)
481 struct MatchGuard { T![if], Expr } 1280 struct MatchGuard { T![if], Expr }
482 1281
1282 /// Record literal expression. The same syntax is used for structs,
1283 /// unions and record enum variants.
1284 ///
1285 /// ```
1286 /// ❰
1287 /// foo::Bar {
1288 /// #![inner_attr]
1289 /// baz: 42,
1290 /// bruh: true,
1291 /// ..spread
1292 /// }
1293 /// ❱
1294 /// ```
1295 ///
1296 /// [Reference](https://doc.rust-lang.org/reference/expressions/struct-expr.html)
483 struct RecordLit { Path, RecordFieldList} 1297 struct RecordLit { Path, RecordFieldList}
1298
1299 /// Record field list including enclosing curly braces.
1300 ///
1301 /// foo::Bar ❰
1302 /// {
1303 /// baz: 42,
1304 /// ..spread
1305 /// }
1306 /// ❱
1307 ///
1308 /// [Reference](https://doc.rust-lang.org/reference/expressions/struct-expr.html)
484 struct RecordFieldList { 1309 struct RecordFieldList {
485 T!['{'], 1310 T!['{'],
486 fields: [RecordField], 1311 fields: [RecordField],
@@ -488,22 +1313,162 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
488 spread: Expr, 1313 spread: Expr,
489 T!['}'] 1314 T!['}']
490 } 1315 }
1316
1317 /// Record field.
1318 ///
1319 /// ```
1320 /// foo::Bar {
1321 /// ❰ #[attr] baz: 42 ❱
1322 /// }
1323 /// ```
1324 ///
1325 /// [Reference](https://doc.rust-lang.org/reference/expressions/struct-expr.html)
491 struct RecordField: AttrsOwner { NameRef, T![:], Expr } 1326 struct RecordField: AttrsOwner { NameRef, T![:], Expr }
492 1327
1328 /// Disjunction of patterns.
1329 ///
1330 /// ```
1331 /// let ❰ Foo(it) | Bar(it) | Baz(it) ❱ = bruh;
1332 /// ```
1333 ///
1334 /// [Reference](https://doc.rust-lang.org/reference/patterns.html)
493 struct OrPat { pats: [Pat] } 1335 struct OrPat { pats: [Pat] }
1336
1337 /// Parenthesized pattern.
1338 /// Note: parens are only used for grouping, this is not a tuple pattern.
1339 ///
1340 /// ```
1341 /// if let ❰ &(0..=42) ❱ = foo {}
1342 /// ```
1343 ///
1344 /// https://doc.rust-lang.org/reference/patterns.html#grouped-patterns
494 struct ParenPat { T!['('], Pat, T![')'] } 1345 struct ParenPat { T!['('], Pat, T![')'] }
1346
1347 /// Reference pattern.
1348 /// Note: this has nothing to do with `ref` keyword, the latter is used in bind patterns.
1349 ///
1350 /// ```
1351 /// let ❰ &mut foo ❱ = bar;
1352 ///
1353 /// let ❰ & ❰ &mut ❰ &_ ❱ ❱ ❱ = baz;
1354 /// ```
1355 ///
1356 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#reference-patterns)
495 struct RefPat { T![&], T![mut], Pat } 1357 struct RefPat { T![&], T![mut], Pat }
1358
1359 /// Box pattern.
1360 ///
1361 /// ```
1362 /// let ❰ box foo ❱ = box 42;
1363 /// ```
1364 ///
1365 /// [Unstable book](https://doc.rust-lang.org/unstable-book/language-features/box-patterns.html)
496 struct BoxPat { T![box], Pat } 1366 struct BoxPat { T![box], Pat }
1367
1368 /// Bind pattern.
1369 ///
1370 /// ```
1371 /// match foo {
1372 /// Some(❰ ref mut bar ❱) => {}
1373 /// ❰ baz @ None ❱ => {}
1374 /// }
1375 /// ```
1376 ///
1377 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#identifier-patterns)
497 struct BindPat: AttrsOwner, NameOwner { T![ref], T![mut], T![@], Pat } 1378 struct BindPat: AttrsOwner, NameOwner { T![ref], T![mut], T![@], Pat }
1379
1380 /// Placeholder pattern a.k.a. the wildcard pattern or the underscore.
1381 ///
1382 /// ```
1383 /// let ❰ _ ❱ = foo;
1384 /// ```
1385 ///
1386 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#wildcard-pattern)
498 struct PlaceholderPat { T![_] } 1387 struct PlaceholderPat { T![_] }
1388
1389 /// Rest-of-the record/tuple pattern.
1390 /// Note: this is not the unbonded range pattern (even more: it doesn't exist).
1391 ///
1392 /// ```
1393 /// let Foo { bar, ❰ .. ❱ } = baz;
1394 /// let (❰ .. ❱, bruh) = (42, 24, 42);
1395 /// let Bruuh(❰ .. ❱) = bruuuh;
1396 /// ```
1397 ///
1398 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#struct-patterns)
499 struct DotDotPat { T![..] } 1399 struct DotDotPat { T![..] }
1400
1401 /// Path pattern.
1402 /// Doesn't include the underscore pattern (it is a special case, namely `PlaceholderPat`).
1403 ///
1404 /// ```
1405 /// let ❰ foo::bar::Baz ❱ { .. } = bruh;
1406 /// if let ❰ CONST ❱ = 42 {}
1407 /// ```
1408 ///
1409 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#path-patterns)
500 struct PathPat { Path } 1410 struct PathPat { Path }
1411
1412 /// Slice pattern.
1413 ///
1414 /// ```
1415 /// let ❰ [foo, bar, baz] ❱ = [1, 2, 3];
1416 /// ```
1417 ///
1418 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#slice-patterns)
501 struct SlicePat { T!['['], args: [Pat], T![']'] } 1419 struct SlicePat { T!['['], args: [Pat], T![']'] }
502 struct RangePat { /*RangeSeparator*/ } 1420
1421 /// Range pattern.
1422 ///
1423 /// ```
1424 /// match foo {
1425 /// ❰ 0..42 ❱ => {}
1426 /// ❰ 0..=42 ❱ => {}
1427 /// }
1428 /// ```
1429 ///
1430 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#range-patterns)
1431 struct RangePat { } // FIXME(@matklad): here should be T![..], T![..=] I think, if we don't already have an accessor in expresions_ext
1432
1433 /// Literal pattern.
1434 /// Includes only bool, number, char, and string literals.
1435 ///
1436 /// ```
1437 /// match foo {
1438 /// Number(❰ 42 ❱) => {}
1439 /// String(❰ "42" ❱) => {}
1440 /// Bool(❰ true ❱) => {}
1441 /// }
1442 /// ```
1443 ///
1444 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#literal-patterns)
503 struct LiteralPat { Literal } 1445 struct LiteralPat { Literal }
1446
1447 /// Macro invocation in pattern position.
1448 ///
1449 /// ```
1450 /// let ❰ foo!(my custom syntax) ❱ = baz;
1451 ///
1452 /// ```
1453 /// [Reference](https://doc.rust-lang.org/reference/macros.html#macro-invocation)
504 struct MacroPat { MacroCall } 1454 struct MacroPat { MacroCall }
505 1455
1456 /// Record literal pattern.
1457 ///
1458 /// ```
1459 /// let ❰ foo::Bar { baz, .. } ❱ = bruh;
1460 /// ```
1461 ///
1462 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#struct-patterns)
506 struct RecordPat { RecordFieldPatList, Path } 1463 struct RecordPat { RecordFieldPatList, Path }
1464
1465 /// Record literal's field patterns list including enclosing curly braces.
1466 ///
1467 /// ```
1468 /// let foo::Bar ❰ { baz, bind @ bruh, .. } ❱ = bruuh;
1469 /// ``
1470 ///
1471 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#struct-patterns)
507 struct RecordFieldPatList { 1472 struct RecordFieldPatList {
508 T!['{'], 1473 T!['{'],
509 pats: [RecordInnerPat], 1474 pats: [RecordInnerPat],
@@ -512,20 +1477,148 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
512 T![..], 1477 T![..],
513 T!['}'] 1478 T!['}']
514 } 1479 }
1480
1481 /// Record literal's field pattern.
1482 /// Note: record literal can also match tuple structs.
1483 ///
1484 /// ```
1485 /// let Foo { ❰ bar: _ ❱ } = baz;
1486 /// let TupleStruct { ❰ 0: _ ❱ } = bruh;
1487 /// ```
1488 ///
1489 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#struct-patterns)
515 struct RecordFieldPat: AttrsOwner { NameRef, T![:], Pat } 1490 struct RecordFieldPat: AttrsOwner { NameRef, T![:], Pat }
516 1491
1492 /// Tuple struct literal pattern.
1493 ///
1494 /// ```
1495 /// let ❰ foo::Bar(baz, bruh) ❱ = bruuh;
1496 /// ```
1497 ///
1498 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#tuple-struct-patterns)
517 struct TupleStructPat { Path, T!['('], args: [Pat], T![')'] } 1499 struct TupleStructPat { Path, T!['('], args: [Pat], T![')'] }
1500
1501 /// Tuple pattern.
1502 /// Note: this doesn't include tuple structs (see `TupleStructPat`)
1503 ///
1504 /// ```
1505 /// let ❰ (foo, bar, .., baz) ❱ = bruh;
1506 /// ```
1507 ///
1508 /// [Reference](https://doc.rust-lang.org/reference/patterns.html#tuple-patterns)
518 struct TuplePat { T!['('], args: [Pat], T![')'] } 1509 struct TuplePat { T!['('], args: [Pat], T![')'] }
519 1510
1511 /// Visibility.
1512 ///
1513 /// ```
1514 /// ❰ pub mod ❱ foo;
1515 /// ❰ pub(crate) ❱ struct Bar;
1516 /// ❰ pub(self) ❱ enum Baz {}
1517 /// ❰ pub(super) ❱ fn bruh() {}
1518 /// ❰ pub(in bruuh::bruuuh) ❱ type T = u64;
1519 /// ```
1520 ///
1521 /// [Reference](https://doc.rust-lang.org/reference/visibility-and-privacy.html)
520 struct Visibility { T![pub], T![super], T![self], T![crate] } 1522 struct Visibility { T![pub], T![super], T![self], T![crate] }
1523
1524 /// Single identifier.
1525 /// Note(@matklad): `Name` is for things that install a new name into the scope,
1526 /// `NameRef` is a usage of a name. Most of the time, this definition/reference
1527 /// distinction can be determined purely syntactically, ie in
1528 /// ```
1529 /// fn foo() { foo() }
1530 /// ```
1531 /// the first foo is `Name`, the second one is `NameRef`.
1532 /// The notable exception are patterns, where in
1533 /// ``
1534 /// let x = 92
1535 /// ```
1536 /// `x` can be semantically either a name or a name ref, depeding on
1537 /// wether there's an `x` constant in scope.
1538 /// We use `Name` for patterns, and disambiguate semantically (see `NameClass` in ide_db).
1539 ///
1540 /// ```
1541 /// let ❰ foo ❱ = bar;
1542 /// struct ❰ Baz ❱;
1543 /// fn ❰ bruh ❱() {}
1544 /// ```
1545 ///
1546 /// [Reference](https://doc.rust-lang.org/reference/identifiers.html)
521 struct Name { T![ident] } 1547 struct Name { T![ident] }
522 struct NameRef { /*NameRefToken*/ }
523 1548
524 struct MacroCall: NameOwner, AttrsOwner,DocCommentsOwner { 1549 /// Reference to a name.
1550 /// See the explanation on the difference between `Name` and `NameRef`
1551 /// in `Name` ast node docs.
1552 ///
1553 /// ```
1554 /// let foo = ❰ bar ❱(❰ Baz(❰ bruh ❱) ❱;
1555 /// ```
1556 ///
1557 /// [Reference](https://doc.rust-lang.org/reference/identifiers.html)
1558 struct NameRef { }
1559
1560 /// Macro call.
1561 /// Includes all of its attributes and doc comments.
1562 ///
1563 /// ```
1564 /// ❰
1565 /// /// Docs
1566 /// #[attr]
1567 /// macro_rules! foo { // macro rules is also a macro call
1568 /// ($bar: tt) => {}
1569 /// }
1570 /// ❱
1571 ///
1572 /// // semicolon is a part of `MacroCall` when it is used in item positions
1573 /// ❰ foo!(); ❱
1574 ///
1575 /// fn main() {
1576 /// ❰ foo!() ❱; // macro call in expression positions doesn't include the semi
1577 /// }
1578 /// ```
1579 ///
1580 /// [Reference](https://doc.rust-lang.org/reference/macros.html)
1581 struct MacroCall: NameOwner, AttrsOwner, DocCommentsOwner {
525 Path, T![!], TokenTree, T![;] 1582 Path, T![!], TokenTree, T![;]
526 } 1583 }
1584
1585 /// Attribute.
1586 ///
1587 /// ```
1588 /// ❰ #![inner_attr] ❱
1589 ///
1590 /// ❰ #[attr] ❱
1591 /// ❰ #[foo = "bar"] ❱
1592 /// ❰ #[baz(bruh::bruuh = "42")] ❱
1593 /// struct Foo;
1594 /// ```
1595 ///
1596 /// [Reference](https://doc.rust-lang.org/reference/attributes.html)
527 struct Attr { T![#], T![!], T!['['], Path, T![=], input: AttrInput, T![']'] } 1597 struct Attr { T![#], T![!], T!['['], Path, T![=], input: AttrInput, T![']'] }
1598
1599 /// Stores a list of lexer tokens and other `TokenTree`s.
1600 /// It appears in attributes, macro_rules and macro call (foo!)
1601 ///
1602 /// ```
1603 /// macro_call! ❰ { my syntax here } ❱;
1604 /// ```
1605 ///
1606 /// [Reference](https://doc.rust-lang.org/reference/macros.html)
528 struct TokenTree {} 1607 struct TokenTree {}
1608
1609 /// Generic lifetime, type and constants parameters list **declaration**.
1610 ///
1611 /// ```
1612 /// fn foo❰ <'a, 'b, T, U, const BAR: u64> ❱() {}
1613 ///
1614 /// struct Baz❰ <T> ❱(T);
1615 ///
1616 /// impl❰ <T> ❱ Bruh<T> {}
1617 ///
1618 /// type Bruuh = for❰ <'a> ❱ fn(&'a str) -> &'a str;
1619 /// ```
1620 ///
1621 /// [Reference](https://doc.rust-lang.org/reference/items/generics.html)
529 struct TypeParamList { 1622 struct TypeParamList {
530 T![<], 1623 T![<],
531 generic_params: [GenericParam], 1624 generic_params: [GenericParam],
@@ -534,21 +1627,141 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
534 const_params: [ConstParam], 1627 const_params: [ConstParam],
535 T![>] 1628 T![>]
536 } 1629 }
1630
1631 /// Single type parameter **declaration**.
1632 ///
1633 /// ```
1634 /// fn foo<❰ K ❱, ❰ I ❱, ❰ E: Debug ❱, ❰ V = DefaultType ❱>() {}
1635 /// ```
1636 ///
1637 /// [Reference](https://doc.rust-lang.org/reference/items/generics.html)
537 struct TypeParam: NameOwner, AttrsOwner, TypeBoundsOwner { 1638 struct TypeParam: NameOwner, AttrsOwner, TypeBoundsOwner {
538 T![=], 1639 T![=],
539 default_type: TypeRef, 1640 default_type: TypeRef,
540 } 1641 }
1642
1643 /// Const generic parameter **declaration**.
1644 /// ```
1645 /// fn foo<T, U, ❰ const BAR: usize ❱, ❰ const BAZ: bool ❱>() {}
1646 /// ```
1647 ///
1648 /// [RFC](https://github.com/rust-lang/rfcs/blob/master/text/2000-const-generics.md#declaring-a-const-parameter)
541 struct ConstParam: NameOwner, AttrsOwner, TypeAscriptionOwner { 1649 struct ConstParam: NameOwner, AttrsOwner, TypeAscriptionOwner {
542 T![=], 1650 T![=],
543 default_val: Expr, 1651 default_val: Expr,
544 } 1652 }
1653
1654 /// Lifetime parameter **declaration**.
1655 ///
1656 /// ```
1657 /// fn foo<❰ 'a ❱, ❰ 'b ❱, V, G, D>(bar: &'a str, baz: &'b mut str) {}
1658 /// ```
1659 ///
1660 /// [Reference](https://doc.rust-lang.org/reference/items/generics.html)
545 struct LifetimeParam: AttrsOwner { T![lifetime] } 1661 struct LifetimeParam: AttrsOwner { T![lifetime] }
546 struct TypeBound { T![lifetime], /* Question, */ T![const], /* Question, */ TypeRef} 1662
1663 /// Type bound declaration clause.
1664 ///
1665 /// ```
1666 /// fn foo<T: ❰ ?Sized ❱ + ❰ Debug ❱>() {}
1667 ///
1668 /// trait Bar<T>
1669 /// where
1670 /// T: ❰ Send ❱ + ❰ Sync ❱
1671 /// {
1672 /// type Baz: ❰ !Sync ❱ + ❰ Debug ❱ + ❰ ?const Add ❱;
1673 /// }
1674 /// ```
1675 ///
1676 /// [Reference](https://doc.rust-lang.org/reference/trait-bounds.html)
1677 struct TypeBound { T![lifetime], /* Question, */ T![const], /* Question, */ TypeRef }
1678
1679 /// Type bounds list.
1680 ///
1681 /// ```
1682 ///
1683 /// fn foo<T: ❰ ?Sized + Debug ❱>() {}
1684 ///
1685 /// trait Bar<T>
1686 /// where
1687 /// T: ❰ Send + Sync ❱
1688 /// {
1689 /// type Baz: ❰ !Sync + Debug ❱;
1690 /// }
1691 /// ```
1692 ///
1693 /// [Reference](https://doc.rust-lang.org/reference/trait-bounds.html)
547 struct TypeBoundList { bounds: [TypeBound] } 1694 struct TypeBoundList { bounds: [TypeBound] }
1695
1696 /// Single where predicate.
1697 ///
1698 /// ```
1699 /// trait Foo<'a, 'b, T>
1700 /// where
1701 /// ❰ 'a: 'b ❱,
1702 /// ❰ T: IntoIterator ❱,
1703 /// ❰ for<'c> <T as IntoIterator>::Item: Bar<'c> ❱
1704 /// {}
1705 /// ```
1706 ///
1707 /// [Reference](https://doc.rust-lang.org/reference/items/generics.html#where-clauses)
548 struct WherePred: TypeBoundsOwner { T![lifetime], TypeRef } 1708 struct WherePred: TypeBoundsOwner { T![lifetime], TypeRef }
1709
1710 /// Where clause.
1711 ///
1712 /// ```
1713 /// trait Foo<'a, T> ❰ where 'a: 'static, T: Debug ❱ {}
1714 ///
1715 /// ```
1716 ///
1717 /// [Reference](https://doc.rust-lang.org/reference/items/generics.html#where-clauses)
549 struct WhereClause { T![where], predicates: [WherePred] } 1718 struct WhereClause { T![where], predicates: [WherePred] }
1719
1720 /// Abi declaration.
1721 /// Note: the abi string is optional.
1722 ///
1723 /// ```
1724 /// ❰ extern "C" ❱ {
1725 /// fn foo() {}
1726 /// }
1727 ///
1728 /// type Bar = ❰ extern ❱ fn() -> u32;
1729 ///
1730 /// type Baz = ❰ extern r#"stdcall"# ❱ fn() -> bool;
1731 /// ```
1732 ///
1733 /// - [Extern blocks reference](https://doc.rust-lang.org/reference/items/external-blocks.html)
1734 /// - [FFI function pointers reference](https://doc.rust-lang.org/reference/items/functions.html#functions)
550 struct Abi { /*String*/ } 1735 struct Abi { /*String*/ }
1736
1737 /// Expression statement.
1738 ///
1739 /// ```
1740 /// ❰ 42; ❱
1741 /// ❰ foo(); ❱
1742 /// ❰ (); ❱
1743 /// ❰ {}; ❱
1744 ///
1745 /// // constructions with trailing curly brace can omit the semicolon
1746 /// // but only when there are satements immediately after them (this is important!)
1747 /// ❰ if bool_cond { } ❱
1748 /// ❰ loop {} ❱
1749 /// ❰ somestatment; ❱
1750 /// ```
1751 ///
1752 /// [Reference](https://doc.rust-lang.org/reference/statements.html)
551 struct ExprStmt: AttrsOwner { Expr, T![;] } 1753 struct ExprStmt: AttrsOwner { Expr, T![;] }
1754
1755 /// Let statement.
1756 ///
1757 /// ```
1758 /// ❰ #[attr] let foo; ❱
1759 /// ❰ let bar: u64; ❱
1760 /// ❰ let baz = 42; ❱
1761 /// ❰ let bruh: bool = true; ❱
1762 /// ```
1763 ///
1764 /// [Reference](https://doc.rust-lang.org/reference/statements.html#let-statements)
552 struct LetStmt: AttrsOwner, TypeAscriptionOwner { 1765 struct LetStmt: AttrsOwner, TypeAscriptionOwner {
553 T![let], 1766 T![let],
554 Pat, 1767 Pat,
@@ -556,42 +1769,192 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
556 initializer: Expr, 1769 initializer: Expr,
557 T![;], 1770 T![;],
558 } 1771 }
1772
1773 /// Condition of `if` or `while` expression.
1774 ///
1775 /// ```
1776 /// if ❰ true ❱ {}
1777 /// if ❰ let Pat(foo) = bar ❱ {}
1778 ///
1779 /// while ❰ true ❱ {}
1780 /// while ❰ let Pat(baz) = bruh ❱ {}
1781 /// ```
1782 ///
1783 /// [If expression reference](https://doc.rust-lang.org/reference/expressions/if-expr.html)
1784 /// [While expression reference](https://doc.rust-lang.org/reference/expressions/loop-expr.html#predicate-loops)
559 struct Condition { T![let], Pat, T![=], Expr } 1785 struct Condition { T![let], Pat, T![=], Expr }
560 struct ParamList { 1786
1787 /// Parameter list **declaration**.
1788 ///
1789 /// ```
1790 /// fn foo❰ (a: u32, b: bool) ❱ -> u32 {}
1791 /// let bar = ❰ |a, b| ❱ {};
1792 ///
1793 /// impl Baz {
1794 /// fn bruh❰ (&self, a: u32) ❱ {}
1795 /// }
1796 /// ```
1797 ///
1798 /// [Reference](https://doc.rust-lang.org/reference/items/functions.html)ocs to codegen script
1799 struct ParamList { // FIXME: this node is used by closure expressions too, but hey use pipes instead of parens...
561 T!['('], 1800 T!['('],
562 SelfParam, 1801 SelfParam,
563 params: [Param], 1802 params: [Param],
564 T![')'] 1803 T![')']
565 } 1804 }
1805
1806 /// Self parameter **declaration**.
1807 ///
1808 /// ```
1809 /// impl Bruh {
1810 /// fn foo(❰ self ❱) {}
1811 /// fn bar(❰ &self ❱) {}
1812 /// fn baz(❰ &mut self ❱) {}
1813 /// fn blah<'a>(❰ &'a self ❱) {}
1814 /// fn blin(❰ self: Box<Self> ❱) {}
1815 /// }
1816 /// ```
1817 ///
1818 /// [Reference](https://doc.rust-lang.org/reference/items/functions.html)
566 struct SelfParam: TypeAscriptionOwner, AttrsOwner { T![&], T![mut], T![lifetime], T![self] } 1819 struct SelfParam: TypeAscriptionOwner, AttrsOwner { T![&], T![mut], T![lifetime], T![self] }
1820
1821 /// Parameter **declaration**.
1822 ///
1823 /// ```
1824 /// fn foo(❰ #[attr] Pat(bar): Pat(u32) ❱, ❰ #[attr] _: bool ❱) {}
1825 ///
1826 /// extern "C" {
1827 /// fn bar(❰ baz: u32 ❱, ❰ ... ❱) -> u32;
1828 /// }
1829 /// ```
1830 ///
1831 /// [Reference](https://doc.rust-lang.org/reference/items/functions.html)
567 struct Param: TypeAscriptionOwner, AttrsOwner { 1832 struct Param: TypeAscriptionOwner, AttrsOwner {
568 Pat, 1833 Pat,
569 T![...] 1834 T![...]
570 } 1835 }
1836
1837 /// Use declaration.
1838 ///
1839 /// ```
1840 /// ❰ #[attr] pub use foo; ❱
1841 /// ❰ use bar as baz; ❱
1842 /// ❰ use bruh::{self, bruuh}; ❱
1843 /// ❰ use { blin::blen, blah::* };
1844 /// ```
1845 ///
1846 /// [Reference](https://doc.rust-lang.org/reference/items/use-declarations.html)
571 struct UseItem: AttrsOwner, VisibilityOwner { 1847 struct UseItem: AttrsOwner, VisibilityOwner {
572 T![use], 1848 T![use],
573 UseTree, 1849 UseTree,
574 } 1850 }
1851
1852 /// Use tree.
1853 ///
1854 /// ```
1855 /// pub use ❰ foo::❰ * ❱ ❱;
1856 /// use ❰ bar as baz ❱;
1857 /// use ❰ bruh::bruuh::{ ❰ self ❱, ❰ blin ❱ } ❱;
1858 /// use ❰ { ❰ blin::blen ❱ } ❱
1859 /// ```
1860 ///
1861 /// [Reference](https://doc.rust-lang.org/reference/items/use-declarations.html)
575 struct UseTree { 1862 struct UseTree {
576 Path, T![*], UseTreeList, Alias 1863 Path, T![*], UseTreeList, Alias
577 } 1864 }
1865
1866 /// Item alias.
1867 /// Note: this is not the type alias.
1868 ///
1869 /// ```
1870 /// use foo ❰ as bar ❱;
1871 /// use baz::{bruh ❰ as _ ❱};
1872 /// extern crate bruuh ❰ as blin ❱;
1873 /// ```
1874 ///
1875 /// [Reference](https://doc.rust-lang.org/reference/items/use-declarations.html)
578 struct Alias: NameOwner { T![as] } 1876 struct Alias: NameOwner { T![as] }
1877
1878 /// Sublist of use trees.
1879 ///
1880 /// ```
1881 /// use bruh::bruuh::❰ { ❰ self ❱, ❰ blin ❱ } ❱;
1882 /// use ❰ { blin::blen::❰ {} ❱ } ❱
1883 /// ```
1884 ///
1885 /// [Reference](https://doc.rust-lang.org/reference/items/use-declarations.html)
579 struct UseTreeList { T!['{'], use_trees: [UseTree], T!['}'] } 1886 struct UseTreeList { T!['{'], use_trees: [UseTree], T!['}'] }
1887
1888 /// Extern crate item.
1889 ///
1890 /// ```
1891 /// ❰ #[attr] pub extern crate foo; ❱
1892 /// ❰ extern crate self as bar; ❱
1893 /// ```
1894 ///
1895 /// [Reference](https://doc.rust-lang.org/reference/items/extern-crates.html)
580 struct ExternCrateItem: AttrsOwner, VisibilityOwner { 1896 struct ExternCrateItem: AttrsOwner, VisibilityOwner {
581 T![extern], T![crate], NameRef, Alias, 1897 T![extern], T![crate], NameRef, Alias,
582 } 1898 }
1899
1900 /// Call site arguments list.
1901 ///
1902 /// ```
1903 /// foo::<T, U>❰ (42, true) ❱;
1904 /// ```
1905 ///
1906 /// [Reference](https://doc.rust-lang.org/reference/expressions/call-expr.html)
583 struct ArgList { 1907 struct ArgList {
584 T!['('], 1908 T!['('],
585 args: [Expr], 1909 args: [Expr],
586 T![')'] 1910 T![')']
587 } 1911 }
1912
1913 /// Path to a symbol. Includes single identifier names and elaborate paths with
1914 /// generic parameters.
1915 ///
1916 /// ```
1917 /// (0..10).❰ ❰ collect ❱ ::<Vec<_>> ❱();
1918 /// ❰ ❰ ❰ Vec ❱ ::<u8> ❱ ::with_capacity ❱(1024);
1919 /// ❰ ❰ <❰ Foo ❱ as ❰ ❰ bar ❱ ::Bar ❱> ❱ ::baz ❱();
1920 /// ❰ ❰ <❰ bruh ❱> ❱ ::bruuh ❱();
1921 /// ```
1922 ///
1923 /// [Reference](https://doc.rust-lang.org/reference/paths.html)
588 struct Path { 1924 struct Path {
589 segment: PathSegment, 1925 segment: PathSegment,
1926 T![::],
590 qualifier: Path, 1927 qualifier: Path,
591 } 1928 }
1929
1930 /// Segment of the path to a symbol.
1931 /// Only path segment of an absolute path holds the `::` token,
1932 /// all other `::` tokens that connect path segments reside under `Path` itself.`
1933 ///
1934 /// ```
1935 /// (0..10).❰ collect ❱ :: ❰ <Vec<_>> ❱();
1936 /// ❰ Vec ❱ :: ❰ <u8> ❱ :: ❰ with_capacity ❱(1024);
1937 /// ❰ <❰ Foo ❱ as ❰ bar ❱ :: ❰ Bar ❱> ❱ :: ❰ baz ❱();
1938 /// ❰ <❰ bruh ❱> ❱ :: ❰ bruuh ❱();
1939 ///
1940 /// // Note that only in this case `::` token is inlcuded:
1941 /// ❰ ::foo ❱;
1942 /// ```
1943 ///
1944 /// [Reference](https://doc.rust-lang.org/reference/paths.html)
592 struct PathSegment { 1945 struct PathSegment {
593 T![::], T![crate], T![self], T![super], T![<], NameRef, TypeArgList, ParamList, RetType, PathType, T![>] 1946 T![::], T![crate], T![self], T![super], T![<], NameRef, TypeArgList, ParamList, RetType, PathType, T![>]
594 } 1947 }
1948
1949 /// List of type arguments that are passed at generic instantiation site.
1950 ///
1951 /// ```
1952 /// type _ = Foo ❰ ::<'a, u64, Item = Bar, 42, {true}> ❱::Bar;
1953 ///
1954 /// Vec❰ ::<bool> ❱::();
1955 /// ```
1956 ///
1957 /// [Reference](https://doc.rust-lang.org/reference/paths.html#paths-in-expressions)
595 struct TypeArgList { 1958 struct TypeArgList {
596 T![::], 1959 T![::],
597 T![<], 1960 T![<],
@@ -602,48 +1965,142 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
602 const_args: [ConstArg], 1965 const_args: [ConstArg],
603 T![>] 1966 T![>]
604 } 1967 }
1968
1969 /// Type argument that is passed at generic instantiation site.
1970 ///
1971 /// ```
1972 /// type _ = Foo::<'a, ❰ u64 ❱, ❰ bool ❱, Item = Bar, 42>::Baz;
1973 /// ```
1974 ///
1975 /// [Reference](https://doc.rust-lang.org/reference/paths.html#paths-in-expressions)
605 struct TypeArg { TypeRef } 1976 struct TypeArg { TypeRef }
1977
1978 /// Associated type argument that is passed at generic instantiation site.
1979 /// ```
1980 /// type Foo = Bar::<'a, u64, bool, ❰ Item = Baz ❱, 42>::Bruh;
1981 ///
1982 /// trait Bruh<T>: Iterator<❰ Item: Debug ❱> {}
1983 /// ```
1984 ///
606 struct AssocTypeArg : TypeBoundsOwner { NameRef, T![=], TypeRef } 1985 struct AssocTypeArg : TypeBoundsOwner { NameRef, T![=], TypeRef }
1986
1987 /// Lifetime argument that is passed at generic instantiation site.
1988 ///
1989 /// ```
1990 /// fn foo<'a>(s: &'a str) {
1991 /// bar::<❰ 'a ❱>(s);
1992 /// }
1993 /// ```
1994 ///
1995 /// [Reference](https://doc.rust-lang.org/reference/paths.html#paths-in-expressions)
607 struct LifetimeArg { T![lifetime] } 1996 struct LifetimeArg { T![lifetime] }
608 struct ConstArg { Literal, T![=], BlockExpr }
609 1997
610 struct MacroItems: ModuleItemOwner{ } 1998 /// Constant value argument that is passed at generic instantiation site.
1999 ///
2000 /// ```
2001 /// foo::<u32, ❰ { true } ❱>();
2002 ///
2003 /// bar::<❰ { 2 + 2} ❱>();
2004 /// ```
2005 ///
2006 /// [RFC](https://github.com/rust-lang/rfcs/blob/master/text/2000-const-generics.md#declaring-a-const-parameter)
2007 struct ConstArg { Literal, BlockExpr }
2008
2009
2010 /// FIXME: (@edwin0cheng) Remove it to use ItemList instead
2011 /// https://github.com/rust-analyzer/rust-analyzer/pull/4083#discussion_r422666243
2012 ///
2013 /// [Reference](https://doc.rust-lang.org/reference/macros.html)
2014 struct MacroItems: ModuleItemOwner { }
611 2015
2016 /// FIXME: (@edwin0cheng) add some documentation here. As per the writing
2017 /// of this comment this ast node is not used.
2018 ///
2019 /// ```
2020 /// // FIXME: example here
2021 /// ```
2022 ///
2023 /// [Reference](https://doc.rust-lang.org/reference/macros.html)
612 struct MacroStmts { 2024 struct MacroStmts {
613 statements: [Stmt], 2025 statements: [Stmt],
614 Expr, 2026 Expr,
615 } 2027 }
616 2028
2029 /// List of items in an extern block.
2030 ///
2031 /// ```
2032 /// extern "C" ❰
2033 /// {
2034 /// fn foo();
2035 /// static var: u32;
2036 /// }
2037 /// ❱
2038 /// ```
2039 ///
2040 /// [Reference](https://doc.rust-lang.org/reference/items/external-blocks.html)
617 struct ExternItemList: ModuleItemOwner { 2041 struct ExternItemList: ModuleItemOwner {
618 T!['{'], 2042 T!['{'],
619 extern_items: [ExternItem], 2043 extern_items: [ExternItem],
620 T!['}'] 2044 T!['}']
621 } 2045 }
622 2046
2047 /// Extern block.
2048 ///
2049 /// ```
2050 /// ❰
2051 /// extern "C" {
2052 /// fn foo();
2053 /// }
2054 /// ❱
2055 ///
2056 /// ```
2057 ///
2058 /// [Reference](https://doc.rust-lang.org/reference/items/external-blocks.html)
623 struct ExternBlock { 2059 struct ExternBlock {
624 Abi, 2060 Abi,
625 ExternItemList 2061 ExternItemList
626 } 2062 }
627 2063
2064 /// Meta item in an attribute.
2065 ///
2066 /// ```
2067 /// #[❰ bar::baz = "42" ❱]
2068 /// #[❰ bruh(bruuh("true")) ❱]
2069 /// struct Foo;
2070 /// ```
2071 ///
2072 /// [Reference](https://doc.rust-lang.org/reference/attributes.html?highlight=meta,item#meta-item-attribute-syntax)
628 struct MetaItem { 2073 struct MetaItem {
629 Path, T![=], AttrInput, nested_meta_items: [MetaItem] 2074 Path, T![=], AttrInput, nested_meta_items: [MetaItem]
630 } 2075 }
631 2076
2077 /// Macro 2.0 definition.
2078 /// Their syntax is still WIP by rustc team...
2079 /// ```
2080 /// ❰
2081 /// macro foo { }
2082 /// ❱
2083 /// ```
2084 ///
2085 /// [RFC](https://github.com/rust-lang/rfcs/blob/master/text/1584-macros.md)
632 struct MacroDef { 2086 struct MacroDef {
633 Name, TokenTree 2087 Name, TokenTree
634 } 2088 }
635 }, 2089 },
636 enums: &ast_enums! { 2090 enums: &ast_enums! {
2091 /// Any kind of nominal type definition.
637 enum NominalDef: NameOwner, TypeParamsOwner, AttrsOwner { 2092 enum NominalDef: NameOwner, TypeParamsOwner, AttrsOwner {
638 StructDef, EnumDef, UnionDef, 2093 StructDef, EnumDef, UnionDef,
639 } 2094 }
640 2095
2096 /// Any kind of **declared** generic parameter
641 enum GenericParam { 2097 enum GenericParam {
642 LifetimeParam, 2098 LifetimeParam,
643 TypeParam, 2099 TypeParam,
644 ConstParam 2100 ConstParam
645 } 2101 }
646 2102
2103 /// Any kind of generic argument passed at instantiation site
647 enum GenericArg { 2104 enum GenericArg {
648 LifetimeArg, 2105 LifetimeArg,
649 TypeArg, 2106 TypeArg,
@@ -651,6 +2108,7 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
651 AssocTypeArg 2108 AssocTypeArg
652 } 2109 }
653 2110
2111 /// Any kind of construct valid in type context
654 enum TypeRef { 2112 enum TypeRef {
655 ParenType, 2113 ParenType,
656 TupleType, 2114 TupleType,
@@ -667,6 +2125,7 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
667 DynTraitType, 2125 DynTraitType,
668 } 2126 }
669 2127
2128 /// Any kind of top-level item that may appear in a module
670 enum ModuleItem: NameOwner, AttrsOwner, VisibilityOwner { 2129 enum ModuleItem: NameOwner, AttrsOwner, VisibilityOwner {
671 StructDef, 2130 StructDef,
672 UnionDef, 2131 UnionDef,
@@ -684,16 +2143,23 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
684 ExternBlock 2143 ExternBlock
685 } 2144 }
686 2145
687 /* impl blocks can also contain MacroCall */ 2146
2147
2148 /// Any kind of item that may appear in an impl block
2149 ///
2150 /// // FIXME: impl blocks can also contain MacroCall
688 enum AssocItem: NameOwner, AttrsOwner { 2151 enum AssocItem: NameOwner, AttrsOwner {
689 FnDef, TypeAliasDef, ConstDef 2152 FnDef, TypeAliasDef, ConstDef
690 } 2153 }
691 2154
692 /* extern blocks can also contain MacroCall */ 2155 /// Any kind of item that may appear in an extern block
2156 ///
2157 /// // FIXME: extern blocks can also contain MacroCall
693 enum ExternItem: NameOwner, AttrsOwner, VisibilityOwner { 2158 enum ExternItem: NameOwner, AttrsOwner, VisibilityOwner {
694 FnDef, StaticDef 2159 FnDef, StaticDef
695 } 2160 }
696 2161
2162 /// Any kind of expression
697 enum Expr: AttrsOwner { 2163 enum Expr: AttrsOwner {
698 TupleExpr, 2164 TupleExpr,
699 ArrayExpr, 2165 ArrayExpr,
@@ -728,6 +2194,7 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
728 BoxExpr, 2194 BoxExpr,
729 } 2195 }
730 2196
2197 /// Any kind of pattern
731 enum Pat { 2198 enum Pat {
732 OrPat, 2199 OrPat,
733 ParenPat, 2200 ParenPat,
@@ -746,18 +2213,26 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
746 MacroPat, 2213 MacroPat,
747 } 2214 }
748 2215
2216 /// Any kind of pattern that appears directly inside of the curly
2217 /// braces of a record pattern
749 enum RecordInnerPat { 2218 enum RecordInnerPat {
750 RecordFieldPat, 2219 RecordFieldPat,
751 BindPat 2220 BindPat
752 } 2221 }
753 2222
2223 /// Any kind of input to an attribute
754 enum AttrInput { Literal, TokenTree } 2224 enum AttrInput { Literal, TokenTree }
2225
2226 /// Any kind of statement
2227 /// Note: there are no empty statements, these are just represented as
2228 /// bare semicolons without a dedicated statement ast node.
755 enum Stmt { 2229 enum Stmt {
756 LetStmt, 2230 LetStmt,
757 ExprStmt, 2231 ExprStmt,
758 // macro calls are parsed as expression statements */ 2232 // macro calls are parsed as expression statements
759 } 2233 }
760 2234
2235 /// Any kind of fields list (record or tuple field lists)
761 enum FieldDefList { 2236 enum FieldDefList {
762 RecordFieldDefList, 2237 RecordFieldDefList,
763 TupleFieldDefList, 2238 TupleFieldDefList,
diff --git a/xtask/src/codegen/gen_syntax.rs b/xtask/src/codegen/gen_syntax.rs
index 8028575c5..19d5594f5 100644
--- a/xtask/src/codegen/gen_syntax.rs
+++ b/xtask/src/codegen/gen_syntax.rs
@@ -3,7 +3,7 @@
3//! Specifically, it generates the `SyntaxKind` enum and a number of newtype 3//! Specifically, it generates the `SyntaxKind` enum and a number of newtype
4//! wrappers around `SyntaxNode` which implement `ra_syntax::AstNode`. 4//! wrappers around `SyntaxNode` which implement `ra_syntax::AstNode`.
5 5
6use std::collections::HashSet; 6use std::{collections::HashSet, fmt::Write};
7 7
8use proc_macro2::{Punct, Spacing}; 8use proc_macro2::{Punct, Spacing};
9use quote::{format_ident, quote}; 9use quote::{format_ident, quote};
@@ -102,6 +102,7 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: AstSrc<'_>) -> Result<String> {
102 }); 102 });
103 ( 103 (
104 quote! { 104 quote! {
105 #[pretty_doc_comment_placeholder_workaround]
105 #[derive(Debug, Clone, PartialEq, Eq, Hash)] 106 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
106 pub struct #name { 107 pub struct #name {
107 pub(crate) syntax: SyntaxNode, 108 pub(crate) syntax: SyntaxNode,
@@ -145,6 +146,7 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: AstSrc<'_>) -> Result<String> {
145 146
146 ( 147 (
147 quote! { 148 quote! {
149 #[pretty_doc_comment_placeholder_workaround]
148 #[derive(Debug, Clone, PartialEq, Eq, Hash)] 150 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
149 pub enum #name { 151 pub enum #name {
150 #(#variants(#variants),)* 152 #(#variants(#variants),)*
@@ -230,10 +232,29 @@ fn generate_nodes(kinds: KindsSrc<'_>, grammar: AstSrc<'_>) -> Result<String> {
230 }; 232 };
231 233
232 let ast = ast.to_string().replace("T ! [ ", "T![").replace(" ] )", "])"); 234 let ast = ast.to_string().replace("T ! [ ", "T![").replace(" ] )", "])");
233 let pretty = crate::reformat(ast)?.replace("#[derive", "\n#[derive"); 235
236 let mut res = String::with_capacity(ast.len() * 2);
237
238 let mut docs =
239 grammar.nodes.iter().map(|it| it.doc).chain(grammar.enums.iter().map(|it| it.doc));
240
241 for chunk in ast.split("# [ pretty_doc_comment_placeholder_workaround ]") {
242 res.push_str(chunk);
243 if let Some(doc) = docs.next() {
244 write_doc_comment(doc, &mut res);
245 }
246 }
247
248 let pretty = crate::reformat(res)?;
234 Ok(pretty) 249 Ok(pretty)
235} 250}
236 251
252fn write_doc_comment(contents: &[&str], dest: &mut String) {
253 for line in contents {
254 writeln!(dest, "///{}", line).unwrap();
255 }
256}
257
237fn generate_syntax_kinds(grammar: KindsSrc<'_>) -> Result<String> { 258fn generate_syntax_kinds(grammar: KindsSrc<'_>) -> Result<String> {
238 let (single_byte_tokens_values, single_byte_tokens): (Vec<_>, Vec<_>) = grammar 259 let (single_byte_tokens_values, single_byte_tokens): (Vec<_>, Vec<_>) = grammar
239 .punct 260 .punct