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